[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