Skip to content

Commit 5650514

Browse files
fix: handle timezones in a bunch of places
1 parent 2e3686b commit 5650514

23 files changed

Lines changed: 95 additions & 61 deletions

bin/check-copyright

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ def get_first_commit(path):
162162
else:
163163
pass
164164
except OSError:
165-
rev, who, when = None, None, datetime.datetime.now()
165+
rev, who, when = None, None, datetime.datetime.now(datetime.timezone.utc)
166166
return { path: { 'rev': rev, 'who': who, 'date': when.strftime('%Y-%m-%d %H:%M:%S'), }, }
167167

168168

ietf/bin/send-review-reminders

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@ from ietf.review.utils import (
2626
send_unavailability_period_ending_reminder, send_reminder_all_open_reviews,
2727
send_review_reminder_overdue_assignment, send_reminder_unconfirmed_assignments)
2828
from ietf.utils.log import log
29+
from ietf.utils.timezone import date_today, DEADLINE_TZINFO
2930

30-
today = datetime.date.today()
31+
today = date_today(DEADLINE_TZINFO)
3132

3233
for assignment in review_assignments_needing_reviewer_reminder(today):
3334
email_reviewer_reminder(assignment)

ietf/doc/expire.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from ietf.meeting.models import Meeting
1919
from ietf.doc.utils import add_state_change_event, update_action_holders
2020
from ietf.mailtrigger.utils import gather_address_lists
21-
from ietf.utils.timezone import datetime_today, DEADLINE_TZINFO
21+
from ietf.utils.timezone import date_today, datetime_today, DEADLINE_TZINFO
2222

2323

2424
nonexpirable_states: Optional[List[State]] = None
@@ -173,7 +173,7 @@ def expire_draft(doc):
173173

174174
def clean_up_draft_files():
175175
"""Move unidentified and old files out of the Internet Draft directory."""
176-
cut_off = datetime.date.today()
176+
cut_off = date_today()
177177

178178
pattern = os.path.join(settings.INTERNET_DRAFT_PATH, "draft-*.*")
179179
filename_re = re.compile(r'^(.*)-(\d\d)$')

ietf/doc/forms.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from ietf.person.models import Email, Person
1616

1717
from ietf.name.models import ExtResourceName
18+
from ietf.utils.timezone import date_today
1819
from ietf.utils.validators import validate_external_resource_value
1920

2021
class TelechatForm(forms.Form):
@@ -34,7 +35,7 @@ def __init__(self, *args, **kwargs):
3435
for d in dates:
3536
self.page_count[d] = telechat_page_count(date=d).for_approval
3637
choice_display[d] = '%s (%s pages)' % (d.strftime("%Y-%m-%d"),self.page_count[d])
37-
if d-datetime.date.today() < datetime.timedelta(days=13):
38+
if d - date_today() < datetime.timedelta(days=13):
3839
choice_display[d] += ' : WARNING - this may not leave enough time for directorate reviews!'
3940
self.fields['telechat_date'].choices = [("", "(not on agenda)")] + [(d, choice_display[d]) for d in dates]
4041

ietf/doc/lastcall.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
from ietf.doc.utils import add_state_change_event, update_action_holders
1111
from ietf.doc.mails import generate_ballot_writeup, generate_approval_mail, generate_last_call_announcement
1212
from ietf.doc.mails import send_last_call_request, email_last_call_expired, email_last_call_expired_with_downref
13+
from ietf.utils.timezone import date_today, DEADLINE_TZINFO
14+
1315

1416
def request_last_call(request, doc):
1517
if not doc.latest_event(type="changed_ballot_writeup_text"):
@@ -33,7 +35,7 @@ def request_last_call(request, doc):
3335
e.save()
3436

3537
def get_expired_last_calls():
36-
today = datetime.date.today()
38+
today = date_today(DEADLINE_TZINFO)
3739
for d in Document.objects.filter(Q(states__type="draft-iesg", states__slug="lc")
3840
| Q(states__type="statchg", states__slug="in-lc")):
3941
e = d.latest_event(LastCallDocEvent, type="sent_last_call")

ietf/doc/mails.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from ietf.group.models import Role
2626
from ietf.doc.models import Document
2727
from ietf.mailtrigger.utils import gather_address_lists
28+
from ietf.utils.timezone import date_today, DEADLINE_TZINFO
2829

2930

3031
def email_state_changed(request, doc, text, mailtrigger_id=None):
@@ -192,7 +193,7 @@ def generate_ballot_rfceditornote(request, doc):
192193
return e
193194

194195
def generate_last_call_announcement(request, doc):
195-
expiration_date = datetime.date.today() + datetime.timedelta(days=14)
196+
expiration_date = date_today(DEADLINE_TZINFO) + datetime.timedelta(days=14)
196197
if doc.group.type_id in ("individ", "area"):
197198
group = "an individual submitter"
198199
expiration_date += datetime.timedelta(days=14)

