Commit efcbf3e0 authored by Thomas Chaumeny's avatar Thomas Chaumeny Committed by Simon Charette
Browse files

Fixed #23381 -- Context manager restored state should be determined in __enter__

parent 569e0a29
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -262,9 +262,9 @@ class override(object):
    """
    def __init__(self, timezone):
        self.timezone = timezone
        self.old_timezone = getattr(_active, 'value', None)

    def __enter__(self):
        self.old_timezone = getattr(_active, 'value', None)
        if self.timezone is None:
            deactivate()
        else:
+1 −1
Original line number Diff line number Diff line
@@ -154,9 +154,9 @@ class override(ContextDecorator):
    def __init__(self, language, deactivate=False):
        self.language = language
        self.deactivate = deactivate
        self.old_language = get_language()

    def __enter__(self):
        self.old_language = get_language()
        if self.language is not None:
            activate(self.language)
        else:
+19 −1
Original line number Diff line number Diff line
@@ -74,7 +74,6 @@ class TranslationTests(TestCase):
            deactivate()

    def test_override_decorator(self):
        activate('de')

        @translation.override('pl')
        def func_pl():
@@ -85,6 +84,7 @@ class TranslationTests(TestCase):
            self.assertEqual(get_language(), settings.LANGUAGE_CODE)

        try:
            activate('de')
            func_pl()
            self.assertEqual(get_language(), 'de')
            func_none()
@@ -92,6 +92,24 @@ class TranslationTests(TestCase):
        finally:
            deactivate()

    def test_override_exit(self):
        """
        Test that the language restored is the one used when the function was
        called, not the one used when the decorator was initialized. refs #23381
        """
        activate('fr')
        @translation.override('pl')
        def func_pl():
            pass
        deactivate()

        try:
            activate('en')
            func_pl()
            self.assertEqual(get_language(), 'en')
        finally:
            deactivate()

    def test_lazy_objects(self):
        """
        Format string interpolation should work with *_lazy objects.