Skip to content

Commit 139ab19

Browse files
committed
Add questionnaire skel view
Add feedback test Fixed labels in feedback form See ietf-tools#970 - Legacy-Id: 5582
1 parent 55e843a commit 139ab19

6 files changed

Lines changed: 213 additions & 51 deletions

File tree

ietf/nomcom/forms.py

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -471,12 +471,12 @@ class Media:
471471
class FeedbackForm(BaseNomcomForm, forms.ModelForm):
472472
position_name = forms.CharField(label='position',
473473
widget=forms.TextInput(attrs={'size': '40'}))
474-
nominee_name = forms.CharField(label='your name',
474+
nominee_name = forms.CharField(label='nominee name',
475475
widget=forms.TextInput(attrs={'size': '40'}))
476-
nominee_email = forms.CharField(label='your email',
476+
nominee_email = forms.CharField(label='nominee email',
477477
widget=forms.TextInput(attrs={'size': '40'}))
478-
nominator_name = forms.CharField(label='nominator name')
479-
nominator_email = forms.CharField(label='nominator email')
478+
nominator_name = forms.CharField(label='your name')
479+
nominator_email = forms.CharField(label='your email')
480480

481481
comments = forms.CharField(label='Comments on this candidate',
482482
widget=forms.Textarea())
@@ -513,6 +513,8 @@ def __init__(self, *args, **kwargs):
513513
comments wishes to be anonymous. The confirmation email will be sent to the address given here,
514514
and the address will also be captured as part of the registered nomination.)"""
515515
self.fields['nominator_email'].help_text = help_text
516+
self.fields['nominator_name'].required = False
517+
self.fields['nominator_email'].required = False
516518

517519
author = get_user_email(self.user)
518520
if author:
@@ -589,6 +591,49 @@ class Media:
589591
"/js/nomcom.js", )
590592

591593

594+
class QuestionnaireForm(BaseNomcomForm, forms.ModelForm):
595+
596+
comments = forms.CharField(label='Comments on this candidate',
597+
widget=forms.Textarea())
598+
fieldsets = [('Provide questionnaires', ('nominee',
599+
'positions',
600+
'comments'))]
601+
602+
def __init__(self, *args, **kwargs):
603+
self.nomcom = kwargs.pop('nomcom', None)
604+
self.user = kwargs.pop('user', None)
605+
606+
super(QuestionnaireForm, self).__init__(*args, **kwargs)
607+
608+
def save(self, commit=True):
609+
feedback = super(QuestionnaireForm, self).save(commit=False)
610+
611+
nominee = self.cleaned_data.get("nominee")
612+
positions = self.cleaned_data.get("positions")
613+
614+
author = get_user_email(self.user)
615+
616+
if author:
617+
feedback.author = author
618+
619+
feedback.nomcom = self.nomcom
620+
feedback.nominee = nominee
621+
feedback.user = self.user
622+
feedback.type = FeedbackType.objects.get(slug='questio')
623+
feedback.save()
624+
feedback.positions = positions
625+
626+
class Meta:
627+
model = Feedback
628+
fields = ('nominee',
629+
'positions',
630+
'comments')
631+
632+
class Media:
633+
js = ("/js/jquery-1.5.1.min.js",
634+
"/js/nomcom.js", )
635+
636+
592637
class NomComTemplateForm(BaseNomcomForm, DBTemplateForm):
593638

594639
fieldsets = [('Template content', ('content', )),

ietf/nomcom/tests.py

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -260,14 +260,19 @@ def test_private_feedback(self):
260260
def feedback_view(self, *args, **kwargs):
261261
public = kwargs.pop('public', True)
262262
nominee_email = kwargs.pop('nominee_email', u'nominee@example.com')
263+
nominator_email = kwargs.pop('nominator_email', "%s%s" % (COMMUNITY_USER, EMAIL_DOMAIN))
263264
position_name = kwargs.pop('position', 'IAOC')
264265

265-
if public:
266-
nominate_url = self.public_feedback_url
267-
else:
268-
nominate_url = self.private_feedback_url
266+
self.nominate_view(public=public,
267+
nominee_email=nominee_email,
268+
position=position_name,
269+
nominator_email=nominator_email)
269270

270-
response = self.client.get(nominate_url)
271+
feedback_url = self.public_feedback_url
272+
if not public:
273+
feedback_url = self.private_feedback_url
274+
275+
response = self.client.get(feedback_url)
271276
self.assertEqual(response.status_code, 200)
272277

273278
nomcom = get_nomcom_by_year(self.year)
@@ -278,10 +283,43 @@ def feedback_view(self, *args, **kwargs):
278283
nomcom.public_key.storage.location = tempfile.gettempdir()
279284
nomcom.public_key.save('cert', File(open(self.cert_file.name, 'r')))
280285

281-
response = self.client.get(nominate_url)
286+
response = self.client.get(feedback_url)
282287
self.assertEqual(response.status_code, 200)
283288
self.assertContains(response, "feedbackform")
284289

290+
position = Position.objects.get(name=position_name)
291+
nominee = Nominee.objects.get(email__address=nominee_email)
292+
293+
comments = 'test feedback view'
294+
295+
test_data = {'comments': comments,
296+
'position_name': position.name,
297+
'nominee_name': nominee.email.person.name,
298+
'nominee_email': nominee.email.address}
299+
300+
if public:
301+
test_data['nominator_email'] = nominator_email
302+
test_data['nominator_name'] = nominator_email
303+
304+
feedback_url += "?nominee=%d&position=%d" % (nominee.id, position.id)
305+
306+
response = self.client.post(feedback_url, test_data)
307+
308+
self.assertEqual(response.status_code, 200)
309+
self.assertContains(response, "info-message-success")
310+
311+
## check objects
312+
feedback = Feedback.objects.get(positions__in=[position],
313+
nominee=nominee,
314+
type=FeedbackType.objects.get(slug='comment'))
315+
if public:
316+
self.assertEqual(feedback.author, nominator_email)
317+
318+
## to check feedback comments are saved like enrypted data
319+
self.assertNotEqual(feedback.comments, comments)
320+
321+
self.assertEqual(check_comments(feedback.comments, comments, self.privatekey_file), True)
322+
285323
def test_public_nominate(self):
286324
login_testing_unauthorized(self, COMMUNITY_USER, self.public_nominate_url)
287325
return self.nominate_view(public=True)
@@ -295,6 +333,7 @@ def test_private_nominate(self):
295333
def nominate_view(self, *args, **kwargs):
296334
public = kwargs.pop('public', True)
297335
nominee_email = kwargs.pop('nominee_email', u'nominee@example.com')
336+
nominator_email = kwargs.pop('nominator_email', "%s%s" % (COMMUNITY_USER, EMAIL_DOMAIN))
298337
position_name = kwargs.pop('position', 'IAOC')
299338

300339
if public:
@@ -328,7 +367,7 @@ def nominate_view(self, *args, **kwargs):
328367
'position': position.id,
329368
'comments': comments}
330369
if not public:
331-
test_data['nominator_email'] = "%s%s" % (COMMUNITY_USER, EMAIL_DOMAIN)
370+
test_data['nominator_email'] = nominator_email
332371

333372
response = self.client.post(nominate_url, test_data)
334373
self.assertEqual(response.status_code, 200)
@@ -342,7 +381,7 @@ def nominate_view(self, *args, **kwargs):
342381
feedback = Feedback.objects.get(positions__in=[position],
343382
nominee=nominee,
344383
type=FeedbackType.objects.get(slug='nomina'),
345-
author="%s%s" % (COMMUNITY_USER, EMAIL_DOMAIN))
384+
author=nominator_email)
346385

347386
# to check feedback comments are saved like enrypted data
348387
self.assertNotEqual(feedback.comments, comments)

ietf/nomcom/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
url(r'^(?P<year>\d{4})/private/key/$', 'private_key', name='nomcom_private_key'),
99
url(r'^(?P<year>\d{4})/private/nominate/$', 'private_nominate', name='nomcom_private_nominate'),
1010
url(r'^(?P<year>\d{4})/private/feedback/$', 'private_feedback', name='nomcom_private_feedback'),
11+
url(r'^(?P<year>\d{4})/private/questionnaire/$', 'private_questionnaire', name='nomcom_private_questionnaire'),
1112
url(r'^(?P<year>\d{4})/private/view-feedback/$', 'view_feedback', name='nomcom_view_feedback'),
1213
url(r'^(?P<year>\d{4})/private/view-feedback/pending/$', 'view_feedback_pending', name='nomcom_view_feedback_pending'),
1314
url(r'^(?P<year>\d{4})/private/view-feedback/nominee/(?P<nominee_id>\d+)$', 'view_feedback_nominee', name='nomcom_view_feedback_nominee'),

ietf/nomcom/views.py

Lines changed: 72 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
from ietf.name.models import NomineePositionState, FeedbackType
2121

2222
from ietf.nomcom.decorators import member_required, private_key_required
23-
from ietf.nomcom.forms import (NominateForm, FeedbackForm, MergeForm,
24-
NomComTemplateForm, PositionForm, PrivateKeyForm,
25-
EditNomcomForm)
23+
from ietf.nomcom.forms import (NominateForm, FeedbackForm, QuestionnaireForm,
24+
MergeForm, NomComTemplateForm, PositionForm,
25+
PrivateKeyForm, EditNomcomForm)
2626
from ietf.nomcom.models import Position, NomineePosition, Nominee, Feedback, NomCom
2727
from ietf.nomcom.utils import (get_nomcom_by_year, HOME_TEMPLATE,
2828
retrieve_nomcom_private_key,
@@ -256,42 +256,6 @@ def private_feedback(request, year):
256256
return feedback(request, year, False)
257257

258258

259-
def process_nomination_status(request, year, nominee_position_id, state, date, hash):
260-
valid = get_hash_nominee_position(date, nominee_position_id) == hash
261-
if not valid:
262-
return HttpResponseForbidden("Bad hash!")
263-
expiration_days = getattr(settings, 'DAYS_TO_EXPIRE_NOMINATION_LINK', None)
264-
if expiration_days:
265-
request_date = datetime.date(int(date[:4]), int(date[4:6]), int(date[6:]))
266-
if datetime.date.today() > (request_date + datetime.timedelta(days=settings.DAYS_TO_EXPIRE_REGISTRATION_LINK)):
267-
return HttpResponseForbidden("Link expired")
268-
269-
need_confirmation = True
270-
nomcom = get_nomcom_by_year(year)
271-
nominee_position = get_object_or_404(NomineePosition, id=nominee_position_id)
272-
if nominee_position.state.slug != "pending":
273-
return HttpResponseForbidden("The nomination already was %s" % nominee_position.state)
274-
275-
state = get_object_or_404(NomineePositionState, slug=state)
276-
message = ('warning', "Are you sure to change the nomination on %s as %s?" % (nominee_position.position.name,
277-
state.name))
278-
if request.method == 'POST':
279-
nominee_position.state = state
280-
nominee_position.save()
281-
need_confirmation = False
282-
message = message = ('success', 'Your nomination on %s has been set as %s' % (nominee_position.position.name,
283-
state.name))
284-
285-
return render_to_response('nomcom/process_nomination_status.html',
286-
{'message': message,
287-
'nomcom': nomcom,
288-
'year': year,
289-
'nominee_position': nominee_position,
290-
'state': state,
291-
'need_confirmation': need_confirmation,
292-
'selected': 'feedback'}, RequestContext(request))
293-
294-
295259
def feedback(request, year, public):
296260
nomcom = get_nomcom_by_year(year)
297261
has_publickey = nomcom.public_key and True or False
@@ -344,6 +308,75 @@ def feedback(request, year, public):
344308
'selected': 'feedback'}, RequestContext(request))
345309

346310

311+
def private_questionnaire(request, year):
312+
nomcom = get_nomcom_by_year(year)
313+
has_publickey = nomcom.public_key and True or False
314+
message = None
315+
template = 'nomcom/private_questionnaire.html'
316+
317+
if not has_publickey:
318+
message = ('warning', "Nomcom don't have public key to ecrypt data, please contact with nomcom chair")
319+
return render_to_response(template,
320+
{'has_publickey': has_publickey,
321+
'message': message,
322+
'nomcom': nomcom,
323+
'year': year,
324+
'selected': 'questionnaire'}, RequestContext(request))
325+
326+
if request.method == 'POST':
327+
form = QuestionnaireForm(data=request.POST,
328+
nomcom=nomcom, user=request.user)
329+
if form.is_valid():
330+
form.save()
331+
message = ('success', 'The questionnaire has been registered.')
332+
else:
333+
form = QuestionnaireForm(nomcom=nomcom, user=request.user)
334+
335+
return render_to_response(template,
336+
{'has_publickey': has_publickey,
337+
'form': form,
338+
'message': message,
339+
'nomcom': nomcom,
340+
'year': year,
341+
'selected': 'questionnaire'}, RequestContext(request))
342+
343+
344+
def process_nomination_status(request, year, nominee_position_id, state, date, hash):
345+
valid = get_hash_nominee_position(date, nominee_position_id) == hash
346+
if not valid:
347+
return HttpResponseForbidden("Bad hash!")
348+
expiration_days = getattr(settings, 'DAYS_TO_EXPIRE_NOMINATION_LINK', None)
349+
if expiration_days:
350+
request_date = datetime.date(int(date[:4]), int(date[4:6]), int(date[6:]))
351+
if datetime.date.today() > (request_date + datetime.timedelta(days=settings.DAYS_TO_EXPIRE_REGISTRATION_LINK)):
352+
return HttpResponseForbidden("Link expired")
353+
354+
need_confirmation = True
355+
nomcom = get_nomcom_by_year(year)
356+
nominee_position = get_object_or_404(NomineePosition, id=nominee_position_id)
357+
if nominee_position.state.slug != "pending":
358+
return HttpResponseForbidden("The nomination already was %s" % nominee_position.state)
359+
360+
state = get_object_or_404(NomineePositionState, slug=state)
361+
message = ('warning', "Are you sure to change the nomination on %s as %s?" % (nominee_position.position.name,
362+
state.name))
363+
if request.method == 'POST':
364+
nominee_position.state = state
365+
nominee_position.save()
366+
need_confirmation = False
367+
message = message = ('success', 'Your nomination on %s has been set as %s' % (nominee_position.position.name,
368+
state.name))
369+
370+
return render_to_response('nomcom/process_nomination_status.html',
371+
{'message': message,
372+
'nomcom': nomcom,
373+
'year': year,
374+
'nominee_position': nominee_position,
375+
'state': state,
376+
'need_confirmation': need_confirmation,
377+
'selected': 'feedback'}, RequestContext(request))
378+
379+
347380
@member_required(role='member')
348381
@private_key_required
349382
def view_feedback(request, year):

ietf/templates/nomcom/nomcom_private_base.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ <h1>Nomcom {{ year }} Private Area</h1>
1010
{% if selected == "index" %}<span class="selected">List of nominees</span>{% else %}<a href="{% url nomcom_private_index year %}">List of nominees</a>{% endif %} |
1111
{% if selected == "nominate" %}<span class="selected">Nominate</span>{% else %}<a href="{% url nomcom_private_nominate year %}">Nominate</a>{% endif %} |
1212
{% if selected == "feedback" %}<span class="selected">Provide comments</span>{% else %}<a href="{% url nomcom_private_feedback year %}">Provide comments</a>{% endif %} |
13+
{% if selected == "questionnaire" %}<span class="selected">Provide questionnaires</span>{% else %}<a href="{% url nomcom_private_questionnaire year %}">Provide questionnaires</a>{% endif %} |
1314
{% if selected == "view_feedback" %}<span class="selected">View comments</span>{% else %}<a href="{% url nomcom_view_feedback year %}">View comments</a>{% endif %} |
1415
{% if selected == "private_key" %}<span class="selected">Private key</span>{% else %}<a href="{% url nomcom_private_key year %}">Private key</a>{% endif %}
1516
{% if user|is_chair:year %} |
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
{% extends "nomcom/nomcom_private_base.html" %}
2+
3+
4+
{% block subtitle %} - Provide Quesionnaire{% endblock %}
5+
6+
{% block pagehead %}
7+
{{ form.media }}
8+
{% endblock %}
9+
10+
{% block nomcom_content %}
11+
12+
13+
{% if message %}
14+
<div class="info-message-{{ message.0 }}">{{ message.1 }}</div>
15+
{% endif %}
16+
17+
{% if has_publickey %}
18+
19+
<div class="js-info">
20+
Your browser has Javascript disabled. Please enable javascript and reload the page.
21+
<script type="text/javascript">
22+
(function ($) {
23+
$(".js-info").hide();
24+
})(jQuery);
25+
</script>
26+
</div>
27+
28+
<div class="content">
29+
<div class="primary">
30+
{% if form.errors %}<div class="info-message-error">Please correct the following errors</div>{% endif %}
31+
32+
<form id="questionnnaireform" action="" method="post">{% csrf_token %}
33+
{{ form }}
34+
35+
<div class="submitrow">
36+
<input type="submit" value="Save" name="save" {% if submit_disabled %}disabled="disabled"{% endif %}/>
37+
</div>
38+
39+
</form>
40+
</div>
41+
{% endif %}
42+
43+
{% endblock %}

0 commit comments

Comments
 (0)