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__': _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org https://mail.zope.org/mailman/listinfo/zope-checkins