Skip to content

Commit e42b501

Browse files
committed
Add navigation bar for nomcom pages.
Add views and template skel for nomcom pages. Modify nomcom templates fixtures Modify initialize functions for nomcom templates Add view tests for nomcom pages. Add navset styles for horizontal items See ietf-tools#919 - Legacy-Id: 5152
1 parent 53cde27 commit e42b501

14 files changed

Lines changed: 208 additions & 47 deletions

File tree

ietf/dbtemplate/fixtures/nomcom_templates.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ $position: Nomination position</field>
5555
<field to="name.dbtemplatetypename" name="type" rel="ManyToOneRel">plain</field>
5656
<field type="TextField" name="content">A new nomination have been received.
5757

58-
Nominator: $nominator <$nominator_email>
59-
Nominee: $nominee <$nominee_email>
58+
Nominator: $nominator ($nominator_email)
59+
Nominee: $nominee ($nominee_email)
6060
Position: $position</field>
6161
<field to="group.group" name="group" rel="ManyToOneRel"><None></None></field>
6262
</object>

ietf/nomcom/forms.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,10 @@
1414
from ietf.person.models import Email, Person
1515
from ietf.nomcom.models import NomCom, Nomination, Nominee, NomineePosition, \
1616
Position, Feedback
17-
17+
from ietf.nomcom.utils import QUESTIONNAIRE_TEMPLATE, NOMINATION_EMAIL_TEMPLATE, \
18+
INEXISTENT_PERSON_TEMPLATE, NOMINEE_EMAIL_TEMPLATE
1819

1920
ROLODEX_URL = getattr(settings, 'ROLODEX_URL', None)
20-
INEXISTENT_PERSON_TEMPLATE = "email/inexistent_person.txt"
21-
NOMINEE_TEMPLATE = "email/new_nominee.txt"
22-
NOMINATION_TEMPLATE = "email/new_nomination.txt"
23-
QUESTIONNAIRE_TEMPLATE = "position/questionnaire.txt"
2421

2522

2623
def get_group_or_404(year):
@@ -227,7 +224,7 @@ def save(self, commit=True):
227224
to_email = email.address
228225
context = {'nominee': email.person.name,
229226
'position': position}
230-
path = nomcom_template_path + NOMINEE_TEMPLATE
227+
path = nomcom_template_path + NOMINEE_EMAIL_TEMPLATE
231228
send_mail(None, to_email, from_email, subject, path, context)
232229

233230
# send email to nominee with questionnaire
@@ -251,7 +248,7 @@ def save(self, commit=True):
251248
if author:
252249
context.update({'nominator': author.person.name,
253250
'nominator_email': author.address})
254-
path = nomcom_template_path + NOMINATION_TEMPLATE
251+
path = nomcom_template_path + NOMINATION_EMAIL_TEMPLATE
255252
send_mail(None, to_email, from_email, subject, path, context)
256253

257254
return nomination

ietf/nomcom/test_data.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@
2222

