[Checkins] SVN: Products.CMFDefault/trunk/Products/CMFDefault/browser/skins/ - fixed some decoding issues

Yvo Schubbe cvs-admin at zope.org
Thu Jun 7 16:49:41 UTC 2012


Log message for revision 126671:
  - fixed some decoding issues

Changed:
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/skins/tests/test_ursa.py
  U   Products.CMFDefault/trunk/Products/CMFDefault/browser/skins/ursa.py

-=-
Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/skins/tests/test_ursa.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/skins/tests/test_ursa.py	2012-06-07 16:28:16 UTC (rev 126670)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/skins/tests/test_ursa.py	2012-06-07 16:49:37 UTC (rev 126671)
@@ -17,6 +17,8 @@
 
 from zope.component import getSiteManager
 from zope.component.testing import PlacelessSetup
+from zope.i18n.interfaces import IUserPreferredCharsets
+from zope.interface import alsoProvides
 
 from Products.CMFCore.interfaces import IActionsTool
 from Products.CMFCore.interfaces import IMembershipTool
@@ -189,16 +191,43 @@
         getSiteManager().registerUtility(tool, IURLTool)
         self.assertEqual(view.portal_title, 'TITLE')
 
+    def test_portal_title_nonascii(self):
+        NONASCII = u'B\xe4r'
+        context = self._makeContext()
+        view = self._makeOne(context)
+        context.Title = lambda: NONASCII.encode('latin-1')
+        context.portal_properties.default_charset = 'latin1'
+        tool = DummyURLTool()
+        tool.getPortalObject = lambda: context
+        getSiteManager().registerUtility(tool, IURLTool)
+        self.assertEqual(view.portal_title, NONASCII)
+
     def test_object_title(self):
         view = self._makeOne()
         view.context.Title = lambda: 'TITLE'
         self.assertEqual(view.object_title, 'TITLE')
 
+    def test_object_title_nonascii(self):
+        NONASCII = u'B\xe4r'
+        context = self._makeContext()
+        view = self._makeOne(context)
+        view.context.Title = lambda: NONASCII.encode('latin-1')
+        context.portal_properties.default_charset = 'latin1'
+        self.assertEqual(view.object_title, NONASCII)
+
     def test_object_description(self):
         view = self._makeOne()
-        view.context.Title = lambda: 'TITLE'
-        self.assertEqual(view.object_title, 'TITLE')
+        view.context.Description = lambda: 'DESCRIPTION'
+        self.assertEqual(view.object_description, 'DESCRIPTION')
 
+    def test_object_description_nonascii(self):
+        NONASCII = u'B\xe4r'
+        context = self._makeContext()
+        view = self._makeOne(context)
+        view.context.Description = lambda: NONASCII.encode('latin-1')
+        context.portal_properties.default_charset = 'latin1'
+        self.assertEqual(view.object_description, NONASCII)
+
     def test_trunc_id(self):
         view = self._makeOne()
         view.context.getId = lambda: 'ID'
@@ -365,8 +394,18 @@
     def test_status_message(self):
         view = self._makeOne()
         view.request.form = {'portal_status_message': 'FOO'}
+        view.request.getPreferredCharsets = lambda: []
+        alsoProvides(view.request, IUserPreferredCharsets)
         self.assertEqual(view.status_message, 'FOO')
 
+    def test_status_message_nonascii(self):
+        NONASCII = u'B\xe4r'
+        view = self._makeOne()
+        view.request.form = {'portal_status_message': NONASCII.encode('utf-8')}
+        view.request.getPreferredCharsets = lambda: ['utf-8']
+        alsoProvides(view.request, IUserPreferredCharsets)
+        self.assertEqual(view.status_message, NONASCII)
+
     def test_actions(self):
         ACTIONS = {'global': [],
                    'user': [],

Modified: Products.CMFDefault/trunk/Products/CMFDefault/browser/skins/ursa.py
===================================================================
--- Products.CMFDefault/trunk/Products/CMFDefault/browser/skins/ursa.py	2012-06-07 16:28:16 UTC (rev 126670)
+++ Products.CMFDefault/trunk/Products/CMFDefault/browser/skins/ursa.py	2012-06-07 16:49:37 UTC (rev 126671)
@@ -13,20 +13,20 @@
 """
 """
 
-from zope.component import getUtility, ComponentLookupError
+from Acquisition import aq_get
+from zope.component import ComponentLookupError
+from zope.component import getUtility
 from zope.component import queryUtility
 
-from Acquisition import aq_get
-
 from Products.CMFCore.interfaces import IActionsTool
 from Products.CMFCore.interfaces import IMembershipTool
 from Products.CMFCore.interfaces import IPropertiesTool
 from Products.CMFCore.interfaces import ISyndicationTool
 from Products.CMFCore.interfaces import IURLTool
 from Products.CMFCore.interfaces import IWorkflowTool
+from Products.CMFDefault.browser.utils import decode
 from Products.CMFDefault.browser.utils import memoize
 from Products.CMFDefault.browser.utils import ViewBase
-from Products.CMFDefault.utils import decode
 from Products.CMFDefault.utils import Message as _
 from Products.CMFDefault.utils import PRODUCTS_CMFCALENDAR_INSTALLED
 from Products.CMFDefault.utils import PRODUCTS_CMFUID_INSTALLED
@@ -136,16 +136,19 @@
 
     @property
     @memoize
+    @decode
     def portal_title(self):
         return self.portal_object.Title()
 
     @property
     @memoize
+    @decode
     def object_title(self):
         return self.context.Title()
 
     @property
     @memoize
+    @decode
     def object_description(self):
         return self.context.Description()
 
@@ -179,24 +182,25 @@
         page_title = self.object_title
 
         if page_title != site_title:
-            page_title = site_title + ": " + page_title
+            page_title = site_title + u": " + page_title
 
-        return decode(page_title, self.context)
+        return page_title
 
     @property
     @memoize
+    @decode
     def breadcrumbs(self):
         # XXX Shouldn't we just be walking up the aq_inner chain?
         result = [{'id': _(u'root'),
-                   'title' : self.ptool.title(),
-                   'url' : self.portal_url,
+                   'title': self.ptool.title(),
+                   'url': self.portal_url,
                   }]
 
         relative = self.utool.getRelativeContentPath(self.context)
         portal = self.portal_object
 
         for i, token in enumerate(relative):
-            now = relative[:i+1]
+            now = relative[:i + 1]
             obj = portal.unrestrictedTraverse(now)
             if token != 'talkback':
                 result.append({'id': token,
@@ -213,6 +217,7 @@
 
     @property
     @memoize
+    @decode
     def membername(self):
         return self.isAnon and 'Guest' or (self.member.getProperty('fullname')
                                            or self.member.getId())
@@ -231,8 +236,9 @@
     @memoize
     def status_message(self):
         message = self.request.form.get('portal_status_message')
-        if message is not None:
-            message = decode(message, self.context)
+        if message and isinstance(message, str):
+            # portal_status_message uses always the browser charset.
+            message = message.decode(self._getBrowserCharset())
         return message
 
     @property



More information about the checkins mailing list