[Checkins] SVN: Sandbox/nadako/zope.publisher/ Make a branch for zope.publisher that includes parts of refactored zope.app.publisher.

Dan Korostelev nadako at gmail.com
Mon Aug 24 11:03:12 EDT 2009


Log message for revision 103155:
  Make a branch for zope.publisher that includes parts of refactored zope.app.publisher.

Changed:
  A   Sandbox/nadako/zope.publisher/
  U   Sandbox/nadako/zope.publisher/src/zope/publisher/browser.py
  U   Sandbox/nadako/zope.publisher/src/zope/publisher/configure.zcml
  U   Sandbox/nadako/zope.publisher/src/zope/publisher/tests/test_browserlanguages.py

-=-
Modified: Sandbox/nadako/zope.publisher/src/zope/publisher/browser.py
===================================================================
--- zope.publisher/trunk/src/zope/publisher/browser.py	2009-08-24 14:45:16 UTC (rev 103154)
+++ Sandbox/nadako/zope.publisher/src/zope/publisher/browser.py	2009-08-24 15:03:12 UTC (rev 103155)
@@ -32,6 +32,7 @@
 from zope.interface import implements, directlyProvides
 from zope.i18n.interfaces import IUserPreferredLanguages
 from zope.i18n.interfaces import IUserPreferredCharsets
+from zope.i18n.interfaces import IModifiableUserPreferredLanguages
 from zope.location import Location
 
 from zope.publisher.interfaces import NotFound
@@ -823,6 +824,49 @@
 
         return [lang for quality, lang in accepts]
 
