checkpoint: refined document/session view with test. Trivial start on Document factories.
- Legacy-Id: 10845
This commit is contained in:
parent
78ca39f237
commit
d709af6ca2
22
ietf/doc/factories.py
Normal file
22
ietf/doc/factories.py
Normal 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,
|
||||
)
|
|
@ -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')"))
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
),
|
||||
]
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in a new issue