From 5c5eb5fea4d7dcd2b0eed982021cfa8aeee2efd8 Mon Sep 17 00:00:00 2001 From: Aymeric Augustin <aymeric.augustin@m4x.org> Date: Tue, 23 Dec 2014 21:49:05 +0100 Subject: [PATCH] Fixed an inconsistency introduced in 547b1810. mark_safe and mark_for_escaping should have been kept similar. On Python 2 this change has no effect. On Python 3 it fixes the use case shown in the regression test for mark_for_escaping, which used to raise a TypeError. The regression test for mark_safe is just for completeness. --- django/utils/safestring.py | 2 +- tests/utils_tests/test_safestring.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/django/utils/safestring.py b/django/utils/safestring.py index ad8054fe0f..50b0c03686 100644 --- a/django/utils/safestring.py +++ b/django/utils/safestring.py @@ -144,4 +144,4 @@ def mark_for_escaping(s): return EscapeBytes(s) if isinstance(s, (six.text_type, Promise)): return EscapeText(s) - return EscapeBytes(bytes(s)) + return EscapeString(str(s)) diff --git a/tests/utils_tests/test_safestring.py b/tests/utils_tests/test_safestring.py index c953412430..053d9f42fa 100644 --- a/tests/utils_tests/test_safestring.py +++ b/tests/utils_tests/test_safestring.py @@ -33,6 +33,15 @@ class SafeStringTest(TestCase): self.assertIsInstance(mark_safe(b), SafeData) self.assertRenderEqual('{{ s }}', 'a&b', s=mark_safe(s)) + def test_mark_safe_object_implementing_dunder_str(self): + class Obj(object): + def __str__(self): + return '<obj>' + + s = mark_safe(Obj()) + + self.assertRenderEqual('{{ s }}', '<obj>', s=s) + def test_mark_for_escaping(self): s = mark_for_escaping('a&b') self.assertRenderEqual('{{ s }}', 'a&b', s=s) @@ -50,6 +59,15 @@ class SafeStringTest(TestCase): s = '<h1>interop</h1>' self.assertEqual(s, mark_safe(s).__html__()) + def test_mark_for_escaping_object_implementing_dunder_str(self): + class Obj(object): + def __str__(self): + return '<obj>' + + s = mark_for_escaping(Obj()) + + self.assertRenderEqual('{{ s }}', '<obj>', s=s) + def test_add_lazy_safe_text_and_safe_text(self): s = html.escape(lazystr('a')) s += mark_safe('&b')