From 3f6081a5b9d982e46865b696ecf857b39c0af064 Mon Sep 17 00:00:00 2001 From: Ryan Cross Date: Mon, 6 Apr 2020 22:54:36 +0000 Subject: [PATCH] Add support for variable length meetings to secr/meetings app. Commit ready for merge - Legacy-Id: 17590 --- ietf/secr/meetings/forms.py | 23 +++++++++++++++-------- ietf/secr/meetings/views.py | 8 ++++---- ietf/secr/templates/meetings/times.html | 2 +- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/ietf/secr/meetings/forms.py b/ietf/secr/meetings/forms.py index 4aa1dd36b..dc5fba4d1 100644 --- a/ietf/secr/meetings/forms.py +++ b/ietf/secr/meetings/forms.py @@ -1,4 +1,5 @@ # Copyright The IETF Trust 2013-2019, All Rights Reserved +import datetime import re from django import forms @@ -10,13 +11,6 @@ from ietf.meeting.models import Meeting, Room, TimeSlot, Session, SchedTimeSessA from ietf.name.models import TimeSlotTypeName import ietf.utils.fields -DAYS_CHOICES = ((0,'Saturday'), - (1,'Sunday'), - (2,'Monday'), - (3,'Tuesday'), - (4,'Wednesday'), - (5,'Thursday'), - (6,'Friday')) # using Django week_day lookup values (Sunday=1) SESSION_DAYS = ((2,'Monday'), @@ -131,15 +125,18 @@ class MeetingRoomForm(forms.ModelForm): exclude = ['resources'] class TimeSlotForm(forms.Form): - day = forms.ChoiceField(choices=DAYS_CHOICES) + day = forms.ChoiceField() time = forms.TimeField() duration = ietf.utils.fields.DurationField() name = forms.CharField(help_text='Name that appears on the agenda') def __init__(self,*args,**kwargs): + if 'meeting' in kwargs: + self.meeting = kwargs.pop('meeting') super(TimeSlotForm, self).__init__(*args,**kwargs) self.fields["time"].widget.attrs["placeholder"] = "HH:MM" self.fields["duration"].widget.attrs["placeholder"] = "HH:MM" + self.fields["day"].choices = self.get_day_choices() def clean_duration(self): '''Limit to HH:MM format''' @@ -148,6 +145,16 @@ class TimeSlotForm(forms.Form): raise forms.ValidationError('{} value has an invalid format. It must be in HH:MM format'.format(duration)) return self.cleaned_data['duration'] + def get_day_choices(self): + '''Get day choices for form based on meeting duration''' + choices = [] + start = self.meeting.date + for n in range(self.meeting.days): + date = start + datetime.timedelta(days=n) + choices.append((n, date.strftime("%a %b %d"))) + return choices + + class MiscSessionForm(TimeSlotForm): short = forms.CharField(max_length=32,label='Short Name',help_text='Enter an abbreviated session name (used for material file names)',required=False) type = forms.ModelChoiceField(queryset=TimeSlotTypeName.objects.filter(used=True).exclude(slug__in=('regular',)),empty_label=None) diff --git a/ietf/secr/meetings/views.py b/ietf/secr/meetings/views.py index 04972299a..815b16121 100644 --- a/ietf/secr/meetings/views.py +++ b/ietf/secr/meetings/views.py @@ -740,7 +740,7 @@ def times(request, meeting_id, schedule_name): times = sorted(slots, key=lambda a: a['time']) if request.method == 'POST': - form = TimeSlotForm(request.POST) + form = TimeSlotForm(request.POST, meeting=meeting) if form.is_valid(): time = get_timeslot_time(form, meeting) duration = form.cleaned_data['duration'] @@ -764,7 +764,7 @@ def times(request, meeting_id, schedule_name): return redirect('ietf.secr.meetings.views.times', meeting_id=meeting_id,schedule_name=schedule_name) else: - form = TimeSlotForm() + form = TimeSlotForm(meeting=meeting) return render(request, 'meetings/times.html', { 'form': form, @@ -799,7 +799,7 @@ def times_edit(request, meeting_id, schedule_name, time): if button_text == 'Cancel': return redirect('ietf.secr.meetings.views.times', meeting_id=meeting_id,schedule_name=schedule_name) - form = TimeSlotForm(request.POST) + form = TimeSlotForm(request.POST, meeting=meeting) if form.is_valid(): day = form.cleaned_data['day'] time = get_timeslot_time(form, meeting) @@ -825,7 +825,7 @@ def times_edit(request, meeting_id, schedule_name, time): 'time':dtime.strftime('%H:%M'), 'duration':timeslots.first().duration, 'name':timeslots.first().name} - form = TimeSlotForm(initial=initial) + form = TimeSlotForm(initial=initial, meeting=meeting) return render(request, 'meetings/times_edit.html', { 'meeting': meeting, diff --git a/ietf/secr/templates/meetings/times.html b/ietf/secr/templates/meetings/times.html index ea22ecd21..6d1a19736 100644 --- a/ietf/secr/templates/meetings/times.html +++ b/ietf/secr/templates/meetings/times.html @@ -19,7 +19,7 @@ {% for item in times %} - {{ item.time|date:"D" }} + {{ item.time|date:"D M d" }} {{ item.time|date:"H:i" }} - {{ item.end_time|date:"H:i" }} {{ item.name }} Edit