Skip to content

Commit de7bab7

Browse files
committed
Add nomination private process
See ietf-tools#929 - Legacy-Id: 5180
1 parent 57ccf2d commit de7bab7

10 files changed

Lines changed: 153 additions & 20 deletions

File tree

ietf/nomcom/forms.py

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
from ietf.nomcom.models import NomCom, Nomination, Nominee, NomineePosition, \
1818
Position, Feedback
1919
from ietf.nomcom.utils import QUESTIONNAIRE_TEMPLATE, NOMINATION_EMAIL_TEMPLATE, \
20-
INEXISTENT_PERSON_TEMPLATE, NOMINEE_EMAIL_TEMPLATE
20+
INEXISTENT_PERSON_TEMPLATE, NOMINEE_EMAIL_TEMPLATE, \
21+
get_user_email
2122
from ietf.nomcom.decorators import member_required
2223

2324
ROLODEX_URL = getattr(settings, 'ROLODEX_URL', None)
@@ -186,18 +187,30 @@ def __init__(self, *args, **kwargs):
186187
class NominateForm(BaseNomcomForm, forms.ModelForm):
187188
comments = forms.CharField(label='Comments', widget=forms.Textarea())
188189

189-
fieldsets = [('Candidate Nomination', ('position', 'candidate_name', 'candidate_email', 'candidate_phone', 'comments'))]
190+
fieldsets = [('Candidate Nomination', ('position', 'candidate_name',
191+
'candidate_email', 'candidate_phone', 'comments'))]
190192

191193
def __init__(self, *args, **kwargs):
192194
self.nomcom = kwargs.pop('nomcom', None)
193195
self.user = kwargs.pop('user', None)
196+
self.public = kwargs.pop('public', None)
197+
194198
super(NominateForm, self).__init__(*args, **kwargs)
195199
if self.nomcom:
196200
self.fields['position'].queryset = Position.objects.filter(nomcom=self.nomcom)
201+
if not self.public:
202+
author = get_user_email(self.user)
203+
if author:
204+
self.fields['nominator_email'].initial = author.address
205+
self.fieldsets = [('Candidate Nomination', ('position',
206+
'nominator_email', 'candidate_name',
207+
'candidate_email', 'candidate_phone',
208+
'comments'))]
197209

198210
def save(self, commit=True):
199211
# Create nomination
200212
nomination = super(NominateForm, self).save(commit=False)
213+
nominator_email = self.cleaned_data.get('nominator_email', None)
201214
candidate_email = self.cleaned_data['candidate_email']
202215
candidate_name = self.cleaned_data['candidate_name']
203216
position = self.cleaned_data['position']
@@ -219,12 +232,18 @@ def save(self, commit=True):
219232
nominee_position, nominee_position_created = NomineePosition.objects.get_or_create(position=position, nominee=nominee)
220233

221234
# Complete nomination data
222-
author_emails = Email.objects.filter(person__user=self.user)
223-
author = author_emails and author_emails[0] or None
224235
feedback = Feedback.objects.create(position=position,
225236
nominee=nominee,
226237
comments=comments,
227238
type=FeedbackType.objects.get(slug='nomina'))
239+
author = None
240+
if self.public:
241+
author = get_user_email(self.user)
242+
else:
243+
if nominator_email:
244+
emails = Email.objects.filter(address=nominator_email)
245+
author = emails and emails[0] or None
246+
228247
if author:
229248
nomination.nominator_email = author.address
230249
feedback.author = author
@@ -287,7 +306,7 @@ def save(self, commit=True):
287306

288307
class Meta:
289308
model = Nomination
290-
fields = ('position', 'candidate_name', 'candidate_email', 'candidate_phone')
309+
fields = ('position', 'nominator_email', 'candidate_name', 'candidate_email', 'candidate_phone')
291310

