Skip to content

Commit be6e536

Browse files
committed
add pending and detail views and tests.
- Legacy-Id: 11125
1 parent 8f8e4df commit be6e536

11 files changed

Lines changed: 521 additions & 121 deletions

File tree

ietf/meeting/forms.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,19 @@
33

44
from django import forms
55
from django.core.validators import ValidationError
6-
from django.forms import BaseFormSet
76
from django.forms.fields import Field
87
from django.utils.encoding import force_text
98
from django.utils import six
109

1110
from ietf.group.models import Group
1211
from ietf.ietfauth.utils import has_role
13-
from ietf.meeting.models import Meeting, Schedule, TimeSlot, Session, SchedTimeSessAssignment, countries, timezones
12+
from ietf.meeting.models import Session, countries, timezones
13+
from ietf.meeting.helpers import assign_interim_session
1414
from ietf.utils.fields import DatepickerDateField
1515

1616
# need to insert empty option for use in ChoiceField
17-
countries.insert(0, ('', '-'*9 ))
17+
#countries.insert(0, ('', '-'*9 ))
18+
countries.insert(0, ('', ''))
1819
timezones.insert(0, ('', '-'*9 ))
1920

2021
# -------------------------------------------------
@@ -138,7 +139,7 @@ def save(self,commit=True):
138139

139140
class InterimRequestForm(forms.Form):
140141
group = GroupModelChoiceField(queryset = Group.objects.filter(type__in=('wg','rg'),state='active').order_by('acronym'))
141-
face_to_face = forms.BooleanField(required=False)
142+
in_person = forms.BooleanField(required=False)
142143
meeting_type = forms.ChoiceField(choices=(("single", "Single"), ("multi-day", "Multi-Day"), ('series','Series')), required=False, initial='single', widget=forms.RadioSelect)
143144
approved = forms.BooleanField(required=False)
144145

@@ -160,18 +161,20 @@ def set_group_options(self):
160161
queryset = Group.objects.filter(type="rg", state="active").order_by('acronym')
161162
elif has_role(self.user, "WG Chair"):
162163
queryset = Group.objects.filter(type="wg", state="active", role__person=self.person, role__name="chair").distinct().order_by('acronym')
163-
164+
elif has_role(self.user, "RG Chair"):
165+
queryset = Group.objects.filter(type="rg", state="active", role__person=self.person, role__name="chair").distinct().order_by('acronym')
164166
self.fields['group'].queryset = queryset
165167

166168
# if there's only one possibility make it the default
167169
if len(queryset) == 1:
168170
self.fields['group'].initial = queryset[0]
169171

170172
class InterimSessionForm(forms.Form):
171-
date = DatepickerDateField(date_format="yyyy-mm-dd", picker_settings={"autoclose": "1" }, label='Date', required=True)
172-
time = forms.TimeField()
173+
# unset: date,time,duration
174+
date = DatepickerDateField(date_format="yyyy-mm-dd", picker_settings={"autoclose": "1" }, label='Date', required=False)
175+
time = forms.TimeField(required=False)
173176
time_utc = forms.TimeField(required=False)
174-
duration = DurationField()
177+
duration = DurationField(required=False)
175178
end_time = forms.TimeField(required=False)
176179
end_time_utc = forms.TimeField(required=False)
177180
remote_instructions = forms.CharField(max_length=1024,required=False)
@@ -196,17 +199,16 @@ def save(self, request, group, meeting):
196199
time = self.cleaned_data.get('time')
197200
duration = self.cleaned_data.get('duration')
198201
remote_instructions = self.cleaned_data.get('remote_instructions')
199-
200-
slot = TimeSlot.objects.create(meeting=meeting, type_id="session", duration=duration,
201-
time=datetime.datetime.combine(date, time))
202+
time=datetime.datetime.combine(date, time)
202203
session = Session.objects.create(meeting=meeting,
203204
group=group,
204205
requested_by=person,
206+
requested_duration=duration,
205207
status_id='apprw',
206208
type_id='session',
207209
remote_instructions=remote_instructions,
208210
agenda_note=agenda_note,)
209-
SchedTimeSessAssignment.objects.create(timeslot=slot, session=session, schedule=meeting.agenda)
210-
211+
assign_interim_session(session,time)
212+
211213
if agenda:
212214
self._save_agenda(agenda)

