Skip to content

Commit cfbb115

Browse files
committed
various fixes for agenda db schema changes
- Legacy-Id: 6377
1 parent 6c13e80 commit cfbb115

4 files changed

Lines changed: 75 additions & 88 deletions

File tree

ietf/secr/meetings/forms.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ def clean(self):
146146
time_obj = datetime.datetime.combine(day_obj,hour)
147147
slot = TimeSlot.objects.get(meeting=self.meeting,time=time_obj,location=room)
148148
next_slot = get_next_slot(slot)
149-
if not next_slot or next_slot.session != None:
149+
if not next_slot:
150150
raise forms.ValidationError('There is no next session to combine')
151151

152152
return cleaned_data

ietf/secr/meetings/views.py

Lines changed: 65 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from django.utils import simplejson
1313

1414
from 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
1616
from ietf.meeting.helpers import get_schedule
1717
from ietf.group.models import Group
1818
from ietf.name.models import SessionStatusName, TimeSlotTypeName
@@ -22,7 +22,7 @@
2222
from ietf.secr.sreq.forms import GroupSelectForm
2323
from ietf.secr.sreq.views import get_initial_session, session_conflicts_as_string
2424
from 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

2727
from 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):
204205
def 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)

ietf/secr/proceedings/proc_utils.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from ietf.secr.proceedings.models import Registration
1515
from ietf.secr.utils.document import get_rfc_num
1616
from ietf.secr.utils.group import groups_by_session
17-
from ietf.secr.utils.meeting import get_upload_root, get_proceedings_path, get_material
17+
from ietf.secr.utils.meeting import get_upload_root, get_proceedings_path, get_material, get_session
1818
from models import InterimMeeting # proxy model
1919

2020
from urllib2 import urlopen
@@ -32,7 +32,8 @@ def mycomp(timeslot):
3232
This takes a timeslot object and returns a key to sort by the area acronym or None
3333
'''
3434
try:
35-
group = timeslot.session.group
35+
session = get_session(timeslot)
36+
group = session.group
3637
key = '%s:%s' % (group.parent.acronym, group.acronym)
3738
except AttributeError:
3839
key = None
@@ -528,7 +529,7 @@ def gen_research(context):
528529
def gen_training(context):
529530
meeting = context['meeting']
530531
timeslots = context['others']
531-
sessions = [ t.session for t in timeslots ]
532+
sessions = [ get_session(t) for t in timeslots ]
532533
for counter,session in enumerate(sessions, start=1):
533534
slides = session.materials.filter(type='slides')
534535
minutes = session.materials.filter(type='minutes')

ietf/secr/proceedings/views.py

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
from ietf.group.proxy import IETFWG
2828
from ietf.group.utils import get_charter_text
2929
from ietf.ietfauth.decorators import has_role
30-
from ietf.meeting.models import Meeting, Session, TimeSlot
30+
from ietf.meeting.models import Meeting, Session, TimeSlot, ScheduledSession
3131
from ietf.name.models import MeetingTypeName, SessionStatusName
3232
from ietf.person.models import Person
3333

@@ -685,22 +685,17 @@ def select(request, meeting_num):
685685

686686
# initialize Training form, this select widget needs to have a session id, because it's
687687
# utilmately the session that we associate material with
688-
# NOTE: there are two ways to query for the groups we want, the later seems more specific
689688
if has_role(user,'Secretariat'):
690-
choices = []
691-
#for session in Session.objects.filter(meeting=meeting).exclude(name=""):
692-
for session in Session.objects.filter(meeting=meeting,timeslot__type='other').order_by('name'):
693-
choices.append((session.id,session.timeslot_set.all()[0].name))
689+
ss = ScheduledSession.objects.filter(schedule=meeting.agenda,timeslot__type='other')
690+
choices = [ (i.session.id, i.session.name) for i in sorted(ss,key=lambda x: x.session.name) ]
694691
training_form = GroupSelectForm(choices=choices)
695692
else:
696693
training_form = None
697694

698695
# iniialize plenary form
699696
if has_role(user,['Secretariat','IETF Chair','IAB Chair']):
700-
choices = []
701-
for session in Session.objects.filter(meeting=meeting,
702-
timeslot__type='plenary').order_by('name'):
703-
choices.append((session.id,session.timeslot_set.all()[0].name))
697+
ss = ScheduledSession.objects.filter(schedule=meeting.agenda,timeslot__type='plenary')
698+
choices = [ (i.session.id, i.session.name) for i in sorted(ss,key=lambda x: x.session.name) ]
704699
plenary_form = GroupSelectForm(choices=choices)
705700
else:
706701
plenary_form = None

0 commit comments

Comments
 (0)