[1.9.x] Fixed #26212 -- Made forms.FileField and translation.lazy_number() picklable.
Backport of b59f963ad2
from master
This commit is contained in:
parent
33b5bb7930
commit
765e6c411c
|
@ -106,6 +106,8 @@ def lazy_number(func, resultclass, number=None, **kwargs):
|
||||||
kwargs['number'] = number
|
kwargs['number'] = number
|
||||||
proxy = lazy(func, resultclass)(**kwargs)
|
proxy = lazy(func, resultclass)(**kwargs)
|
||||||
else:
|
else:
|
||||||
|
original_kwargs = kwargs.copy()
|
||||||
|
|
||||||
class NumberAwareString(resultclass):
|
class NumberAwareString(resultclass):
|
||||||
def __mod__(self, rhs):
|
def __mod__(self, rhs):
|
||||||
if isinstance(rhs, dict) and number:
|
if isinstance(rhs, dict) and number:
|
||||||
|
@ -128,9 +130,14 @@ def lazy_number(func, resultclass, number=None, **kwargs):
|
||||||
return translated
|
return translated
|
||||||
|
|
||||||
proxy = lazy(lambda **kwargs: NumberAwareString(), NumberAwareString)(**kwargs)
|
proxy = lazy(lambda **kwargs: NumberAwareString(), NumberAwareString)(**kwargs)
|
||||||
|
proxy.__reduce__ = lambda: (_lazy_number_unpickle, (func, resultclass, number, original_kwargs))
|
||||||
return proxy
|
return proxy
|
||||||
|
|
||||||
|
|
||||||
|
def _lazy_number_unpickle(func, resultclass, number, kwargs):
|
||||||
|
return lazy_number(func, resultclass, number=number, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def ngettext_lazy(singular, plural, number=None):
|
def ngettext_lazy(singular, plural, number=None):
|
||||||
return lazy_number(ngettext, str, singular=singular, plural=plural, number=number)
|
return lazy_number(ngettext, str, singular=singular, plural=plural, number=number)
|
||||||
|
|
||||||
|
|
|
@ -14,3 +14,6 @@ Bugfixes
|
||||||
|
|
||||||
* Added system checks for query name clashes of hidden relationships
|
* Added system checks for query name clashes of hidden relationships
|
||||||
(:ticket:`26162`).
|
(:ticket:`26162`).
|
||||||
|
|
||||||
|
* Made ``forms.FileField`` and ``utils.translation.lazy_number()`` picklable
|
||||||
|
(:ticket:`26212`).
|
||||||
|
|
|
@ -24,3 +24,6 @@ Bugfixes
|
||||||
|
|
||||||
* Fixed regression with an ``__in=qs`` lookup for a ``ForeignKey`` with
|
* Fixed regression with an ``__in=qs`` lookup for a ``ForeignKey`` with
|
||||||
``to_field`` set (:ticket:`26196`).
|
``to_field`` set (:ticket:`26196`).
|
||||||
|
|
||||||
|
* Made ``forms.FileField`` and ``utils.translation.lazy_number()`` picklable
|
||||||
|
(:ticket:`26212`).
|
||||||
|
|
|
@ -919,6 +919,9 @@ class FieldsTests(SimpleTestCase):
|
||||||
# with here)
|
# with here)
|
||||||
self.assertTrue(f.has_changed('resume.txt', {'filename': 'resume.txt', 'content': 'My resume'}))
|
self.assertTrue(f.has_changed('resume.txt', {'filename': 'resume.txt', 'content': 'My resume'}))
|
||||||
|
|
||||||
|
def test_file_picklable(self):
|
||||||
|
self.assertIsInstance(pickle.loads(pickle.dumps(FileField())), FileField)
|
||||||
|
|
||||||
# ImageField ##################################################################
|
# ImageField ##################################################################
|
||||||
|
|
||||||
@skipIf(Image is None, "Pillow is required to test ImageField")
|
@skipIf(Image is None, "Pillow is required to test ImageField")
|
||||||
|
|
|
@ -239,6 +239,14 @@ class TranslationTests(SimpleTestCase):
|
||||||
)
|
)
|
||||||
self.assertEqual(result % {'name': 'Joe', 'num': 4}, "Joe has 4 good results")
|
self.assertEqual(result % {'name': 'Joe', 'num': 4}, "Joe has 4 good results")
|
||||||
|
|
||||||
|
def test_ungettext_lazy_pickle(self):
|
||||||
|
s1 = ungettext_lazy('%d good result', '%d good results')
|
||||||
|
self.assertEqual(s1 % 1, '1 good result')
|
||||||
|
self.assertEqual(s1 % 8, '8 good results')
|
||||||
|
s2 = pickle.loads(pickle.dumps(s1))
|
||||||
|
self.assertEqual(s2 % 1, '1 good result')
|
||||||
|
self.assertEqual(s2 % 8, '8 good results')
|
||||||
|
|
||||||
@override_settings(LOCALE_PATHS=extended_locale_paths)
|
@override_settings(LOCALE_PATHS=extended_locale_paths)
|
||||||
def test_pgettext(self):
|
def test_pgettext(self):
|
||||||
trans_real._active = local()
|
trans_real._active = local()
|
||||||
|
|
Loading…
Reference in New Issue