Add questionnaire skel view

Add feedback test
Fixed labels in feedback form
See #970
 - Legacy-Id: 5582
This commit is contained in:
Emilio Jiménez 2013-03-21 18:33:02 +00:00
parent 55e843a4d8
commit 139ab194c9
6 changed files with 213 additions and 51 deletions

View file

@ -471,12 +471,12 @@ class NominateForm(BaseNomcomForm, forms.ModelForm):
class FeedbackForm(BaseNomcomForm, forms.ModelForm):
position_name = forms.CharField(label='position',
widget=forms.TextInput(attrs={'size': '40'}))
nominee_name = forms.CharField(label='your name',
nominee_name = forms.CharField(label='nominee name',
widget=forms.TextInput(attrs={'size': '40'}))
nominee_email = forms.CharField(label='your email',
nominee_email = forms.CharField(label='nominee email',
widget=forms.TextInput(attrs={'size': '40'}))
nominator_name = forms.CharField(label='nominator name')
nominator_email = forms.CharField(label='nominator email')
nominator_name = forms.CharField(label='your name')
nominator_email = forms.CharField(label='your email')
comments = forms.CharField(label='Comments on this candidate',
widget=forms.Textarea())
@ -513,6 +513,8 @@ class FeedbackForm(BaseNomcomForm, forms.ModelForm):
comments wishes to be anonymous. The confirmation email will be sent to the address given here,
and the address will also be captured as part of the registered nomination.)"""
self.fields['nominator_email'].help_text = help_text
self.fields['nominator_name'].required = False
self.fields['nominator_email'].required = False
author = get_user_email(self.user)
if author:
@ -589,6 +591,49 @@ class FeedbackForm(BaseNomcomForm, forms.ModelForm):
"/js/nomcom.js", )
class QuestionnaireForm(BaseNomcomForm, forms.ModelForm):
comments = forms.CharField(label='Comments on this candidate',
widget=forms.Textarea())
fieldsets = [('Provide questionnaires', ('nominee',
'positions',
'comments'))]
def __init__(self, *args, **kwargs):
self.nomcom = kwargs.pop('nomcom', None)
self.user = kwargs.pop('user', None)
super(QuestionnaireForm, self).__init__(*args, **kwargs)
def save(self, commit=True):
feedback = super(QuestionnaireForm, self).save(commit=False)
nominee = self.cleaned_data.get("nominee")
positions = self.cleaned_data.get("positions")
author = get_user_email(self.user)
if author:
feedback.author = author
feedback.nomcom = self.nomcom
feedback.nominee = nominee
feedback.user = self.user
feedback.type = FeedbackType.objects.get(slug='questio')
feedback.save()
feedback.positions = positions
class Meta:
model = Feedback
fields = ('nominee',
'positions',
'comments')
class Media:
js = ("/js/jquery-1.5.1.min.js",
"/js/nomcom.js", )
class NomComTemplateForm(BaseNomcomForm, DBTemplateForm):
fieldsets = [('Template content', ('content', )),

View file

@ -260,14 +260,19 @@ class NomcomViewsTest(TestCase):
def feedback_view(self, *args, **kwargs):
public = kwargs.pop('public', True)
nominee_email = kwargs.pop('nominee_email', u'nominee@example.com')
nominator_email = kwargs.pop('nominator_email', "%s%s" % (COMMUNITY_USER, EMAIL_DOMAIN))
position_name = kwargs.pop('position', 'IAOC')
if public:
nominate_url = self.public_feedback_url
else:
nominate_url = self.private_feedback_url
self.nominate_view(public=public,
nominee_email=nominee_email,
position=position_name,
nominator_email=nominator_email)
response = self.client.get(nominate_url)
feedback_url = self.public_feedback_url
if not public:
feedback_url = self.private_feedback_url
response = self.client.get(feedback_url)
self.assertEqual(response.status_code, 200)
nomcom = get_nomcom_by_year(self.year)
@ -278,10 +283,43 @@ class NomcomViewsTest(TestCase):
nomcom.public_key.storage.location = tempfile.gettempdir()
nomcom.public_key.save('cert', File(open(self.cert_file.name, 'r')))
response = self.client.get(nominate_url)
response = self.client.get(feedback_url)
self.assertEqual(response.status_code, 200)
self.assertContains(response, "feedbackform")
position = Position.objects.get(name=position_name)
nominee = Nominee.objects.get(email__address=nominee_email)
comments = 'test feedback view'
test_data = {'comments': comments,
'position_name': position.name,
'nominee_name': nominee.email.person.name,
'nominee_email': nominee.email.address}
if public:
test_data['nominator_email'] = nominator_email
test_data['nominator_name'] = nominator_email
feedback_url += "?nominee=%d&position=%d" % (nominee.id, position.id)
response = self.client.post(feedback_url, test_data)
self.assertEqual(response.status_code, 200)
self.assertContains(response, "info-message-success")
## check objects
feedback = Feedback.objects.get(positions__in=[position],
nominee=nominee,
type=FeedbackType.objects.get(slug='comment'))
if public:
self.assertEqual(feedback.author, nominator_email)
## to check feedback comments are saved like enrypted data
self.assertNotEqual(feedback.comments, comments)
self.assertEqual(check_comments(feedback.comments, comments, self.privatekey_file), True)
def test_public_nominate(self):
login_testing_unauthorized(self, COMMUNITY_USER, self.public_nominate_url)
return self.nominate_view(public=True)
@ -295,6 +333,7 @@ class NomcomViewsTest(TestCase):
def nominate_view(self, *args, **kwargs):
public = kwargs.pop('public', True)
nominee_email = kwargs.pop('nominee_email', u'nominee@example.com')
nominator_email = kwargs.pop('nominator_email', "%s%s" % (COMMUNITY_USER, EMAIL_DOMAIN))
position_name = kwargs.pop('position', 'IAOC')
if public:
@ -328,7 +367,7 @@ class NomcomViewsTest(TestCase):
'position': position.id,
'comments': comments}
if not public:
test_data['nominator_email'] = "%s%s" % (COMMUNITY_USER, EMAIL_DOMAIN)
test_data['nominator_email'] = nominator_email
response = self.client.post(nominate_url, test_data)
self.assertEqual(response.status_code, 200)
@ -342,7 +381,7 @@ class NomcomViewsTest(TestCase):
feedback = Feedback.objects.get(positions__in=[position],
nominee=nominee,
type=FeedbackType.objects.get(slug='nomina'),
author="%s%s" % (COMMUNITY_USER, EMAIL_DOMAIN))
author=nominator_email)
# to check feedback comments are saved like enrypted data
self.assertNotEqual(feedback.comments, comments)

View file

@ -8,6 +8,7 @@ urlpatterns = patterns('ietf.nomcom.views',
url(r'^(?P<year>\d{4})/private/key/$', 'private_key', name='nomcom_private_key'),
url(r'^(?P<year>\d{4})/private/nominate/$', 'private_nominate', name='nomcom_private_nominate'),
url(r'^(?P<year>\d{4})/private/feedback/$', 'private_feedback', name='nomcom_private_feedback'),
url(r'^(?P<year>\d{4})/private/questionnaire/$', 'private_questionnaire', name='nomcom_private_questionnaire'),
url(r'^(?P<year>\d{4})/private/view-feedback/$', 'view_feedback', name='nomcom_view_feedback'),
url(r'^(?P<year>\d{4})/private/view-feedback/pending/$', 'view_feedback_pending', name='nomcom_view_feedback_pending'),
url(r'^(?P<year>\d{4})/private/view-feedback/nominee/(?P<nominee_id>\d+)$', 'view_feedback_nominee', name='nomcom_view_feedback_nominee'),

View file

@ -20,9 +20,9 @@ from ietf.dbtemplate.views import template_edit
from ietf.name.models import NomineePositionState, FeedbackType
from ietf.nomcom.decorators import member_required, private_key_required
from ietf.nomcom.forms import (NominateForm, FeedbackForm, MergeForm,
NomComTemplateForm, PositionForm, PrivateKeyForm,
EditNomcomForm)
from ietf.nomcom.forms import (NominateForm, FeedbackForm, QuestionnaireForm,
MergeForm, NomComTemplateForm, PositionForm,
PrivateKeyForm, EditNomcomForm)
from ietf.nomcom.models import Position, NomineePosition, Nominee, Feedback, NomCom
from ietf.nomcom.utils import (get_nomcom_by_year, HOME_TEMPLATE,
retrieve_nomcom_private_key,
@ -256,42 +256,6 @@ def private_feedback(request, year):
return feedback(request, year, False)
def process_nomination_status(request, year, nominee_position_id, state, date, hash):
valid = get_hash_nominee_position(date, nominee_position_id) == hash
if not valid:
return HttpResponseForbidden("Bad hash!")
expiration_days = getattr(settings, 'DAYS_TO_EXPIRE_NOMINATION_LINK', None)
if expiration_days:
request_date = datetime.date(int(date[:4]), int(date[4:6]), int(date[6:]))
if datetime.date.today() > (request_date + datetime.timedelta(days=settings.DAYS_TO_EXPIRE_REGISTRATION_LINK)):
return HttpResponseForbidden("Link expired")
need_confirmation = True
nomcom = get_nomcom_by_year(year)
nominee_position = get_object_or_404(NomineePosition, id=nominee_position_id)
if nominee_position.state.slug != "pending":
return HttpResponseForbidden("The nomination already was %s" % nominee_position.state)
state = get_object_or_404(NomineePositionState, slug=state)
message = ('warning', "Are you sure to change the nomination on %s as %s?" % (nominee_position.position.name,
state.name))
if request.method == 'POST':
nominee_position.state = state
nominee_position.save()
need_confirmation = False
message = message = ('success', 'Your nomination on %s has been set as %s' % (nominee_position.position.name,
state.name))
return render_to_response('nomcom/process_nomination_status.html',
{'message': message,
'nomcom': nomcom,
'year': year,
'nominee_position': nominee_position,
'state': state,
'need_confirmation': need_confirmation,
'selected': 'feedback'}, RequestContext(request))
def feedback(request, year, public):
nomcom = get_nomcom_by_year(year)
has_publickey = nomcom.public_key and True or False
@ -344,6 +308,75 @@ def feedback(request, year, public):
'selected': 'feedback'}, RequestContext(request))
def private_questionnaire(request, year):
nomcom = get_nomcom_by_year(year)
has_publickey = nomcom.public_key and True or False
message = None
template = 'nomcom/private_questionnaire.html'
if not has_publickey:
message = ('warning', "Nomcom don't have public key to ecrypt data, please contact with nomcom chair")
return render_to_response(template,
{'has_publickey': has_publickey,
'message': message,
'nomcom': nomcom,
'year': year,
'selected': 'questionnaire'}, RequestContext(request))
if request.method == 'POST':
form = QuestionnaireForm(data=request.POST,
nomcom=nomcom, user=request.user)
if form.is_valid():
form.save()
message = ('success', 'The questionnaire has been registered.')
else:
form = QuestionnaireForm(nomcom=nomcom, user=request.user)
return render_to_response(template,
{'has_publickey': has_publickey,
'form': form,
'message': message,
'nomcom': nomcom,
'year': year,
'selected': 'questionnaire'}, RequestContext(request))
def process_nomination_status(request, year, nominee_position_id, state, date, hash):
valid = get_hash_nominee_position(date, nominee_position_id) == hash
if not valid:
return HttpResponseForbidden("Bad hash!")
expiration_days = getattr(settings, 'DAYS_TO_EXPIRE_NOMINATION_LINK', None)
if expiration_days:
request_date = datetime.date(int(date[:4]), int(date[4:6]), int(date[6:]))
if datetime.date.today() > (request_date + datetime.timedelta(days=settings.DAYS_TO_EXPIRE_REGISTRATION_LINK)):
return HttpResponseForbidden("Link expired")
need_confirmation = True
nomcom = get_nomcom_by_year(year)
nominee_position = get_object_or_404(NomineePosition, id=nominee_position_id)
if nominee_position.state.slug != "pending":
return HttpResponseForbidden("The nomination already was %s" % nominee_position.state)
state = get_object_or_404(NomineePositionState, slug=state)
message = ('warning', "Are you sure to change the nomination on %s as %s?" % (nominee_position.position.name,
state.name))
if request.method == 'POST':
nominee_position.state = state
nominee_position.save()
need_confirmation = False
message = message = ('success', 'Your nomination on %s has been set as %s' % (nominee_position.position.name,
state.name))
return render_to_response('nomcom/process_nomination_status.html',
{'message': message,
'nomcom': nomcom,
'year': year,
'nominee_position': nominee_position,
'state': state,
'need_confirmation': need_confirmation,
'selected': 'feedback'}, RequestContext(request))
@member_required(role='member')
@private_key_required
def view_feedback(request, year):

View file

@ -10,6 +10,7 @@
{% if selected == "index" %}<span class="selected">List of nominees</span>{% else %}<a href="{% url nomcom_private_index year %}">List of nominees</a>{% endif %} |
{% if selected == "nominate" %}<span class="selected">Nominate</span>{% else %}<a href="{% url nomcom_private_nominate year %}">Nominate</a>{% endif %} |
{% if selected == "feedback" %}<span class="selected">Provide comments</span>{% else %}<a href="{% url nomcom_private_feedback year %}">Provide comments</a>{% endif %} |
{% if selected == "questionnaire" %}<span class="selected">Provide questionnaires</span>{% else %}<a href="{% url nomcom_private_questionnaire year %}">Provide questionnaires</a>{% endif %} |
{% if selected == "view_feedback" %}<span class="selected">View comments</span>{% else %}<a href="{% url nomcom_view_feedback year %}">View comments</a>{% endif %} |
{% if selected == "private_key" %}<span class="selected">Private key</span>{% else %}<a href="{% url nomcom_private_key year %}">Private key</a>{% endif %}
{% if user|is_chair:year %} |

View file

@ -0,0 +1,43 @@
{% extends "nomcom/nomcom_private_base.html" %}
{% block subtitle %} - Provide Quesionnaire{% endblock %}
{% block pagehead %}
{{ form.media }}
{% endblock %}
{% block nomcom_content %}
{% if message %}
<div class="info-message-{{ message.0 }}">{{ message.1 }}</div>
{% endif %}
{% if has_publickey %}
<div class="js-info">
Your browser has Javascript disabled. Please enable javascript and reload the page.
<script type="text/javascript">
(function ($) {
$(".js-info").hide();
})(jQuery);
</script>
</div>
<div class="content">
<div class="primary">
{% if form.errors %}<div class="info-message-error">Please correct the following errors</div>{% endif %}
<form id="questionnnaireform" action="" method="post">{% csrf_token %}
{{ form }}
<div class="submitrow">
<input type="submit" value="Save" name="save" {% if submit_disabled %}disabled="disabled"{% endif %}/>
</div>
</form>
</div>
{% endif %}
{% endblock %}