From d709af6ca29d5dadd44f874ded9a3887b939dea6 Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Thu, 18 Feb 2016 04:07:17 +0000 Subject: [PATCH] checkpoint: refined document/session view with test. Trivial start on Document factories. - Legacy-Id: 10845 --- ietf/doc/factories.py | 22 +++++++ ietf/doc/tests.py | 66 +++++++++++++++++++ ietf/doc/views_material.py | 1 + ...0019_allow_null_sessionpresentation_rev.py | 20 ++++++ ietf/meeting/models.py | 9 ++- ietf/meeting/templatetags/session_filters.py | 5 ++ .../doc/material/all_presentations.html | 13 +++- .../doc/material/presentations-row.html | 25 +++---- 8 files changed, 147 insertions(+), 14 deletions(-) create mode 100644 ietf/doc/factories.py create mode 100644 ietf/meeting/migrations/0019_allow_null_sessionpresentation_rev.py diff --git a/ietf/doc/factories.py b/ietf/doc/factories.py new file mode 100644 index 000000000..06d41951b --- /dev/null +++ b/ietf/doc/factories.py @@ -0,0 +1,22 @@ +import factory + +from ietf.doc.models import Document + +class DocumentFactory(factory.DjangoModelFactory): + class Meta: + model = Document + + type_id = 'draft' + title = factory.Faker('sentence',nb_words=6) + rev = '00' + group = None + + @factory.lazy_attribute_sequence + def name(self, n): + return '%s-%s-%s-%s%d'%( + self.type_id, + 'bogusperson', + self.group.acronym if self.group else 'netherwhere', + 'musings', + n, + ) diff --git a/ietf/doc/tests.py b/ietf/doc/tests.py index 24ba04318..4b2d674f5 100644 --- a/ietf/doc/tests.py +++ b/ietf/doc/tests.py @@ -20,10 +20,14 @@ import debug # pyflakes:ignore from ietf.doc.models import ( Document, DocAlias, DocRelationshipName, RelatedDocument, State, DocEvent, BallotPositionDocEvent, LastCallDocEvent, WriteupDocEvent, NewRevisionDocEvent, save_document_in_history ) +from ietf.doc.factories import DocumentFactory from ietf.group.models import Group +from ietf.group.factories import GroupFactory from ietf.meeting.models import Meeting, Session, SessionPresentation +from ietf.meeting.factories import SessionFactory from ietf.name.models import SessionStatusName from ietf.person.models import Person +from ietf.person.factories import PersonFactory from ietf.utils.mail import outbox from ietf.utils.test_data import make_test_data from ietf.utils.test_utils import login_testing_unauthorized, unicontent @@ -904,3 +908,65 @@ expand-draft-ietf-ames-test.all@virtual.ietf.org ames-author@example.ames, ames self.assertEqual(r.status_code, 200) self.assertTrue('draft-ietf-mars-test.all@ietf.org' in unicontent(r)) self.assertTrue('ballot_saved' in unicontent(r)) + +class DocumentMeetingTests(TestCase): + + def setUp(self): + self.group = GroupFactory(type_id='wg',state_id='active') + + today = datetime.date.today() + cut_days = settings.MEETING_MATERIALS_SUBMISSION_CORRECTION_DAYS + self.past_cutoff = SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today-datetime.timedelta(days=1+cut_days)) + self.past = SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today-datetime.timedelta(days=cut_days/2)) + self.inprog = SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today-datetime.timedelta(days=1)) + SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today+datetime.timedelta(days=90)) + SessionFactory.create(meeting__type_id='interim',group=self.group,meeting__date=today+datetime.timedelta(days=45)) + + def test_view_document_meetings(self): + doc = DocumentFactory.create() + doc.sessionpresentation_set.create(session=self.inprog,rev=None) + + url = urlreverse('ietf.doc.views_material.all_presentations', kwargs=dict(name=doc.name)) + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + q = PyQuery(response.content) + self.assertTrue(q('#inprogressmeets')) + self.assertFalse(any([q(id) for id in ['#pastmeets','#futuremeets']])) + self.assertFalse(q('#addsessionsbutton')) + self.assertFalse(q("a.btn:contains('Remove document')")) + + doc.sessionpresentation_set.create(session=self.past_cutoff,rev=None) + doc.sessionpresentation_set.create(session=self.past,rev=None) + + self.client.login(username="secretary", password="secretary+password") + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + q = PyQuery(response.content) + self.assertTrue(q('#addsessionsbutton')) + self.assertEqual(1,len(q("#inprogressmeets a.btn-default:contains('Remove document')"))) + self.assertEqual(1,len(q("#pastmeets a.btn-default:contains('Remove document')"))) + self.assertEqual(1,len(q("#pastmeets a.btn-warning:contains('Remove document')"))) + + group_chair = PersonFactory() + self.group.role_set.create(name_id='chair',person=group_chair,email=group_chair.email()) + self.client.login(username=group_chair.user.username,password='%s+password'%group_chair.user.username) + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + q = PyQuery(response.content) + self.assertTrue(q('#addsessionsbutton')) + self.assertEqual(1,len(q("#inprogressmeets a.btn-default:contains('Remove document')"))) + self.assertEqual(1,len(q("#pastmeets a.btn-default:contains('Remove document')"))) + self.assertTrue(q('#pastmeets')) + self.assertFalse(q("#pastmeets a.btn-warning:contains('Remove document')")) + + other_group = GroupFactory(type_id='wg',state_id='active') + other_chair = PersonFactory() + other_group.role_set.create(name_id='chair',person=other_chair,email=group_chair.email()) + self.client.login(username=other_chair.user.username,password='%s+password'%other_chair.user.username) + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + q = PyQuery(response.content) + self.assertTrue(q('#addsessionsbutton')) + self.assertTrue(all([q(id) for id in ['#pastmeets','#inprogressmeets']])) + self.assertFalse(q("#inprogressmeets a.btn:contains('Remove document')")) + self.assertFalse(q("#pastmeets a.btn:contains('Remove document')")) diff --git a/ietf/doc/views_material.py b/ietf/doc/views_material.py index b872b473c..f4763fda6 100644 --- a/ietf/doc/views_material.py +++ b/ietf/doc/views_material.py @@ -330,6 +330,7 @@ def all_presentations(request, name): future, in_progress, past = group_sessions(sessions) return render(request, 'doc/material/all_presentations.html', { + 'user': request.user, 'doc': doc, 'future': future, 'in_progress': in_progress, diff --git a/ietf/meeting/migrations/0019_allow_null_sessionpresentation_rev.py b/ietf/meeting/migrations/0019_allow_null_sessionpresentation_rev.py new file mode 100644 index 000000000..b427f8db7 --- /dev/null +++ b/ietf/meeting/migrations/0019_allow_null_sessionpresentation_rev.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('meeting', '0018_auto_20160207_0537'), + ] + + operations = [ + migrations.AlterField( + model_name='sessionpresentation', + name='rev', + field=models.CharField(max_length=16, null=True, verbose_name=b'revision', blank=True), + preserve_default=True, + ), + ] diff --git a/ietf/meeting/models.py b/ietf/meeting/models.py index 50fbe2eae..59f74e7d7 100644 --- a/ietf/meeting/models.py +++ b/ietf/meeting/models.py @@ -22,6 +22,7 @@ from django.utils.text import slugify from ietf.doc.models import Document from ietf.group.models import Group +from ietf.group.utils import can_manage_materials from ietf.name.models import MeetingTypeName, TimeSlotTypeName, SessionStatusName, ConstraintName, RoomResourceName from ietf.person.models import Person @@ -887,7 +888,7 @@ class Constraint(models.Model): class SessionPresentation(models.Model): session = models.ForeignKey('Session') document = models.ForeignKey(Document) - rev = models.CharField(verbose_name="revision", max_length=16, blank=True) + rev = models.CharField(verbose_name="revision", max_length=16, null=True, blank=True) class Meta: db_table = 'meeting_session_materials' @@ -957,6 +958,12 @@ class Session(models.Model): def drafts(self): return list(self.materials.filter(type='draft')) + def can_manage_materials(self, user): + return can_manage_materials(user,self.group) + + def is_material_submission_cutoff(self): + return datetime.date.today() > self.meeting.get_submission_correction_date() + def __unicode__(self): if self.meeting.type_id == "interim": return self.meeting.number diff --git a/ietf/meeting/templatetags/session_filters.py b/ietf/meeting/templatetags/session_filters.py index 3a7ba0fbb..2a3da7028 100644 --- a/ietf/meeting/templatetags/session_filters.py +++ b/ietf/meeting/templatetags/session_filters.py @@ -10,3 +10,8 @@ def presented_versions(session,doc): else: rev = sp.first().rev return rev if rev else "(current)" + +@register.filter +def can_manage_materials(session,user): + return session.can_manage_materials(user) + diff --git a/ietf/templates/doc/material/all_presentations.html b/ietf/templates/doc/material/all_presentations.html index 2af035eb9..05d465e35 100644 --- a/ietf/templates/doc/material/all_presentations.html +++ b/ietf/templates/doc/material/all_presentations.html @@ -1,6 +1,6 @@ {% extends "base.html" %} {# Copyright The IETF Trust 2015, All Rights Reserved #} -{% load origin %} +{% load origin ietf_filters %} {% block title %}Sessions linked to {{doc.name}}{% endblock %} @@ -8,6 +8,17 @@ {% origin %}

