Remove sessonly, replacing the idea with a separate State. Add tests checking how materials show on agenda views. Commit ready for merge.

- Legacy-Id: 9351
This commit is contained in:
Robert Sparks 2015-04-01 16:00:05 +00:00
parent 16662f6448
commit a6c64d2b12
10 changed files with 2908 additions and 2721 deletions

View file

@ -233,14 +233,13 @@ class DocumentInfo(models.Model):
return None
def meeting_related(self):
if self.type_id in ("agenda","minutes","bluesheets"):
return (self.name.split("-")[1] == "interim"
or (self.session_set.exists() if isinstance(self, Document) else self.doc.session_set.exists()))
elif self.type_id in ("slides",):
return (self.name.split("-")[1] == "interim"
or (self.get_state('slides') and self.get_state('slides').slug in ("active", "sessonly","archived") ))
else:
return False
answer = False
if self.type_id in ("agenda","minutes","bluesheets","slides"):
answer = (self.name.split("-")[1] == "interim"
or (self if isinstance(self, Document) else self.doc).session_set.exists())
if self.type_id in ("slides",):
answer = answer and self.get_state_slug('reuse_policy')=='single'
return answer
def relations_that(self, relationship):
"""Return the related-document objects that describe a given relationship targeting self."""

View file

@ -43,6 +43,7 @@ class GroupMaterialTests(TestCase):
doc = Document.objects.create(name="slides-testteam-test-file", rev="01", type_id="slides", group=group)
doc.set_state(State.objects.get(type="slides", slug="active"))
doc.set_state(State.objects.get(type="reuse_policy", slug="multiple"))
DocAlias.objects.create(name=doc.name, document=doc)
NewRevisionDocEvent.objects.create(doc=doc,by=Person.objects.get(name="(System)"),rev='00',type='new_revision',desc='New revision available')
NewRevisionDocEvent.objects.create(doc=doc,by=Person.objects.get(name="(System)"),rev='01',type='new_revision',desc='New revision available')
@ -168,7 +169,7 @@ class GroupMaterialTests(TestCase):
self.assertEqual(doc.title, "New title")
self.assertEqual(doc.get_state_slug(), "active")
with open(os.path.join(self.agenda_dir, "42", "slides", doc.name + "-" + doc.rev + ".txt")) as f:
with open(os.path.join(doc.get_file_path(), doc.name + "-" + doc.rev + ".txt")) as f:
self.assertEqual(f.read(), content)
def test_material_presentations(self):

View file

@ -500,7 +500,7 @@ def document_main(request, name, rev=None):
if doc.type_id in ("slides", "agenda", "minutes"):
can_manage_material = can_manage_materials(request.user, doc.group)
presentations = None
if doc.type_id=='slides' and doc.get_state_slug('slides') in ['sessonly','active']:
if doc.type_id=='slides' and doc.get_state_slug('slides')=='active' :
presentations = doc.future_presentations()
if doc.meeting_related():
# disallow editing meeting-related stuff through this

View file

@ -864,24 +864,16 @@ class Session(models.Model):
unique_constraints_dict = None
# Should work on how materials are captured so that deleted things are no longer associated with the session
# (We can keep the information about something being added to and removed from a session in the document's history)
def agenda(self):
items = self.materials.filter(type="agenda",states__type="agenda",states__slug="active")
if items and items[0] is not None:
return items[0]
else:
return None
return self.materials.filter(type='agenda').exclude(states__type='agenda',states__slug='deleted').first()
def minutes(self):
try:
return self.materials.get(type="minutes",states__type="minutes",states__slug="active")
except Exception:
return None
return self.materials.filter(type='minutes').exclude(states__type='minutes',states__slug='deleted').first()
def slides(self):
try:
return self.materials.filter(type="slides",states__type="slides",states__slug="active").order_by("order")
except Exception:
return []
return list(self.materials.filter(type='slides').exclude(states__type='slides',states__slug='deleted').order_by('order'))
def __unicode__(self):
if self.meeting.type_id == "interim":

View file

