3131# --------------------------------------------------
3232# Helper Functions
3333# --------------------------------------------------
34+ def assign (session ,timeslot ,meeting ):
35+ '''
36+ Robust function to assign a session to a timeslot
37+ '''
38+ qs = timeslot .scheduledsession_set .filter (schedule = meeting .agenda )
39+ # this should never happen, but just in case
40+ if not qs :
41+ ScheduledSession .objects .create (schedule = meeting .agenda ,
42+ session = session ,
43+ timeslot = timeslot )
44+ else :
45+ # find the first unassigned scheduled session or create a new one
46+ for ss in qs :
47+ if not ss .session :
48+ ss .session = session
49+ ss .save ()
50+ break
51+ else :
52+ ScheduledSession .objects .create (schedule = meeting .agenda ,
53+ session = session ,
54+ timeslot = timeslot )
55+ session .status_id = 'sched'
56+ session .save ()
57+
3458def build_timeslots (request ,meeting ,room = None ):
3559 '''
3660 This function takes a Meeting object and an optional room argument. If room isn't passed we
3761 pre-create the full set of timeslot records using the last meeting as a template.
3862 If room is passed pre-create timeslots for the new room. Call this after saving new rooms
3963 or adding a room.
4064 '''
65+ schedule = get_schedule (request ,meeting )
4166 slots = meeting .timeslot_set .filter (type = 'session' )
4267 if room :
4368 rooms = [room ]
@@ -68,6 +93,7 @@ def build_timeslots(request,meeting,room=None):
6893 time = new_time ,
6994 location = room ,
7095 duration = t .duration )
96+ ScheduledSession .objects .create (schedule = schedule ,timeslot = ts )
7197
7298def build_nonsession (request , meeting ):
7399 '''
@@ -98,10 +124,7 @@ def build_nonsession(request, meeting):
98124 time = new_time ,
99125 duration = slot .duration ,
100126 show_location = slot .show_location )
101-
102- ScheduledSession .create (schedule = schedule ,
103- session = session ,
104- timeslot = ts )
127+ ScheduledSession .create (schedule = schedule ,session = session ,timeslot = ts )
105128
106129def get_last_meeting (meeting ):
107130 last_number = int (meeting .number ) - 1
@@ -207,10 +230,8 @@ def sort_groups(meeting):
207230 groups_with_sessions = [ s .group for s in sessions if s .group .type .slug in ('wg' ,'rg' ,'ag' ) ]
208231 gset = set (groups_with_sessions )
209232 sorted_groups_with_sessions = sorted (gset , key = lambda instance : instance .acronym )
210- slots = TimeSlot .objects .filter (meeting = meeting ,
211- scheduledsession__schedule = meeting .agenda ,
212- scheduledsession__session__isnull = False )
213- groups_with_timeslots = [ get_session (s ).group for s in slots ]
233+ scheduled_sessions = ScheduledSession .objects .filter (schedule = meeting .agenda ,session__isnull = False )
234+ groups_with_timeslots = [ x .session .group for x in scheduled_sessions ]
214235 for group in sorted_groups_with_sessions :
215236 if group in groups_with_timeslots :
216237 scheduled_groups .append (group )
@@ -621,7 +642,7 @@ def schedule(request, meeting_id, acronym):
621642 d ['day' ] = timeslot .time .isoweekday () % 7 + 1 # adjust to django week_day
622643 d ['time' ] = timeslot .time .strftime ('%H%M' )
623644 else :
624- d ['day' ] = 2
645+ d ['day' ] = 2 # default
625646 if is_combined (s ,meeting ):
626647 d ['combine' ] = True
627648 initial .append (d )
@@ -663,17 +684,15 @@ def schedule(request, meeting_id, acronym):
663684 if any (x in form .changed_data for x in ('day' ,'time' ,'room' )):
664685 # clear the old association
665686 if initial_timeslot :
666- initial_timeslot .scheduledsession_set .filter (schedule = meeting .agenda ,session = session ).delete ()
667-
687+ # get SS record(s) and unschedule by removing the session reference
688+ for ss in session .scheduledsession_set .filter (schedule = meeting .agenda ):
689+ ss .session = None
690+ ss .save ()
691+
668692 if timeslot :
669- # create association
670- ScheduledSession .objects .create (schedule = meeting .agenda ,
671- session = session ,
672- timeslot = timeslot )
693+ assign (session ,timeslot ,meeting )
673694 if timeslot .sessions .all ().count () > 1 :
674- messages .warning (request , 'WARNING: There are now two sessions scheduled for the timeslot: %s' % timeslot )
675- session .status_id = 'sched'
676-
695+ messages .warning (request , 'WARNING: There are now multiple sessions scheduled for the timeslot: %s' % timeslot )
677696 else :
678697 session .status_id = 'schedw'
679698
@@ -689,11 +708,11 @@ def schedule(request, meeting_id, acronym):
689708 if 'combine' in form .changed_data :
690709 next_slot = get_next_slot (timeslot )
691710 if combine :
692- ScheduledSession .objects .create (schedule = meeting .agenda ,
693- session = session ,
694- timeslot = next_slot )
711+ assign (session ,next_slot ,meeting )
695712 else :
696- next_slot .scheduledsession_set .filter (schedule = meeting .agenda ,session = session ).delete ()
713+ for ss in next_slot .scheduledsession_set .filter (schedule = meeting .agenda ,session = session ):
714+ ss .session = None
715+ ss .save ()
697716
698717 # ---------------------------------------
699718
@@ -812,12 +831,13 @@ def times(request, meeting_id):
812831 return HttpResponseRedirect (url )
813832
814833 for room in meeting .room_set .all ():
815- TimeSlot .objects .create (type_id = 'session' ,
816- meeting = meeting ,
817- name = name ,
818- time = new_time ,
819- location = room ,
820- duration = duration )
834+ ts = TimeSlot .objects .create (type_id = 'session' ,
835+ meeting = meeting ,
836+ name = name ,
837+ time = new_time ,
838+ location = room ,
839+ duration = duration )
840+ ScheduledSession .objects .create (schedule = meeting .agenda ,timeslot = ts )
821841
822842 messages .success (request , 'Timeslots created' )
823843 url = reverse ('meetings_times' , kwargs = {'meeting_id' :meeting_id })
0 commit comments