mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-08 06:14:47 +03:00
When making datetimes aware, use the active timezone if it exists. Fixes #2850.
This commit is contained in:
parent
f33ca01511
commit
9c2cf518c2
|
@ -13,6 +13,7 @@ from django.core.exceptions import ValidationError as DjangoValidationError
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
from django.core.validators import RegexValidator, ip_address_validators
|
from django.core.validators import RegexValidator, ip_address_validators
|
||||||
from django.forms import ImageField as DjangoImageField
|
from django.forms import ImageField as DjangoImageField
|
||||||
|
from django.forms.utils import from_current_timezone
|
||||||
from django.utils import six, timezone
|
from django.utils import six, timezone
|
||||||
from django.utils.dateparse import parse_date, parse_datetime, parse_time
|
from django.utils.dateparse import parse_date, parse_datetime, parse_time
|
||||||
from django.utils.encoding import is_protected_type, smart_text
|
from django.utils.encoding import is_protected_type, smart_text
|
||||||
|
@ -903,6 +904,11 @@ class DateTimeField(Field):
|
||||||
When `self.default_timezone` is not `None`, always return aware datetimes.
|
When `self.default_timezone` is not `None`, always return aware datetimes.
|
||||||
"""
|
"""
|
||||||
if (self.default_timezone is not None) and not timezone.is_aware(value):
|
if (self.default_timezone is not None) and not timezone.is_aware(value):
|
||||||
|
# If a timezone is active, we want to use it, but if not we want to use the timezone
|
||||||
|
# specified for this field over the system's default timezone.
|
||||||
|
if hasattr(timezone._active, 'value'):
|
||||||
|
return from_current_timezone(value)
|
||||||
|
else:
|
||||||
return timezone.make_aware(value, self.default_timezone)
|
return timezone.make_aware(value, self.default_timezone)
|
||||||
elif (self.default_timezone is None) and timezone.is_aware(value):
|
elif (self.default_timezone is None) and timezone.is_aware(value):
|
||||||
return timezone.make_naive(value, timezone.UTC())
|
return timezone.make_naive(value, timezone.UTC())
|
||||||
|
|
|
@ -4,6 +4,7 @@ from decimal import Decimal
|
||||||
|
|
||||||
import django
|
import django
|
||||||
import pytest
|
import pytest
|
||||||
|
from django.test.utils import override_settings
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
|
||||||
import rest_framework
|
import rest_framework
|
||||||
|
@ -848,6 +849,40 @@ class TestNoOutputFormatDateField(FieldValues):
|
||||||
field = serializers.DateField(format=None)
|
field = serializers.DateField(format=None)
|
||||||
|
|
||||||
|
|
||||||
|
class FakeTimezone(datetime.tzinfo):
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "<FakeTimezone>"
|
||||||
|
|
||||||
|
def utcoffset(self, dt):
|
||||||
|
return datetime.timedelta(1)
|
||||||
|
|
||||||
|
def tzname(self, dt):
|
||||||
|
return "FakeTimezone"
|
||||||
|
|
||||||
|
def dst(self, dt):
|
||||||
|
return datetime.timedelta(1)
|
||||||
|
|
||||||
|
|
||||||
|
class TestAwareDateTimeField:
|
||||||
|
|
||||||
|
@override_settings(USE_TZ=True)
|
||||||
|
def test_with_timezone_active(self):
|
||||||
|
naive_now = timezone.make_naive(timezone.now())
|
||||||
|
timezone.activate(FakeTimezone())
|
||||||
|
field = serializers.DateTimeField(default_timezone=timezone.UTC())
|
||||||
|
aware_now = field.enforce_timezone(naive_now)
|
||||||
|
assert aware_now.tzname() == 'FakeTimezone'
|
||||||
|
timezone.deactivate()
|
||||||
|
|
||||||
|
@override_settings(USE_TZ=True)
|
||||||
|
def test_without_timezone_active(self):
|
||||||
|
naive_now = timezone.make_naive(timezone.now())
|
||||||
|
field = serializers.DateTimeField(default_timezone=timezone.UTC())
|
||||||
|
aware_now = field.enforce_timezone(naive_now)
|
||||||
|
assert aware_now.tzname() == 'UTC'
|
||||||
|
|
||||||
|
|
||||||
class TestDateTimeField(FieldValues):
|
class TestDateTimeField(FieldValues):
|
||||||
"""
|
"""
|
||||||
Valid and invalid values for `DateTimeField`.
|
Valid and invalid values for `DateTimeField`.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user