Commit 032c0916 authored by Thomas Chaumeny's avatar Thomas Chaumeny Committed by Aymeric Augustin
Browse files

Fixed #23388 -- Made django.utils.timezone.override usable as a decorator

parent 8b6cb9d0
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ except ImportError:

from django.conf import settings
from django.utils import six
from django.utils.decorators import ContextDecorator

__all__ = [
    'utc', 'get_fixed_timezone',
@@ -248,7 +249,7 @@ def deactivate():
        del _active.value


class override(object):
class override(ContextDecorator):
    """
    Temporarily set the time zone for the current thread.

+4 −0
Original line number Diff line number Diff line
@@ -901,6 +901,10 @@ appropriate entities.
    ``None``, the :ref:`current time zone <default-current-time-zone>` is unset
    on entry with :func:`deactivate()` instead.

    .. versionchanged:: 1.8

        ``override`` is now usable as a function decorator.

.. function:: localtime(value, timezone=None)

    Converts an aware :class:`~datetime.datetime` to a different time zone,
+30 −0
Original line number Diff line number Diff line
@@ -71,6 +71,36 @@ class TimezoneTests(unittest.TestCase):
        finally:
            timezone.deactivate()

    def test_override_decorator(self):
        default = timezone.get_default_timezone()

        @timezone.override(EAT)
        def func_tz_eat():
            self.assertIs(EAT, timezone.get_current_timezone())

        @timezone.override(None)
        def func_tz_none():
            self.assertIs(default, timezone.get_current_timezone())

        try:
            timezone.activate(ICT)

            func_tz_eat()
            self.assertIs(ICT, timezone.get_current_timezone())

            func_tz_none()
            self.assertIs(ICT, timezone.get_current_timezone())

            timezone.deactivate()

            func_tz_eat()
            self.assertIs(default, timezone.get_current_timezone())

            func_tz_none()
            self.assertIs(default, timezone.get_current_timezone())
        finally:
            timezone.deactivate()

    def test_copy(self):
        self.assertIsInstance(copy.copy(timezone.UTC()), timezone.UTC)
        self.assertIsInstance(copy.copy(timezone.LocalTimezone()), timezone.LocalTimezone)