Commit b59f963a authored by Alexey Kotlyarov's avatar Alexey Kotlyarov Committed by Tim Graham
Browse files

Fixed #26212 -- Made forms.FileField and translation.lazy_number() picklable.

parent 1ac7fdcd
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -106,6 +106,8 @@ def lazy_number(func, resultclass, number=None, **kwargs):
        kwargs['number'] = number
        proxy = lazy(func, resultclass)(**kwargs)
    else:
        original_kwargs = kwargs.copy()

        class NumberAwareString(resultclass):
            def __bool__(self):
                return bool(kwargs['singular'])
@@ -134,9 +136,14 @@ def lazy_number(func, resultclass, number=None, **kwargs):
                return translated

        proxy = lazy(lambda **kwargs: NumberAwareString(), NumberAwareString)(**kwargs)
        proxy.__reduce__ = lambda: (_lazy_number_unpickle, (func, resultclass, number, original_kwargs))
    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):
    return lazy_number(ngettext, str, singular=singular, plural=plural, number=number)

+3 −0
Original line number Diff line number Diff line
@@ -14,3 +14,6 @@ Bugfixes

* Added system checks for query name clashes of hidden relationships
  (:ticket:`26162`).

* Made ``forms.FileField`` and ``utils.translation.lazy_number()`` picklable
  (:ticket:`26212`).
+3 −0
Original line number Diff line number Diff line
@@ -24,3 +24,6 @@ Bugfixes

* Fixed regression with an ``__in=qs`` lookup for a ``ForeignKey`` with
  ``to_field`` set (:ticket:`26196`).

* Made ``forms.FileField`` and ``utils.translation.lazy_number()`` picklable
  (:ticket:`26212`).
+3 −0
Original line number Diff line number Diff line
@@ -949,6 +949,9 @@ class FieldsTests(SimpleTestCase):
        # with here)
        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 ##################################################################

    @skipIf(Image is None, "Pillow is required to test ImageField")
+8 −0
Original line number Diff line number Diff line
@@ -243,6 +243,14 @@ class TranslationTests(SimpleTestCase):
        self.assertTrue(ungettext_lazy('%d good result', '%d good results'))
        self.assertFalse(ungettext_lazy('', ''))

    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)
    def test_pgettext(self):
        trans_real._active = local()