Skip to content

Commit ac55b2c

Browse files
fix: init time inputs in correct tz when editing an interim request (ietf-tools#4838)
* fix: init time inputs in correct tz when editing an interim request * test: add test * test: fix old tests that relied on mixing dates, times, and datetimes
1 parent 895aff9 commit ac55b2c

3 files changed

Lines changed: 24 additions & 10 deletions

File tree

ietf/meeting/forms.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -223,10 +223,10 @@ def save(self, *args, **kwargs):
223223

224224
class InterimSessionModelForm(forms.ModelForm):
225225
date = DatepickerDateField(date_format="yyyy-mm-dd", picker_settings={"autoclose": "1"}, label='Date', required=False)
226-
time = forms.TimeField(widget=forms.TimeInput(format='%H:%M'), required=True, help_text="Local time")
226+
time = forms.TimeField(widget=forms.TimeInput(format='%H:%M'), required=True, help_text="Start time in meeting time zone")
227227
time.widget.attrs['placeholder'] = "HH:MM"
228228
requested_duration = CustomDurationField(required=True)
229-
end_time = forms.TimeField(required=False, help_text="Local time")
229+
end_time = forms.TimeField(required=False, help_text="End time in meeting time zone")
230230
end_time.widget.attrs['placeholder'] = "HH:MM"
231231
remote_participation = forms.ChoiceField(choices=(), required=False)
232232
remote_instructions = forms.CharField(
@@ -258,8 +258,8 @@ def __init__(self, *args, **kwargs):
258258
self.is_edit = bool(self.instance.pk)
259259
# setup fields that aren't intrinsic to the Session object
260260
if self.is_edit:
261-
self.initial['date'] = self.instance.official_timeslotassignment().timeslot.time
262-
self.initial['time'] = self.instance.official_timeslotassignment().timeslot.time
261+
self.initial['date'] = self.instance.official_timeslotassignment().timeslot.local_start_time().date()
262+
self.initial['time'] = self.instance.official_timeslotassignment().timeslot.local_start_time().time()
263263
if self.instance.agenda():
264264
doc = self.instance.agenda()
265265
content = doc.text_or_error()

ietf/meeting/tests_forms.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from django.test import override_settings, RequestFactory
77

88
from ietf.group.factories import GroupFactory
9+
from ietf.meeting.factories import SessionFactory
910
from ietf.meeting.forms import (FileUploadForm, ApplyToAllFileUploadForm, InterimSessionModelForm,
1011
InterimMeetingModelForm)
1112
from ietf.person.factories import PersonFactory
@@ -123,6 +124,15 @@ def test_remote_participation_options(self):
123124
self.assertNotIn('meetecho', choice_vals)
124125
self.assertIn('manual', choice_vals)
125126

127+
def test_edits_in_meeting_time_zone(self):
128+
# use a time zone that never has a UTC offset of 0, even with DST
129+
session = SessionFactory(meeting__type_id='interim', meeting__time_zone='America/Halifax')
130+
form = InterimSessionModelForm(instance=session)
131+
self.assertEqual(
132+
form.initial['time'].strftime('%H:%M'),
133+
session.official_timeslotassignment().timeslot.local_start_time().strftime('%H:%M'),
134+
)
135+
126136

127137
class InterimMeetingModelFormTests(TestCase):
128138
def test_enforces_authroles(self):

ietf/meeting/tests_views.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5382,12 +5382,11 @@ def test_interim_request_edit_no_notice(self):
53825382
length_before = len(outbox)
53835383
form_initial = r.context['form'].initial
53845384
formset_initial = r.context['formset'].forms[0].initial
5385-
new_time = formset_initial['time'] + datetime.timedelta(hours=1)
53865385
data = {'group':group.pk,
53875386
'meeting_type':'single',
53885387
'session_set-0-id':meeting.session_set.first().id,
53895388
'session_set-0-date':formset_initial['date'].strftime('%Y-%m-%d'),
5390-
'session_set-0-time':new_time.strftime('%H:%M'),
5389+
'session_set-0-time':'12:34',
53915390
'session_set-0-requested_duration': '00:30',
53925391
'session_set-0-remote_instructions':formset_initial['remote_instructions'],
53935392
#'session_set-0-agenda':formset_initial['agenda'],
@@ -5400,7 +5399,10 @@ def test_interim_request_edit_no_notice(self):
54005399
self.assertEqual(len(outbox),length_before)
54015400
session = meeting.session_set.first()
54025401
timeslot = session.official_timeslotassignment().timeslot
5403-
self.assertEqual(timeslot.time,new_time)
5402+
self.assertEqual(
5403+
timeslot.time,
5404+
meeting.tz().localize(datetime.datetime.combine(formset_initial['date'], datetime.time(12, 34))),
5405+
)
54045406

54055407
def test_interim_request_edit(self):
54065408
'''Edit request. Send notice of change'''
@@ -5420,13 +5422,12 @@ def test_interim_request_edit(self):
54205422
length_before = len(outbox)
54215423
form_initial = r.context['form'].initial
54225424
formset_initial = r.context['formset'].forms[0].initial
5423-
new_time = formset_initial['time'] + datetime.timedelta(hours=1)
54245425
new_duration = formset_initial['requested_duration'] + datetime.timedelta(hours=1)
54255426
data = {'group':group.pk,
54265427
'meeting_type':'single',
54275428
'session_set-0-id':meeting.session_set.first().id,
54285429
'session_set-0-date':formset_initial['date'].strftime('%Y-%m-%d'),
5429-
'session_set-0-time':new_time.strftime('%H:%M'),
5430+
'session_set-0-time': '12:34',
54305431
'session_set-0-requested_duration':self.strfdelta(new_duration, '{hours}:{minutes}'),
54315432
'session_set-0-remote_instructions':formset_initial['remote_instructions'],
54325433
#'session_set-0-agenda':formset_initial['agenda'],
@@ -5440,7 +5441,10 @@ def test_interim_request_edit(self):
54405441
self.assertIn('CHANGED', outbox[-1]['Subject'])
54415442
session = meeting.session_set.first()
54425443
timeslot = session.official_timeslotassignment().timeslot
5443-
self.assertEqual(timeslot.time,new_time)
5444+
self.assertEqual(
5445+
timeslot.time,
5446+
meeting.tz().localize(datetime.datetime.combine(formset_initial['date'], datetime.time(12, 34))),
5447+
)
54445448
self.assertEqual(timeslot.duration,new_duration)
54455449

54465450
def strfdelta(self, tdelta, fmt):

0 commit comments

Comments
 (0)