2323
def nomcom_test_data():
2424
group, created = Group.objects.get_or_create(name='IAB/IESG Nominating Committee 2013/2014',
25-
state=GroupStateName.objects.get(='active'),
25+
state=GroupStateName.objects.get(slug='active'),
2626
type=GroupTypeName.objects.get(slug='nomcom'),
2727
acronym='nomcom2013')
2828
nomcom, created = NomCom.objects.get_or_create(group=group)
29-
u, created = User.objects.get_or_create(username="plain")
29+
u, created = User.objects.get_or_create(username="plain", password="plain")
3030
plainman, created = Person.objects.get_or_create(
3131
name="Plain Man",
3232
ascii="Plain Man",

ietf/nomcom/tests.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,52 @@
11
from django.test import TestCase
22
from django.db import IntegrityError
3+
from django.core.urlresolvers import reverse
34

5+
from ietf.utils.test_utils import login_testing_unauthorized
46
from ietf.nomcom.test_data import nomcom_test_data
57
from ietf.nomcom.models import NomineePosition, Position, Nominee, NomineePositionState
68

79

10+
class NomcomTest(TestCase):
11+
"""Tests to create a new nomcom"""
12+
fixtures = ['names', 'nomcom_templates']
13+
14+
def check_url_status(self, url, status):
15+
response = self.client.get(url)
16+
self.assertEqual(response.status_code, status)
17+
18+
def setUp(self):
19+
nomcom_test_data()
20+
self.year = 2013
21+
22+
def test_home_view(self):
23+
"""Verify home view"""
24+
url = reverse('nomcom_index', kwargs={'year': self.year})
25+
self.check_url_status(url, 200)
26+
27+
def test_nominate_view(self):
28+
"""Verify nominate view"""
29+
url = reverse('nomcom_nominate', kwargs={'year': self.year})
30+
login_testing_unauthorized(self, 'kaligula', url)
31+
self.check_url_status(url, 200)
32+
33+
def test_requirements_view(self):
34+
"""Verify requirements view"""
35+
url = reverse('nomcom_requirements', kwargs={'year': self.year})
36+
self.check_url_status(url, 200)
37+
38+
def test_questionnaires_view(self):
39+
"""Verify questionnaires view"""
40+
url = reverse('nomcom_questionnaires', kwargs={'year': self.year})
41+
self.check_url_status(url, 200)
42+
43+
def test_comments_view(self):
44+
"""Verify comments view"""
45+
url = reverse('nomcom_comments', kwargs={'year': self.year})
46+
login_testing_unauthorized(self, 'plain', url)
47+
self.check_url_status(url, 200)
48+
49+
850
class NomineePositionStateSaveTest(TestCase):
951
"""Tests for the NomineePosition save override method"""
1052
fixtures = ['names', 'nomcom_templates']

ietf/nomcom/urls.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,14 @@
33
EditMembersForm, EditMembersFormPreview
44

55
urlpatterns = patterns('ietf.nomcom.views',
6+
url(r'^(?P<year>\d{4})/$', 'index', name='nomcom_index'),
7+
url(r'^(?P<year>\d{4})/requirements/$', 'requirements', name='nomcom_requirements'),
8+
url(r'^(?P<year>\d{4})/questionnaires/$', 'questionnaires', name='nomcom_questionnaires'),
9+
url(r'^(?P<year>\d{4})/requirement/(?P<name>[^/]+)/$', 'requirement_detail', name='nomcom_requirement_detail'),
10+
url(r'^(?P<year>\d{4})/questionnaire/(?P<name>[^/]+)/$', 'questionnaire_detail', name='nomcom_questionnaire_detail'),
11+
url(r'^(?P<year>\d{4})/comments/$', 'comments', name='nomcom_comments'),
12+
url(r'^(?P<year>\d{4})/nominate/$', 'nominate', name='nomcom_nominate'),
613
url(r'^(?P<year>\d{4})/edit-chair/$', EditChairFormPreview(EditChairForm), name='edit_chair'),
714
url(r'^(?P<year>\d{4})/edit-members/$', EditMembersFormPreview(EditMembersForm), name='edit_members'),
815
url(r'^(?P<year>\d{4})/edit-publickey/$', 'edit_publickey', name='edit_publickey'),
9-
url(r'^(?P<year>\d{4})/nominate/$', 'nominate', name='nominate'),
1016
)

ietf/nomcom/utils.py

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1+
from django.shortcuts import get_object_or_404
2+
13
from ietf.dbtemplate.models import DBTemplate
24

35
MAIN_NOMCOM_TEMPLATE_PATH = '/nomcom/defaults/'
4-
DEFAULT_NOMCOM_TEMPLATES = 'home.rst', 'email/inexistent_person.txt', 'email/new_nomination.txt', 'email/new_nominee.txt'
5-
DEFAULT_QUESTIONNAIRE_TEMPLATE = 'position/questionnaire.txt'
6-
DEFAULT_REQUIREMENTS_TEMPLATE = 'position/requirements.txt'
6+
QUESTIONNAIRE_TEMPLATE = 'position/questionnaire.txt'
7+
REQUIREMENTS_TEMPLATE = 'position/requirements.txt'
8+
HOME_TEMPLATE = 'home.rst'
9+
INEXISTENT_PERSON_TEMPLATE = 'email/inexistent_person.txt'
10+
NOMINEE_EMAIL_TEMPLATE = 'email/new_nominee.txt'
11+
NOMINATION_EMAIL_TEMPLATE = 'email/new_nomination.txt'
12+
DEFAULT_NOMCOM_TEMPLATES = [HOME_TEMPLATE, INEXISTENT_PERSON_TEMPLATE, NOMINATION_EMAIL_TEMPLATE, NOMINEE_EMAIL_TEMPLATE]
713

814

915
def initialize_templates_for_group(group):
@@ -20,24 +26,31 @@ def initialize_templates_for_group(group):
2026

2127

2228
def initialize_questionnaire_for_position(position):
23-
questionnaire_path = MAIN_NOMCOM_TEMPLATE_PATH + DEFAULT_QUESTIONNAIRE_TEMPLATE
29+
questionnaire_path = MAIN_NOMCOM_TEMPLATE_PATH + QUESTIONNAIRE_TEMPLATE
2430
template = DBTemplate.objects.get(path=questionnaire_path)
2531
return DBTemplate.objects.create(
2632
group=position.nomcom.group,
2733
title=template.title + '[%s]' % position.name,
28-
path='/nomcom/' + position.nomcom.group.acronym + '/' + str(position.id) + '/' + DEFAULT_QUESTIONNAIRE_TEMPLATE,
34+
path='/nomcom/' + position.nomcom.group.acronym + '/' + str(position.id) + '/' + QUESTIONNAIRE_TEMPLATE,
2935
variables=template.variables,
3036
type_id=template.type_id,
3137
content=template.content)
3238

3339

3440
def initialize_requirements_for_position(position):
35-
requirements_path = MAIN_NOMCOM_TEMPLATE_PATH + DEFAULT_REQUIREMENTS_TEMPLATE
41+
requirements_path = MAIN_NOMCOM_TEMPLATE_PATH + REQUIREMENTS_TEMPLATE
3642
template = DBTemplate.objects.get(path=requirements_path)
3743
return DBTemplate.objects.create(
3844
group=position.nomcom.group,
3945
title=template.title + '[%s]' % position.name,
40-
path='/nomcom/' + position.nomcom.group.acronym + '/' + str(position.id) + '/' + DEFAULT_REQUIREMENTS_TEMPLATE,
46+
path='/nomcom/' + position.nomcom.group.acronym + '/' + str(position.id) + '/' + REQUIREMENTS_TEMPLATE,
4147
variables=template.variables,
4248
type_id=template.type_id,
4349
content=template.content)
50+
51+
52+
def get_nomcom_by_year(year):
53+
from ietf.nomcom.models import NomCom
54+
return get_object_or_404(NomCom,
55+
group__acronym__icontains=year,
56+
group__state__slug='active')

ietf/nomcom/views.py

Lines changed: 76 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,88 @@
1-
from django.shortcuts import get_object_or_404, render_to_response
1+
from django.shortcuts import render_to_response
22
from django.template import RequestContext
33
from django.http import HttpResponseForbidden
44
from django.contrib.auth.decorators import login_required
5+
from django.template.loader import render_to_string
56

7+
from ietf.nomcom.utils import get_nomcom_by_year, HOME_TEMPLATE
68
from ietf.nomcom.forms import EditPublicKeyForm, NominateForm
7-
from ietf.nomcom.models import NomCom
9+
10+
11+
def index(request, year):
12+
nomcom = get_nomcom_by_year(year)
13+
home_template = '/nomcom/%s/%s' % (nomcom.group.acronym, HOME_TEMPLATE)
14+
template = render_to_string(home_template, {})
15+
return render_to_response('nomcom/index.html',
16+
{'nomcom': nomcom,
17+
'year': year,
18+
'selected': 'index',
19+
'template': template}, RequestContext(request))
20+
21+
22+
def requirements(request, year):
23+
nomcom = get_nomcom_by_year(year)
24+
return render_to_response('nomcom/requirements.html',
25+
{'nomcom': nomcom,
26+
'year': year,
27+
'selected': 'requirements'}, RequestContext(request))
28+
29+
30+
def questionnaires(request, year):
31+
nomcom = get_nomcom_by_year(year)
32+
return render_to_response('nomcom/questionnaires.html',
33+
{'nomcom': nomcom,
34+
'year': year,
35+
'selected': 'questionnaires'}, RequestContext(request))
36+
37+
38+
def questionnaire_detail(request, year, name):
39+
nomcom = get_nomcom_by_year(year)
40+
return render_to_response('nomcom/questionnaire_detail.html',
41+
{'nomcom': nomcom,
42+
'year': year,
43+
'selected': 'questionnaires'}, RequestContext(request))
44+
45+
46+
def requirement_detail(request, year, name):
47+
nomcom = get_nomcom_by_year(year)
48+
return render_to_response('nomcom/requirement_detail.html',
49+
{'nomcom': nomcom,
50+
'year': year,
51+
'selected': 'requirements'}, RequestContext(request))
52+
53+
54+
@login_required
55+
def nominate(request, year):
56+
nomcom = get_nomcom_by_year(year)
57+
message = None
58+
if request.method == 'POST':
59+
form = NominateForm(data=request.POST, nomcom=nomcom, user=request.user)
60+
if form.is_valid():
61+
form.save()
62+
message = ('success', 'Your nomination has been registered. Thank you for the nomination.')
63+
else:
64+
form = NominateForm(nomcom=nomcom, user=request.user)
65+
66+
return render_to_response('nomcom/nominate.html',
67+
{'form': form,
68+
'message': message,
69+
'nomcom': nomcom,
70+
'year': year,
71+
'selected': 'nominate'}, RequestContext(request))
72+
73+
74+
@login_required
75+
def comments(request, year):
76+
nomcom = get_nomcom_by_year(year)
77+
return render_to_response('nomcom/comments.html',
78+
{'nomcom': nomcom,
79+
'year': year,
80+
'selected': 'comments'}, RequestContext(request))
881

982

1083
@login_required
1184
def edit_publickey(request, year):
12-
nomcom = get_object_or_404(NomCom,
13-
group__acronym__icontains=year,
14-
group__state__slug='active')
85+
nomcom = get_nomcom_by_year(year)
1586
is_group_chair = nomcom.group.is_chair(request.user)
1687
if not is_group_chair:
1788
return HttpResponseForbidden("Must be group chair")
@@ -32,22 +103,3 @@ def edit_publickey(request, year):
32103
{'form': form,
33104
'group': nomcom.group,
34105
'message': message}, RequestContext(request))
35-
36-
37-
@login_required
38-
def nominate(request, year):
39-
nomcom = get_object_or_404(NomCom,
40-
group__acronym__icontains=year,
41-
group__state__slug='active')
42-
message = None
43-
if request.method == 'POST':
44-
form = NominateForm(data=request.POST, nomcom=nomcom, user=request.user)
45-
if form.is_valid():
46-
form.save()
47-
message = ('success', 'Your nomination has been registered. Thank you for the nomination.')
48-
else:
49-
form = NominateForm(nomcom=nomcom, user=request.user)
50-
51-
return render_to_response('nomcom/nominate.html',
52-
{'form': form,
53-
'message': message}, RequestContext(request))
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{% extends "nomcom/nomcom_base.html" %}
2+
3+
{% block title %} {{ nomcom }} - Provide comments{% endblock %}