@ -23,9 +23,10 @@ def make_meeting_test_data():
room.resources = [projector]
# 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=Group.objects.get(acronym="mars"),
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())
@ -44,16 +45,22 @@ def make_meeting_test_data():
meeting.agenda = schedule
meeting.save()
doc = Document.objects.create(name='agenda-mars-ietf-42', type_id='agenda', title="Agenda", external_url="agenda-mars")
doc = Document.objects.create(name='agenda-mars-ietf-42', type_id='agenda', title="Agenda", external_url="agenda-mars.txt",group=mars)
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))
doc = Document.objects.create(name='minutes-mars-ietf-42', type_id='minutes', title="Minutes", external_url="minutes-mars")
doc = Document.objects.create(name='minutes-mars-ietf-42', type_id='minutes', title="Minutes", external_url="minutes-mars.txt",group=mars)
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))
doc = Document.objects.create(name='slides-mars-ietf-42', type_id='slides', title="Slideshow", external_url="slides-mars")
doc = Document.objects.create(name='slides-mars-ietf-42', type_id='slides', title="Slideshow", external_url="slides-mars.txt",group=mars)
doc.set_state(State.objects.get(type=doc.type_id, slug="active"))
doc.set_state(State.objects.get(type='reuse_policy',slug='single'))
mars_session.sessionpresentation_set.add(SessionPresentation(session=mars_session,document=doc,rev=doc.rev))
doc = Document.objects.create(name='slides-mars-ietf-42-deleted', type_id='slides', title="Bad Slideshow", external_url="slides-mars-deleted.txt",group=mars)
doc.set_state(State.objects.get(type=doc.type_id, slug="deleted"))
doc.set_state(State.objects.get(type='reuse_policy',slug='single'))
mars_session.sessionpresentation_set.add(SessionPresentation(session=mars_session,document=doc,rev=doc.rev))
return meeting

View file

