Skip to content

Commit 5bafd3d

Browse files
committed
Conditioned behavior of views for concluded nomcoms. Fixes ietf-tools#1856.
- Legacy-Id: 10521
1 parent e81b473 commit 5bafd3d

18 files changed

Lines changed: 434 additions & 153 deletions

ietf/dbtemplate/factories.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import factory
2+
3+
from ietf.dbtemplate.models import DBTemplate
4+
5+
class DBTemplateFactory(factory.DjangoModelFactory):
6+
class Meta:
7+
model = DBTemplate
8+
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
{% extends "ietf.html" %}
2+
3+
{% load bootstrap3 %}
4+
5+
{% block content %}
6+
<h1>Template: {{ template }}</h1>
7+
8+
<h2>Meta information</h2>
9+
<dl>
10+
<dt>Title</dt>
11+
<dd>{{ template.title }}</dt>
12+
<dt>Group</dt>
13+
<dd>{{ template.group }}</dd>
14+
<dt>Template type</dt>
15+
<dd>{{ template.type.name }}
16+
{% if template.type.slug == "rst" %}
17+
<p class="help-block">This template uses the syntax of reStructuredText. Get a quick reference at <a href="http://docutils.sourceforge.net/docs/user/rst/quickref.html">http://docutils.sourceforge.net/docs/user/rst/quickref.html</a>.</p>
18+
<p class="help-block">You can do variable interpolation with $varialbe if the template allows any variable.</p>
19+
{% endif %}
20+
{% if template.type.slug == "django" %}
21+
<p class="help-block">This template uses the syntax of the default django template framework. Get more info at <a href="https://docs.djangoproject.com/en/dev/topics/templates/">https://docs.djangoproject.com/en/dev/topics/templates/</a>.</p>
22+
<p class="help-block">You can do variable interpolation with the current django markup &#123;&#123;variable&#125;&#125; if the template allows any variable.</p>
23+
{% endif %}
24+
{% if template.type.slug == "plain" %}
25+
<p class="help-block">This template uses plain text, so no markup is used. You can do variable interpolation with $variable if the template allows any variable.</p>
26+
{% endif %}
27+
</dd>
28+
{% if template.variables %}
29+
<dt>Variables allowed in this template</dt>
30+
<dd>{{ template.variables|linebreaks }}</dd>
31+
{% endif %}
32+
</dl>
33+
34+
<h2>Template content</h2>
35+
36+
<div class = "panel panel-default">
37+
<p class='pasted'>{{ template.content }}</p>
38+
</div>
39+
40+
{% endblock content %}

ietf/dbtemplate/views.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,19 @@ def template_edit(request, acronym, template_id, base_template='dbtemplate/templ
4343
}
4444
context.update(extra_context)
4545
return render(request, base_template, context)
46+
47+
def template_show(request, acronym, template_id, base_template='dbtemplate/template_edit.html', extra_context=None):
48+
group = get_object_or_404(Group, acronym=acronym)
49+
chairs = group.role_set.filter(name__slug='chair')
50+
extra_context = extra_context or {}
51+
52+
if not has_role(request.user, "Secretariat") and not chairs.filter(person__user=request.user).count():
53+
return HttpResponseForbidden("You are not authorized to access this view")
54+
55+
template = get_object_or_404(DBTemplate, id=template_id, group=group)
56+
57+
context = {'template': template,
58+
'group': group,
59+
}
60+
context.update(extra_context)
61+
return render(request, base_template, context)

