|
@@ -8,10 +8,11 @@ from django.db.models import (
|
|
|
TimeField,
|
|
|
)
|
|
|
from django.db.models.functions import (
|
|
|
- Extract, ExtractDay, ExtractHour, ExtractIsoYear, ExtractMinute,
|
|
|
- ExtractMonth, ExtractQuarter, ExtractSecond, ExtractWeek, ExtractWeekDay,
|
|
|
- ExtractYear, Trunc, TruncDate, TruncDay, TruncHour, TruncMinute,
|
|
|
- TruncMonth, TruncQuarter, TruncSecond, TruncTime, TruncWeek, TruncYear,
|
|
|
+ Extract, ExtractDay, ExtractHour, ExtractIsoWeekDay, ExtractIsoYear,
|
|
|
+ ExtractMinute, ExtractMonth, ExtractQuarter, ExtractSecond, ExtractWeek,
|
|
|
+ ExtractWeekDay, ExtractYear, Trunc, TruncDate, TruncDay, TruncHour,
|
|
|
+ TruncMinute, TruncMonth, TruncQuarter, TruncSecond, TruncTime, TruncWeek,
|
|
|
+ TruncYear,
|
|
|
)
|
|
|
from django.test import (
|
|
|
TestCase, override_settings, skipIfDBFeature, skipUnlessDBFeature,
|
|
@@ -217,6 +218,16 @@ class DateFunctionTests(TestCase):
|
|
|
],
|
|
|
lambda m: (m.start_datetime, m.extracted)
|
|
|
)
|
|
|
+ self.assertQuerysetEqual(
|
|
|
+ DTModel.objects.annotate(
|
|
|
+ extracted=Extract('start_datetime', 'iso_week_day'),
|
|
|
+ ).order_by('start_datetime'),
|
|
|
+ [
|
|
|
+ (start_datetime, start_datetime.isoweekday()),
|
|
|
+ (end_datetime, end_datetime.isoweekday()),
|
|
|
+ ],
|
|
|
+ lambda m: (m.start_datetime, m.extracted)
|
|
|
+ )
|
|
|
self.assertQuerysetEqual(
|
|
|
DTModel.objects.annotate(extracted=Extract('start_datetime', 'hour')).order_by('start_datetime'),
|
|
|
[(start_datetime, start_datetime.hour), (end_datetime, end_datetime.hour)],
|
|
@@ -275,7 +286,10 @@ class DateFunctionTests(TestCase):
|
|
|
|
|
|
def test_extract_duration_unsupported_lookups(self):
|
|
|
msg = "Cannot extract component '%s' from DurationField 'duration'."
|
|
|
- for lookup in ('year', 'iso_year', 'month', 'week', 'week_day', 'quarter'):
|
|
|
+ for lookup in (
|
|
|
+ 'year', 'iso_year', 'month', 'week', 'week_day', 'iso_week_day',
|
|
|
+ 'quarter',
|
|
|
+ ):
|
|
|
with self.subTest(lookup):
|
|
|
with self.assertRaisesMessage(ValueError, msg % lookup):
|
|
|
DTModel.objects.annotate(extracted=Extract('duration', lookup))
|
|
@@ -499,6 +513,41 @@ class DateFunctionTests(TestCase):
|
|
|
)
|
|
|
self.assertEqual(DTModel.objects.filter(start_datetime__week_day=ExtractWeekDay('start_datetime')).count(), 2)
|
|
|
|
|
|
+ def test_extract_iso_weekday_func(self):
|
|
|
+ start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321)
|
|
|
+ end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123)
|
|
|
+ if settings.USE_TZ:
|
|
|
+ start_datetime = timezone.make_aware(start_datetime, is_dst=False)
|
|
|
+ end_datetime = timezone.make_aware(end_datetime, is_dst=False)
|
|
|
+ self.create_model(start_datetime, end_datetime)
|
|
|
+ self.create_model(end_datetime, start_datetime)
|
|
|
+ self.assertQuerysetEqual(
|
|
|
+ DTModel.objects.annotate(
|
|
|
+ extracted=ExtractIsoWeekDay('start_datetime'),
|
|
|
+ ).order_by('start_datetime'),
|
|
|
+ [
|
|
|
+ (start_datetime, start_datetime.isoweekday()),
|
|
|
+ (end_datetime, end_datetime.isoweekday()),
|
|
|
+ ],
|
|
|
+ lambda m: (m.start_datetime, m.extracted)
|
|
|
+ )
|
|
|
+ self.assertQuerysetEqual(
|
|
|
+ DTModel.objects.annotate(
|
|
|
+ extracted=ExtractIsoWeekDay('start_date'),
|
|
|
+ ).order_by('start_datetime'),
|
|
|
+ [
|
|
|
+ (start_datetime, start_datetime.isoweekday()),
|
|
|
+ (end_datetime, end_datetime.isoweekday()),
|
|
|
+ ],
|
|
|
+ lambda m: (m.start_datetime, m.extracted)
|
|
|
+ )
|
|
|
+ self.assertEqual(
|
|
|
+ DTModel.objects.filter(
|
|
|
+ start_datetime__week_day=ExtractWeekDay('start_datetime'),
|
|
|
+ ).count(),
|
|
|
+ 2,
|
|
|
+ )
|
|
|
+
|
|
|
def test_extract_hour_func(self):
|
|
|
start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321)
|
|
|
end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123)
|
|
@@ -1005,6 +1054,8 @@ class DateFunctionWithTimeZoneTests(DateFunctionTests):
|
|
|
isoyear=ExtractIsoYear('start_datetime', tzinfo=melb),
|
|
|
weekday=ExtractWeekDay('start_datetime'),
|
|
|
weekday_melb=ExtractWeekDay('start_datetime', tzinfo=melb),
|
|
|
+ isoweekday=ExtractIsoWeekDay('start_datetime'),
|
|
|
+ isoweekday_melb=ExtractIsoWeekDay('start_datetime', tzinfo=melb),
|
|
|
quarter=ExtractQuarter('start_datetime', tzinfo=melb),
|
|
|
hour=ExtractHour('start_datetime'),
|
|
|
hour_melb=ExtractHour('start_datetime', tzinfo=melb),
|
|
@@ -1020,6 +1071,8 @@ class DateFunctionWithTimeZoneTests(DateFunctionTests):
|
|
|
self.assertEqual(utc_model.isoyear, 2015)
|
|
|
self.assertEqual(utc_model.weekday, 2)
|
|
|
self.assertEqual(utc_model.weekday_melb, 3)
|
|
|
+ self.assertEqual(utc_model.isoweekday, 1)
|
|
|
+ self.assertEqual(utc_model.isoweekday_melb, 2)
|
|
|
self.assertEqual(utc_model.quarter, 2)
|
|
|
self.assertEqual(utc_model.hour, 23)
|
|
|
self.assertEqual(utc_model.hour_melb, 9)
|
|
@@ -1035,8 +1088,10 @@ class DateFunctionWithTimeZoneTests(DateFunctionTests):
|
|
|
self.assertEqual(melb_model.week, 25)
|
|
|
self.assertEqual(melb_model.isoyear, 2015)
|
|
|
self.assertEqual(melb_model.weekday, 3)
|
|
|
+ self.assertEqual(melb_model.isoweekday, 2)
|
|
|
self.assertEqual(melb_model.quarter, 2)
|
|
|
self.assertEqual(melb_model.weekday_melb, 3)
|
|
|
+ self.assertEqual(melb_model.isoweekday_melb, 2)
|
|
|
self.assertEqual(melb_model.hour, 9)
|
|
|
self.assertEqual(melb_model.hour_melb, 9)
|
|
|
|