Loading django/utils/encoding.py +8 −9 Original line number Diff line number Diff line Loading @@ -67,14 +67,13 @@ 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) elif hasattr(s, '__unicode__'): s = six.text_type(s) else: s = six.text_type(bytes(s), encoding, errors) else: Loading tests/utils_tests/test_encoding.py +16 −1 Original line number Diff line number Diff line Loading @@ -4,10 +4,25 @@ from __future__ import unicode_literals 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): """ Loading Loading
django/utils/encoding.py +8 −9 Original line number Diff line number Diff line Loading @@ -67,14 +67,13 @@ 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) elif hasattr(s, '__unicode__'): s = six.text_type(s) else: s = six.text_type(bytes(s), encoding, errors) else: Loading
tests/utils_tests/test_encoding.py +16 −1 Original line number Diff line number Diff line Loading @@ -4,10 +4,25 @@ from __future__ import unicode_literals 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): """ Loading