292311
class Media:
293312
js = ("/js/jquery-1.5.1.min.js",

ietf/nomcom/tests.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,14 @@ def setUp(self):
4141
self.edit_members_url = reverse('nomcom_edit_members', kwargs={'year': self.year})
4242
self.edit_chair_url = reverse('nomcom_edit_chair', kwargs={'year': self.year})
4343
self.public_key_url = reverse('nomcom_edit_publickey', kwargs={'year': self.year})
44+
self.private_nominate_url = reverse('nomcom_private_nominate', kwargs={'year': self.year})
4445

4546
# public urls
4647
self.index_url = reverse('nomcom_index', kwargs={'year': self.year})
4748
self.requirements_url = reverse('nomcom_requirements', kwargs={'year': self.year})
4849
self.questionnaires_url = reverse('nomcom_questionnaires', kwargs={'year': self.year})
4950
self.comments_url = reverse('nomcom_comments', kwargs={'year': self.year})
50-
self.nominate_url = reverse('nomcom_nominate', kwargs={'year': self.year})
51+
self.public_nominate_url = reverse('nomcom_public_nominate', kwargs={'year': self.year})
5152

5253
def access_member_url(self, url):
5354
login_testing_unauthorized(self, COMMUNITY_USER, url)
@@ -184,11 +185,23 @@ def test_comments_view(self):
184185
self.check_url_status(self.comments_url, 200)
185186
self.client.logout()
186187

187-
def test_nominate_view(self):
188+
def test_public_nominate(self):
189+
login_testing_unauthorized(self, COMMUNITY_USER, self.public_nominate_url)
190+
return self.nominate_view(public=True)
191+
192+
def test_private_nominate(self):
193+
self.access_member_url(self.private_nominate_url)
194+
return self.nominate_view(public=False)
195+
196+
def nominate_view(self, public=True):
188197
"""Verify nominate view"""
189-
login_testing_unauthorized(self, COMMUNITY_USER, self.nominate_url)
190-
response = self.client.get(self.nominate_url)
198+
if public:
199+
nominate_url = self.public_nominate_url
200+
else:
201+
nominate_url = self.private_nominate_url
202+
response = self.client.get(nominate_url)
191203
self.assertEqual(response.status_code, 200)
204+
192205
nomcom = get_nomcom_by_year(self.year)
193206
if not nomcom.public_key:
194207
self.assertNotContains(response, "nominateform")
@@ -197,7 +210,7 @@ def test_nominate_view(self):
197210
nomcom.public_key.storage.location = tempfile.gettempdir()
198211
nomcom.public_key.save('cert', File(open(self.cert_file.name, 'r')))
199212

200-
response = self.client.get(self.nominate_url)
213+
response = self.client.get(nominate_url)
201214
self.assertEqual(response.status_code, 200)
202215
self.assertContains(response, "nominateform")
203216

@@ -212,8 +225,10 @@ def test_nominate_view(self):
212225
'candidate_phone': candidate_phone,
213226
'position': position.id,
214227
'comments': comments}
228+
if not public:
229+
test_data['nominator_email'] = "%s%s" % (COMMUNITY_USER, EMAIL_DOMAIN)
215230

216-
response = self.client.post(self.nominate_url, test_data)
231+
response = self.client.post(nominate_url, test_data)
217232
self.assertEqual(response.status_code, 200)
218233

219234
# check objects

