Skip to content

Commit d709af6

Browse files
committed
checkpoint: refined document/session view with test. Trivial start on Document factories.
- Legacy-Id: 10845
1 parent 78ca39f commit d709af6

8 files changed

Lines changed: 147 additions & 14 deletions

File tree

ietf/doc/factories.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import factory
2+
3+
from ietf.doc.models import Document
4+
5+
class DocumentFactory(factory.DjangoModelFactory):
6+
class Meta:
7+
model = Document
8+
9+
type_id = 'draft'
10+
title = factory.Faker('sentence',nb_words=6)
11+
rev = '00'
12+
group = None
13+
14+
@factory.lazy_attribute_sequence
15+
def name(self, n):
16+
return '%s-%s-%s-%s%d'%(
17+
self.type_id,
18+
'bogusperson',
19+
self.group.acronym if self.group else 'netherwhere',
20+
'musings',
21+
n,
22+
)

ietf/doc/tests.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,14 @@
2020
from ietf.doc.models import ( Document, DocAlias, DocRelationshipName, RelatedDocument, State,
2121
DocEvent, BallotPositionDocEvent, LastCallDocEvent, WriteupDocEvent, NewRevisionDocEvent,
2222
save_document_in_history )
23+
from ietf.doc.factories import DocumentFactory
2324
from ietf.group.models import Group
25+
from ietf.group.factories import GroupFactory
2426
from ietf.meeting.models import Meeting, Session, SessionPresentation
27+
from ietf.meeting.factories import SessionFactory
2528
from ietf.name.models import SessionStatusName
2629
from ietf.person.models import Person
30+
from ietf.person.factories import PersonFactory
2731
from ietf.utils.mail import outbox
2832
from ietf.utils.test_data import make_test_data
2933
from ietf.utils.test_utils import login_testing_unauthorized, unicontent
@@ -904,3 +908,65 @@ def testExpansions(self):
904908
self.assertEqual(r.status_code, 200)
905909
self.assertTrue('draft-ietf-mars-test.all@ietf.org' in unicontent(r))
906910
self.assertTrue('ballot_saved' in unicontent(r))
911+
912+
class DocumentMeetingTests(TestCase):
913+
914+
def setUp(self):
915+
self.group = GroupFactory(type_id='wg',state_id='active')
916+
917+
today = datetime.date.today()
918+
cut_days = settings.MEETING_MATERIALS_SUBMISSION_CORRECTION_DAYS
919+
self.past_cutoff = SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today-datetime.timedelta(days=1+cut_days))
920+
self.past = SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today-datetime.timedelta(days=cut_days/2))
921+
self.inprog = SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today-datetime.timedelta(days=1))
922+
SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today+datetime.timedelta(days=90))
923+
SessionFactory.create(meeting__type_id='interim',group=self.group,meeting__date=today+datetime.timedelta(days=45))
924+
925+
def test_view_document_meetings(self):
926+
doc = DocumentFactory.create()
927+
doc.sessionpresentation_set.create(session=self.inprog,rev=None)
928+
929+
url = urlreverse('ietf.doc.views_material.all_presentations', kwargs=dict(name=doc.name))
930+
response = self.client.get(url)
931+
self.assertEqual(response.status_code, 200)
932+
q = PyQuery(response.content)
933+
self.assertTrue(q('#inprogressmeets'))
934+
self.assertFalse(any([q(id) for id in ['#pastmeets','#futuremeets']]))
935+
self.assertFalse(q('#addsessionsbutton'))
936+
self.assertFalse(q("a.btn:contains('Remove document')"))
937+
938+
doc.sessionpresentation_set.create(session=self.past_cutoff,rev=None)
939+
doc.sessionpresentation_set.create(session=self.past,rev=None)
940+
941+
self.client.login(username="secretary", password="secretary+password")
942+
response = self.client.get(url)
943+
self.assertEqual(response.status_code, 200)
944+
q = PyQuery(response.content)
945+
self.assertTrue(q('#addsessionsbutton'))
946+
self.assertEqual(1,len(q("#inprogressmeets a.btn-default:contains('Remove document')")))
947+
self.assertEqual(1,len(q("#pastmeets a.btn-default:contains('Remove document')")))
948+
self.assertEqual(1,len(q("#pastmeets a.btn-warning:contains('Remove document')")))
949+
950+
group_chair = PersonFactory()
951+
self.group.role_set.create(name_id='chair',person=group_chair,email=group_chair.email())
952+
self.client.login(username=group_chair.user.username,password='%s+password'%group_chair.user.username)
953+
response = self.client.get(url)
954+
self.assertEqual(response.status_code, 200)
955+
q = PyQuery(response.content)
956+
self.assertTrue(q('#addsessionsbutton'))
957+
self.assertEqual(1,len(q("#inprogressmeets a.btn-default:contains('Remove document')")))
958+
self.assertEqual(1,len(q("#pastmeets a.btn-default:contains('Remove document')")))
959+
self.assertTrue(q('#pastmeets'))
960+
self.assertFalse(q("#pastmeets a.btn-warning:contains('Remove document')"))
961+
962+
other_group = GroupFactory(type_id='wg',state_id='active')
963+
other_chair = PersonFactory()
964+
other_group.role_set.create(name_id='chair',person=other_chair,email=group_chair.email())
965+
self.client.login(username=other_chair.user.username,password='%s+password'%other_chair.user.username)
966+
response = self.client.get(url)
967+
self.assertEqual(response.status_code, 200)
968+
q = PyQuery(response.content)
969+
self.assertTrue(q('#addsessionsbutton'))
970+
self.assertTrue(all([q(id) for id in ['#pastmeets','#inprogressmeets']]))
971+
self.assertFalse(q("#inprogressmeets a.btn:contains('Remove document')"))
972+
self.assertFalse(q("#pastmeets a.btn:contains('Remove document')"))

