From ac55b2cb6ffbb0106c9609ecfcd173c55b4a6baf Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Tue, 6 Dec 2022 10:46:48 -0400 Subject: [PATCH] fix: init time inputs in correct tz when editing an interim request (#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 --- ietf/meeting/forms.py | 8 ++++---- ietf/meeting/tests_forms.py | 10 ++++++++++ ietf/meeting/tests_views.py | 16 ++++++++++------ 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/ietf/meeting/forms.py b/ietf/meeting/forms.py index a946fe20b..477a1dbb9 100644 --- a/ietf/meeting/forms.py +++ b/ietf/meeting/forms.py @@ -223,10 +223,10 @@ class InterimMeetingModelForm(forms.ModelForm): class InterimSessionModelForm(forms.ModelForm): date = DatepickerDateField(date_format="yyyy-mm-dd", picker_settings={"autoclose": "1"}, label='Date', required=False) - time = forms.TimeField(widget=forms.TimeInput(format='%H:%M'), required=True, help_text="Local time") + time = forms.TimeField(widget=forms.TimeInput(format='%H:%M'), required=True, help_text="Start time in meeting time zone") time.widget.attrs['placeholder'] = "HH:MM" requested_duration = CustomDurationField(required=True) - end_time = forms.TimeField(required=False, help_text="Local time") + end_time = forms.TimeField(required=False, help_text="End time in meeting time zone") end_time.widget.attrs['placeholder'] = "HH:MM" remote_participation = forms.ChoiceField(choices=(), required=False) remote_instructions = forms.CharField( @@ -258,8 +258,8 @@ class InterimSessionModelForm(forms.ModelForm): self.is_edit = bool(self.instance.pk) # setup fields that aren't intrinsic to the Session object if self.is_edit: - self.initial['date'] = self.instance.official_timeslotassignment().timeslot.time - self.initial['time'] = self.instance.official_timeslotassignment().timeslot.time + self.initial['date'] = self.instance.official_timeslotassignment().timeslot.local_start_time().date() + self.initial['time'] = self.instance.official_timeslotassignment().timeslot.local_start_time().time() if self.instance.agenda(): doc = self.instance.agenda() content = doc.text_or_error() diff --git a/ietf/meeting/tests_forms.py b/ietf/meeting/tests_forms.py index 4a06d7786..61d0a1d2c 100644 --- a/ietf/meeting/tests_forms.py +++ b/ietf/meeting/tests_forms.py @@ -6,6 +6,7 @@ from django.core.files.uploadedfile import SimpleUploadedFile from django.test import override_settings, RequestFactory from ietf.group.factories import GroupFactory +from ietf.meeting.factories import SessionFactory from ietf.meeting.forms import (FileUploadForm, ApplyToAllFileUploadForm, InterimSessionModelForm, InterimMeetingModelForm) from ietf.person.factories import PersonFactory @@ -123,6 +124,15 @@ class InterimSessionModelFormTests(TestCase): self.assertNotIn('meetecho', choice_vals) self.assertIn('manual', choice_vals) + def test_edits_in_meeting_time_zone(self): + # use a time zone that never has a UTC offset of 0, even with DST + session = SessionFactory(meeting__type_id='interim', meeting__time_zone='America/Halifax') + form = InterimSessionModelForm(instance=session) + self.assertEqual( + form.initial['time'].strftime('%H:%M'), + session.official_timeslotassignment().timeslot.local_start_time().strftime('%H:%M'), + ) + class InterimMeetingModelFormTests(TestCase): def test_enforces_authroles(self): diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index 482d3ccc6..9d7fc8f28 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -5382,12 +5382,11 @@ class InterimTests(TestCase): length_before = len(outbox) form_initial = r.context['form'].initial formset_initial = r.context['formset'].forms[0].initial - new_time = formset_initial['time'] + datetime.timedelta(hours=1) data = {'group':group.pk, 'meeting_type':'single', 'session_set-0-id':meeting.session_set.first().id, 'session_set-0-date':formset_initial['date'].strftime('%Y-%m-%d'), - 'session_set-0-time':new_time.strftime('%H:%M'), + 'session_set-0-time':'12:34', 'session_set-0-requested_duration': '00:30', 'session_set-0-remote_instructions':formset_initial['remote_instructions'], #'session_set-0-agenda':formset_initial['agenda'], @@ -5400,7 +5399,10 @@ class InterimTests(TestCase): self.assertEqual(len(outbox),length_before) session = meeting.session_set.first() timeslot = session.official_timeslotassignment().timeslot - self.assertEqual(timeslot.time,new_time) + self.assertEqual( + timeslot.time, + meeting.tz().localize(datetime.datetime.combine(formset_initial['date'], datetime.time(12, 34))), + ) def test_interim_request_edit(self): '''Edit request. Send notice of change''' @@ -5420,13 +5422,12 @@ class InterimTests(TestCase): length_before = len(outbox) form_initial = r.context['form'].initial formset_initial = r.context['formset'].forms[0].initial - new_time = formset_initial['time'] + datetime.timedelta(hours=1) new_duration = formset_initial['requested_duration'] + datetime.timedelta(hours=1) data = {'group':group.pk, 'meeting_type':'single', 'session_set-0-id':meeting.session_set.first().id, 'session_set-0-date':formset_initial['date'].strftime('%Y-%m-%d'), - 'session_set-0-time':new_time.strftime('%H:%M'), + 'session_set-0-time': '12:34', 'session_set-0-requested_duration':self.strfdelta(new_duration, '{hours}:{minutes}'), 'session_set-0-remote_instructions':formset_initial['remote_instructions'], #'session_set-0-agenda':formset_initial['agenda'], @@ -5440,7 +5441,10 @@ class InterimTests(TestCase): self.assertIn('CHANGED', outbox[-1]['Subject']) session = meeting.session_set.first() timeslot = session.official_timeslotassignment().timeslot - self.assertEqual(timeslot.time,new_time) + self.assertEqual( + timeslot.time, + meeting.tz().localize(datetime.datetime.combine(formset_initial['date'], datetime.time(12, 34))), + ) self.assertEqual(timeslot.duration,new_duration) def strfdelta(self, tdelta, fmt):