ietf/nomcom/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
urlpatterns = patterns('ietf.nomcom.views',
66
url(r'^(?P<year>\d{4})/private/$', 'private_index', name='nomcom_private_index'),
7+
url(r'^(?P<year>\d{4})/private/nominate/$', 'private_nominate', name='nomcom_private_nominate'),
78
url(r'^(?P<year>\d{4})/private/merge/$', 'private_merge', name='nomcom_private_merge'),
89
url(r'^(?P<year>\d{4})/private/edit-members/$', EditMembersFormPreview(EditMembersForm), name='nomcom_edit_members'),
910
url(r'^(?P<year>\d{4})/private/edit-chair/$', EditChairFormPreview(EditChairForm), name='nomcom_edit_chair'),
@@ -13,7 +14,7 @@
1314
url(r'^(?P<year>\d{4})/requirements/$', 'requirements', name='nomcom_requirements'),
1415
url(r'^(?P<year>\d{4})/questionnaires/$', 'questionnaires', name='nomcom_questionnaires'),
1516
url(r'^(?P<year>\d{4})/comments/$', 'comments', name='nomcom_comments'),
16-
url(r'^(?P<year>\d{4})/nominate/$', 'nominate', name='nomcom_nominate'),
17+
url(r'^(?P<year>\d{4})/nominate/$', 'public_nominate', name='nomcom_public_nominate'),
1718
url(r'^ajax/position-text/(?P<position_id>\d+)/$', 'ajax_position_text', name='nomcom_ajax_position_text'),
1819

1920
)

ietf/nomcom/utils.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from django.shortcuts import get_object_or_404
22
from django.core.exceptions import PermissionDenied
33

4+
from ietf.person.models import Email
45
from ietf.dbtemplate.models import DBTemplate
56

67
MAIN_NOMCOM_TEMPLATE_PATH = '/nomcom/defaults/'
@@ -20,6 +21,10 @@ def get_nomcom_by_year(year):
2021
group__state__slug='active')
2122

2223

24+
def get_user_email(user):
25+
emails = Email.objects.filter(person__user=user)
26+
27+
2328
def is_nomcom_member(user, nomcom):
2429
is_group_member = nomcom.group.is_member(user)
2530
if not is_group_member:

ietf/nomcom/views.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,26 @@ def questionnaires(request, year):
6666

6767

