[Checkins] SVN: Zope/trunk/ - If `IBrowserPage` is provided by a view, form input is decoded.

Yvo Schubbe y.2011 at wcm-solutions.de
Tue Mar 8 04:36:32 EST 2011


Log message for revision 120792:
  - If `IBrowserPage` is provided by a view, form input is decoded.

Changed:
  U   Zope/trunk/doc/CHANGES.rst
  UU  Zope/trunk/src/ZPublisher/HTTPRequest.py
  UU  Zope/trunk/src/ZPublisher/Publish.py
  UU  Zope/trunk/src/ZPublisher/tests/testHTTPRequest.py

-=-
Modified: Zope/trunk/doc/CHANGES.rst
===================================================================
--- Zope/trunk/doc/CHANGES.rst	2011-03-08 07:57:53 UTC (rev 120791)
+++ Zope/trunk/doc/CHANGES.rst	2011-03-08 09:36:31 UTC (rev 120792)
@@ -28,6 +28,9 @@
 Features Added
 ++++++++++++++
 
+- ZPublisher: If `IBrowserPage` is provided by a view, form input is decoded.
+  This makes it easier to use ``zope.formlib`` and ``z3c.form`` in Zope 2.
+
 - Report success or failure (when known) of creating a new user with
   the addzope2user script.
 

Modified: Zope/trunk/src/ZPublisher/HTTPRequest.py
===================================================================
--- Zope/trunk/src/ZPublisher/HTTPRequest.py	2011-03-08 07:57:53 UTC (rev 120791)
+++ Zope/trunk/src/ZPublisher/HTTPRequest.py	2011-03-08 09:36:31 UTC (rev 120792)
@@ -40,7 +40,6 @@
 from ZPublisher.BaseRequest import BaseRequest
 from ZPublisher.BaseRequest import quote
 from ZPublisher.Converters import get_converter
-from ZPublisher.HTTPResponse import HTTPResponse
 from ZPublisher.maybe_lock import allocate_lock
 
 # Flags
@@ -1150,6 +1149,12 @@
             other['PATH_INFO'] = path = "%s/%s" % (path,meth)
             self._hacked_path = 1
 
+    def postProcessInputs(self):
+        """Process the values in request.form to decode strings to unicode.
+        """
+        for name, value in self.form.iteritems():
+            self.form[name] = _decode(value, default_encoding)
+
     def resolve_url(self, url):
         # Attempt to resolve a url into an object in the Zope
         # namespace. The url must be a fully-qualified url. The
@@ -1754,3 +1759,16 @@
         result.append((k, v))
 
     return result
+
+def _decode(value, charset):
+    """Recursively look for string values and decode.
+    """
+    if isinstance(value, list):
+        return [_decode(v, charset) for v in value]
+    elif isinstance(value, tuple):
+        return tuple(_decode(v, charset) for v in value)
+    elif isinstance(value, dict):
+        return dict((k, _decode(v, charset)) for k, v in value.iteritems())
+    elif isinstance(value, str):
+        return unicode(value, charset, 'replace')
+    return value


Property changes on: Zope/trunk/src/ZPublisher/HTTPRequest.py
___________________________________________________________________
Deleted: svn:keywords
   - Id

Modified: Zope/trunk/src/ZPublisher/Publish.py
===================================================================
--- Zope/trunk/src/ZPublisher/Publish.py	2011-03-08 07:57:53 UTC (rev 120791)
+++ Zope/trunk/src/ZPublisher/Publish.py	2011-03-08 09:36:31 UTC (rev 120792)
@@ -15,19 +15,26 @@
 
 import sys, os
 import transaction
-from Response import Response
-from Request import Request
-from maybe_lock import allocate_lock
-from mapply import mapply
+
 from zExceptions import Redirect
+from zope.event import notify
 from zope.publisher.interfaces import ISkinnable
+from zope.publisher.interfaces.browser import IBrowserPage
 from zope.publisher.skinnable import setDefaultSkin
 from zope.security.management import newInteraction, endInteraction
-from zope.event import notify
 
