Skip to content

Commit 07bce84

Browse files
committed
TruncQuarter, TruncDate, TruncTime not implemented
with some microsecond support mixed in
1 parent 98dbf02 commit 07bce84

File tree

1 file changed

+76
-71
lines changed

1 file changed

+76
-71
lines changed

tests/db_functions/datetime/test_extract_trunc.py

Lines changed: 76 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from datetime import timezone as datetime_timezone
44

55
from django.conf import settings
6-
from django.db import connection, DataError, NotSupportedError, OperationalError
6+
from django.db import DataError, NotSupportedError, OperationalError, connection
77
from django.db.models import (
88
DateField,
99
DateTimeField,
@@ -269,13 +269,14 @@ def test_extract_func(self):
269269
[(start_datetime, start_datetime.year), (end_datetime, end_datetime.year)],
270270
lambda m: (m.start_datetime, m.extracted),
271271
)
272-
self.assertQuerySetEqual(
273-
DTModel.objects.annotate(
274-
extracted=Extract("start_datetime", "quarter")
275-
).order_by("start_datetime"),
276-
[(start_datetime, 2), (end_datetime, 2)],
277-
lambda m: (m.start_datetime, m.extracted),
278-
)
272+
# ExtractQuarter not supported.
273+
# self.assertQuerySetEqual(
274+
# DTModel.objects.annotate(
275+
# extracted=Extract("start_datetime", "quarter")
276+
# ).order_by("start_datetime"),
277+
# [(start_datetime, 2), (end_datetime, 2)],
278+
# lambda m: (m.start_datetime, m.extracted),
279+
# )
279280
self.assertQuerySetEqual(
280281
DTModel.objects.annotate(
281282
extracted=Extract("start_datetime", "month")
@@ -513,9 +514,9 @@ def test_extract_iso_year_func_boundaries(self):
513514
week_52_day_2014 = timezone.make_aware(week_52_day_2014)
514515
week_53_day_2015 = timezone.make_aware(week_53_day_2015)
515516
days = [week_52_day_2014, week_1_day_2014_2015, week_53_day_2015]
516-
obj_1_iso_2014 = self.create_model(week_52_day_2014, end_datetime)
517-
obj_1_iso_2015 = self.create_model(week_1_day_2014_2015, end_datetime)
518-
obj_2_iso_2015 = self.create_model(week_53_day_2015, end_datetime)
517+
self.create_model(week_52_day_2014, end_datetime)
518+
self.create_model(week_1_day_2014_2015, end_datetime)
519+
self.create_model(week_53_day_2015, end_datetime)
519520
qs = (
520521
DTModel.objects.filter(start_datetime__in=days)
521522
.annotate(
@@ -533,19 +534,20 @@ def test_extract_iso_year_func_boundaries(self):
533534
lambda m: (m.start_datetime, m.extracted),
534535
)
535536

536-
qs = DTModel.objects.filter(
537-
start_datetime__iso_year=2015,
538-
).order_by("start_datetime")
537+
# qs = DTModel.objects.filter(
538+
# start_datetime__iso_year=2015,
539+
# ).order_by("start_datetime")
539540

540-
self.assertSequenceEqual(qs, [obj_1_iso_2015, obj_2_iso_2015])
541-
qs = DTModel.objects.filter(
542-
start_datetime__iso_year__gt=2014,
543-
).order_by("start_datetime")
544-
self.assertSequenceEqual(qs, [obj_1_iso_2015, obj_2_iso_2015])
545-
qs = DTModel.objects.filter(
546-
start_datetime__iso_year__lte=2014,
547-
).order_by("start_datetime")
548-
self.assertSequenceEqual(qs, [obj_1_iso_2014])
541+
# Transform not supported.
542+
# self.assertSequenceEqual(qs, [obj_1_iso_2015, obj_2_iso_2015])
543+
# qs = DTModel.objects.filter(
544+
# start_datetime__iso_year__gt=2014,
545+
# ).order_by("start_datetime")
546+
# self.assertSequenceEqual(qs, [obj_1_iso_2015, obj_2_iso_2015])
547+
# qs = DTModel.objects.filter(
548+
# start_datetime__iso_year__lte=2014,
549+
# ).order_by("start_datetime")
550+
# self.assertSequenceEqual(qs, [obj_1_iso_2014])
549551

550552
def test_extract_month_func(self):
551553
start_datetime = microsecond_support(datetime(2015, 6, 15, 14, 30, 50, 321))
@@ -1016,12 +1018,13 @@ def test_datetime_to_time_kind(kind):
10161018
test_datetime_to_time_kind("minute")
10171019
test_datetime_to_time_kind("second")
10181020

1019-
qs = DTModel.objects.filter(
1020-
start_datetime__date=Trunc(
1021-
"start_datetime", "day", output_field=DateField()
1022-
)
1023-
)
1024-
self.assertEqual(qs.count(), 2)
1021+
# qs = DTModel.objects.filter(
1022+
# start_datetime__date=Trunc(
1023+
# "start_datetime", "day", output_field=DateField()
1024+
# )
1025+
# )
1026+
# Trunc DateTime to Date not supported.
1027+
# self.assertEqual(qs.count(), 2)
10251028

10261029
def _test_trunc_week(self, start_datetime, end_datetime):
10271030
start_datetime = microsecond_support(start_datetime)
@@ -1590,7 +1593,7 @@ def test_trunc_second_func(self):
15901593
DTModel.objects.filter(
15911594
start_datetime=TruncSecond("start_datetime")
15921595
).count(),
1593-
1,
1596+
1 if connection.features.supports_microsecond_precision else 2,
15941597
)
15951598

15961599
with self.assertRaisesMessage(
@@ -1684,8 +1687,8 @@ def test_extract_func_with_timezone(self):
16841687
start_datetime = timezone.make_aware(start_datetime)
16851688
end_datetime = timezone.make_aware(end_datetime)
16861689
self.create_model(start_datetime, end_datetime)
1687-
delta_tzinfo_pos = datetime_timezone(timedelta(hours=5))
1688-
delta_tzinfo_neg = datetime_timezone(timedelta(hours=-5, minutes=17))
1690+
# delta_tzinfo_pos = datetime_timezone(timedelta(hours=5))
1691+
# delta_tzinfo_neg = datetime_timezone(timedelta(hours=-5, minutes=17))
16891692
melb = zoneinfo.ZoneInfo("Australia/Melbourne")
16901693

16911694
qs = DTModel.objects.annotate(
@@ -1697,14 +1700,15 @@ def test_extract_func_with_timezone(self):
16971700
weekday_melb=ExtractWeekDay("start_datetime", tzinfo=melb),
16981701
isoweekday=ExtractIsoWeekDay("start_datetime"),
16991702
isoweekday_melb=ExtractIsoWeekDay("start_datetime", tzinfo=melb),
1700-
quarter=ExtractQuarter("start_datetime", tzinfo=melb),
1703+
# quarter=ExtractQuarter("start_datetime", tzinfo=melb),
17011704
hour=ExtractHour("start_datetime"),
17021705
hour_melb=ExtractHour("start_datetime", tzinfo=melb),
1703-
hour_with_delta_pos=ExtractHour("start_datetime", tzinfo=delta_tzinfo_pos),
1704-
hour_with_delta_neg=ExtractHour("start_datetime", tzinfo=delta_tzinfo_neg),
1705-
minute_with_delta_neg=ExtractMinute(
1706-
"start_datetime", tzinfo=delta_tzinfo_neg
1707-
),
1706+
# Unsupported tz on MongoDB
1707+
# hour_with_delta_pos=ExtractHour("start_datetime", tzinfo=delta_tzinfo_pos)
1708+
# hour_with_delta_neg=ExtractHour("start_datetime", tzinfo=delta_tzinfo_neg)
1709+
# minute_with_delta_neg=ExtractMinute(
1710+
# "start_datetime", tzinfo=delta_tzinfo_neg
1711+
# ),
17081712
).order_by("start_datetime")
17091713

17101714
utc_model = qs.get()
@@ -1716,12 +1720,12 @@ def test_extract_func_with_timezone(self):
17161720
self.assertEqual(utc_model.weekday_melb, 3)
17171721
self.assertEqual(utc_model.isoweekday, 1)
17181722
self.assertEqual(utc_model.isoweekday_melb, 2)
1719-
self.assertEqual(utc_model.quarter, 2)
1723+
# self.assertEqual(utc_model.quarter, 2)
17201724
self.assertEqual(utc_model.hour, 23)
17211725
self.assertEqual(utc_model.hour_melb, 9)
1722-
self.assertEqual(utc_model.hour_with_delta_pos, 4)
1723-
self.assertEqual(utc_model.hour_with_delta_neg, 18)
1724-
self.assertEqual(utc_model.minute_with_delta_neg, 47)
1726+
# self.assertEqual(utc_model.hour_with_delta_pos, 4)
1727+
# self.assertEqual(utc_model.hour_with_delta_neg, 18)
1728+
# self.assertEqual(utc_model.minute_with_delta_neg, 47)
17251729

17261730
with timezone.override(melb):
17271731
melb_model = qs.get()
@@ -1732,7 +1736,7 @@ def test_extract_func_with_timezone(self):
17321736
self.assertEqual(melb_model.isoyear, 2015)
17331737
self.assertEqual(melb_model.weekday, 3)
17341738
self.assertEqual(melb_model.isoweekday, 2)
1735-
self.assertEqual(melb_model.quarter, 2)
1739+
# self.assertEqual(melb_model.quarter, 2)
17361740
self.assertEqual(melb_model.weekday_melb, 3)
17371741
self.assertEqual(melb_model.isoweekday_melb, 2)
17381742
self.assertEqual(melb_model.hour, 9)
@@ -1795,8 +1799,8 @@ def test_extract_invalid_field_with_timezone(self):
17951799
).get()
17961800

17971801
def test_trunc_timezone_applied_before_truncation(self):
1798-
start_datetime = datetime(2016, 1, 1, 1, 30, 50, 321)
1799-
end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123)
1802+
start_datetime = microsecond_support(datetime(2016, 1, 1, 1, 30, 50, 321))
1803+
end_datetime = microsecond_support(datetime(2016, 6, 15, 14, 10, 50, 123))
18001804
start_datetime = timezone.make_aware(start_datetime)
18011805
end_datetime = timezone.make_aware(end_datetime)
18021806
self.create_model(start_datetime, end_datetime)
@@ -1807,17 +1811,17 @@ def test_trunc_timezone_applied_before_truncation(self):
18071811
DTModel.objects.annotate(
18081812
melb_year=TruncYear("start_datetime", tzinfo=melb),
18091813
pacific_year=TruncYear("start_datetime", tzinfo=pacific),
1810-
melb_date=TruncDate("start_datetime", tzinfo=melb),
1811-
pacific_date=TruncDate("start_datetime", tzinfo=pacific),
1812-
melb_time=TruncTime("start_datetime", tzinfo=melb),
1813-
pacific_time=TruncTime("start_datetime", tzinfo=pacific),
1814+
# melb_date=TruncDate("start_datetime", tzinfo=melb),
1815+
# pacific_date=TruncDate("start_datetime", tzinfo=pacific),
1816+
# melb_time=TruncTime("start_datetime", tzinfo=melb),
1817+
# pacific_time=TruncTime("start_datetime", tzinfo=pacific),
18141818
)
18151819
.order_by("start_datetime")
18161820
.get()
18171821
)
18181822

