Skip to content

Commit b8cfbf1

Browse files
committed
From rjsparks@nostrum.com:
- Fixed layout issue on schedule editing page in Chrome - Fixed errant display of text in unscheduled group bar on the schedule editing page - Changed the instruction text on the special requests field of the session request form From rcross@amsl.com: - Improved scheduling of non-session items - Fixed issue with layout of the new notifications page - Fixed crash on notifications page - Legacy-Id: 7644
2 parents 73b0831 + 029b477 commit b8cfbf1

10 files changed

Lines changed: 86 additions & 56 deletions

File tree

ietf/secr/meetings/tests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def test_notifications(self):
8888
response = self.client.get(url)
8989
self.assertEqual(response.status_code, 200)
9090
q = PyQuery(response.content)
91-
self.assertEqual(q('#id_notification_list').html(),'ames,mars')
91+
self.assertEqual(q('#id_notification_list').html(),'ames, mars')
9292

9393
# test that only changes since last notification show up
9494
mars_group = Group.objects.get(acronym='mars')

ietf/secr/meetings/views.py

Lines changed: 59 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
from ietf.utils.mail import send_mail
1616
from ietf.meeting.models import Meeting, Session, Room, TimeSlot, ScheduledSession, Schedule
17-
from ietf.meeting.helpers import get_schedule
1817
from ietf.group.models import Group, GroupEvent
1918
from ietf.person.models import Person
2019
from 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+
121142
def 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+
128149
def 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

457476
def 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+
752776
def 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, {}),

ietf/secr/templates/includes/sessions_request_form.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
</td>
5858
</tr>
5959
<tr class="bg1">
60-
<td valign="top">Special Requests:<br />&nbsp;<br />i.e. Meetecho, WebEx (please state which, and the reason needed), restrictions on meeting times / days, etc.</td>
60+
<td valign="top">Special Requests:<br />&nbsp;<br />i.e. restrictions on meeting times / days, etc.</td>
6161
<td>{{ form.comments.errors }}{{ form.comments }}</td>
6262
</tr>
6363
</table>

ietf/secr/templates/meetings/notifications.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ <h2>IETF {{ meeting.number }} - Send Notifications</h2>
1919
<form id="id_notification_form" action="." method="post">{% csrf_token %}
2020
<p>Send email notifications to all groups that have been scheduled since the last
2121
notification went out on {{ last_notice.time|date:"Y-m-d" }}:</p>
22-
<p id="id_notification_list">{% if not groups %}(none){% endif %}{% for group in groups %}{{ group.acronym }}{% if not forloop.last %},{% endif %}{% endfor %}<p>
22+
<p id="id_notification_list">{% if not groups %}(none){% endif %}{% for group in groups %}{{ group.acronym }}{% if not forloop.last %}, {% endif %}{% endfor %}<p>
2323
<input type="submit" value="Send Now" name="submit" onclick="return window.confirm('Are you sure you want to send notifications?');">
2424
</form>
2525

ietf/secr/templates/meetings/schedule.html

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,33 @@
44

