diff --git a/ietf/meeting/test_data.py b/ietf/meeting/test_data.py
index 66960f1f0..b5ed80574 100644
--- a/ietf/meeting/test_data.py
+++ b/ietf/meeting/test_data.py
@@ -37,6 +37,7 @@ def make_meeting_test_data():
meeting = Meeting.objects.get(number="42", type="ietf")
schedule = Schedule.objects.create(meeting=meeting, owner=plainman, name="test-agenda", visible=True, public=True)
+ unofficial_schedule = Schedule.objects.create(meeting=meeting, owner=plainman, name="test-unofficial-agenda", visible=True, public=True)
pname = RoomResourceName.objects.create(name='projector',slug='proj')
projector = ResourceAssociation.objects.create(name=pname,icon="notfound.png",desc="Basic projector")
room = Room.objects.create(meeting=meeting, name="Test Room", capacity=123)
@@ -45,40 +46,48 @@ def make_meeting_test_data():
breakfast_room.session_types.add("lead")
room.resources = [projector]
+ # slots
+ slot1 = TimeSlot.objects.create(meeting=meeting, type_id="session", duration=30 * 60, location=room,
+ time=datetime.datetime.combine(datetime.date.today(), datetime.time(9, 30)))
+ slot2 = TimeSlot.objects.create(meeting=meeting, type_id="session", duration=30 * 60, location=room,
+ time=datetime.datetime.combine(datetime.date.today(), datetime.time(10, 30)))
+ breakfast_slot = TimeSlot.objects.create(meeting=meeting, type_id="lead", duration=90 * 60,
+ location=breakfast_room,
+ time=datetime.datetime.combine(datetime.date.today(),datetime.time(7,0)))
# mars WG
mars = Group.objects.get(acronym='mars')
- slot = TimeSlot.objects.create(meeting=meeting, type_id="session", duration=30 * 60, location=room,
- time=datetime.datetime.combine(datetime.date.today(), datetime.time(9, 30)))
mars_session = Session.objects.create(meeting=meeting, group=mars,
attendees=10, requested_by=system_person,
requested_duration=20, status_id="schedw",
scheduled=datetime.datetime.now(),type_id="session")
mars_session.resources = [projector]
- SchedTimeSessAssignment.objects.create(timeslot=slot, session=mars_session, schedule=schedule)
+ SchedTimeSessAssignment.objects.create(timeslot=slot1, session=mars_session, schedule=schedule)
+ SchedTimeSessAssignment.objects.create(timeslot=slot2, session=mars_session, schedule=unofficial_schedule)
# ames WG
- slot = TimeSlot.objects.create(meeting=meeting, type_id="session", duration=30 * 60, location=room,
- time=datetime.datetime.combine(datetime.date.today(), datetime.time(10, 30)))
ames_session = Session.objects.create(meeting=meeting, group=Group.objects.get(acronym="ames"),
attendees=10, requested_by=system_person,
requested_duration=20, status_id="schedw",
scheduled=datetime.datetime.now(),type_id="session")
- SchedTimeSessAssignment.objects.create(timeslot=slot, session=ames_session, schedule=schedule)
+ SchedTimeSessAssignment.objects.create(timeslot=slot2, session=ames_session, schedule=schedule)
+ SchedTimeSessAssignment.objects.create(timeslot=slot1, session=ames_session, schedule=unofficial_schedule)
# IESG breakfast
- breakfast_slot = TimeSlot.objects.create(meeting=meeting, type_id="lead", duration=90 * 60,
- location=breakfast_room,
- time=datetime.datetime.combine(datetime.date.today(),datetime.time(7,0)))
iesg_session = Session.objects.create(meeting=meeting, group=Group.objects.get(acronym="iesg"),
name="IESG Breakfast",
attendees=25, requested_by=system_person,
requested_duration=20, status_id="schedw",
scheduled=datetime.datetime.now(),type_id="lead")
SchedTimeSessAssignment.objects.create(timeslot=breakfast_slot, session=iesg_session, schedule=schedule)
+ # No breakfast on unofficial schedule
meeting.agenda = schedule
meeting.save()
+ # Convenience for the tests
+ meeting.unofficial_schedule = unofficial_schedule
+
+
doc = Document.objects.create(name='agenda-mars-ietf-42', type_id='agenda', title="Agenda", external_url="agenda-mars.txt",group=mars,rev='00')
doc.set_state(State.objects.get(type=doc.type_id, slug="active"))
mars_session.sessionpresentation_set.add(SessionPresentation(session=mars_session,document=doc,rev=doc.rev))
diff --git a/ietf/meeting/tests_api.py b/ietf/meeting/tests_api.py
index 1c2990c60..ef6cbaf47 100644
--- a/ietf/meeting/tests_api.py
+++ b/ietf/meeting/tests_api.py
@@ -19,10 +19,10 @@ class ApiTests(TestCase):
mars_session = Session.objects.filter(meeting=meeting, group__acronym="mars").first()
ames_session = Session.objects.filter(meeting=meeting, group__acronym="ames").first()
- mars_scheduled = SchedTimeSessAssignment.objects.get(session=mars_session)
+ mars_scheduled = SchedTimeSessAssignment.objects.get(session=mars_session,schedule__name='test-agenda')
mars_slot = mars_scheduled.timeslot
- ames_scheduled = SchedTimeSessAssignment.objects.get(session=ames_session)
+ ames_scheduled = SchedTimeSessAssignment.objects.get(session=ames_session,schedule__name='test-agenda')
ames_slot = ames_scheduled.timeslot
def do_unschedule(assignment):
@@ -88,16 +88,16 @@ class ApiTests(TestCase):
r = do_extend(schedule,mars_scheduled)
self.assertEqual(r.status_code, 201)
self.assertTrue("error" not in json.loads(r.content))
- self.assertEqual(mars_session.timeslotassignments.count(),2)
+ self.assertEqual(mars_session.timeslotassignments.filter(schedule__name='test-agenda').count(),2)
# Unschedule mars
r = do_unschedule(mars_scheduled)
self.assertEqual(r.status_code, 200)
self.assertTrue("error" not in json.loads(r.content))
# Make sure it got both the original and extended session
- self.assertEqual(mars_session.timeslotassignments.count(),0)
+ self.assertEqual(mars_session.timeslotassignments.filter(schedule__name='test-agenda').count(),0)
- self.assertEqual(SchedTimeSessAssignment.objects.get(session=ames_session).timeslot, mars_slot)
+ self.assertEqual(SchedTimeSessAssignment.objects.get(session=ames_session,schedule__name='test-agenda').timeslot, mars_slot)
def test_constraints_json(self):
diff --git a/ietf/meeting/tests_js.py b/ietf/meeting/tests_js.py
index c5bc88b62..0e1b7221e 100644
--- a/ietf/meeting/tests_js.py
+++ b/ietf/meeting/tests_js.py
@@ -69,7 +69,7 @@ class ScheduleEditTests(StaticLiveServerTestCase):
def testUnschedule(self):
- self.assertEqual(SchedTimeSessAssignment.objects.filter(session__meeting__number=42,session__group__acronym='mars').count(),1)
+ self.assertEqual(SchedTimeSessAssignment.objects.filter(session__meeting__number=42,session__group__acronym='mars',schedule__name='test-agenda').count(),1)
self.login()
url = self.absreverse('ietf.meeting.views.edit_agenda',kwargs=dict(num='42',name='test-agenda',owner='plain@example.com'))
@@ -86,7 +86,7 @@ class ScheduleEditTests(StaticLiveServerTestCase):
self.assertTrue(len(q('#sortable-list #session_1'))>0)
time.sleep(0.1) # The API that modifies the database runs async
- self.assertEqual(SchedTimeSessAssignment.objects.filter(session__meeting__number=42,session__group__acronym='mars').count(),0)
+ self.assertEqual(SchedTimeSessAssignment.objects.filter(session__meeting__number=42,session__group__acronym='mars',schedule__name='test-agenda').count(),0)
# The following are useful debugging tools
diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py
index 36960fe54..1fe43fecc 100644
--- a/ietf/meeting/tests_views.py
+++ b/ietf/meeting/tests_views.py
@@ -68,7 +68,7 @@ class MeetingTests(TestCase):
def test_agenda(self):
meeting = make_meeting_test_data()
session = Session.objects.filter(meeting=meeting, group__acronym="mars").first()
- slot = TimeSlot.objects.get(sessionassignments__session=session)
+ slot = TimeSlot.objects.get(sessionassignments__session=session,sessionassignments__schedule=meeting.agenda)
self.write_materials_files(meeting, session)
@@ -106,6 +106,10 @@ class MeetingTests(TestCase):
self.assertTrue(time_interval in agenda_content)
+ r = self.client.get(urlreverse("ietf.meeting.views.agenda", kwargs=dict(num=meeting.number,name=meeting.unofficial_schedule.name,owner=meeting.unofficial_schedule.owner.email())))
+ self.assertEqual(r.status_code, 200)
+ self.assertTrue('not the official schedule' in unicontent(r))
+
# CSV
r = self.client.get(urlreverse("ietf.meeting.views.agenda", kwargs=dict(num=meeting.number, ext=".csv")))
self.assertEqual(r.status_code, 200)
@@ -149,6 +153,11 @@ class MeetingTests(TestCase):
r = self.client.get(url)
self.assertTrue(all([x in unicontent(r) for x in ['mars','IESG Breakfast','Test Room','Breakfast Room']]))
+ url = urlreverse("ietf.meeting.views.agenda_by_room",kwargs=dict(num=meeting.number,name=meeting.unofficial_schedule.name,owner=meeting.unofficial_schedule.owner.email()))
+ r = self.client.get(url)
+ self.assertTrue(all([x in unicontent(r) for x in ['mars','Test Room',]]))
+ self.assertFalse('IESG Breakfast' in unicontent(r))
+
def test_agenda_by_type(self):
meeting = make_meeting_test_data()
@@ -157,6 +166,11 @@ class MeetingTests(TestCase):
r = self.client.get(url)
self.assertTrue(all([x in unicontent(r) for x in ['mars','IESG Breakfast','Test Room','Breakfast Room']]))
+ url = urlreverse("ietf.meeting.views.agenda_by_type",kwargs=dict(num=meeting.number,name=meeting.unofficial_schedule.name,owner=meeting.unofficial_schedule.owner.email()))
+ r = self.client.get(url)
+ self.assertTrue(all([x in unicontent(r) for x in ['mars','Test Room',]]))
+ self.assertFalse('IESG Breakfast' in unicontent(r))
+
url = urlreverse("ietf.meeting.views.agenda_by_type",kwargs=dict(num=meeting.number,type='session'))
r = self.client.get(url)
self.assertTrue(all([x in unicontent(r) for x in ['mars','Test Room']]))
@@ -167,12 +181,23 @@ class MeetingTests(TestCase):
self.assertFalse(any([x in unicontent(r) for x in ['mars','Test Room']]))
self.assertTrue(all([x in unicontent(r) for x in ['IESG Breakfast','Breakfast Room']]))
+ url = urlreverse("ietf.meeting.views.agenda_by_type",kwargs=dict(num=meeting.number,type='lead',name=meeting.unofficial_schedule.name,owner=meeting.unofficial_schedule.owner.email()))
+ r = self.client.get(url)
+ self.assertFalse(any([x in unicontent(r) for x in ['IESG Breakfast','Breakfast Room']]))
+
def test_agenda_room_view(self):
meeting = make_meeting_test_data()
url = urlreverse("ietf.meeting.views.room_view",kwargs=dict(num=meeting.number))
login_testing_unauthorized(self,"secretary",url)
r = self.client.get(url)
+ self.assertEqual(r.status_code,200)
self.assertTrue(all([x in unicontent(r) for x in ['mars','IESG Breakfast','Test Room','Breakfast Room']]))
+ url = urlreverse("ietf.meeting.views.room_view",kwargs=dict(num=meeting.number,name=meeting.unofficial_schedule.name,owner=meeting.unofficial_schedule.owner.email()))
+ r = self.client.get(url)
+ self.assertEqual(r.status_code,200)
+ self.assertTrue(all([x in unicontent(r) for x in ['mars','Test Room','Breakfast Room']]))
+ self.assertFalse('IESG Breakfast' in unicontent(r))
+
def test_materials(self):
meeting = make_meeting_test_data()
@@ -338,12 +363,12 @@ class EditTests(TestCase):
def test_slot_to_the_right(self):
meeting = make_meeting_test_data()
session = Session.objects.filter(meeting=meeting, group__acronym="mars").first()
- mars_scheduled = session.timeslotassignments.get()
- mars_slot = TimeSlot.objects.get(sessionassignments__session=session)
+ mars_scheduled = session.timeslotassignments.get(schedule__name='test-agenda')
+ mars_slot = TimeSlot.objects.get(sessionassignments__session=session,sessionassignments__schedule__name='test-agenda')
mars_ends = mars_slot.time + mars_slot.duration
session = Session.objects.filter(meeting=meeting, group__acronym="ames").first()
- ames_slot_qs = TimeSlot.objects.filter(sessionassignments__session=session)
+ ames_slot_qs = TimeSlot.objects.filter(sessionassignments__session=session,sessionassignments__schedule__name='test-agenda')
ames_slot_qs.update(time=mars_ends + datetime.timedelta(seconds=11 * 60))
self.assertTrue(not mars_slot.slot_to_the_right)
diff --git a/ietf/meeting/urls.py b/ietf/meeting/urls.py
index 9f836589f..03d3cdcf7 100644
--- a/ietf/meeting/urls.py
+++ b/ietf/meeting/urls.py
@@ -16,8 +16,12 @@ type_ietf_only_patterns = [
url(r'^agenda/(?P