ietf/meeting/helpers.py

Lines changed: 75 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@
1717
from ietf.doc.models import Document
1818
from ietf.group.models import Group
1919
from ietf.ietfauth.utils import has_role, user_is_person
20+
from ietf.liaisons.utils import get_person_for_user
2021
from ietf.person.models import Person
21-
from ietf.meeting.models import Meeting, Schedule
22+
from ietf.meeting.models import Meeting, Schedule, TimeSlot, SchedTimeSessAssignment
2223
from ietf.utils.history import find_history_active_at, find_history_replacements_active_at
2324
from ietf.utils.pipe import pipe
2425

@@ -285,6 +286,10 @@ def session_constraint_expire(request,session):
285286
if key is not None and cache.has_key(key):
286287
cache.delete(key)
287288

289+
# -------------------------------------------------
290+
# Interim Meeting Helpers
291+
# -------------------------------------------------
292+
288293
def get_earliest_session(session_formset):
289294
'''Return earliest InterimSessionForm from formset'''
290295
earliest = session_formset[0]
@@ -300,20 +305,79 @@ def get_next_interim_number(group,date):
300305
sequence = Meeting.objects.filter(number__startswith='interim-%s-%s' % (date.year,group.acronym)).count() + 1
301306
return 'interim-%s-%s-%s' % (date.year,group.acronym,sequence)
302307

303-
def create_interim_meeting(request_form,session_form):
304-
'''Create an Interim meeting, given an InterimRequestForm and InterimSessionForm'''
305-
group = request_form.cleaned_data.get('group')
306-
date = session_form.cleaned_data.get('date')
308+
def create_interim_meeting(group,date,city='',country='',timezone='UTC',person=None):
309+
'''Helper function to create interim meeting and associated schedule'''
310+
if not person:
311+
person = Person.objects.get(name="(System)")
307312
number = get_next_interim_number(group,date)
308-
city = session_form.cleaned_data.get('city')
309-
country = session_form.cleaned_data.get('country')
310-
timezone = session_form.cleaned_data.get('timezone')
311-
if not request_form.cleaned_data.get('face_to_face'):
312-
timezone = 'UTC'
313313
meeting = Meeting.objects.create(number=number,type_id='interim',date=date,city=city,
314314
country=country,time_zone=timezone)
315-
schedule = Schedule.objects.create(meeting=meeting, owner=request_form.person, visible=True, public=True)
315+
schedule = Schedule.objects.create(meeting=meeting, owner=person, visible=True, public=True)
316316
meeting.agenda = schedule
317317
meeting.save()
318318
return meeting
319319

