checkpoint: refined document/session view with test. Trivial start on Document factories.

- Legacy-Id: 10845
This commit is contained in:
Robert Sparks 2016-02-18 04:07:17 +00:00
parent 78ca39f237
commit d709af6ca2
8 changed files with 147 additions and 14 deletions

22
ietf/doc/factories.py Normal file
View file

@ -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,
)

View file

@ -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')"))

View file

@ -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,

View file

@ -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,
),
]

View file

@ -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

View file

@ -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)

View file

@ -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 %}
<h1>Sessions linked to {{doc.name}}{% if doc.title %}<br><small>{{doc.title}}</small>{% endif %}</h1>
<div class="buttonlist" >
{% comment TODO %}
<a class="btn btn-default">Add doc to next session for this group</a>
{% endcomment %}
{% if user|has_role:"Secretariat,Area Director,WG Chair,WG Secretary,RG Chair,RG Secretary,IRTF Chair,Team Chair" %}
<a class="btn btn-default" id="addsessionsbutton">Link to more sessions</a>
{% else %}
{{user}} failed the has_role check
{% endif %}
</div>
{% if in_progress %}
<div class="panel panel-default" id="inprogressmeets">
<div class="panel-heading">Meetings in progress</div>

View file

@ -1,13 +1,17 @@
{% load session_filters %}
{% load origin %}
{% load ietf_filters session_filters %}
{% origin %}
<table class="table table-condensed table-striped">
<thead>
<tr>
<th class="col-md-1">Revision</th>
<th class="col-md-2">Meeting</th>
<th class="col-md-2">Session</th>
<th class="col-md-1"></th>
<th class="col-md-1"></th>
<th class="col-md-5"></th>
<th class="col-md-1">{% comment %}Agenda{% endcomment %}</th>
<th class="col-md-1">{% comment %}Minutes{% endcomment %}</th>
<th class="col-md-1">{% comment %}Materials{% endcomment %}</th>
<th class="col-md-4">{% comment %}Buttons{% endcomment %}</th>
</tr>
</thead>
<tbody>
@ -22,18 +26,15 @@
{% else %}
{{s.status}}
{% endif %}
{% comment %}
{% if show_request and s.meeting.type.slug == 'ietf' %}
{% if can_edit %}
<br>
<a class="btn btn-default btn-xs" href="{% url 'sessions_view' num=s.meeting.number acronym=s.group.acronym %}">Edit Session Request</a>
{% endif %}
{% endif %}
{% endcomment %}
</td>
<td>{% if s.agenda %}<a href="{{ s.agenda.get_absolute_url }}">Agenda</a>{% endif %}</td>
<td>{% if s.minutes %}<a href="{{ s.minutes.get_absolute_url }}">Minutes</a>{% endif %}</td>
<td><a href="{% url 'ietf.meeting.views.session_details' num=s.meeting.number acronym=s.group.acronym %}">Materials</a></td>
<td>
{% if user|has_role:"Secretariat" or s|can_manage_materials:user and not s.is_material_submission_cutoff %}
<a class="btn btn-{% if s.is_material_submission_cutoff %}warning{% else %}default{% endif %} btn-xs" href="">Remove document from session</a>
{% endif %}
</td>
{% endfor %}
</tbody>
</table>