Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge branch 't20812'

  • Loading branch information...
commit 85359ec9a4514087e2cc666b77eb635aacba5073 2 parents cc957cb + 2326ded
@apollo13 apollo13 authored
Showing with 24 additions and 10 deletions.
  1. +8 −9 django/utils/encoding.py
  2. +16 −1 tests/utils_tests/test_encoding.py
View
17 django/utils/encoding.py
@@ -67,16 +67,15 @@ def force_text(s, encoding='utf-8', strings_only=False, errors='strict'):
return s
try:
if not isinstance(s, six.string_types):
- if hasattr(s, '__unicode__'):
- s = s.__unicode__()
- else:
- if six.PY3:
- if isinstance(s, bytes):
- s = six.text_type(s, encoding, errors)
- else:
- s = six.text_type(s)
+ if six.PY3:
+ if isinstance(s, bytes):
+ s = six.text_type(s, encoding, errors)
else:
- s = six.text_type(bytes(s), encoding, errors)
+ s = six.text_type(s)
+ elif hasattr(s, '__unicode__'):
+ s = six.text_type(s)
+ else:
+ s = six.text_type(bytes(s), encoding, errors)
else:
# Note: We use .decode() here, instead of six.text_type(s, encoding,
# errors), so that if s is a SafeBytes, it ends up being a
View
17 tests/utils_tests/test_encoding.py
@@ -4,10 +4,25 @@
import unittest
import datetime
-from django.utils.encoding import force_bytes, filepath_to_uri
+from django.utils import six
+from django.utils.encoding import force_bytes, force_text, filepath_to_uri
class TestEncodingUtils(unittest.TestCase):
+ def test_force_text_exception(self):
+ """
+ Check that broken __unicode__/__str__ actually raises an error.
+ """
+ class MyString(object):
+ def __str__(self):
+ return b'\xc3\xb6\xc3\xa4\xc3\xbc'
+
+ __unicode__ = __str__
+
+ # str(s) raises a TypeError on python 3 if the result is not a text type.
+ # python 2 fails when it tries converting from str to unicode (via ASCII).
+ exception = TypeError if six.PY3 else UnicodeError
+ self.assertRaises(exception, force_text, MyString())
def test_force_bytes_exception(self):
"""
Please sign in to comment.
Something went wrong with that request. Please try again.