Sessions linked to {{doc.name}}{% if doc.title %}
{{doc.title}}{% endif %}

+
+ {% comment TODO %} + Add doc to next session for this group + {% endcomment %} + {% if user|has_role:"Secretariat,Area Director,WG Chair,WG Secretary,RG Chair,RG Secretary,IRTF Chair,Team Chair" %} + Link to more sessions + {% else %} + {{user}} failed the has_role check + {% endif %} +
+ {% if in_progress %}
Meetings in progress
diff --git a/ietf/templates/doc/material/presentations-row.html b/ietf/templates/doc/material/presentations-row.html index 1e49b9619..042c29d2e 100644 --- a/ietf/templates/doc/material/presentations-row.html +++ b/ietf/templates/doc/material/presentations-row.html @@ -1,13 +1,17 @@ -{% load session_filters %} +{% load origin %} +{% load ietf_filters session_filters %} + + {% origin %} - - - + + + + @@ -22,18 +26,15 @@ {% else %} {{s.status}} {% endif %} -{% comment %} - {% if show_request and s.meeting.type.slug == 'ietf' %} - {% if can_edit %} -
- Edit Session Request - {% endif %} - {% endif %} -{% endcomment %} + {% endfor %}
Revision Meeting Session{% comment %}Agenda{% endcomment %}{% comment %}Minutes{% endcomment %}{% comment %}Materials{% endcomment %}{% comment %}Buttons{% endcomment %}
{% if s.agenda %}Agenda{% endif %} {% if s.minutes %}Minutes{% endif %} Materials + {% if user|has_role:"Secretariat" or s|can_manage_materials:user and not s.is_material_submission_cutoff %} + Remove document from session + {% endif %} +