Skip to content

Commit 23c2b5c

Browse files
Merge pull request ietf-tools#4601 from painless-security/jennifer/yet-more-tz-fixes
fix: more miscellaneous timezone fixes
2 parents c561994 + 8101b4f commit 23c2b5c

82 files changed

Lines changed: 423 additions & 288 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

bin/add-old-drafts-from-archive.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from django.core.validators import validate_email, ValidationError
1717
from ietf.utils.draft import PlaintextDraft
1818
from ietf.submit.utils import update_authors
19+
from ietf.utils.timezone import date_today
1920

2021
import debug # pyflakes:ignore
2122

@@ -66,9 +67,9 @@
6667
print name, rev, "Can't parse", p,":",e
6768
continue
6869
if draft.errors and draft.errors.keys()!=['draftname',]:
69-
print "Errors - could not process", name, rev, datetime.datetime.fromtimestamp(p.stat().st_mtime), draft.errors, draft.get_title().encode('utf8')
70+
print "Errors - could not process", name, rev, datetime.datetime.fromtimestamp(p.stat().st_mtime, datetime.timezone.utc), draft.errors, draft.get_title().encode('utf8')
7071
else:
71-
time = datetime.datetime.fromtimestamp(p.stat().st_mtime)
72+
time = datetime.datetime.fromtimestamp(p.stat().st_mtime, datetime.timezone.utc)
7273
if not doc:
7374
doc = Document.objects.create(name=name,
7475
time=time,
@@ -140,7 +141,7 @@ def turn_into_unicode(s):
140141
doc = doc,
141142
rev = rev,
142143
by = system,
143-
desc = "Revision added from id-archive on %s by %s"%(datetime.date.today(),sys.argv[0]),
144+
desc = "Revision added from id-archive on %s by %s"%(date_today(),sys.argv[0]),
144145
time=time,
145146
)
146147
events.append(e)

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/rfc-editor-index-updates

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ from django.core.mail import mail_admins
2929
from ietf.doc.utils import rebuild_reference_relations
3030
from ietf.utils.log import log
3131
from ietf.utils.pipe import pipe
32+
from ietf.utils.timezone import date_today
3233

3334
import ietf.sync.rfceditor
3435

@@ -39,7 +40,7 @@ parser.add_option("-d", dest="skip_date",
3940

4041
options, args = parser.parse_args()
4142

42-
skip_date = datetime.date.today() - datetime.timedelta(days=365)
43+
skip_date = date_today() - datetime.timedelta(days=365)
4344
if options.skip_date:
4445
skip_date = datetime.datetime.strptime(options.skip_date, "%Y-%m-%d").date()
4546

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/factories.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from ietf.person.factories import PersonFactory
2020
from ietf.group.factories import RoleFactory
2121
from ietf.utils.text import xslugify
22+
from ietf.utils.timezone import date_today
2223

2324

2425
def draft_name_generator(type_id,group,n):
@@ -321,7 +322,7 @@ def states(obj, create, extracted, **kwargs):
321322
# This is very skeletal. It is enough for the tests that use it now, but when it's needed, it will need to be improved with, at least, a group generator that backs the object with a review team.
322323
class ReviewFactory(BaseDocumentFactory):
323324
type_id = 'review'
324-
name = factory.LazyAttribute(lambda o: 'review-doesnotexist-00-%s-%s'%(o.group.acronym,datetime.date.today().isoformat()))
325+
name = factory.LazyAttribute(lambda o: 'review-doesnotexist-00-%s-%s'%(o.group.acronym,date_today().isoformat()))
325326
group = factory.SubFactory('ietf.group.factories.GroupFactory',type_id='review')
326327

327328
class DocAliasFactory(factory.django.DjangoModelFactory):

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 & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
# helpers for handling last calls on Internet Drafts
22

3-
import datetime
4-
53
from django.db.models import Q
64

75
from ietf.doc.models import Document, State, DocEvent, LastCallDocEvent, WriteupDocEvent
@@ -10,6 +8,8 @@
108
from ietf.doc.utils import add_state_change_event, update_action_holders
119
from ietf.doc.mails import generate_ballot_writeup, generate_approval_mail, generate_last_call_announcement
1210
from ietf.doc.mails import send_last_call_request, email_last_call_expired, email_last_call_expired_with_downref
11+
from ietf.utils.timezone import date_today, DEADLINE_TZINFO
12+
1313

1414
def request_last_call(request, doc):
1515
if not doc.latest_event(type="changed_ballot_writeup_text"):
@@ -33,7 +33,7 @@ def request_last_call(request, doc):
3333
e.save()
3434

3535
def get_expired_last_calls():
36-
today = datetime.date.today()
36+
today = date_today(DEADLINE_TZINFO)
3737
for d in Document.objects.filter(Q(states__type="draft-iesg", states__slug="lc")
3838
| Q(states__type="statchg", states__slug="in-lc")):
3939
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: 20 additions & 9 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,14 +910,21 @@ 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"""
914924
# Assumes no two meetings have the same start date - if the assumption is violated, one will be chosen arbitrariy
915-
candidate_presentations = self.sessionpresentation_set.filter(session__meeting__date__lte=datetime.date.today())
916-
candidate_meetings = set([p.session.meeting for p in candidate_presentations if p.session.meeting.end_date()<datetime.date.today()])
925+
today = date_today()
926+
candidate_presentations = self.sessionpresentation_set.filter(session__meeting__date__lte=today)
927+
candidate_meetings = set([p.session.meeting for p in candidate_presentations if p.session.meeting.end_date()<today])
917928
if candidate_meetings:
918929
mtg = sorted(list(candidate_meetings),key=lambda x:x.date,reverse=True)[0]
919930
return self.sessionpresentation_set.filter(session__meeting=mtg)
@@ -962,7 +973,7 @@ def fake_history_obj(self, rev):
962973
elif rev_events.exists():
963974
time = rev_events.first().time
964975
else:
965-
time = datetime.datetime.fromtimestamp(0)
976+
time = datetime.datetime.fromtimestamp(0, datetime.timezone.utc)
966977
dh = DocHistory(name=self.name, rev=rev, doc=self, time=time, type=self.type, title=self.title,
967978
stream=self.stream, group=self.group)
968979

0 commit comments

Comments
 (0)