ietf/doc/views_material.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ def all_presentations(request, name):
330330
future, in_progress, past = group_sessions(sessions)
331331

332332
return render(request, 'doc/material/all_presentations.html', {
333+
'user': request.user,
333334
'doc': doc,
334335
'future': future,
335336
'in_progress': in_progress,
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
4+
from django.db import models, migrations
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('meeting', '0018_auto_20160207_0537'),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name='sessionpresentation',
16+
name='rev',
17+
field=models.CharField(max_length=16, null=True, verbose_name=b'revision', blank=True),
18+
preserve_default=True,
19+
),
20+
]

ietf/meeting/models.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
from ietf.doc.models import Document
2424
from ietf.group.models import Group
25+
from ietf.group.utils import can_manage_materials
2526
from ietf.name.models import MeetingTypeName, TimeSlotTypeName, SessionStatusName, ConstraintName, RoomResourceName
2627
from ietf.person.models import Person
2728

@@ -887,7 +888,7 @@ def json_dict(self, host_scheme):
887888
class SessionPresentation(models.Model):
888889
session = models.ForeignKey('Session')
889890
document = models.ForeignKey(Document)
890-
rev = models.CharField(verbose_name="revision", max_length=16, blank=True)
891+
rev = models.CharField(verbose_name="revision", max_length=16, null=True, blank=True)
891892

892893
class Meta:
893894
db_table = 'meeting_session_materials'
@@ -957,6 +958,12 @@ def slides(self):
957958
def drafts(self):
958959
return list(self.materials.filter(type='draft'))
959960

961+
def can_manage_materials(self, user):
962+
return can_manage_materials(user,self.group)
963+
964+
def is_material_submission_cutoff(self):
965+
return datetime.date.today() > self.meeting.get_submission_correction_date()
966+
960967
def __unicode__(self):
961968
if self.meeting.type_id == "interim":
962969
return self.meeting.number

