mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-07 22:04:48 +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.validators import RegexValidator, ip_address_validators
|
||||
from django.forms import ImageField as DjangoImageField
|
||||
from django.forms.utils import from_current_timezone
|
||||
from django.utils import six, timezone
|
||||
from django.utils.dateparse import parse_date, parse_datetime, parse_time
|
||||
from django.utils.encoding import is_protected_type, smart_text
|
||||
|
@ -903,7 +904,12 @@ class DateTimeField(Field):
|
|||
When `self.default_timezone` is not `None`, always return aware datetimes.
|
||||
"""
|
||||
if (self.default_timezone is not None) and not timezone.is_aware(value):
|
||||
return timezone.make_aware(value, self.default_timezone)
|
||||
# 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)
|
||||
elif (self.default_timezone is None) and timezone.is_aware(value):
|
||||
return timezone.make_naive(value, timezone.UTC())
|
||||
return value
|
||||
|
|
|
@ -4,6 +4,7 @@ from decimal import Decimal
|
|||
|
||||
import django
|
||||
import pytest
|
||||
from django.test.utils import override_settings
|
||||
from django.utils import timezone
|
||||
|
||||
import rest_framework
|
||||
|
@ -848,6 +849,40 @@ class TestNoOutputFormatDateField(FieldValues):
|
|||
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):
|
||||
"""
|
||||
Valid and invalid values for `DateTimeField`.
|
||||
|
|
Loading…
Reference in New Issue
Block a user