1212from django .utils import simplejson
1313
1414from ietf .utils .mail import send_mail
15- from ietf .meeting .models import Meeting , Session , Room , TimeSlot
15+ from ietf .meeting .models import Meeting , Session , Room , TimeSlot , Schedule , ScheduledSession
1616from ietf .meeting .helpers import get_schedule
1717from ietf .group .models import Group
1818from ietf .name .models import SessionStatusName , TimeSlotTypeName
2222from ietf .secr .sreq .forms import GroupSelectForm
2323from ietf .secr .sreq .views import get_initial_session , session_conflicts_as_string
2424from ietf .secr .utils .mail import get_cc_list
25- from ietf .secr .utils .meeting import get_upload_root
25+ from ietf .secr .utils .meeting import get_upload_root , get_session , get_timeslot
2626
2727from forms import *
2828
@@ -106,6 +106,8 @@ def build_nonsession(meeting):
106106 last_meeting = get_last_meeting (meeting )
107107 delta = meeting .date - last_meeting .date
108108 system = Person .objects .get (name = '(system)' )
109+ schedule = get_schedule (request , meeting )
110+
109111 for slot in TimeSlot .objects .filter (meeting = last_meeting ,type__in = ('break' ,'reg' ,'other' ,'plenary' )):
110112 new_time = slot .time + delta
111113 session = None
@@ -119,9 +121,8 @@ def build_nonsession(meeting):
119121 status_id = 'sched' )
120122 session .save ()
121123
122- TimeSlot .objects .create (type = slot .type ,
124+ ts = TimeSlot .objects .create (type = slot .type ,
123125 meeting = meeting ,
124- session = session ,
125126 name = slot .name ,
126127 time = new_time ,
127128 duration = slot .duration ,
@@ -136,7 +137,7 @@ def is_combined(session):
136137 '''
137138 Check to see if this session is using two combined timeslots
138139 '''
139- if session .timeslot_set .count () > 1 :
140+ if session .scheduledsession_set . filter ( schedule = meeting . agenda ) .count () > 1 :
140141 return True
141142 else :
142143 return False
@@ -175,7 +176,7 @@ def send_notification(request, sessions):
175176 # easier to populate template from timeslot perspective. assuming one-to-one timeslot-session
176177 count = 0
177178 session_info = ''
178- data = [ (s ,s . timeslot_set . all ()[ 0 ] ) for s in sessions ]
179+ data = [ (s ,get_timeslot ( s ) ) for s in sessions ]
179180 for s ,t in data :
180181 count += 1
181182 session_info += session_info_template .format (group .acronym ,
@@ -204,8 +205,7 @@ def send_notification(request, sessions):
204205def sort_groups (meeting ):
205206 '''
206207 Similar to sreq.views.sort_groups
207- Takes a Django User object and a Meeting object
208- Returns a tuple scheduled_groups, unscheduled groups.
208+ Takes a Meeting object and returns a tuple scheduled_groups, unscheduled groups.
209209 '''
210210 scheduled_groups = []
211211 unscheduled_groups = []
@@ -217,10 +217,10 @@ def sort_groups(meeting):
217217 scheduled_sessions = ScheduledSession .objects .filter (schedule = meeting .agenda ,session__isnull = False )
218218 groups_with_timeslots = [ x .session .group for x in scheduled_sessions ]
219219 for group in sorted_groups_with_sessions :
220- if group in groups_with_timeslots :
221- scheduled_groups .append (group )
222- else :
223- unscheduled_groups .append (group )
220+ if group in groups_with_timeslots :
221+ scheduled_groups .append (group )
222+ else :
223+ unscheduled_groups .append (group )
224224
225225 return scheduled_groups , unscheduled_groups
226226
@@ -418,6 +418,14 @@ def non_session(request, meeting_id):
418418 t = meeting .date + datetime .timedelta (days = int (day ))
419419 new_time = datetime .datetime (t .year ,t .month ,t .day ,time .hour ,time .minute )
420420
421+ # create TimeSlot object
422+ timeslot = TimeSlot .objects .create (type = form .cleaned_data ['type' ],
423+ meeting = meeting ,
424+ name = name ,
425+ time = new_time ,
426+ duration = duration ,
427+ show_location = form .cleaned_data ['show_location' ])
428+
421429 # create a dummy Session object to hold materials
422430 # NOTE: we're setting group to none here, but the set_room page will force user
423431 # to pick a legitimate group
@@ -430,15 +438,11 @@ def non_session(request, meeting_id):
430438 requested_by = Person .objects .get (name = '(system)' ),
431439 status_id = 'sched' )
432440 session .save ()
433-
434- # create TimeSlot object
435- TimeSlot .objects .create (type = form .cleaned_data ['type' ],
436- meeting = meeting ,
437- session = session ,
438- name = name ,
439- time = new_time ,
440- duration = duration ,
441- show_location = form .cleaned_data ['show_location' ])
441+
442+ # create association
443+ ScheduledSession .objects .create (timeslot = timeslot ,
444+ session = session ,
445+ schedule = meeting .agenda )
442446
443447 messages .success (request , 'Non-Sessions updated successfully' )
444448 url = reverse ('meetings_non_session' , kwargs = {'meeting_id' :meeting_id })
@@ -464,13 +468,14 @@ def non_session_delete(request, meeting_id, slot_id):
464468 '''
465469 slot = get_object_or_404 (TimeSlot , id = slot_id )
466470 if slot .type_id in ('other' ,'plenary' ):
467- if slot .session .materials .exclude (states__slug = 'deleted' ):
471+ session = get_session (slot )
472+ if session and session .materials .exclude (states__slug = 'deleted' ):
468473 messages .error (request , 'Materials have already been uploaded for "%s". You must delete those before deleting the timeslot.' % slot .name )
469474 url = reverse ('meetings_non_session' , kwargs = {'meeting_id' :meeting_id })
470475 return HttpResponseRedirect (url )
471476
472477 else :
473- slot .session .delete ()
478+ slot .sessions . all () .delete ()
474479 slot .delete ()
475480
476481 messages .success (request , 'Non-Session timeslot deleted successfully' )
@@ -483,14 +488,15 @@ def non_session_edit(request, meeting_id, slot_id):
483488 '''
484489 meeting = get_object_or_404 (Meeting , number = meeting_id )
485490 slot = get_object_or_404 (TimeSlot , id = slot_id )
491+ session = get_session (slot )
486492
487493 if request .method == 'POST' :
488494 button_text = request .POST .get ('submit' , '' )
489495 if button_text == 'Cancel' :
490496 url = reverse ('meetings_non_session' , kwargs = {'meeting_id' :meeting_id })
491497 return HttpResponseRedirect (url )
492498
493- form = NonSessionEditForm (request .POST ,meeting = meeting , session = slot . session )
499+ form = NonSessionEditForm (request .POST ,meeting = meeting , session = session )
494500 if form .is_valid ():
495501 location = form .cleaned_data ['location' ]
496502 group = form .cleaned_data ['group' ]
@@ -500,7 +506,6 @@ def non_session_edit(request, meeting_id, slot_id):
500506 slot .name = name
501507 slot .save ()
502508 # save group to session object
503- session = slot .session
504509 session .group = group
505510 session .name = name
506511 session .short = short
@@ -514,10 +519,10 @@ def non_session_edit(request, meeting_id, slot_id):
514519 # we need to pass the session to the form in order to disallow changing
515520 # of group after materials have been uploaded
516521 initial = {'location' :slot .location ,
517- 'group' :slot . session .group ,
518- 'name' :slot . session .name ,
519- 'short' :slot . session .short }
520- form = NonSessionEditForm (meeting = meeting ,session = slot . session ,initial = initial )
522+ 'group' :session .group ,
523+ 'name' :session .name ,
524+ 'short' :session .short }
525+ form = NonSessionEditForm (meeting = meeting ,session = session ,initial = initial )
521526
522527 return render_to_response ('meetings/non_session_edit.html' , {
523528 'meeting' : meeting ,
@@ -538,10 +543,10 @@ def remove_session(request, meeting_id, acronym):
538543 now = datetime .datetime .now ()
539544
540545 for session in sessions :
541- for timeslot in session .timeslot_set . all ():
542- timeslot .session = None
543- timeslot .modified = now
544- timeslot .save ()
546+ ss = session .official_scheduledsession ()
547+ ss .session = None
548+ ss .modified = now
549+ ss .save ()
545550 session .status_id = 'canceled'
546551 session .modified = now
547552 session .save ()
@@ -610,11 +615,12 @@ def schedule(request, meeting_id, acronym):
610615 for s in sessions :
611616 d = {'session' :s .id ,
612617 'note' :s .agenda_note }
613- qs = s .timeslot_set .all ()
614- if qs :
615- d ['room' ] = qs [0 ].location .id
616- d ['day' ] = qs [0 ].time .isoweekday () % 7 + 1 # adjust to django week_day
617- d ['time' ] = qs [0 ].time .strftime ('%H%M' )
618+ timeslot = get_timeslot (s )
619+
620+ if timeslot :
621+ d ['room' ] = timeslot .location .id
622+ d ['day' ] = timeslot .time .isoweekday () % 7 + 1 # adjust to django week_day
623+ d ['time' ] = timeslot .time .strftime ('%H%M' )
618624 else :
619625 d ['day' ] = 2 # default
620626 if is_combined (s ,meeting ):
@@ -647,35 +653,24 @@ def schedule(request, meeting_id, acronym):
647653 day = form .cleaned_data ['day' ]
648654 combine = form .cleaned_data .get ('combine' ,None )
649655 session = Session .objects .get (id = id )
650- was_combined = is_combined (session )
651- initial_timeslots = session .timeslot_set .all ()
652- if initial_timeslots :
653- initial_timeslot = initial_timeslots [0 ]
654- else :
655- initial_timeslot = None
656+ initial_timeslot = get_timeslot (session )
656657
657658 # find new timeslot
658659 new_day = meeting .date + datetime .timedelta (days = int (day )- 1 )
659660 hour = datetime .time (int (time [:2 ]),int (time [2 :]))
660661 new_time = datetime .datetime .combine (new_day ,hour )
661- qs = TimeSlot .objects .filter (meeting = meeting ,time = new_time ,location = room )
662- if qs .filter (session = None ):
663- timeslot = qs .filter (session = None )[0 ]
664- else :
665- # we need to create another, identical timeslot
666- timeslot = TimeSlot .objects .create (meeting = qs [0 ].meeting ,
667- type = qs [0 ].type ,
668- name = qs [0 ].name ,
669- time = qs [0 ].time ,
670- duration = qs [0 ].duration ,
671- location = qs [0 ].location ,
672- show_location = qs [0 ].show_location ,
673- modified = now )
674- messages .warning (request , 'WARNING: There are now two sessions scheduled for the timeslot: %s' % timeslot )
675-
662+ timeslot = TimeSlot .objects .filter (meeting = meeting ,time = new_time ,location = room )[0 ]
663+
664+ # COMBINE SECTION - BEFORE --------------
665+ if 'combine' in form .changed_data and not combine :
666+ next_slot = get_next_slot (initial_timeslot )
667+ for ss in next_slot .scheduledsession_set .filter (schedule = meeting .agenda ,session = session ):
668+ ss .session = None
669+ ss .save ()
670+ # ---------------------------------------
676671 if any (x in form .changed_data for x in ('day' ,'time' ,'room' )):
677- # clear the old timeslot(s)
678- for ts in initial_timeslots :
672+ # clear the old association
673+ if initial_timeslot :
679674 # get SS record(s) and unschedule by removing the session reference
680675 for ss in session .scheduledsession_set .filter (schedule = meeting .agenda ):
681676 ss .session = None
@@ -696,24 +691,18 @@ def schedule(request, meeting_id, acronym):
696691 session .modified = now
697692 session .save ()
698693
699- # COMBINE SECTION ------- ---------------
700- if 'combine' in form .changed_data :
694+ # COMBINE SECTION - AFTER ---------------
695+ if 'combine' in form .changed_data and combine :
701696 next_slot = get_next_slot (timeslot )
702- if combine :
703- assign (session ,next_slot ,meeting )
704- else :
705- for ss in next_slot .scheduledsession_set .filter (schedule = meeting .agenda ,session = session ):
706- ss .session = None
707- ss .save ()
708-
697+ assign (session ,next_slot ,meeting )
709698 # ---------------------------------------
710699
711700 # notify. dont send if Tutorial, BOF or indicated on form
712701 notification_message = "No notification has been sent to anyone for this session."
713702 if (has_changed
714703 and not extra_form .cleaned_data .get ('no_notify' ,False )
715704 and group .state .slug != 'bof'
716- and session . timeslot_set . all ( )): # and the session is scheduled, else skip
705+ and get_timeslot ( session )): # and the session is scheduled, else skip
717706
718707 send_notification (request , sessions )
719708 notification_message = "Notification sent."
@@ -724,6 +713,7 @@ def schedule(request, meeting_id, acronym):
724713 url = reverse ('meetings_select_group' , kwargs = {'meeting_id' :meeting_id })
725714 return HttpResponseRedirect (url )
726715
716+
727717 else :
728718 formset = NewSessionFormset (initial = initial )
729719 extra_form = ExtraSessionForm ()
@@ -856,9 +846,10 @@ def times_delete(request, meeting_id, time):
856846 parts = [ int (x ) for x in time .split (':' ) ]
857847 dtime = datetime .datetime (* parts )
858848
859- if ScheduledSession .objects .filter (timeslot__time = dtime ,
860- timeslot__meeting = meeting ,
861- session__isnull = False ):
849+ qs = meeting .agenda .scheduledsession_set .filter (timeslot__time = dtime ,
850+ session__isnull = False )
851+
852+ if qs :
862853 messages .error (request , 'ERROR deleting timeslot. There is one or more sessions scheduled for this timeslot.' )
863854 url = reverse ('meetings_times' , kwargs = {'meeting_id' :meeting_id })
864855 return HttpResponseRedirect (url )
0 commit comments