Add questionnaire skel view
Add feedback test Fixed labels in feedback form See #970 - Legacy-Id: 5582
This commit is contained in:
parent
55e843a4d8
commit
139ab194c9
|
@ -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', )),
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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 %} |
|
||||
|
|
43
ietf/templates/nomcom/private_questionnaire.html
Normal file
43
ietf/templates/nomcom/private_questionnaire.html
Normal 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 %}
|
Loading…
Reference in a new issue