Skip to content

Commit 996fc71

Browse files
committed
Add new page for editing timeslots and misc session, accessible from
the possible agendas list for a meeting. The new page incorporates the editing functionality otherwise accessible from /secr/meetings/<meeting>/<schedule>/miscsessions/ /secr/meetings/<meeting>/<schedule>/regularsessions/ /meeting/<meeting>/timeslots/edit in a time vs. room grid that gives a better overview of what's going on each day and allows adding and editing time slots and sessions. Regular sessions must be scheduled in the other schedule editor, but it's possible to add regular timeslots and edit agenda notes on scheduled regular sessions. - Legacy-Id: 18379
1 parent c78ffbc commit 996fc71

File tree

9 files changed

+918
-35
lines changed

9 files changed

+918
-35
lines changed

ietf/meeting/tests_views.py

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,6 +1171,161 @@ def test_edit_meeting_schedule(self):
11711171
self.assertEqual(list(SchedTimeSessAssignment.objects.filter(schedule=schedule, timeslot=timeslots[1])), [])
11721172
self.assertEqual(list(SchedTimeSessAssignment.objects.filter(schedule=schedule, timeslot=timeslots[2])), [])
11731173

1174+
def test_edit_meeting_timeslots_and_misc_sessions(self):
1175+
meeting = make_meeting_test_data()
1176+
1177+
self.client.login(username="secretary", password="secretary+password")
1178+
1179+
# check we have the grid and everything set up as a baseline -
1180+
# the Javascript tests check that the Javascript can work with
1181+
# it
1182+
url = urlreverse("ietf.meeting.views.edit_meeting_timeslots_and_misc_sessions", kwargs=dict(num=meeting.number, owner=meeting.schedule.base.owner_email(), name=meeting.schedule.base.name))
1183+
r = self.client.get(url)
1184+
q = PyQuery(r.content)
1185+
1186+
breakfast_room = Room.objects.get(meeting=meeting, name="Breakfast Room")
1187+
break_room = Room.objects.get(meeting=meeting, name="Break Area")
1188+
reg_room = Room.objects.get(meeting=meeting, name="Registration Area")
1189+
1190+
for i in range(meeting.days):
1191+
self.assertTrue(q("[data-day=\"{}\"]".format((meeting.date + datetime.timedelta(days=i)).isoformat())))
1192+
1193+
self.assertTrue(q(".room-label:contains(\"{}\")".format(breakfast_room.name)))
1194+
self.assertTrue(q(".room-label:contains(\"{}\")".format(break_room.name)))
1195+
self.assertTrue(q(".room-label:contains(\"{}\")".format(reg_room.name)))
1196+
1197+
break_slot = TimeSlot.objects.get(location=break_room, type='break')
1198+
1199+
room_row = q(".room-row[data-day=\"{}\"][data-room=\"{}\"]".format(break_slot.time.date().isoformat(), break_slot.location_id))
1200+
self.assertTrue(room_row)
1201+
self.assertTrue(room_row.find("#timeslot{}".format(break_slot.pk)))
1202+
1203+
self.assertTrue(q(".timeslot-form"))
1204+
1205+
# add timeslot
1206+
ietf_group = Group.objects.get(acronym='ietf')
1207+
1208+
r = self.client.post(url, {
1209+
'day': meeting.date,
1210+
'time': '08:30',
1211+
'duration': '1:30',
1212+
'location': break_room.pk,
1213+
'show_location': 'on',
1214+
'type': 'other',
1215+
'group': ietf_group.pk,
1216+
'name': "IETF Testing",
1217+
'short': "ietf-testing",
1218+
'scroll': 1234,
1219+
'action': 'add-timeslot',
1220+
})
1221+
self.assertNoFormPostErrors(r)
1222+
self.assertIn("#scroll=1234", r['Location'])
1223+
1224+
test_timeslot = TimeSlot.objects.get(meeting=meeting, name="IETF Testing")
1225+
self.assertEqual(test_timeslot.time, datetime.datetime.combine(meeting.date, datetime.time(8, 30)))
1226+
self.assertEqual(test_timeslot.duration, datetime.timedelta(hours=1, minutes=30))
1227+
self.assertEqual(test_timeslot.location_id, break_room.pk)
1228+
self.assertEqual(test_timeslot.show_location, True)
1229+
self.assertEqual(test_timeslot.type_id, 'other')
1230+
1231+
test_session = Session.objects.get(meeting=meeting, timeslotassignments__timeslot=test_timeslot)
1232+
self.assertEqual(test_session.short, 'ietf-testing')
1233+
self.assertEqual(test_session.group, ietf_group)
1234+
1235+
self.assertTrue(SchedulingEvent.objects.filter(session=test_session, status='sched'))
1236+
1237+
# edit timeslot
1238+
r = self.client.get(url, {
1239+
'timeslot': test_timeslot.pk,
1240+
'action': 'edit-timeslot',
1241+
})
1242+
self.assertEqual(r.status_code, 200)
1243+
edit_form_html = json.loads(r.content)['form']
1244+
q = PyQuery(edit_form_html)
1245+
self.assertEqual(q("[name=name]").val(), test_timeslot.name)
1246+
self.assertEqual(q("[name=location]").val(), str(test_timeslot.location_id))
1247+
self.assertEqual(q("[name=timeslot]").val(), str(test_timeslot.pk))
1248+
self.assertEqual(q("[name=type]").val(), str(test_timeslot.type_id))
1249+
self.assertEqual(q("[name=group]").val(), str(ietf_group.pk))
1250+
1251+
iab_group = Group.objects.get(acronym='iab')
1252+
1253+
r = self.client.post(url, {
1254+
'timeslot': test_timeslot.pk,
1255+
'day': meeting.date,
1256+
'time': '09:30',
1257+
'duration': '1:00',
1258+
'location': breakfast_room.pk,
1259+
'type': 'other',
1260+
'group': iab_group.pk,
1261+
'name': "IETF Testing 2",
1262+
'short': "ietf-testing2",
1263+
'action': 'edit-timeslot',
1264+
})
1265+
self.assertNoFormPostErrors(r)
1266+
test_timeslot.refresh_from_db()
1267+
self.assertEqual(test_timeslot.time, datetime.datetime.combine(meeting.date, datetime.time(9, 30)))
1268+
self.assertEqual(test_timeslot.duration, datetime.timedelta(hours=1))
1269+
self.assertEqual(test_timeslot.location_id, breakfast_room.pk)
1270+
self.assertEqual(test_timeslot.show_location, False)
1271+
self.assertEqual(test_timeslot.type_id, 'other')
1272+
1273+
test_session.refresh_from_db()
1274+
self.assertEqual(test_session.short, 'ietf-testing2')
1275+
self.assertEqual(test_session.group, iab_group)
1276+
1277+
# cancel timeslot
1278+
r = self.client.post(url, {
1279+
'timeslot': test_timeslot.pk,
1280+
'action': 'cancel-timeslot',
1281+
})
1282+
self.assertNoFormPostErrors(r)
1283+
1284+
event = SchedulingEvent.objects.filter(
1285+
session__timeslotassignments__timeslot=test_timeslot
1286+
).order_by('-id').first()
1287+
self.assertEqual(event.status_id, 'canceled')
1288+
1289+
# delete timeslot
1290+
test_presentation = Document.objects.create(name='slides-test', type_id='slides')
1291+
SessionPresentation.objects.create(
1292+
document=test_presentation,
1293+
rev='1',
1294+
session=test_session
1295+
)
1296+
1297+
r = self.client.post(url, {
1298+
'timeslot': test_timeslot.pk,
1299+
'action': 'delete-timeslot',
1300+
})
1301+
self.assertNoFormPostErrors(r)
1302+
1303+
self.assertEqual(list(TimeSlot.objects.filter(pk=test_timeslot.pk)), [])
1304+
self.assertEqual(list(Session.objects.filter(pk=test_session.pk)), [])
1305+
self.assertEqual(test_presentation.get_state_slug(), 'deleted')
1306+
1307+
# set agenda note
1308+
assignment = SchedTimeSessAssignment.objects.filter(session__group__acronym='mars', schedule=meeting.schedule).first()
1309+
1310+
url = urlreverse("ietf.meeting.views.edit_meeting_timeslots_and_misc_sessions", kwargs=dict(num=meeting.number, owner=meeting.schedule.owner_email(), name=meeting.schedule.name))
1311+
1312+
r = self.client.post(url, {
1313+
'timeslot': assignment.timeslot_id,
1314+
'day': assignment.timeslot.time.date().isoformat(),
1315+
'time': assignment.timeslot.time.time().isoformat(),
1316+
'duration': assignment.timeslot.duration,
1317+
'location': assignment.timeslot.location_id,
1318+
'type': assignment.timeslot.type_id,
1319+
'name': assignment.timeslot.name,
1320+
'agenda_note': "New Test Note",
1321+
'action': 'edit-timeslot',
1322+
})
1323+
self.assertNoFormPostErrors(r)
1324+
1325+
assignment.session.refresh_from_db()
1326+
self.assertEqual(assignment.session.agenda_note, "New Test Note")
1327+
1328+
11741329
def test_new_meeting_schedule(self):
11751330
meeting = make_meeting_test_data()
11761331

ietf/meeting/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
type_ietf_only_patterns = [
2929
url(r'^agenda/%(owner)s/%(schedule_name)s/edit$' % settings.URL_REGEXPS, views.edit_schedule),
3030
url(r'^agenda/%(owner)s/%(schedule_name)s/edit/$' % settings.URL_REGEXPS, views.edit_meeting_schedule),
31+
url(r'^agenda/%(owner)s/%(schedule_name)s/timeslots/$' % settings.URL_REGEXPS, views.edit_meeting_timeslots_and_misc_sessions),
3132
url(r'^agenda/%(owner)s/%(schedule_name)s/details$' % settings.URL_REGEXPS, views.edit_schedule_properties),
3233
url(r'^agenda/%(owner)s/%(schedule_name)s/delete$' % settings.URL_REGEXPS, views.delete_schedule),
3334
url(r'^agenda/%(owner)s/%(schedule_name)s/make_official$' % settings.URL_REGEXPS, views.make_schedule_official),

0 commit comments

Comments
 (0)