Add support for variable length meetings to secr/meetings app. Commit ready for merge

- Legacy-Id: 17590
This commit is contained in:
Ryan Cross 2020-04-06 22:54:36 +00:00
parent a99c37cd47
commit 3f6081a5b9
3 changed files with 20 additions and 13 deletions

View file

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

View file

@ -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,

View file

@ -19,7 +19,7 @@
<tbody>
{% for item in times %}
<tr class="{% cycle 'row1' 'row2' %}">
<td>{{ item.time|date:"D" }}</td>
<td>{{ item.time|date:"D M d" }}</td>
<td>{{ item.time|date:"H:i" }} - {{ item.end_time|date:"H:i" }}</td>
<td>{{ item.name }}</td>
<td><a href="{% url "ietf.secr.meetings.views.times_edit" meeting_id=meeting.number schedule_name=schedule.name time=item.time|date:"Y:m:d:H:i" %}">Edit</a></td>