320+
def create_interim_meeting_from_forms(request_form,session_form):
321+
'''Create an Interim meeting, given an InterimRequestForm and InterimSessionForm'''
322+
group = request_form.cleaned_data.get('group')
323+
date = session_form.cleaned_data.get('date')
324+
city = session_form.cleaned_data.get('city')
325+
country = session_form.cleaned_data.get('country')
326+
timezone = session_form.cleaned_data.get('timezone')
327+
person = request_form.person
328+
return create_interim_meeting(group=group,date=date,city=city,country=country,timezone=timezone,person=person)
329+
330+
def assign_interim_session(session,time):
331+
'''Helper function to create a timeslot and assign the interim session'''
332+
slot = TimeSlot.objects.create(meeting=session.meeting, type_id="session",
333+
duration=session.requested_duration, time=time)
334+
SchedTimeSessAssignment.objects.create(timeslot=slot, session=session, schedule=session.meeting.agenda)
335+
336+
def can_approve_interim_request(meeting,user):
337+
'''Returns True if the user has permissions to approve an interim meeting request'''
338+
if meeting.type.slug != 'interim':
339+
return False
340+
if has_role(user, 'Secretariat'):
341+
return True
342+
person = get_person_for_user(user)
343+
session = meeting.session_set.first()
344+
if not session:
345+
return False
346+
group = session.group
347+
if group.type.slug == 'wg' and group.parent.role_set.filter(name='ad',person=person):
348+
return True
349+
if group.type.slug == 'rg' and group.parent.role_set.filter(name='chair',person=person):
350+
return True
351+
return False
352+
353+
def can_edit_interim_request(meeting,user):
354+
'''Returns True if the user can edit the interim meeting request'''
355+
356+
if can_approve_interim_request(meeting,user):
357+
return True
358+
359+
return False
360+
361+
def can_request_interim_meeting(user):
362+
if has_role(user, ('Secretariat','Area Director','WG Chair','IRTF Chair', 'RG Chair')):
363+
return True
364+
return False
365+
366+
def can_view_interim_request(meeting,user):
367+
'''Returns True if the user can see the pending interim request in the pending interim view'''
368+
if meeting.type.slug != 'interim':
369+
return False
370+
if has_role(user, 'Secretariat'):
371+
return True
372+
person = get_person_for_user(user)
373+
session = meeting.session_set.first()
374+
if not session:
375+
return False
376+
group = session.group
377+
if has_role(user, 'Area Director') and group.type.slug == 'wg':
378+
return True
379+
if has_role(user, 'IRTF Chair') and group.type.slug == 'rg':
380+
return True
381+
if group.role_set.filter(name='chair',person=person):
382+
return True
383+
return False

ietf/meeting/test_data.py

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,21 @@
33
from ietf.doc.models import Document, State
44
from ietf.group.models import Group
55
from ietf.meeting.models import Meeting, Room, TimeSlot, Session, Schedule, SchedTimeSessAssignment, ResourceAssociation, SessionPresentation
6+
from ietf.meeting.helpers import create_interim_meeting, assign_interim_session
67
from ietf.name.models import RoomResourceName
78
from ietf.person.models import Person
89
from ietf.utils.test_data import make_test_data
910

11+
def make_interim_meeting(group,date,status='sched'):
12+
system_person = Person.objects.get(name="(System)")
13+
time = datetime.datetime.combine(date, datetime.time(9))
14+
meeting = create_interim_meeting(group=group,date=date)
15+
session = Session.objects.create(meeting=meeting, group=group,
16+
attendees=10, requested_by=system_person,
17+
requested_duration=20, status_id=status,
18+
scheduled=datetime.datetime.now(),type_id="session")
19+
assign_interim_session(session,time)
20+
return meeting
1021

1122
def make_meeting_test_data():
1223
if not Group.objects.filter(acronym='mars'):
@@ -79,29 +90,13 @@ def make_meeting_test_data():
7990

8091
# Future Interim Meetings
8192
date = datetime.date.today() + datetime.timedelta(days=365)
82-
mars_meeting = Meeting.objects.create(
83-
number="interim-%s-mars-1" % date.year,
84-
type_id='interim',
85-
date=date,
86-
city="New York",
87-
country="US",
88-
)
89-
mars_session = Session.objects.create(meeting=mars_meeting, group=mars,
90-
attendees=10, requested_by=system_person,
91-
requested_duration=20, status_id="sched",
92-
scheduled=datetime.datetime.now(),type_id="session")
93+
date2 = datetime.date.today() + datetime.timedelta(days=1000)
9394
ames = Group.objects.get(acronym="ames")
94-
ames_meeting = Meeting.objects.create(
95-
number="interim-%s-ames-1" % date.year,
96-
type_id='interim',
97-
date=date,
98-
city="New York",
99-
country="US",
100-
)
101-
ames_session = Session.objects.create(meeting=ames_meeting, group=ames,
102-
attendees=10, requested_by=system_person,
103-
requested_duration=20, status_id="canceled",
104-
scheduled=datetime.datetime.now(),type_id="session")
95+
96+
make_interim_meeting(group=mars,date=date,status='sched')
97+
make_interim_meeting(group=mars,date=date2,status='apprw')
98+
make_interim_meeting(group=ames,date=date,status='canceled')
99+
make_interim_meeting(group=ames,date=date2,status='apprw')
105100

106101
return meeting
107102

0 commit comments

Comments
 (0)