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
This commit is contained in:
Jennifer Richards 2022-12-06 10:46:48 -04:00 committed by GitHub
parent 895aff9480
commit ac55b2cb6f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 10 deletions

View file

@ -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()

View file

@ -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):

View file

@ -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):