55
{% block extrahead %}{{ block.super }}
66
<script type="text/javascript" src="{{ SECR_STATIC_URL }}js/utils.js"></script>
7-
7+
88
<script type="text/javascript">
99
$(document).ready(function() {
10-
$.ajaxSetup ({
11-
cache: false
10+
$.ajaxSetup ({
11+
cache: false
1212
});
13-
13+
1414
$("select[id$='day']").change(function(){
15-
var loadUrl = "/meetings/ajax/get-times/";
15+
var loadUrl = "/secr/meetings/ajax/get-times/";
1616
var url = window.location.pathname;
1717
var parts = url.split("/");
1818
var id = this.id;
1919
var new_id = id.replace('day','time');
2020
var sel = "#"+new_id;
2121
var day = $(this).val();
22-
loadUrl = loadUrl+parts[2]+"/"+day+"/";
22+
loadUrl = loadUrl+parts[3]+"/"+day+"/";
2323
$.getJSON(loadUrl,function(data) {
2424
$(sel+" option").remove();
2525
$.each(data,function(i,item) {
2626
$(sel).append('<option value="'+item.id+'">'+item.value+'</option>');
2727
});
2828
});
2929
});
30-
31-
30+
31+
3232
});
33-
33+
3434
</script>
3535
{% endblock %}
3636

@@ -46,11 +46,11 @@
4646

4747
<div class="module">
4848
<h2>Requested Information</h2>
49-
49+
5050
{% if show_request %}
5151
{% include "includes/sessions_request_view.html" %}
5252
{% endif %}
53-
53+
5454
<div class="inline-group">
5555
<h2>Sessions</h2>
5656

@@ -66,17 +66,17 @@ <h3><b>Session:</b>&nbsp; #{{ forloop.counter }}{% if form.session_object.status
6666
</div> <!-- inline-related -->
6767
{% endfor %}
6868
</div> <!-- inline-group -->
69-
69+
7070
<div class="button-group">
7171
<ul>
7272
<li><button type="submit" name="submit" value="Save">Save</button></li>
7373
<li><button type="button" onclick="if (window.confirm('This group will be permanently removed from the agenda and scheduling tool')) { window.location='{% url "meetings_remove_session" meeting_id=meeting.number acronym=group.acronym %}' };">Remove this group from agenda</button></li>
7474
<li><button type="button" onclick="window.location='{% url "meetings_select_group" meeting_id=meeting.number schedule_name=schedule.name %}'">Back</button></li>
7575
</ul>
7676
</div> <!-- button-group -->
77-
77+
7878
</form>
79-
79+
8080
</div> <!-- module -->
8181

8282
{% endblock %}

ietf/secr/templates/proceedings/select.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
var ajax_load = "<p><h4 align='center'>Generating Proceedings. This may take a few minutes.</h3><img class='loading' src='{{ SECR_STATIC_URL }}img/ajax-loader.gif' alt='loading...' /></p>";
1616
var url = window.location.pathname;
1717
var parts = url.split("/");
18-
var loadUrl = "/proceedings/ajax/generate-proceedings/" + parts[2] + "/";
18+
var loadUrl = "/secr/proceedings/ajax/generate-proceedings/" + parts[2] + "/";
1919
$("#private-functions").html(ajax_load).load(loadUrl);
2020
});
2121

ietf/templates/meeting/landscape_edit.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@
249249
</th>
250250
{% for day in time_slices %}
251251
{% for slot in date_slices|lookup:day %}
252-
<td id="{{r.domid}}_{{day}}_{{slot.0|date:'Hi'}}" class="day_{{day}} agenda-column-{{day}}-{{slot.0|date:'Hi'}} agenda_slot agenda_slot_unavailable" capacity="{{r.capacity}}" ></td>
252+
<td id="{{r.dom_id}}_{{day}}_{{slot.0|date:'Hi'}}" class="day_{{day}} agenda-column-{{day}}-{{slot.0|date:'Hi'}} agenda_slot agenda_slot_unavailable" capacity="{{r.capacity}}" ></td>
253253
{% endfor %}
254254
<td class="day_{{day}} spacer {{day|date:'Y-m-d'}}-spacer"></td>
255255
{% endfor %}

ietf/templates/meeting/timeslot_edit.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@
141141
</th>
142142
{% for day in time_slices %}
143143
{% for slot in date_slices|lookup:day %}
144-
<td slot_time="{{day}} {{slot.0|date:'H:i:s'}}" slot_duration="{{slot.2}}" slot_room="{{r.pk}}" id="{{r.domid}}_{{day}}_{{slot.0|date:'Hi'}}" class="day_{{day}} agenda-column-{{day}}-{{slot.0|date:'Hi'}} agenda_slot {% cycle 'agenda_slot_alt' '' %} agenda_slot_unavailable" ></td>
144+
<td slot_time="{{day}} {{slot.0|date:'H:i:s'}}" slot_duration="{{slot.2}}" slot_room="{{r.pk}}" id="{{r.dom_id}}_{{day}}_{{slot.0|date:'Hi'}}" class="day_{{day}} agenda-column-{{day}}-{{slot.0|date:'Hi'}} agenda_slot {% cycle 'agenda_slot_alt' '' %} agenda_slot_unavailable" ></td>
145145
{% endfor %}
146146
<td class="day_{{day}} spacer {{day|date:'Y-m-d'}}-spacer"></td>
147147
{% endfor %}

0 commit comments

Comments
 (0)