1414
1515from ietf .utils .mail import send_mail
1616from ietf .meeting .models import Meeting , Session , Room , TimeSlot , ScheduledSession , Schedule
17- from ietf .meeting .helpers import get_schedule
1817from ietf .group .models import Group , GroupEvent
1918from ietf .person .models import Person
2019from ietf .secr .meetings .blue_sheets import create_blue_sheets
@@ -83,19 +82,18 @@ def build_timeslots(meeting,room=None):
8382 location = room ,
8483 duration = t .duration )
8584
86- def build_nonsession (meeting ):
85+ def build_nonsession (meeting , schedule ):
8786 '''
8887 This function takes a meeting object and creates non-session records
8988 for a new meeting, based on the last meeting
9089 '''
9190 last_meeting = get_last_meeting (meeting )
9291 if not last_meeting :
9392 return None
94-
93+
9594 delta = meeting .date - last_meeting .date
9695 system = Person .objects .get (name = '(system)' )
97- schedule = get_schedule (meeting )
98-
96+
9997 for slot in TimeSlot .objects .filter (meeting = last_meeting ,type__in = ('break' ,'reg' ,'other' ,'plenary' )):
10098 new_time = slot .time + delta
10199 session = None
@@ -118,13 +116,36 @@ def build_nonsession(meeting):
118116 if session :
119117 ScheduledSession .objects .create (schedule = schedule ,session = session ,timeslot = ts )
120118
119+ def check_nonsession (meeting ,schedule ):
120+ '''
121+ Ensure non-session timeslots exist and have appropriate ScheduledSession objects
122+ for the specified schedule.
123+ '''
124+ slots = TimeSlot .objects .filter (meeting = meeting ,type__in = ('break' ,'reg' ,'other' ,'plenary' ))
125+ if not slots :
126+ build_nonsession (meeting ,schedule )
127+ return None
128+
129+ scheduledsessions = slots .filter (type = 'plenary' ).first ().scheduledsession_set .all ()
130+ if not scheduledsessions .filter (schedule = schedule ):
131+ source = scheduledsessions .first ().schedule
132+ copy_scheduledsessions (slots ,source ,schedule )
133+
134+ def copy_scheduledsessions (slots ,source ,target ):
135+ '''
136+ Copy scheduledsession objects from source schedule to target schedule. Slots is
137+ a queryset of slots
138+ '''
139+ for ss in ScheduledSession .objects .filter (schedule = source ,timeslot__in = slots ):
140+ ScheduledSession .objects .create (schedule = target ,session = ss .session ,timeslot = ss .timeslot )
141+
121142def get_last_meeting (meeting ):
122143 last_number = int (meeting .number ) - 1
123144 try :
124145 return Meeting .objects .get (number = last_number )
125146 except Meeting .DoesNotExist :
126147 return None
127-
148+
128149def is_combined (session ,meeting ,schedule = None ):
129150 '''
130151 Check to see if this session is using two combined timeslots
@@ -162,7 +183,7 @@ def send_notifications(meeting, groups, person):
162183 # easier to populate template from timeslot perspective. assuming one-to-one timeslot-session
163184 count = 0
164185 session_info = ''
165- data = [ (s ,get_timeslot (s )) for s in sessions ]
186+ data = [ (s ,get_timeslot (s )) for s in sessions if get_timeslot ( s ) ]
166187 for s ,t in data :
167188 count += 1
168189 session_info += session_info_template .format (group .acronym ,
@@ -189,7 +210,7 @@ def send_notifications(meeting, groups, person):
189210 template ,
190211 context ,
191212 cc = cc_list )
192-
213+
193214 # create sent_notification event
194215 GroupEvent .objects .create (group = group ,time = now ,type = 'sent_notification' ,
195216 by = person ,desc = 'sent scheduled notification for %s' % meeting )
@@ -392,10 +413,8 @@ def non_session(request, meeting_id, schedule_name):
392413 '''
393414 meeting = get_object_or_404 (Meeting , number = meeting_id )
394415 schedule = get_object_or_404 (Schedule , meeting = meeting , name = schedule_name )
395-
396- # if the Break/Registration records don't exist yet (new meeting) create them
397- if not TimeSlot .objects .filter (meeting = meeting ,type__in = ('break' ,'reg' ,'other' )):
398- build_nonsession (meeting )
416+
417+ check_nonsession (meeting ,schedule )
399418
400419 slots = TimeSlot .objects .filter (meeting = meeting ,type__in = ('break' ,'reg' ,'other' ,'plenary' )).order_by ('-type__name' ,'time' )
401420
@@ -419,7 +438,7 @@ def non_session(request, meeting_id, schedule_name):
419438 time = new_time ,
420439 duration = duration ,
421440 show_location = form .cleaned_data ['show_location' ])
422-
441+
423442 # create a dummy Session object to hold materials
424443 # NOTE: we're setting group to none here, but the set_room page will force user
425444 # to pick a legitimate group
@@ -432,14 +451,14 @@ def non_session(request, meeting_id, schedule_name):
432451 requested_by = Person .objects .get (name = '(system)' ),
433452 status_id = 'sched' )
434453 session .save ()
435-
454+
436455 # create association
437456 ScheduledSession .objects .create (timeslot = timeslot ,
438457 session = session ,
439- schedule = meeting . agenda )
458+ schedule = schedule )
440459
441460 messages .success (request , 'Non-Sessions updated successfully' )
442- return redirect ('meetings_non_session' , meeting_id = meeting_id , schedule_name = schedule . name )
461+ return redirect ('meetings_non_session' , meeting_id = meeting_id , schedule_name = schedule_name )
443462 else :
444463 form = NonSessionForm (initial = {'show_location' :True })
445464
@@ -456,19 +475,22 @@ def non_session(request, meeting_id, schedule_name):
456475
457476def non_session_delete (request , meeting_id , schedule_name , slot_id ):
458477 '''
459- This function deletes the non-session TimeSlot. For "other" and "plenary" timeslot types
460- we need to delete the corresponding Session object as well. Check for uploaded material
461- first.
478+ This function deletes the non-session TimeSlot. For "other" and "plenary" timeslot
479+ types we need to delete the corresponding Session object as well. Check for uploaded
480+ material first. ScheduledSession objects get deleted as well .
462481 '''
482+ meeting = get_object_or_404 (Meeting , number = meeting_id )
483+ # schedule = get_object_or_404(Schedule, meeting=meeting, name=schedule_name)
463484 slot = get_object_or_404 (TimeSlot , id = slot_id )
464485 if slot .type_id in ('other' ,'plenary' ):
465- session = get_session (slot ,schedule = schedule )
466- if session and session .materials .exclude (states__slug = 'deleted' ):
467- messages .error (request , 'Materials have already been uploaded for "%s". You must delete those before deleting the timeslot.' % slot .name )
468- return redirect ('meetings_non_session' , meeting_id = meeting_id , schedule_name = schedule_name )
469-
486+ scheduledsessions = slot .scheduledsession_set .filter (schedule__meeting = meeting )
487+ session_objects = [ x .session for x in scheduledsessions ]
488+ for session in session_objects :
489+ if session .materials .exclude (states__slug = 'deleted' ):
490+ messages .error (request , 'Materials have already been uploaded for "%s". You must delete those before deleting the timeslot.' % slot .name )
491+ return redirect ('meetings_non_session' , meeting_id = meeting_id , schedule_name = schedule_name )
470492 else :
471- slot . sessions . all ( ).delete ()
493+ Session . objects . filter ( pk__in = [ x . pk for x in session_objects ] ).delete ()
472494 slot .delete ()
473495
474496 messages .success (request , 'Non-Session timeslot deleted successfully' )
@@ -480,6 +502,7 @@ def non_session_edit(request, meeting_id, schedule_name, slot_id):
480502 '''
481503 meeting = get_object_or_404 (Meeting , number = meeting_id )
482504 slot = get_object_or_404 (TimeSlot , id = slot_id )
505+ schedule = get_object_or_404 (Schedule , meeting = meeting , name = schedule_name )
483506 session = get_session (slot ,schedule = schedule )
484507
485508 if request .method == 'POST' :
@@ -517,6 +540,7 @@ def non_session_edit(request, meeting_id, schedule_name, slot_id):
517540 return render_to_response ('meetings/non_session_edit.html' , {
518541 'meeting' : meeting ,
519542 'form' : form ,
543+ 'schedule' : schedule ,
520544 'slot' : slot },
521545 RequestContext (request , {}),
522546 )
@@ -585,7 +609,7 @@ def rooms(request, meeting_id, schedule_name):
585609 '''
586610 meeting = get_object_or_404 (Meeting , number = meeting_id )
587611 schedule = get_object_or_404 (Schedule , meeting = meeting , name = schedule_name )
588-
612+
589613 # if no rooms exist yet (new meeting) formset extra=10
590614 first_time = not bool (meeting .room_set .all ())
591615 extra = 10 if first_time else 0
@@ -630,7 +654,7 @@ def schedule(request, meeting_id, schedule_name, acronym):
630654 meeting = get_object_or_404 (Meeting , number = meeting_id )
631655 schedule = get_object_or_404 (Schedule , meeting = meeting , name = schedule_name )
632656 group = get_object_or_404 (Group , acronym = acronym )
633-
657+
634658 sessions = Session .objects .filter (meeting = meeting ,group = group ,status__in = ('schedw' ,'apprw' ,'appr' ,'sched' ,'canceled' ))
635659 legacy_session = get_initial_session (sessions )
636660 now = datetime .datetime .now ()
@@ -742,13 +766,13 @@ def select(request, meeting_id, schedule_name):
742766 '''
743767 meeting = get_object_or_404 (Meeting , number = meeting_id )
744768 schedule = get_object_or_404 (Schedule , meeting = meeting , name = schedule_name )
745-
769+
746770 return render_to_response ('meetings/select.html' , {
747771 'meeting' : meeting ,
748772 'schedule' : schedule },
749773 RequestContext (request , {}),
750774 )
751-
775+
752776def select_group (request , meeting_id , schedule_name ):
753777 '''
754778 In this view the user can select the group to schedule. Only those groups that have
@@ -758,7 +782,7 @@ def select_group(request, meeting_id, schedule_name):
758782 '''
759783 meeting = get_object_or_404 (Meeting , number = meeting_id )
760784 schedule = get_object_or_404 (Schedule , meeting = meeting , name = schedule_name )
761-
785+
762786 if request .method == 'POST' :
763787 group = request .POST .get ('group' ,None )
764788 if group :
@@ -864,7 +888,7 @@ def times_edit(request, meeting_id, schedule_name, time):
864888 '''
865889 meeting = get_object_or_404 (Meeting , number = meeting_id )
866890 schedule = get_object_or_404 (Schedule , meeting = meeting , name = schedule_name )
867-
891+
868892 parts = [ int (x ) for x in time .split (':' ) ]
869893 dtime = datetime .datetime (* parts )
870894 timeslots = TimeSlot .objects .filter (meeting = meeting ,time = dtime )
@@ -880,10 +904,10 @@ def times_edit(request, meeting_id, schedule_name, time):
880904 time = form .cleaned_data ['time' ]
881905 duration = form .cleaned_data ['duration' ]
882906 name = form .cleaned_data ['name' ]
883-
907+
884908 t = meeting .date + datetime .timedelta (days = int (day ))
885909 new_time = datetime .datetime (t .year ,t .month ,t .day ,time .hour ,time .minute )
886-
910+
887911 for timeslot in timeslots :
888912 timeslot .time = new_time
889913 timeslot .duration = duration
@@ -918,7 +942,7 @@ def times_delete(request, meeting_id, schedule_name, time):
918942 meeting. There is one timeslot for each room.
919943 '''
920944 meeting = get_object_or_404 (Meeting , number = meeting_id )
921-
945+
922946 parts = [ int (x ) for x in time .split (':' ) ]
923947 dtime = datetime .datetime (* parts )
924948
@@ -955,7 +979,7 @@ def view(request, meeting_id):
955979
956980 '''
957981 meeting = get_object_or_404 (Meeting , number = meeting_id )
958-
982+
959983 return render_to_response ('meetings/view.html' , {
960984 'meeting' : meeting },
961985 RequestContext (request , {}),
0 commit comments