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&amp;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 }}', '&lt;obj&gt;', s=s)
+
     def test_add_lazy_safe_text_and_safe_text(self):
         s = html.escape(lazystr('a'))
         s += mark_safe('&b')