Skip to content

Commit 0c458ef

Browse files
fix: make a few datetime manipulations timezone-aware (ietf-tools#4755)
* fix: set tz when passing a date to timesince_days filter * fix: fill in tz for a constructed datetime in idindex/index.py * test: simplify double-negatives in test assertions * test: fix I-D expiration test cases to be tz aware * fix: use tz-aware comparisons for in_draft_expire_freeze method * test: fix tz used for timesince_days filter test case
1 parent 36bbc9b commit 0c458ef

4 files changed

Lines changed: 28 additions & 10 deletions

File tree

ietf/doc/expire.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,10 @@ def in_draft_expire_freeze(when=None):
7373

7474
d = meeting.get_second_cut_off()
7575
# for some reason, the old Perl code started at 9 am
76-
second_cut_off = datetime.datetime.combine(d, datetime.time(9, 0))
76+
second_cut_off = d.replace(hour=9, minute=0, second=0, microsecond=0)
7777

7878
d = meeting.get_ietf_monday()
79-
ietf_monday = datetime.datetime.combine(d, datetime.time(0, 0))
79+
ietf_monday = datetime.datetime.combine(d, datetime.time(0, 0), tzinfo=meeting.tz())
8080

8181
return second_cut_off <= when < ietf_monday
8282

ietf/doc/templatetags/ietf_filters.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import datetime
66
import re
77
from urllib.parse import urljoin
8+
from zoneinfo import ZoneInfo
89

910
from django import template
1011
from django.conf import settings
@@ -316,9 +317,18 @@ def underline(string):
316317

317318
@register.filter(name='timesince_days')
318319
def timesince_days(date):
319-
"""Returns the number of days since 'date' (relative to now)"""
320+
"""Returns the number of days since 'date' (relative to now)
321+
322+
>>> timesince_days(timezone.now() - datetime.timedelta(days=2))
323+
2
324+
325+
>>> tz = ZoneInfo(settings.TIME_ZONE)
326+
>>> timesince_days(timezone.now().astimezone(tz).date() - datetime.timedelta(days=2))
327+
2
328+
329+
"""
320330
if date.__class__ is not datetime.datetime:
321-
date = datetime.datetime(date.year, date.month, date.day)
331+
date = datetime.datetime(date.year, date.month, date.day, tzinfo=ZoneInfo(settings.TIME_ZONE))
322332
delta = timezone.now() - date
323333
return delta.days
324334

ietf/doc/tests_draft.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -644,11 +644,19 @@ def test_in_draft_expire_freeze(self):
644644
second_cut_off = meeting.get_second_cut_off()
645645
ietf_monday = meeting.get_ietf_monday()
646646

647-
self.assertTrue(not in_draft_expire_freeze(datetime.datetime.combine(second_cut_off - datetime.timedelta(days=7), datetime.time(0, 0, 0))))
648-
self.assertTrue(not in_draft_expire_freeze(datetime.datetime.combine(second_cut_off, datetime.time(0, 0, 0))))
649-
self.assertTrue(in_draft_expire_freeze(datetime.datetime.combine(second_cut_off + datetime.timedelta(days=7), datetime.time(0, 0, 0))))
650-
self.assertTrue(in_draft_expire_freeze(datetime.datetime.combine(ietf_monday - datetime.timedelta(days=1), datetime.time(0, 0, 0))))
651-
self.assertTrue(not in_draft_expire_freeze(datetime.datetime.combine(ietf_monday, datetime.time(0, 0, 0))))
647+
self.assertFalse(in_draft_expire_freeze((second_cut_off - datetime.timedelta(days=7)).replace(hour=0, minute=0, second=0)))
648+
self.assertFalse(in_draft_expire_freeze(second_cut_off.replace(hour=0, minute=0, second=0)))
649+
self.assertTrue(in_draft_expire_freeze((second_cut_off + datetime.timedelta(days=7)).replace(hour=0, minute=0, second=0)))
650+
self.assertTrue(in_draft_expire_freeze(
651+
datetime.datetime.combine(
652+
ietf_monday - datetime.timedelta(days=1),
653+
datetime.time(0, 0, 0),
654+
tzinfo=datetime.timezone.utc,
655+
)
656+
))
657+
self.assertFalse(in_draft_expire_freeze(
658+
datetime.datetime.combine(ietf_monday, datetime.time(0, 0, 0), tzinfo=datetime.timezone.utc)
659+
))
652660

653661
def test_warn_expirable_drafts(self):
654662
from ietf.doc.expire import get_soon_to_expire_drafts, send_expire_warning_for_draft

ietf/idindex/index.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ def active_drafts_index_by_group(extra_values=()):
270270
groups = [g for g in groups_dict.values() if hasattr(g, "active_drafts")]
271271
groups.sort(key=lambda g: g.acronym)
272272

273-
fallback_time = datetime.datetime(1950, 1, 1)
273+
fallback_time = datetime.datetime(1950, 1, 1, tzinfo=datetime.timezone.utc)
274274
for g in groups:
275275
g.active_drafts.sort(key=lambda d: d.get("initial_rev_time", fallback_time))
276276

0 commit comments

Comments
 (0)