@ -33,11 +33,27 @@ class MeetingTests(TestCase):
with open(path, "w") as f:
f.write(content)
def write_materials_files(self, meeting, session):
draft = Document.objects.filter(type="draft", group=session.group).first()
self.write_materials_file(meeting, session.materials.get(type="agenda"),
"1. WG status (15 minutes)\n\n2. Status of %s\n\n" % draft.name)
self.write_materials_file(meeting, session.materials.get(type="minutes"),
"1. More work items underway\n\n2. The draft will be finished before next meeting\n\n")
self.write_materials_file(meeting, session.materials.filter(type="slides").exclude(states__type__slug='slides',states__slug='deleted').first(),
"This is a slideshow")
def test_agenda(self):
meeting = make_meeting_test_data()
session = Session.objects.filter(meeting=meeting, group__acronym="mars").first()
slot = TimeSlot.objects.get(scheduledsession__session=session)
self.write_materials_files(meeting, session)
time_interval = "%s-%s" % (slot.time.strftime("%H%M"), (slot.time + slot.duration).strftime("%H%M"))
# plain
@ -51,6 +67,13 @@ class MeetingTests(TestCase):
self.assertTrue(slot.location.name in agenda_content)
self.assertTrue(time_interval in agenda_content)
# Make sure there's a frame for the agenda and it points to the right place
self.assertTrue(any([session.materials.get(type='agenda').href() in x.attrib['xsrc'] for x in q('tr.groupagenda iframe')]))
# Make sure undeleted slides are present and deleted slides are not
self.assertTrue(any([session.materials.filter(type='slides').exclude(states__type__slug='slides',states__slug='deleted').first().title in x.text for x in q('tr.groupagenda a')]))
self.assertFalse(any([session.materials.filter(type='slides',states__type__slug='slides',states__slug='deleted').first().title in x.text for x in q('tr.groupagenda a')]))
# mobile
r = self.client.get(urlreverse("ietf.meeting.views.agenda", kwargs=dict(num=meeting.number)),
{ '_testiphone': "1" })
@ -81,6 +104,10 @@ class MeetingTests(TestCase):
self.assertTrue(session.group.parent.acronym.upper() in agenda_content)
self.assertTrue(slot.location.name in agenda_content)
self.assertTrue(session.materials.get(type='agenda').external_url in r.content)
self.assertTrue(session.materials.filter(type='slides').exclude(states__type__slug='slides',states__slug='deleted').first().external_url in r.content)
self.assertFalse(session.materials.filter(type='slides',states__type__slug='slides',states__slug='deleted').first().external_url in r.content)
# iCal
r = self.client.get(urlreverse("ietf.meeting.views.ical_agenda", kwargs=dict(num=meeting.number))
+ "?" + session.group.parent.acronym.upper())
@ -92,6 +119,11 @@ class MeetingTests(TestCase):
self.assertTrue("BEGIN:VTIMEZONE" in agenda_content)
self.assertTrue("END:VTIMEZONE" in agenda_content)
self.assertTrue(session.agenda().get_absolute_url() in r.content)
self.assertTrue(session.materials.filter(type='slides').exclude(states__type__slug='slides',states__slug='deleted').first().get_absolute_url() in r.content)
# TODO - the ics view uses .all on a queryset in a view so it's showing the deleted slides.
#self.assertFalse(session.materials.filter(type='slides',states__type__slug='slides',states__slug='deleted').first().get_absolute_url() in r.content)
# week view
r = self.client.get(urlreverse("ietf.meeting.views.week_view", kwargs=dict(num=meeting.number)))
self.assertEqual(r.status_code, 200)
@ -102,16 +134,8 @@ class MeetingTests(TestCase):
def test_materials(self):
meeting = make_meeting_test_data()
session = Session.objects.filter(meeting=meeting, group__acronym="mars").first()
draft = Document.objects.filter(type="draft", group=session.group).first()
self.write_materials_file(meeting, session.materials.get(type="agenda"),
"1. WG status (15 minutes)\n\n2. Status of %s\n\n" % draft.name)
self.write_materials_file(meeting, session.materials.get(type="minutes"),
"1. More work items underway\n\n2. The draft will be finished before next meeting\n\n")
self.write_materials_file(meeting, session.materials.get(type="slides"),
"This is a slideshow")
self.write_materials_files(meeting, session)
# session agenda
r = self.client.get(urlreverse("ietf.meeting.views.session_agenda",
@ -132,6 +156,7 @@ class MeetingTests(TestCase):
self.assertTrue(row.find("a:contains(\"Agenda\")"))
self.assertTrue(row.find("a:contains(\"Minutes\")"))
self.assertTrue(row.find("a:contains(\"Slideshow\")"))
self.assertFalse(row.find("a:contains(\"Bad Slideshow\")"))
# FIXME: missing tests of .pdf/.tar generation (some code can
# probably be lifted from similar tests in iesg/tests.py)

File diff suppressed because it is too large Load diff

View file

@ -2,11 +2,14 @@
# boiler plate
import os, sys
import django
basedir = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '../..'))
sys.path.insert(0, basedir)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ietf.settings")
django.setup()
# script
from django.core.serializers import serialize

View file

@ -914,6 +914,7 @@ def upload_unified(request, meeting_num, acronym=None, session_id=None):
# set Doc state
state = State.objects.get(type=doc.type,slug='active')
doc.set_state(state)
doc.set_state(State.objects.get(type='reuse_policy',slug='single'))
# create session relationship, per Henrik we should associate documents to all sessions
# for the current meeting (until tools support different materials for diff sessions)

View file

@ -319,6 +319,9 @@ def make_test_data():
def other_doc_factory(type_id,name):
doc = Document.objects.create(type_id=type_id,name=name,rev='00',group=mars_wg)
DocAlias.objects.create(name=name,document=doc)
doc.set_state(State.objects.get(type__slug=doc.type.slug,slug='active'))
if type_id=='slides':
doc.set_state(State.objects.get(type='reuse_policy',slug='single'))
other_doc_factory('agenda','agenda-42-mars')
other_doc_factory('minutes','minutes-42-mars')
other_doc_factory('slides','slides-42-mars-1')