[1.8.x] Fixed #24252 -- Forced lazy __str__ to utf-8 on Python 2

Thanks Stanislas Guerra for the report and Tomas Ehrlich for
the review.
Backport of cd0ceaa102 from master.
This commit is contained in:
Claude Paroz 2015-01-31 16:05:16 +01:00
parent d88c24f436
commit ea3e40c278
2 changed files with 15 additions and 0 deletions

View File

@ -120,6 +120,7 @@ def lazy(func, *resultclasses):
cls.__str__ = cls.__text_cast cls.__str__ = cls.__text_cast
else: else:
cls.__unicode__ = cls.__text_cast cls.__unicode__ = cls.__text_cast
cls.__str__ = cls.__bytes_cast_encoded
elif cls._delegate_bytes: elif cls._delegate_bytes:
if six.PY3: if six.PY3:
cls.__bytes__ = cls.__bytes_cast cls.__bytes__ = cls.__bytes_cast
@ -142,6 +143,9 @@ def lazy(func, *resultclasses):
def __bytes_cast(self): def __bytes_cast(self):
return bytes(func(*self.__args, **self.__kw)) return bytes(func(*self.__args, **self.__kw))
def __bytes_cast_encoded(self):
return func(*self.__args, **self.__kw).encode('utf-8')
def __cast(self): def __cast(self):
if self._delegate_bytes: if self._delegate_bytes:
return self.__bytes_cast() return self.__bytes_cast()

View File

@ -318,6 +318,17 @@ class ReverseLazyTest(TestCase):
response = self.client.get('/login_required_view/') response = self.client.get('/login_required_view/')
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
def test_inserting_reverse_lazy_into_string(self):
self.assertEqual(
'Some URL: %s' % reverse_lazy('some-login-page'),
'Some URL: /login/'
)
if six.PY2:
self.assertEqual(
b'Some URL: %s' % reverse_lazy('some-login-page'),
'Some URL: /login/'
)
class ReverseLazySettingsTest(AdminScriptTestCase): class ReverseLazySettingsTest(AdminScriptTestCase):
""" """