ietf/doc/models.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
from ietf.utils.validators import validate_no_control_chars
3737
from ietf.utils.mail import formataddr
3838
from ietf.utils.models import ForeignKey
39-
from ietf.utils.timezone import RPC_TZINFO
39+
from ietf.utils.timezone import date_today, RPC_TZINFO
4040
if TYPE_CHECKING:
4141
# importing other than for type checking causes errors due to cyclic imports
4242
from ietf.meeting.models import ProceedingsMaterial, Session
@@ -831,16 +831,20 @@ def save(self, *args, **kwargs):
831831
def telechat_date(self, e=None):
832832
if not e:
833833
e = self.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
834-
return e.telechat_date if e and e.telechat_date and e.telechat_date >= datetime.date.today() else None
834+
return e.telechat_date if e and e.telechat_date and e.telechat_date >= date_today(settings.TIME_ZONE) else None
835835

836836
def past_telechat_date(self):
837837
"Return the latest telechat date if it isn't in the future; else None"
838838
e = self.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
839-
return e.telechat_date if e and e.telechat_date and e.telechat_date < datetime.date.today() else None
839+
return e.telechat_date if e and e.telechat_date and e.telechat_date < date_today(settings.TIME_ZONE) else None
840840

841841
def previous_telechat_date(self):
842842
"Return the most recent telechat date in the past, if any (even if there's another in the future)"
843-
e = self.latest_event(TelechatDocEvent, type="scheduled_for_telechat", telechat_date__lt=timezone.now())
843+
e = self.latest_event(
844+
TelechatDocEvent,
845+
type="scheduled_for_telechat",
846+
telechat_date__lt=date_today(settings.TIME_ZONE),
847+
)
844848
return e.telechat_date if e else None
845849

846850
def request_closed_time(self, review_req):
@@ -906,8 +910,14 @@ def related_ipr(self):
906910
def future_presentations(self):
907911
""" returns related SessionPresentation objects for meetings that
908912
have not yet ended. This implementation allows for 2 week meetings """
909-
candidate_presentations = self.sessionpresentation_set.filter(session__meeting__date__gte=datetime.date.today()-datetime.timedelta(days=15))
910-
return sorted([pres for pres in candidate_presentations if pres.session.meeting.end_date()>=datetime.date.today()], key=lambda x:x.session.meeting.date)
913+
candidate_presentations = self.sessionpresentation_set.filter(
914+
session__meeting__date__gte=date_today() - datetime.timedelta(days=15)
915+
)
916+
return sorted(
917+
[pres for pres in candidate_presentations
918+
if pres.session.meeting.end_date() >= date_today()],
919+
key=lambda x:x.session.meeting.date,
920+
)
911921

912922
def last_presented(self):
913923
""" returns related SessionPresentation objects for the most recent meeting in the past"""

ietf/doc/templatetags/ballot_icon.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
from django import template
3939
from django.urls import reverse as urlreverse
4040
from django.db.models import Q
41+
from django.utils import timezone
4142
from django.utils.safestring import mark_safe
4243

4344
from ietf.ietfauth.utils import user_is_person, has_role
@@ -173,17 +174,17 @@ def state_age_colored(doc):
173174
if iesg_state in ["dead", "watching", "pub", "idexists"]:
174175
return ""
175176
try:
176-
state_date = (
177+
state_datetime = (
177178
doc.docevent_set.filter(
178179
Q(type="started_iesg_process")
179180
| Q(type="changed_state", statedocevent__state_type="draft-iesg")
180181
)
181182
.order_by("-time")[0]
182-
.time.date()
183+
.time
183184
)
184185
except IndexError:
185-
state_date = datetime.date(1990, 1, 1)
186-
days = (datetime.date.today() - state_date).days
186+
state_datetime = datetime.datetime(1990, 1, 1, tzinfo=datetime.timezone.utc)
187+
days = (timezone.now() - state_datetime).days
187188
# loosely based on
188189
# https://trac.ietf.org/trac/iesg/wiki/PublishPath
189190
if iesg_state == "lc":

ietf/doc/tests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2226,7 +2226,7 @@ def setUp(self):
22262226
self.other_chair = PersonFactory()
22272227
self.other_group.role_set.create(name_id='chair',person=self.other_chair,email=self.other_chair.email())
22282228

2229-
today = datetime.date.today()
2229+
today = datetime_today()
22302230
cut_days = settings.MEETING_MATERIALS_DEFAULT_SUBMISSION_CORRECTION_DAYS
22312231
self.past_cutoff = SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today-datetime.timedelta(days=1+cut_days))
22322232
self.past = SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today-datetime.timedelta(days=cut_days/2))

ietf/doc/tests_draft.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,7 @@ def test_in_draft_expire_freeze(self):
640640

641641
meeting = Meeting.objects.create(number="123",
642642
type=MeetingTypeName.objects.get(slug="ietf"),
643-
date=datetime.date.today())
643+
date=date_today())
644644
second_cut_off = meeting.get_second_cut_off()
645645
ietf_monday = meeting.get_ietf_monday()
646646

0 commit comments

Comments
 (0)