6868
@login_required
69-
def nominate(request, year):
69+
def public_nominate(request, year):
70+
return nominate(request, year, True)
71+
72+
73+
@member_required(role='member')
74+
def private_nominate(request, year):
75+
return nominate(request, year, False)
76+
77+
78+
def nominate(request, year, public):
7079
nomcom = get_nomcom_by_year(year)
7180
has_publickey = nomcom.public_key and True or False
81+
if public:
82+
template = 'nomcom/public_nominate.html'
83+
else:
84+
template = 'nomcom/private_nominate.html'
85+
7286
if not has_publickey:
7387
message = ('warning', "Nomcom don't have public key to ecrypt data, please contact with nomcom chair")
74-
return render_to_response('nomcom/nominate.html',
88+
return render_to_response(template,
7589
{'has_publickey': has_publickey,
7690
'message': message,
7791
'nomcom': nomcom,
@@ -80,14 +94,14 @@ def nominate(request, year):
8094

8195
message = None
8296
if request.method == 'POST':
83-
form = NominateForm(data=request.POST, nomcom=nomcom, user=request.user)
97+
form = NominateForm(data=request.POST, nomcom=nomcom, user=request.user, public=public)
8498
if form.is_valid():
8599
form.save()
86100
message = ('success', 'Your nomination has been registered. Thank you for the nomination.')
87101
else:
88-
form = NominateForm(nomcom=nomcom, user=request.user)
102+
form = NominateForm(nomcom=nomcom, user=request.user, public=public)
89103

90-
return render_to_response('nomcom/nominate.html',
104+
return render_to_response(template,
91105
{'has_publickey': has_publickey,
92106
'form': form,
93107
'message': message,

ietf/templates/nomcom/nomcom_private_base.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ <h1>Nomcom {{ year }} Private Area</h1>
77
<div class="ietf-navset">
88
{% if selected == "index" %}<span class="selected">List of nominees</span>{% else %}<a href="{% url nomcom_private_index year %}">List of nominees</a>{% endif %} |
99
{% if selected == "merge" %}<span class="selected">Merge nominee email addr{% else %}<a href="{% url nomcom_private_merge year %}">Merge nominee email addr</a>{% endif %} |
10+
{% if selected == "nominate" %}<span class="selected">Nominate{% else %}<a href="{% url nomcom_private_nominate year %}">Nominate</a>{% endif %} |
1011
</div>
1112

1213

ietf/templates/nomcom/nomcom_public_base.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ <h1>Nomcom {{ year }} Pages</h1>
66

77
<div class="ietf-navset">
88
{% if selected == "index" %}<span class="selected">Home</span>{% else %}<a href="{% url nomcom_index year %}">Home</a>{% endif %} |
9-
{% if selected == "nominate" %}<span class="selected">Nominate</span>{% else %}<a href="{% url nomcom_nominate year %}">Nominate</a>{% endif %} |
9+
{% if selected == "nominate" %}<span class="selected">Nominate</span>{% else %}<a href="{% url nomcom_public_nominate year %}">Nominate</a>{% endif %} |
1010
{% if selected == "requirements" %}<span class="selected">Requirements</span>{% else %}<a href="{% url nomcom_requirements year %}">Requirements</a>{% endif %} |
1111
{% if selected == "questionnaires" %}<span class="selected">Questionnaires</span>{% else %}<a href="{% url nomcom_questionnaires year %}">Questionnaires</a>{% endif %} |
1212
{% if selected == "comments" %}<span class="selected">Provide Comments</span>{% else %}<a href="{% url nomcom_comments year %}">Provide Comments</a>{% endif %}

ietf/templates/nomcom/nominate.html

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
{% extends "nomcom/nomcom_public_base.html" %}
2-
31
{% block subtitle %} - Nominate{% endblock %}
42

53
{% block pagehead %}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
{% extends "nomcom/nomcom_private_base.html" %}
2+
3+
{% block subtitle %} - Nominate{% endblock %}
4+
5+
{% block pagehead %}
6+
{{ form.media }}
7+
{% endblock %}
8+
9+
{% block nomcom_content %}
10+
11+
12+
{% if message %}
13+
<div class="info-message-{{ message.0 }}">{{ message.1 }}</div>
14+
{% endif %}
15+
16+
{% if has_publickey %}
17+
18+
<div class="js-info">
19+
Your browser has Javascript disabled. Please enable javascript and reload the page.
20+
<script type="text/javascript">
21+
(function ($) {
22+
$(".js-info").hide();
23+
})(jQuery);
24+
</script>
25+
</div>
26+
27+
28+
{% if form.errors %}<div class="info-message-error">Please correct the following errors</div>{% endif %}
29+
30+
<form id="nominateform" action="" method="post">{% csrf_token %}
31+
{{ form }}
32+
33+
<div class="submitrow">
34+
<input type="submit" value="Save" name="save" />
35+
</div>
36+
37+
</form>
38+
{% endif %}
39+
40+
{% endblock %}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
{% extends "nomcom/nomcom_public_base.html" %}
2+
3+
{% block subtitle %} - Nominate{% endblock %}
4+
5+
{% block pagehead %}
6+
{{ form.media }}
7+
{% endblock %}
8+
9+
{% block nomcom_content %}
10+
11+
12+
{% if message %}
13+
<div class="info-message-{{ message.0 }}">{{ message.1 }}</div>
14+
{% endif %}
15+
16+
{% if has_publickey %}
17+
18+
<div class="js-info">
19+
Your browser has Javascript disabled. Please enable javascript and reload the page.
20+
<script type="text/javascript">
21+
(function ($) {
22+
$(".js-info").hide();
23+
})(jQuery);
24+
</script>
25+
</div>
26+
27+
28+
{% if form.errors %}<div class="info-message-error">Please correct the following errors</div>{% endif %}
29+
30+
<form id="nominateform" action="" method="post">{% csrf_token %}
31+
{{ form }}
32+
33+
<div class="submitrow">
34+
<input type="submit" value="Save" name="save" />
35+
</div>
36+
37+
</form>
38+
{% endif %}
39+
40+
{% endblock %}

0 commit comments

Comments
 (0)