From 46b082e05ccedffeb623028caf70adbaba7bce6f Mon Sep 17 00:00:00 2001 From: Aymeric Augustin Date: Tue, 1 May 2012 10:40:25 +0200 Subject: [PATCH] Fixed #17742 -- Handled aware datetimes in DateField Converted aware datetimes to the default time zone before using them in the context of a DateField. --- django/db/models/fields/__init__.py | 5 +++++ tests/modeltests/timezones/models.py | 3 +++ tests/modeltests/timezones/tests.py | 20 ++++++++++++++++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 3e97f6cb01..79fb373ce1 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -667,6 +667,11 @@ class DateField(Field): if value is None: return value if isinstance(value, datetime.datetime): + if settings.USE_TZ and timezone.is_aware(value): + # Convert aware datetimes to the current time zone + # before casting them to dates (#17742). + default_timezone = timezone.get_default_timezone() + value = timezone.make_naive(value, default_timezone) return value.date() if isinstance(value, datetime.date): return value diff --git a/tests/modeltests/timezones/models.py b/tests/modeltests/timezones/models.py index f0cc79275d..c49e42f887 100644 --- a/tests/modeltests/timezones/models.py +++ b/tests/modeltests/timezones/models.py @@ -16,3 +16,6 @@ class SessionEvent(models.Model): class Timestamp(models.Model): created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) + +class AllDayEvent(models.Model): + day = models.DateField() diff --git a/tests/modeltests/timezones/tests.py b/tests/modeltests/timezones/tests.py index 90bc1f3a18..ddfbc045d9 100644 --- a/tests/modeltests/timezones/tests.py +++ b/tests/modeltests/timezones/tests.py @@ -23,7 +23,7 @@ from django.utils.tzinfo import FixedOffset from django.utils.unittest import skipIf, skipUnless from .forms import EventForm, EventSplitForm, EventModelForm -from .models import Event, MaybeEvent, Session, SessionEvent, Timestamp +from .models import Event, MaybeEvent, Session, SessionEvent, Timestamp, AllDayEvent # These tests use the EAT (Eastern Africa Time) and ICT (Indochina Time) @@ -244,6 +244,14 @@ class LegacyDatabaseTests(TestCase): [event], transform=lambda d: d) + def test_filter_date_field_with_aware_datetime(self): + # Regression test for #17742 + day = datetime.date(2011, 9, 1) + event = AllDayEvent.objects.create(day=day) + # This is 2011-09-02T01:30:00+03:00 in EAT + dt = datetime.datetime(2011, 9, 1, 22, 30, 0, tzinfo=UTC) + self.assertTrue(AllDayEvent.objects.filter(day__gte=dt).exists()) + @override_settings(TIME_ZONE='Africa/Nairobi', USE_TZ=True) class NewDatabaseTests(TestCase): @@ -456,8 +464,16 @@ class NewDatabaseTests(TestCase): [event], transform=lambda d: d) + def test_filter_date_field_with_aware_datetime(self): + # Regression test for #17742 + day = datetime.date(2011, 9, 1) + event = AllDayEvent.objects.create(day=day) + # This is 2011-09-02T01:30:00+03:00 in EAT + dt = datetime.datetime(2011, 9, 1, 22, 30, 0, tzinfo=UTC) + self.assertFalse(AllDayEvent.objects.filter(day__gte=dt).exists()) + def test_null_datetime(self): - # Regression for #17294 + # Regression test for #17294 e = MaybeEvent.objects.create() self.assertEqual(e.dt, None)