[Zope-Checkins] SVN: Zope/branches/2.12/ - LP #143273: Enable the dtml-var modifiers url_quote, url_unquote,

Jens Vagelpohl jens at dataflake.org
Wed Jul 14 05:52:45 EDT 2010


Log message for revision 114734:
  - LP #143273: Enable the dtml-var modifiers url_quote, url_unquote,
    url_quote_plus and url_unquote_plus to handle unicode strings.
  

Changed:
  U   Zope/branches/2.12/doc/CHANGES.rst
  U   Zope/branches/2.12/src/DocumentTemplate/DT_Var.py
  U   Zope/branches/2.12/src/DocumentTemplate/tests/test_DT_Var.py

-=-
Modified: Zope/branches/2.12/doc/CHANGES.rst
===================================================================
--- Zope/branches/2.12/doc/CHANGES.rst	2010-07-14 06:59:19 UTC (rev 114733)
+++ Zope/branches/2.12/doc/CHANGES.rst	2010-07-14 09:52:44 UTC (rev 114734)
@@ -11,7 +11,10 @@
 Bugs Fixed
 ++++++++++
 
+- LP #143273: Enable the dtml-var modifiers url_quote, url_unquote, 
+  url_quote_plus and url_unquote_plus to handle unicode strings.
 
+
 2.12.9 (2010-07-13)
 -------------------
 

Modified: Zope/branches/2.12/src/DocumentTemplate/DT_Var.py
===================================================================
--- Zope/branches/2.12/src/DocumentTemplate/DT_Var.py	2010-07-14 06:59:19 UTC (rev 114733)
+++ Zope/branches/2.12/src/DocumentTemplate/DT_Var.py	2010-07-14 09:52:44 UTC (rev 114734)
@@ -342,15 +342,31 @@
 
 
 def url_quote(v, name='(Unknown name)', md={}):
+    if isinstance(v, unicode):
+        # quote does not handle unicode. Encoding to a "safe"
+        # intermediate encoding before quoting, then unencoding the result.
+        return quote(v.encode('utf-8')).decode('UTF-8')
     return quote(str(v))
 
 def url_quote_plus(v, name='(Unknown name)', md={}):
+    if isinstance(v, unicode):
+        # quote_plus does not handle unicode. Encoding to a "safe"
+        # intermediate encoding before quoting, then unencoding the result.
+        return quote_plus(v.encode('utf-8')).decode('UTF-8')
     return quote_plus(str(v))
 
 def url_unquote(v, name='(Unknown name)', md={}):
+    if isinstance(v, unicode):
+        # unquote does not handle unicode. Encoding to a "safe"
+        # intermediate encoding before quoting, then unencoding the result.
+        return unquote(v.encode('utf-8')).decode('UTF-8')
     return unquote(str(v))
 
 def url_unquote_plus(v, name='(Unknown name)', md={}):
+    if isinstance(v, unicode):
+        # unquote_plus does not handle unicode. Encoding to a "safe"
+        # intermediate encoding before quoting, then unencoding the result.
+        return unquote_plus(v.encode('utf-8')).decode('UTF-8')
     return unquote_plus(str(v))
 
 def newline_to_br(v, name='(Unknown name)', md={}):

Modified: Zope/branches/2.12/src/DocumentTemplate/tests/test_DT_Var.py
===================================================================
--- Zope/branches/2.12/src/DocumentTemplate/tests/test_DT_Var.py	2010-07-14 06:59:19 UTC (rev 114733)
+++ Zope/branches/2.12/src/DocumentTemplate/tests/test_DT_Var.py	2010-07-14 09:52:44 UTC (rev 114734)
@@ -62,9 +62,43 @@
 
         """
 
+
+class TestUrlQuoting(unittest.TestCase):
+
+    def test_url_quoting(self):
+        from DocumentTemplate.DT_Var import url_quote
+        from DocumentTemplate.DT_Var import url_unquote
+        unicode_value = u'G\xfcnther M\xfcller'
+        quoted_unicode_value = u'G%C3%BCnther%20M%C3%BCller'
+        utf8_value = unicode_value.encode('UTF-8')
+        quoted_utf8_value = 'G%C3%BCnther%20M%C3%BCller'
+
+        self.assertEquals(url_quote(unicode_value), quoted_unicode_value)
+        self.assertEquals(url_quote(utf8_value), quoted_utf8_value)
+        
+        self.assertEquals(url_unquote(quoted_unicode_value), unicode_value)
+        self.assertEquals(url_unquote(quoted_utf8_value), utf8_value)
+
+
+    def test_url_quoting_plus(self):
+        from DocumentTemplate.DT_Var import url_quote_plus
+        from DocumentTemplate.DT_Var import url_unquote_plus
+        unicode_value = u'G\xfcnther M\xfcller'
+        quoted_unicode_value = u'G%C3%BCnther+M%C3%BCller'
+        utf8_value = unicode_value.encode('UTF-8')
+        quoted_utf8_value = 'G%C3%BCnther+M%C3%BCller'
+
+        self.assertEquals(url_quote_plus(unicode_value), quoted_unicode_value)
+        self.assertEquals(url_quote_plus(utf8_value), quoted_utf8_value)
+        
+        self.assertEquals(url_unquote_plus(quoted_unicode_value), unicode_value)
+        self.assertEquals(url_unquote_plus(quoted_utf8_value), utf8_value)
+
+
 def test_suite():
     suite = unittest.TestSuite()
     suite.addTest(doctest.DocTestSuite())
+    suite.addTest(unittest.makeSuite(TestUrlQuoting))
     return suite
 
 if __name__ == '__main__':



More information about the Zope-Checkins mailing list