[Checkins] SVN: DocumentTemplate/trunk/ - LP #143273: Enable the dtml-var modifiers url_quote, url_unquote,

Jens Vagelpohl jens at dataflake.org
Wed Jul 14 06:02:06 EDT 2010


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

Changed:
  U   DocumentTemplate/trunk/CHANGES.txt
  U   DocumentTemplate/trunk/src/DocumentTemplate/DT_Var.py
  U   DocumentTemplate/trunk/src/DocumentTemplate/tests/test_DT_Var.py

-=-
Modified: DocumentTemplate/trunk/CHANGES.txt
===================================================================
--- DocumentTemplate/trunk/CHANGES.txt	2010-07-14 09:52:44 UTC (rev 114734)
+++ DocumentTemplate/trunk/CHANGES.txt	2010-07-14 10:02:06 UTC (rev 114735)
@@ -4,7 +4,10 @@
 2.13.1 (unreleased)
 -------------------
 
+- LP #143273: Enable the dtml-var modifiers url_quote, url_unquote,
+  url_quote_plus and url_unquote_plus to handle unicode strings.
 
+
 2.13.0 (2010-06-19)
 -------------------
 

Modified: DocumentTemplate/trunk/src/DocumentTemplate/DT_Var.py
===================================================================
--- DocumentTemplate/trunk/src/DocumentTemplate/DT_Var.py	2010-07-14 09:52:44 UTC (rev 114734)
+++ DocumentTemplate/trunk/src/DocumentTemplate/DT_Var.py	2010-07-14 10:02:06 UTC (rev 114735)
@@ -339,15 +339,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: DocumentTemplate/trunk/src/DocumentTemplate/tests/test_DT_Var.py
===================================================================
--- DocumentTemplate/trunk/src/DocumentTemplate/tests/test_DT_Var.py	2010-07-14 09:52:44 UTC (rev 114734)
+++ DocumentTemplate/trunk/src/DocumentTemplate/tests/test_DT_Var.py	2010-07-14 10:02:06 UTC (rev 114735)
@@ -61,9 +61,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 checkins mailing list