ietf/meeting/templatetags/session_filters.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,8 @@ def presented_versions(session,doc):
1010
else:
1111
rev = sp.first().rev
1212
return rev if rev else "(current)"
13+
14+
@register.filter
15+
def can_manage_materials(session,user):
16+
return session.can_manage_materials(user)
17+

ietf/templates/doc/material/all_presentations.html

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
11
{% extends "base.html" %}
22
{# Copyright The IETF Trust 2015, All Rights Reserved #}
3-
{% load origin %}
3+
{% load origin ietf_filters %}
44

55
{% block title %}Sessions linked to {{doc.name}}{% endblock %}
66

77
{% block content %}
88
{% origin %}
99
<h1>Sessions linked to {{doc.name}}{% if doc.title %}<br><small>{{doc.title}}</small>{% endif %}</h1>
1010

11+
<div class="buttonlist" >
12+
{% comment TODO %}
13+
<a class="btn btn-default">Add doc to next session for this group</a>
14+
{% endcomment %}
15+
{% if user|has_role:"Secretariat,Area Director,WG Chair,WG Secretary,RG Chair,RG Secretary,IRTF Chair,Team Chair" %}
16+
<a class="btn btn-default" id="addsessionsbutton">Link to more sessions</a>
17+
{% else %}
18+
{{user}} failed the has_role check
19+
{% endif %}
20+
</div>
21+
1122
{% if in_progress %}
1223
<div class="panel panel-default" id="inprogressmeets">
1324
<div class="panel-heading">Meetings in progress</div>
Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1-
{% load session_filters %}
1+
{% load origin %}
2+
{% load ietf_filters session_filters %}
3+
4+
{% origin %}
25
<table class="table table-condensed table-striped">
36
<thead>
47
<tr>
58
<th class="col-md-1">Revision</th>
69
<th class="col-md-2">Meeting</th>
710
<th class="col-md-2">Session</th>
8-
<th class="col-md-1"></th>
9-
<th class="col-md-1"></th>
10-
<th class="col-md-5"></th>
11+
<th class="col-md-1">{% comment %}Agenda{% endcomment %}</th>
12+
<th class="col-md-1">{% comment %}Minutes{% endcomment %}</th>
13+
<th class="col-md-1">{% comment %}Materials{% endcomment %}</th>
14+
<th class="col-md-4">{% comment %}Buttons{% endcomment %}</th>
1115
</tr>
1216
</thead>
1317
<tbody>
@@ -22,18 +26,15 @@
2226
{% else %}
2327
{{s.status}}
2428
{% endif %}
25-
{% comment %}
26-
{% if show_request and s.meeting.type.slug == 'ietf' %}
27-
{% if can_edit %}
28-
<br>
29-
<a class="btn btn-default btn-xs" href="{% url 'sessions_view' num=s.meeting.number acronym=s.group.acronym %}">Edit Session Request</a>
30-
{% endif %}
31-
{% endif %}
32-
{% endcomment %}
3329
</td>
3430
<td>{% if s.agenda %}<a href="{{ s.agenda.get_absolute_url }}">Agenda</a>{% endif %}</td>
3531
<td>{% if s.minutes %}<a href="{{ s.minutes.get_absolute_url }}">Minutes</a>{% endif %}</td>
3632
<td><a href="{% url 'ietf.meeting.views.session_details' num=s.meeting.number acronym=s.group.acronym %}">Materials</a></td>
33+
<td>
34+
{% if user|has_role:"Secretariat" or s|can_manage_materials:user and not s.is_material_submission_cutoff %}
35+
<a class="btn btn-{% if s.is_material_submission_cutoff %}warning{% else %}default{% endif %} btn-xs" href="">Remove document from session</a>
36+
{% endif %}
37+
</td>
3738
{% endfor %}
3839
</tbody>
3940
</table>

0 commit comments

Comments
 (0)