1819-
melb_start_datetime = start_datetime.astimezone(melb)
1820-
pacific_start_datetime = start_datetime.astimezone(pacific)
1823+
# melb_start_datetime = start_datetime.astimezone(melb)
1824+
# pacific_start_datetime = start_datetime.astimezone(pacific)
18211825
self.assertEqual(model.start_datetime, start_datetime)
18221826
self.assertEqual(model.melb_year, truncate_to(start_datetime, "year", melb))
18231827
self.assertEqual(
@@ -1826,18 +1830,19 @@ def test_trunc_timezone_applied_before_truncation(self):
18261830
self.assertEqual(model.start_datetime.year, 2016)
18271831
self.assertEqual(model.melb_year.year, 2016)
18281832
self.assertEqual(model.pacific_year.year, 2015)
1829-
self.assertEqual(model.melb_date, melb_start_datetime.date())
1830-
self.assertEqual(model.pacific_date, pacific_start_datetime.date())
1831-
self.assertEqual(model.melb_time, melb_start_datetime.time())
1832-
self.assertEqual(model.pacific_time, pacific_start_datetime.time())
1833+
1834+
# self.assertEqual(model.melb_date, melb_start_datetime.date())
1835+
# self.assertEqual(model.pacific_date, pacific_start_datetime.date())
1836+
# self.assertEqual(model.melb_time, melb_start_datetime.time())
1837+
# self.assertEqual(model.pacific_time, pacific_start_datetime.time())
18331838

18341839
def test_trunc_func_with_timezone(self):
18351840
"""
18361841
If the truncated datetime transitions to a different offset (daylight
18371842
saving) then the returned value will have that new timezone/offset.
18381843
"""
1839-
start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321)
1840-
end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123)
1844+
start_datetime = microsecond_support(datetime(2015, 6, 15, 14, 30, 50, 321))
1845+
end_datetime = microsecond_support(datetime(2016, 6, 15, 14, 10, 50, 123))
18411846
start_datetime = timezone.make_aware(start_datetime)
18421847
end_datetime = timezone.make_aware(end_datetime)
18431848
self.create_model(start_datetime, end_datetime)
@@ -1913,14 +1918,14 @@ def test_datetime_to_time_kind(kind):
19131918
lambda m: (m.start_datetime, m.truncated),
19141919
)
19151920

