SVN: CMF/trunk/C fixed some encoding issues with forms/formlib:

Yvo Schubbe <[email protected]>
Newsgroups gmane.comp.web.zope.cmf.cvs
Message-ID <[email protected]>
Log message for revision 69110:
  fixed some encoding issues with forms/formlib:
  - added getBrowserCharset function
  - changed portal_status_message encoding
  - made sure getMainGlobals does not override the Content-Type charset if already set

Changed:
  U   CMF/trunk/CHANGES.txt
  U   CMF/trunk/CMFDefault/browser/utils.py
  U   CMF/trunk/CMFDefault/skins/zpt_control/setRedirect.py
  U   CMF/trunk/CMFDefault/skins/zpt_generic/getMainGlobals.py
  U   CMF/trunk/CMFDefault/utils.py

-=-
Modified: CMF/trunk/CHANGES.txt
===================================================================
--- CMF/trunk/CHANGES.txt	2006-07-13 15:17:21 UTC (rev 69109)
+++ CMF/trunk/CHANGES.txt	2006-07-13 15:21:06 UTC (rev 69110)
@@ -2,6 +2,10 @@
 
   New Features
 
+    - CMFDefault utils: Added getBrowserCharset function.
+      Returns the charset preferred by the browser. Strings encoded with this
+      charset are decoded correctly by Five.browser.decode.processInputs.
+
     - Content: Added IFactory utilities for all content classes.
       They are now used by default instead of the old constructor methods.
 
@@ -15,6 +19,10 @@
 
   Others
 
+    - skins: Changed encoding of translated portal_status_messages.
+      Now getBrowserCharset is used to play nice with Five forms. Customized
+      setRedirect and getMainGlobals scripts have to be updated.
+
     - FSFile: Added registration for 'txt' extension.
 
     - Profiles: All profiles are now registered by ZCML.

Modified: CMF/trunk/CMFDefault/browser/utils.py
===================================================================
--- CMF/trunk/CMFDefault/browser/utils.py	2006-07-13 15:17:21 UTC (rev 69109)
+++ CMF/trunk/CMFDefault/browser/utils.py	2006-07-13 15:21:06 UTC (rev 69110)
@@ -25,6 +25,7 @@
 
 from Products.CMFCore.utils import getToolByName
 from Products.CMFDefault.permissions import View
+from Products.CMFDefault.utils import getBrowserCharset
 from Products.CMFDefault.utils import html_marshal
 from Products.CMFDefault.utils import Message as _
 from Products.CMFDefault.utils import translate
@@ -92,6 +93,10 @@
         ptool = self._getTool('portal_properties')
         return ptool.getProperty('default_charset', None)
 
+    @memoize
+    def _getBrowserCharset(self):
+        return getBrowserCharset(self.request)
+
     # interface
 
     @memoize
@@ -120,7 +125,7 @@
         message = self.request.other.get('portal_status_message', '')
         if message:
             if isinstance(message, unicode):
-                message = message.encode(self._getDefaultCharset())
+                message = message.encode(self._getBrowserCharset())
             kw['portal_status_message'] = message
         for k in keys.split(','):
             k = k.strip()

Modified: CMF/trunk/CMFDefault/skins/zpt_control/setRedirect.py
===================================================================
--- CMF/trunk/CMFDefault/skins/zpt_control/setRedirect.py	2006-07-13 15:17:21 UTC (rev 69109)
+++ CMF/trunk/CMFDefault/skins/zpt_control/setRedirect.py	2006-07-13 15:21:06 UTC (rev 69110)
@@ -2,10 +2,9 @@
 ##
 from ZTUtils import make_query
 from Products.CMFCore.utils import getToolByName
+from Products.CMFDefault.utils import getBrowserCharset
 
 utool = getToolByName(script, 'portal_url')
-ptool = getToolByName(script, 'portal_properties')
-default_charset = ptool.getProperty('default_charset', None)
 portal_url = utool()
 
 
@@ -17,7 +16,7 @@
 message = context.REQUEST.other.get('portal_status_message', '')
 if message:
     if isinstance(message, unicode):
-        message = unicode(message).encode(default_charset)
+        message = unicode(message).encode(getBrowserCharset(context.REQUEST))
     kw['portal_status_message'] = message
 for k, v in kw.items():
     if not v:

Modified: CMF/trunk/CMFDefault/skins/zpt_generic/getMainGlobals.py
===================================================================
--- CMF/trunk/CMFDefault/skins/zpt_generic/getMainGlobals.py	2006-07-13 15:17:21 UTC (rev 69109)
+++ CMF/trunk/CMFDefault/skins/zpt_generic/getMainGlobals.py	2006-07-13 15:21:06 UTC (rev 69110)
@@ -2,6 +2,7 @@
 ##
 from Products.CMFCore.utils import getToolByName
 from Products.CMFDefault.utils import decode
+from Products.CMFDefault.utils import getBrowserCharset
 
 atool = getToolByName(script, 'portal_actions')
 mtool = getToolByName(script, 'portal_membership')
@@ -10,14 +11,18 @@
 wtool = getToolByName(script, 'portal_workflow')
 portal_object = utool.getPortalObject()
 
-default_charset = ptool.getProperty('default_charset', None)
-if default_charset:
-    context.REQUEST.RESPONSE.setHeader('Content-Type',
-                                     'text/html;charset=%s' % default_charset)
+if not 'charset' in context.REQUEST.RESPONSE.getHeader('content-type'):
+    # Some newstyle views set a different charset - don't override it.
+    # Oldstyle views need the default_charset.
+    default_charset = ptool.getProperty('default_charset', None)
+    if default_charset:
+        context.REQUEST.RESPONSE.setHeader('content-type',
+                                    'text/html; charset=%s' % default_charset)
 
 message = context.REQUEST.get('portal_status_message')
 if message and isinstance(message, str):
-    message = message.decode(default_charset)
+    # portal_status_message uses always the browser charset.
+    message = message.decode(getBrowserCharset(context.REQUEST))
 
 globals = {'utool': utool,
            'mtool': mtool,

Modified: CMF/trunk/CMFDefault/utils.py
===================================================================
--- CMF/trunk/CMFDefault/utils.py	2006-07-13 15:17:21 UTC (rev 69109)
+++ CMF/trunk/CMFDefault/utils.py	2006-07-13 15:21:06 UTC (rev 69110)
@@ -26,6 +26,7 @@
 from Products.PageTemplates.GlobalTranslationService \
         import getGlobalTranslationService
 from ZTUtils.Zope import complex_marshal
+from zope.i18n.interfaces import IUserPreferredCharsets
 from zope.i18nmessageid import MessageFactory
 
 from Products.CMFCore.utils import getToolByName
@@ -457,5 +458,13 @@
             pass
     return GTS.translate('cmf_default', message, context=context)
 
+security.declarePublic('getBrowserCharset')
+def getBrowserCharset(request):
+    """ Get charset preferred by the browser.
+    """
+    envadapter = IUserPreferredCharsets(request)
+    charsets = envadapter.getPreferredCharsets() or ['utf-8']
+    return charsets[0]
+
 security.declarePublic('Message')
 Message = _ = MessageFactory('cmf_default')
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.