ietf/templates/nomcom/index.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{% extends "nomcom/nomcom_base.html" %}
2+
3+
{% block subtitle %} - Home {% endblock %}
4+
5+
{% block nomcom_content %}
6+
{{ template|safe }}
7+
{% endblock %}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{% extends "base.html" %}
2+
3+
{% block title %}Nomcom {{ year }}{% block subtitle %}{% endblock %}{% endblock %}
4+
5+
{% block content %}
6+
7+
<h1>Nomcom {{ year }} Pages</h1>
8+
9+
<div class="ietf-navset">
10+
{% if selected == "index" %}<span class="selected">Home</span>{% else %}<a href="{% url nomcom_index year %}">Home</a>{% endif %} |
11+
{% if selected == "nominate" %}<span class="selected">Nominate</span>{% else %}<a href="{% url nomcom_nominate year %}">Nominate</a>{% endif %} |
12+
{% if selected == "requirements" %}<span class="selected">Requirements</span>{% else %}<a href="{% url nomcom_requirements year %}">Requirements</a>{% endif %} |
13+
{% if selected == "questionnaires" %}<span class="selected">Questionnaires</span>{% else %}<a href="{% url nomcom_questionnaires year %}">Questionnaires</a>{% endif %} |
14+
{% if selected == "comments" %}<span class="selected">Provide Comments</span>{% else %}<a href="{% url nomcom_comments year %}">Provide Comments</a>{% endif %}
15+
</div>
16+
17+
{% block nomcom_content %}
18+
{% endblock %}
19+
{% endblock %}

0 commit comments

Comments
 (0)