-from pubevents import PubStart, PubSuccess, PubFailure, \
-     PubBeforeCommit, PubAfterTraversal, PubBeforeAbort
+from .mapply import mapply
+from .maybe_lock import allocate_lock
+from .pubevents import PubAfterTraversal
+from .pubevents import PubBeforeAbort
+from .pubevents import PubBeforeCommit
+from .pubevents import PubFailure
+from .pubevents import PubStart
+from .pubevents import PubSuccess
+from .Request import Request
+from .Response import Response
 
+
 class Retry(Exception):
     """Raise this to retry a request
     """
@@ -114,6 +121,9 @@
 
         object=request.traverse(path, validated_hook=validated_hook)
 
+        if IBrowserPage.providedBy(object):
+            request.postProcessInputs()
+
         notify(PubAfterTraversal(request))
 
         if transactions_manager:


Property changes on: Zope/trunk/src/ZPublisher/Publish.py
___________________________________________________________________
Deleted: svn:keywords
   - Id

Modified: Zope/trunk/src/ZPublisher/tests/testHTTPRequest.py
===================================================================
--- Zope/trunk/src/ZPublisher/tests/testHTTPRequest.py	2011-03-08 07:57:53 UTC (rev 120791)
+++ Zope/trunk/src/ZPublisher/tests/testHTTPRequest.py	2011-03-08 09:36:31 UTC (rev 120792)
@@ -1,5 +1,8 @@
 import unittest
 
+from zope.testing.cleanup import cleanUp
+
+
 class RecordTests(unittest.TestCase):
 
     def test_repr(self):
@@ -11,8 +14,12 @@
         d = eval(r)
         self.assertEqual(d, rec.__dict__)
 
+
 class HTTPRequestTests(unittest.TestCase):
 
+    def tearDown(self):
+        cleanUp()
+
     def _getTargetClass(self):
         from ZPublisher.HTTPRequest import HTTPRequest
         return HTTPRequest
@@ -634,7 +641,33 @@
         self.assertEquals(req.cookies['multi2'],
                           'cookie data with unquoted spaces')
 
+    def test_postProcessInputs(self):
+        from ZPublisher.HTTPRequest import default_encoding
 
+        _NON_ASCII = u'\xc4\xd6\xdc'
+        req = self._makeOne()
+        req.form = {'foo': _NON_ASCII.encode(default_encoding),
+                    'foo_list': [_NON_ASCII.encode(default_encoding), 'SPAM'],
+                    'foo_tuple': (_NON_ASCII.encode(default_encoding), 'HAM'),
+                    'foo_dict': {'foo': _NON_ASCII, 'bar': 'EGGS'}}
+        req.postProcessInputs()
+        self.assertTrue(isinstance(req.form['foo'], unicode))
+        self.assertEqual(req.form['foo'], _NON_ASCII)
+        self.assertTrue(isinstance(req.form['foo_list'], list))
+        self.assertTrue(isinstance(req.form['foo_list'][0], unicode))
+        self.assertEqual(req.form['foo_list'][0], _NON_ASCII)
+        self.assertTrue(isinstance(req.form['foo_list'][1], unicode))
+        self.assertEqual(req.form['foo_list'][1], u'SPAM')
+        self.assertTrue(isinstance(req.form['foo_tuple'], tuple))
+        self.assertTrue(isinstance(req.form['foo_tuple'][0], unicode))
+        self.assertEqual(req.form['foo_tuple'][0], _NON_ASCII)
+        self.assertTrue(isinstance(req.form['foo_tuple'][1], unicode))
+        self.assertEqual(req.form['foo_tuple'][1], u'HAM')
+        self.assertTrue(isinstance(req.form['foo_dict'], dict))
+        self.assertTrue(isinstance(req.form['foo_dict']['foo'], unicode))
+        self.assertEqual(req.form['foo_dict']['foo'], _NON_ASCII)
+        self.assertTrue(isinstance(req.form['foo_dict']['bar'], unicode))
+        self.assertEqual(req.form['foo_dict']['bar'], u'EGGS')
 
     def test_close_removes_stdin_references(self):
         # Verifies that all references to the input stream go away on


Property changes on: Zope/trunk/src/ZPublisher/tests/testHTTPRequest.py
___________________________________________________________________
Deleted: svn:keywords
   - Id



More information about the checkins mailing list