[Checkins] SVN: z3c.language.negotiator/trunk/ Cache ONLY for the session setting.

Adam Groszer agroszer at gmail.com
Fri Oct 1 11:29:16 EDT 2010


Log message for revision 117125:
  Cache ONLY for the session setting.

Changed:
  U   z3c.language.negotiator/trunk/CHANGES.txt
  U   z3c.language.negotiator/trunk/src/z3c/language/negotiator/app.py
  U   z3c.language.negotiator/trunk/src/z3c/language/negotiator/tests.py

-=-
Modified: z3c.language.negotiator/trunk/CHANGES.txt
===================================================================
--- z3c.language.negotiator/trunk/CHANGES.txt	2010-10-01 14:44:45 UTC (rev 117124)
+++ z3c.language.negotiator/trunk/CHANGES.txt	2010-10-01 15:29:15 UTC (rev 117125)
@@ -5,7 +5,10 @@
 1.1.3 (unreleased)
 ------------------
 
-- Nothing changed yet.
+- Cache ONLY for the ``session`` setting. Others turned out as a bad idea.
+  It's pretty straightforward now, we're caching session data lookups because
+  those lookups are sooo slow.
+  Would be better done in z3c.language.session, but there's nothing persistent.
 
 
 1.1.2 (2010-08-05)

Modified: z3c.language.negotiator/trunk/src/z3c/language/negotiator/app.py
===================================================================
--- z3c.language.negotiator/trunk/src/z3c/language/negotiator/app.py	2010-10-01 14:44:45 UTC (rev 117124)
+++ z3c.language.negotiator/trunk/src/z3c/language/negotiator/app.py	2010-10-01 15:29:15 UTC (rev 117125)
@@ -34,16 +34,16 @@
 
 
 class Negotiator(persistent.Persistent, contained.Contained):
-    """Loacal negotiator implementation.
+    """Local negotiator implementation.
 
     The negotiator let you change the policy, which is a alias
     for the lookup mechanism.
 
     'server' -- The server defines the language
 
-    'session' -- The session defines the language (usefull for testing)
+    'session' -- The session defines the language (useful for testing)
 
-    'browser' -- The browser defines the language (usefull for testing)
+    'browser' -- The browser defines the language (useful for testing)
 
     'browser --> session --> server' -- Left criteria first
 
@@ -80,7 +80,7 @@
             self._policy = policy
         return property(get, set)
 
-    def _getLanguage(self, languages, request):
+    def getLanguage(self, languages, request):
         """Returns the language dependent on the policy."""
         policyList = self._policy.split(' --> ')
 
@@ -93,10 +93,21 @@
 
             # the language is handled by a session
             elif policy == 'session':
-                session = ILanguageSession(request)
-                lang = session.getLanguage()
-                if lang is not None:
-                    return lang
+                if self.cacheEnabled:
+                    try:
+                        cached = request.annotations[LANGUAGE_CACHE_KEY]
+                        return cached
+                    except KeyError:
+                        session = ILanguageSession(request)
+                        lang = session.getLanguage()
+                        if lang is not None:
+                            request.annotations[LANGUAGE_CACHE_KEY] = lang
+                            return lang
+                else:
+                    session = ILanguageSession(request)
+                    lang = session.getLanguage()
+                    if lang is not None:
+                        return lang
 
             # the language is handled by the browsers language settings
             elif policy == 'browser':
@@ -106,30 +117,6 @@
 
         return None
 
-    def getLanguage(self, languages, request):
-        if self.cacheEnabled:
-            try:
-                cached = request.annotations[LANGUAGE_CACHE_KEY]
-                if cached in languages:
-                    return cached
-
-                # If the user asked for a specific variation, but we don't
-                # have it available we may serve the most generic one,
-                # according to the spec (eg: user asks for ('en-us',
-                # 'de'), but we don't have 'en-us', then 'en' is preferred
-                # to 'de').
-                parts = cached.split('-')
-                if len(parts) > 1 and parts[0] in languages:
-                    return parts[0]
-
-                #if there's still no match, we have to run through _getLanguage
-            except KeyError:
-                lang = self._getLanguage(languages, request)
-                request.annotations[LANGUAGE_CACHE_KEY] = lang
-                return lang
-
-        return self._getLanguage(languages, request)
-
     def clearCache(self, request):
         try:
             del request.annotations[LANGUAGE_CACHE_KEY]

Modified: z3c.language.negotiator/trunk/src/z3c/language/negotiator/tests.py
===================================================================
--- z3c.language.negotiator/trunk/src/z3c/language/negotiator/tests.py	2010-10-01 14:44:45 UTC (rev 117124)
+++ z3c.language.negotiator/trunk/src/z3c/language/negotiator/tests.py	2010-10-01 15:29:15 UTC (rev 117125)
@@ -125,7 +125,7 @@
 
         self.negotiator.serverLanguage = u'en'
 
-        self.assertEqual(self.negotiator.getLanguage(('en', 'de'), env), 'de')
+        self.assertEqual(self.negotiator.getLanguage(('en', 'de'), env), 'en')
 
         env = testing.EnvStub(('pt-br','en'))
 
@@ -133,7 +133,7 @@
 
         self.negotiator.serverLanguage = u'de'
 
-        self.assertEqual(self.negotiator.getLanguage(('en', 'de'), env), 'en')
+        self.assertEqual(self.negotiator.getLanguage(('en', 'de'), env), 'de')
 
         self.negotiator.clearCache(env)
 



More information about the checkins mailing list