Skip to content

Commit 613746f

Browse files
committed
changes, timeslot should always have scheduled session
- Legacy-Id: 5766
1 parent a667b0b commit 613746f

1 file changed

Lines changed: 48 additions & 28 deletions

File tree

ietf/secr/meetings/views.py

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,38 @@
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+
3458
def 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

7298
def 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

106129
def 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

Comments
 (0)