1916-
test_datetime_to_date_kind("year")
1917-
test_datetime_to_date_kind("quarter")
1918-
test_datetime_to_date_kind("month")
1919-
test_datetime_to_date_kind("week")
1920-
test_datetime_to_date_kind("day")
1921-
test_datetime_to_time_kind("hour")
1922-
test_datetime_to_time_kind("minute")
1923-
test_datetime_to_time_kind("second")
1921+
# test_datetime_to_date_kind("year")
1922+
# test_datetime_to_date_kind("quarter")
1923+
# test_datetime_to_date_kind("month")
1924+
# test_datetime_to_date_kind("week")
1925+
# test_datetime_to_date_kind("day")
1926+
# test_datetime_to_time_kind("hour")
1927+
# test_datetime_to_time_kind("minute")
1928+
# test_datetime_to_time_kind("second")
19241929
test_datetime_kind("year")
19251930
test_datetime_kind("quarter")
19261931
test_datetime_kind("month")
@@ -1930,12 +1935,12 @@ def test_datetime_to_time_kind(kind):
19301935
test_datetime_kind("minute")
19311936
test_datetime_kind("second")
19321937

1933-
qs = DTModel.objects.filter(
1934-
start_datetime__date=Trunc(
1935-
"start_datetime", "day", output_field=DateField()
1936-
)
1937-
)
1938-
self.assertEqual(qs.count(), 2)
1938+
# qs = DTModel.objects.filter(
1939+
# start_datetime__date=Trunc(
1940+
# "start_datetime", "day", output_field=DateField()
1941+
# )
1942+
# )
1943+
# self.assertEqual(qs.count(), 2)
19391944

19401945
def test_trunc_invalid_field_with_timezone(self):
19411946
melb = zoneinfo.ZoneInfo("Australia/Melbourne")

0 commit comments

Comments
 (0)