+class NotCompatibleAdapterError(Exception):
+    """Adapter not compatible with
+       zope.i18n.interfaces.IModifiableBrowserLanguages has been used.
+    """
+
+BROWSER_LANGUAGES_KEY = "zope.publisher.browser.IUserPreferredLanguages"
+
+class CacheableBrowserLanguages(BrowserLanguages):
+
+    implements(IUserPreferredLanguages)
+
+    def getPreferredLanguages(self):
+        languages_data = self._getLanguagesData()
+        if "overridden" in languages_data:
+            return languages_data["overridden"]
+        elif "cached" not in languages_data:
+            languages_data["cached"] = super(
+                CacheableBrowserLanguages, self).getPreferredLanguages()
+        return languages_data["cached"]
+
+    def _getLanguagesData(self):
+        annotations = self.request.annotations
+        languages_data = annotations.get(BROWSER_LANGUAGES_KEY)
+        if languages_data is None:
+            annotations[BROWSER_LANGUAGES_KEY] = languages_data = {}
+        return languages_data
+
+class ModifiableBrowserLanguages(CacheableBrowserLanguages):
+
+    implements(IModifiableUserPreferredLanguages)
+
+    def setPreferredLanguages(self, languages):
+        languages_data = self.request.annotations.get(BROWSER_LANGUAGES_KEY)
+        if languages_data is None:
+            # Better way to create a compatible with
+            # IModifiableUserPreferredLanguages adapter is to use
+            # CacheableBrowserLanguages as base class or as example.
+            raise NotCompatibleAdapterError("Adapter not compatible with "
+                "zope.i18n.interfaces.IModifiableBrowserLanguages "
+                "has been used.")
+        languages_data["overridden"] = languages
+        self.request.setupLocale()
+
 class BrowserView(Location):
     """Browser View.
 

Modified: Sandbox/nadako/zope.publisher/src/zope/publisher/configure.zcml
===================================================================
--- zope.publisher/trunk/src/zope/publisher/configure.zcml	2009-08-24 14:45:16 UTC (rev 103154)
+++ Sandbox/nadako/zope.publisher/src/zope/publisher/configure.zcml	2009-08-24 15:03:12 UTC (rev 103155)
@@ -16,9 +16,46 @@
         zcml:condition="installed zope.annotation"
         interface="zope.annotation.interfaces.IAttributeAnnotatable"
         />
+    <require
+        permission="zope.View"
+        interface="zope.publisher.interfaces.http.IHTTPApplicationRequest"/>
   </class>
 
+  <class class="zope.publisher.http.URLGetter">
+    <allow attributes="get __getitem__ __str__" />
+  </class>
+
+  <class class="zope.publisher.http.DirectResult">
+    <allow interface="zope.publisher.http.IResult" />
+  </class>
+
+  <class class="zope.publisher.browser.BrowserRequest">
+    <allow
+      interface="zope.publisher.interfaces.browser.IBrowserApplicationRequest"
+      attributes="response locale __str__"
+      />
+  </class>
+
+  <class class="zope.publisher.browser.TestRequest">
+    <allow
+      interface="zope.publisher.interfaces.browser.IBrowserApplicationRequest"
+      attributes="response"
+      />
+  </class>
+
+  <class class="zope.publisher.browser.BrowserResponse">
+    <allow
+      interface="zope.publisher.interfaces.http.IHTTPResponse"
+      />
+  </class>
+
   <adapter factory="zope.publisher.http.HTTPCharsets" />
+
+  <adapter
+    factory=".browser.ModifiableBrowserLanguages"
+    for="zope.publisher.interfaces.http.IHTTPRequest"
+    provides="zope.i18n.interfaces.IModifiableUserPreferredLanguages"
+    />
   
   <class class="xmlrpclib.Binary">
     <allow attributes="data encode decode" />

Modified: Sandbox/nadako/zope.publisher/src/zope/publisher/tests/test_browserlanguages.py
===================================================================
--- zope.publisher/trunk/src/zope/publisher/tests/test_browserlanguages.py	2009-08-24 14:45:16 UTC (rev 103154)
+++ Sandbox/nadako/zope.publisher/src/zope/publisher/tests/test_browserlanguages.py	2009-08-24 15:03:12 UTC (rev 103155)
@@ -18,8 +18,10 @@
 import unittest
 
 from zope.publisher.browser import BrowserLanguages
+from zope.publisher.browser import CacheableBrowserLanguages
+from zope.publisher.browser import ModifiableBrowserLanguages
+from zope.publisher.browser import NotCompatibleAdapterError
 
-
 # Note: The expected output is in order of preference,
 # empty 'q=' means 'q=1', and if theres more than one
 # empty, we assume they are in order of preference.
@@ -54,10 +56,44 @@
             self.assertEqual(list(browser_languages.getPreferredLanguages()),
                              expected)
 
+class CacheableBrowserLanguagesTests(BrowserLanguagesTest):
 
+    def factory(self, request):
+        return CacheableBrowserLanguages(request)
+
+    def test_cached_languages(self):
+        eq = self.failUnlessEqual
+        request = TestRequest("da, en, pt")
+        browser_languages = self.factory(request)
+        eq(list(browser_languages.getPreferredLanguages()), ["da", "en", "pt"])
+        request["HTTP_ACCEPT_LANGUAGE"] = "ru, en"
+        eq(list(browser_languages.getPreferredLanguages()), ["da", "en", "pt"])
+
+class ModifiableBrowserLanguagesTests(CacheableBrowserLanguagesTests):
+
+    def factory(self, request):
+        return ModifiableBrowserLanguages(request)
+
+    def test_setPreferredLanguages(self):
+        eq = self.failUnlessEqual
+        request = TestRequest("da, en, pt")
+        browser_languages = self.factory(request)
+        eq(list(browser_languages.getPreferredLanguages()), ["da", "en", "pt"])
+        browser_languages.setPreferredLanguages(["ru", "en"])
+        self.failUnless(request.localized)
+        eq(list(browser_languages.getPreferredLanguages()), ["ru", "en"])
+
+    def test_conflicting_adapters(self):
+        request = TestRequest("da, en, pt")
+        not_compatible_browser_languages = BrowserLanguages(request)
+        browser_languages = self.factory(request)
+        self.assertRaises(NotCompatibleAdapterError,
+            browser_languages.setPreferredLanguages, ["ru", "en"])
+
+
 def test_suite():
-    loader=unittest.TestLoader()
-    return loader.loadTestsFromTestCase(BrowserLanguagesTest)
-
-if __name__=='__main__':
-    unittest.TextTestRunner().run(test_suite())
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(BrowserLanguagesTest))
+    suite.addTest(unittest.makeSuite(CacheableBrowserLanguagesTests))
+    suite.addTest(unittest.makeSuite(ModifiableBrowserLanguagesTests))
+    return suite



More information about the Checkins mailing list