ietf/nomcom/factories.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@
5858
-----END PRIVATE KEY-----
5959
'''
6060

61+
def provide_private_key_to_test_client(testcase):
62+
session = testcase.client.session
63+
session['NOMCOM_PRIVATE_KEY_%s'%testcase.nc.year()] = key
64+
session.save()
65+
6166
def nomcom_kwargs_for_year(year=None, *args, **kwargs):
6267
if not year:
6368
year = random.randint(1980,2100)

ietf/nomcom/tests.py

Lines changed: 148 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,12 @@
2727
NomineePositionStateName, Feedback, FeedbackTypeName, \
2828
Nomination
2929
from ietf.nomcom.forms import EditMembersForm, EditMembersFormPreview
30-
from ietf.nomcom.utils import get_nomcom_by_year, get_or_create_nominee
30+
from ietf.nomcom.utils import get_nomcom_by_year, get_or_create_nominee, get_hash_nominee_position
3131
from ietf.nomcom.management.commands.send_reminders import Command, is_time_to_send
3232

33-
from ietf.nomcom.factories import NomComFactory, nomcom_kwargs_for_year
33+
from ietf.nomcom.factories import NomComFactory, nomcom_kwargs_for_year, provide_private_key_to_test_client
3434
from ietf.person.factories import PersonFactory
35+
from ietf.dbtemplate.factories import DBTemplateFactory
3536

3637
client_test_cert_files = None
3738

@@ -928,11 +929,13 @@ class InactiveNomcomTests(TestCase):
928929
def setUp(self):
929930
self.nc = NomComFactory.create(**nomcom_kwargs_for_year(group__state_id='conclude'))
930931
self.plain_person = PersonFactory.create()
932+
self.chair = self.nc.group.role_set.filter(name='chair').first().person
933+
self.member = self.nc.group.role_set.filter(name='member').first().person
931934

932935
def test_feedback_closed(self):
933936
for view in ['nomcom_public_feedback', 'nomcom_private_feedback']:
934937
url = reverse(view, kwargs={'year': self.nc.year()})
935-
who = self.plain_person if 'public' in view else self.nc.group.role_set.filter(name='member').first().person
938+
who = self.plain_person if 'public' in view else self.member
936939
login_testing_unauthorized(self, who.user.username, url)
937940
response = self.client.get(url)
938941
self.assertEqual(response.status_code, 200)
@@ -963,11 +966,151 @@ def test_feedback_closed(self):
963966
def test_nominations_closed(self):
964967
for view in ['nomcom_public_nominate', 'nomcom_private_nominate']:
965968
url = reverse(view, kwargs={'year': self.nc.year() })
966-
who = self.plain_person if 'public' in view else self.nc.group.role_set.filter(name='member').first().person
969+
who = self.plain_person if 'public' in view else self.member
967970
login_testing_unauthorized(self, who.user.username, url)
968971
response = self.client.get(url)
969972
self.assertEqual(response.status_code, 200)
970973
q = PyQuery(response.content)
971974
self.assertTrue( '(Concluded)' in q('h1').text())
972975
self.assertTrue( 'closed' in q('.alert-warning').text())
973-
976+
977+
def test_acceptance_closed(self):
978+
today = datetime.date.today().strftime('%Y%m%d')
979+
pid = self.nc.position_set.first().nomineeposition_set.first().id
980+
url = reverse('nomcom_process_nomination_status', kwargs = {
981+
'year' : self.nc.year(),
982+
'nominee_position_id' : pid,
983+
'state' : 'accepted',
984+
'date' : today,
985+
'hash' : get_hash_nominee_position(today,pid),
986+
})
987+
response = self.client.get(url)
988+
self.assertEqual(response.status_code, 403)
989+
990+
def test_can_view_but_cannot_edit_nomcom_settings(self):
991+
url = reverse('nomcom_edit_nomcom',kwargs={'year':self.nc.year() })
992+
login_testing_unauthorized(self, self.chair.user.username, url)
993+
response = self.client.get(url)
994+
self.assertEqual(response.status_code, 200)
995+
response = self.client.post(url,{})
996+
self.assertEqual(response.status_code, 403)
997+
998+
def test_cannot_classify_feedback(self):
999+
url = reverse('nomcom_view_feedback_pending',kwargs={'year':self.nc.year() })
1000+
login_testing_unauthorized(self, self.chair.user.username, url)
1001+
provide_private_key_to_test_client(self)
1002+
response = self.client.get(url)
1003+
self.assertEqual(response.status_code, 403)
1004+
response = self.client.post(url,{})
1005+
self.assertEqual(response.status_code, 403)
1006+
1007+
def test_cannot_modify_nominees(self):
1008+
url = reverse('nomcom_private_index', kwargs={'year':self.nc.year()})
1009+
login_testing_unauthorized(self, self.chair.user.username, url)
1010+
response = self.client.get(url)
1011+
self.assertEqual(response.status_code, 200)
1012+
q = PyQuery(response.content)
1013+
self.assertFalse( q('#batch-action-form'))
1014+
test_data = {"action": "set_as_pending",
1015+
"selected": [1]}
1016+
response = self.client.post(url, test_data)
1017+
self.assertEqual(response.status_code, 200)
1018+
q = PyQuery(response.content)
1019+
self.assertTrue('not active' in q('.alert-warning').text() )
1020+
1021+
def test_email_pasting_closed(self):
1022+
url = reverse('nomcom_private_feedback_email', kwargs={'year':self.nc.year()})
1023+
login_testing_unauthorized(self, self.chair.user.username, url)
1024+
response = self.client.get(url)
1025+
self.assertEqual(response.status_code, 200)
1026+
q = PyQuery(response.content)
1027+
self.assertFalse( q('#paste-email-feedback-form'))
1028+
test_data = {"email_text": "some garbage text",
1029+
}
1030+
response = self.client.post(url, test_data)
1031+
self.assertEqual(response.status_code, 200)
1032+
q = PyQuery(response.content)
1033+
self.assertTrue('not active' in q('.alert-warning').text() )
1034+
1035+
def test_questionnaire_entry_closed(self):
1036+
url = reverse('nomcom_private_questionnaire', kwargs={'year':self.nc.year()})
1037+
login_testing_unauthorized(self, self.chair.user.username, url)
1038+
response = self.client.get(url)
1039+
self.assertEqual(response.status_code, 200)
1040+
q = PyQuery(response.content)
1041+
self.assertFalse( q('#questionnaireform'))
1042+
response = self.client.post(url, {})
1043+
self.assertEqual(response.status_code, 200)
1044+
q = PyQuery(response.content)
1045+
self.assertTrue('not active' in q('.alert-warning').text() )
1046+
1047+
def _test_send_reminders_closed(self,rtype):
1048+
url = reverse('nomcom_send_reminder_mail', kwargs={'year':self.nc.year(),'type':rtype })
1049+
login_testing_unauthorized(self, self.chair.user.username, url)
1050+
response = self.client.get(url)
1051+
self.assertEqual(response.status_code, 200)
1052+
q = PyQuery(response.content)
1053+
self.assertFalse( q('#reminderform'))
1054+
response = self.client.post(url, {})
1055+
self.assertEqual(response.status_code, 200)
1056+
q = PyQuery(response.content)
1057+
self.assertTrue('not active' in q('.alert-warning').text() )
1058+
1059+
def test_send_accept_reminders_closed(self):
1060+
self._test_send_reminders_closed('accept')
1061+
1062+
def test_send_questionnaire_reminders_closed(self):
1063+
self._test_send_reminders_closed('questionnaire')
1064+
1065+
def test_merge_closed(self):
1066+
url = reverse('nomcom_private_merge', kwargs={'year':self.nc.year()})
1067+
login_testing_unauthorized(self, self.chair.user.username, url)
1068+
response = self.client.get(url)
1069+
q = PyQuery(response.content)
1070+
self.assertFalse( q('#mergeform'))
1071+
response = self.client.post(url, {})
1072+
self.assertEqual(response.status_code, 200)
1073+
q = PyQuery(response.content)
1074+
self.assertTrue('not active' in q('.alert-warning').text() )
1075+
1076+
def test_cannot_edit_position(self):
1077+
url = reverse('nomcom_edit_position',kwargs={'year':self.nc.year(),'position_id':self.nc.position_set.first().id})
1078+
login_testing_unauthorized(self, self.chair.user.username, url)
1079+
provide_private_key_to_test_client(self)
1080+
response = self.client.get(url)
1081+
self.assertEqual(response.status_code, 403)
1082+
response = self.client.post(url,{})
1083+
self.assertEqual(response.status_code, 403)
1084+
1085+
def test_cannot_add_position(self):
1086+
url = reverse('nomcom_add_position',kwargs={'year':self.nc.year()})
1087+
login_testing_unauthorized(self, self.chair.user.username, url)
1088+
provide_private_key_to_test_client(self)
1089+
response = self.client.get(url)
1090+
self.assertEqual(response.status_code, 403)
1091+
response = self.client.post(url,{})
1092+
self.assertEqual(response.status_code, 403)
1093+
1094+
def test_cannot_delete_position(self):
1095+
url = reverse('nomcom_remove_position',kwargs={'year':self.nc.year(),'position_id':self.nc.position_set.first().id})
1096+
login_testing_unauthorized(self, self.chair.user.username, url)
1097+
provide_private_key_to_test_client(self)
1098+
response = self.client.get(url)
1099+
self.assertEqual(response.status_code, 403)
1100+
response = self.client.post(url,{})
1101+
self.assertEqual(response.status_code, 403)
1102+
1103+
def test_can_view_but_not_edit_templates(self):
1104+
template = DBTemplateFactory.create(group=self.nc.group,
1105+
title='Test template',
1106+
path='/nomcom/'+self.nc.group.acronym+'/test',
1107+
variables='',
1108+
type_id='text',
1109+
content='test content')
1110+
url = reverse('nomcom_edit_template',kwargs={'year':self.nc.year(), 'template_id':template.id})
1111+
login_testing_unauthorized(self, self.chair.user.username, url)
1112+
response = self.client.get(url)
1113+
self.assertEqual(response.status_code, 200)
1114+
q = PyQuery(response.content)
1115+
self.assertFalse( q('#templateform') )
1116+

ietf/nomcom/urls.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from django.conf.urls import patterns, url
2-
from django.views.generic import TemplateView
32

43
from ietf.nomcom.forms import EditMembersForm, EditMembersFormPreview
54

@@ -22,8 +21,6 @@
2221
url(r'^(?P<year>\d{4})/private/send-reminder-mail/(?P<type>\w+)/$', 'send_reminder_mail', name='nomcom_send_reminder_mail'),
2322
url(r'^(?P<year>\d{4})/private/edit-members/$', EditMembersFormPreview(EditMembersForm), name='nomcom_edit_members'),
2423
url(r'^(?P<year>\d{4})/private/edit-nomcom/$', 'edit_nomcom', name='nomcom_edit_nomcom'),
25-
url(r'^(?P<year>\d{4})/private/delete-nomcom/$', 'delete_nomcom', name='nomcom_delete_nomcom'),
26-
url(r'^deleted/$', TemplateView.as_view(template_name='nomcom/deleted.html'), name='nomcom_deleted'),
2724
url(r'^(?P<year>\d{4})/private/chair/templates/$', 'list_templates', name='nomcom_list_templates'),
2825
url(r'^(?P<year>\d{4})/private/chair/templates/(?P<template_id>\d+)/$', 'edit_template', name='nomcom_edit_template'),
2926
url(r'^(?P<year>\d{4})/private/chair/position/$', 'list_positions', name='nomcom_list_positions'),

0 commit comments

Comments
 (0)