1717from ietf .doc .models import Document
1818from ietf .group .models import Group
1919from ietf .ietfauth .utils import has_role , user_is_person
20+ from ietf .liaisons .utils import get_person_for_user
2021from ietf .person .models import Person
21- from ietf .meeting .models import Meeting , Schedule
22+ from ietf .meeting .models import Meeting , Schedule , TimeSlot , SchedTimeSessAssignment
2223from ietf .utils .history import find_history_active_at , find_history_replacements_active_at
2324from 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+
288293def 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
0 commit comments