diff --git a/ietf/nomcom/forms.py b/ietf/nomcom/forms.py index a6ea1f882..286a03d15 100644 --- a/ietf/nomcom/forms.py +++ b/ietf/nomcom/forms.py @@ -17,7 +17,8 @@ from ietf.person.models import Email, Person from ietf.nomcom.models import NomCom, Nomination, Nominee, NomineePosition, \ Position, Feedback from ietf.nomcom.utils import QUESTIONNAIRE_TEMPLATE, NOMINATION_EMAIL_TEMPLATE, \ - INEXISTENT_PERSON_TEMPLATE, NOMINEE_EMAIL_TEMPLATE + INEXISTENT_PERSON_TEMPLATE, NOMINEE_EMAIL_TEMPLATE, \ + get_user_email from ietf.nomcom.decorators import member_required ROLODEX_URL = getattr(settings, 'ROLODEX_URL', None) @@ -186,18 +187,30 @@ class EditPublicKeyForm(BaseNomcomForm, forms.ModelForm): class NominateForm(BaseNomcomForm, forms.ModelForm): comments = forms.CharField(label='Comments', widget=forms.Textarea()) - fieldsets = [('Candidate Nomination', ('position', 'candidate_name', 'candidate_email', 'candidate_phone', 'comments'))] + fieldsets = [('Candidate Nomination', ('position', 'candidate_name', + 'candidate_email', 'candidate_phone', 'comments'))] def __init__(self, *args, **kwargs): self.nomcom = kwargs.pop('nomcom', None) self.user = kwargs.pop('user', None) + self.public = kwargs.pop('public', None) + super(NominateForm, self).__init__(*args, **kwargs) if self.nomcom: self.fields['position'].queryset = Position.objects.filter(nomcom=self.nomcom) + if not self.public: + author = get_user_email(self.user) + if author: + self.fields['nominator_email'].initial = author.address + self.fieldsets = [('Candidate Nomination', ('position', + 'nominator_email', 'candidate_name', + 'candidate_email', 'candidate_phone', + 'comments'))] def save(self, commit=True): # Create nomination nomination = super(NominateForm, self).save(commit=False) + nominator_email = self.cleaned_data.get('nominator_email', None) candidate_email = self.cleaned_data['candidate_email'] candidate_name = self.cleaned_data['candidate_name'] position = self.cleaned_data['position'] @@ -219,12 +232,18 @@ class NominateForm(BaseNomcomForm, forms.ModelForm): nominee_position, nominee_position_created = NomineePosition.objects.get_or_create(position=position, nominee=nominee) # Complete nomination data - author_emails = Email.objects.filter(person__user=self.user) - author = author_emails and author_emails[0] or None feedback = Feedback.objects.create(position=position, nominee=nominee, comments=comments, type=FeedbackType.objects.get(slug='nomina')) + author = None + if self.public: + author = get_user_email(self.user) + else: + if nominator_email: + emails = Email.objects.filter(address=nominator_email) + author = emails and emails[0] or None + if author: nomination.nominator_email = author.address feedback.author = author @@ -287,7 +306,7 @@ class NominateForm(BaseNomcomForm, forms.ModelForm): class Meta: model = Nomination - fields = ('position', 'candidate_name', 'candidate_email', 'candidate_phone') + fields = ('position', 'nominator_email', 'candidate_name', 'candidate_email', 'candidate_phone') class Media: js = ("/js/jquery-1.5.1.min.js", diff --git a/ietf/nomcom/tests.py b/ietf/nomcom/tests.py index 493571e7a..ab4fc994e 100644 --- a/ietf/nomcom/tests.py +++ b/ietf/nomcom/tests.py @@ -41,13 +41,14 @@ class NomcomViewsTest(TestCase): self.edit_members_url = reverse('nomcom_edit_members', kwargs={'year': self.year}) self.edit_chair_url = reverse('nomcom_edit_chair', kwargs={'year': self.year}) self.public_key_url = reverse('nomcom_edit_publickey', kwargs={'year': self.year}) + self.private_nominate_url = reverse('nomcom_private_nominate', kwargs={'year': self.year}) # public urls self.index_url = reverse('nomcom_index', kwargs={'year': self.year}) self.requirements_url = reverse('nomcom_requirements', kwargs={'year': self.year}) self.questionnaires_url = reverse('nomcom_questionnaires', kwargs={'year': self.year}) self.comments_url = reverse('nomcom_comments', kwargs={'year': self.year}) - self.nominate_url = reverse('nomcom_nominate', kwargs={'year': self.year}) + self.public_nominate_url = reverse('nomcom_public_nominate', kwargs={'year': self.year}) def access_member_url(self, url): login_testing_unauthorized(self, COMMUNITY_USER, url) @@ -184,11 +185,23 @@ class NomcomViewsTest(TestCase): self.check_url_status(self.comments_url, 200) self.client.logout() - def test_nominate_view(self): + def test_public_nominate(self): + login_testing_unauthorized(self, COMMUNITY_USER, self.public_nominate_url) + return self.nominate_view(public=True) + + def test_private_nominate(self): + self.access_member_url(self.private_nominate_url) + return self.nominate_view(public=False) + + def nominate_view(self, public=True): """Verify nominate view""" - login_testing_unauthorized(self, COMMUNITY_USER, self.nominate_url) - response = self.client.get(self.nominate_url) + if public: + nominate_url = self.public_nominate_url + else: + nominate_url = self.private_nominate_url + response = self.client.get(nominate_url) self.assertEqual(response.status_code, 200) + nomcom = get_nomcom_by_year(self.year) if not nomcom.public_key: self.assertNotContains(response, "nominateform") @@ -197,7 +210,7 @@ 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(self.nominate_url) + response = self.client.get(nominate_url) self.assertEqual(response.status_code, 200) self.assertContains(response, "nominateform") @@ -212,8 +225,10 @@ class NomcomViewsTest(TestCase): 'candidate_phone': candidate_phone, 'position': position.id, 'comments': comments} + if not public: + test_data['nominator_email'] = "%s%s" % (COMMUNITY_USER, EMAIL_DOMAIN) - response = self.client.post(self.nominate_url, test_data) + response = self.client.post(nominate_url, test_data) self.assertEqual(response.status_code, 200) # check objects diff --git a/ietf/nomcom/urls.py b/ietf/nomcom/urls.py index 137a3b0fd..3f12ad32f 100644 --- a/ietf/nomcom/urls.py +++ b/ietf/nomcom/urls.py @@ -4,6 +4,7 @@ from ietf.nomcom.forms import EditChairForm, EditChairFormPreview, \ urlpatterns = patterns('ietf.nomcom.views', url(r'^(?P\d{4})/private/$', 'private_index', name='nomcom_private_index'), + url(r'^(?P\d{4})/private/nominate/$', 'private_nominate', name='nomcom_private_nominate'), url(r'^(?P\d{4})/private/merge/$', 'private_merge', name='nomcom_private_merge'), url(r'^(?P\d{4})/private/edit-members/$', EditMembersFormPreview(EditMembersForm), name='nomcom_edit_members'), url(r'^(?P\d{4})/private/edit-chair/$', EditChairFormPreview(EditChairForm), name='nomcom_edit_chair'), @@ -13,7 +14,7 @@ urlpatterns = patterns('ietf.nomcom.views', url(r'^(?P\d{4})/requirements/$', 'requirements', name='nomcom_requirements'), url(r'^(?P\d{4})/questionnaires/$', 'questionnaires', name='nomcom_questionnaires'), url(r'^(?P\d{4})/comments/$', 'comments', name='nomcom_comments'), - url(r'^(?P\d{4})/nominate/$', 'nominate', name='nomcom_nominate'), + url(r'^(?P\d{4})/nominate/$', 'public_nominate', name='nomcom_public_nominate'), url(r'^ajax/position-text/(?P\d+)/$', 'ajax_position_text', name='nomcom_ajax_position_text'), ) diff --git a/ietf/nomcom/utils.py b/ietf/nomcom/utils.py index 2f44ed6d8..38a7f78b7 100644 --- a/ietf/nomcom/utils.py +++ b/ietf/nomcom/utils.py @@ -1,6 +1,7 @@ from django.shortcuts import get_object_or_404 from django.core.exceptions import PermissionDenied +from ietf.person.models import Email from ietf.dbtemplate.models import DBTemplate MAIN_NOMCOM_TEMPLATE_PATH = '/nomcom/defaults/' @@ -20,6 +21,10 @@ def get_nomcom_by_year(year): group__state__slug='active') +def get_user_email(user): + emails = Email.objects.filter(person__user=user) + + def is_nomcom_member(user, nomcom): is_group_member = nomcom.group.is_member(user) if not is_group_member: diff --git a/ietf/nomcom/views.py b/ietf/nomcom/views.py index 9c87e5cdb..a13e9b3ab 100644 --- a/ietf/nomcom/views.py +++ b/ietf/nomcom/views.py @@ -66,12 +66,26 @@ def questionnaires(request, year): @login_required -def nominate(request, year): +def public_nominate(request, year): + return nominate(request, year, True) + + +@member_required(role='member') +def private_nominate(request, year): + return nominate(request, year, False) + + +def nominate(request, year, public): nomcom = get_nomcom_by_year(year) has_publickey = nomcom.public_key and True or False + if public: + template = 'nomcom/public_nominate.html' + else: + template = 'nomcom/private_nominate.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('nomcom/nominate.html', + return render_to_response(template, {'has_publickey': has_publickey, 'message': message, 'nomcom': nomcom, @@ -80,14 +94,14 @@ def nominate(request, year): message = None if request.method == 'POST': - form = NominateForm(data=request.POST, nomcom=nomcom, user=request.user) + form = NominateForm(data=request.POST, nomcom=nomcom, user=request.user, public=public) if form.is_valid(): form.save() message = ('success', 'Your nomination has been registered. Thank you for the nomination.') else: - form = NominateForm(nomcom=nomcom, user=request.user) + form = NominateForm(nomcom=nomcom, user=request.user, public=public) - return render_to_response('nomcom/nominate.html', + return render_to_response(template, {'has_publickey': has_publickey, 'form': form, 'message': message, diff --git a/ietf/templates/nomcom/nomcom_private_base.html b/ietf/templates/nomcom/nomcom_private_base.html index ee69d3aa4..6a74706cd 100644 --- a/ietf/templates/nomcom/nomcom_private_base.html +++ b/ietf/templates/nomcom/nomcom_private_base.html @@ -7,6 +7,7 @@
{% if selected == "index" %}List of nominees{% else %}List of nominees{% endif %} | {% if selected == "merge" %}Merge nominee email addr{% else %}Merge nominee email addr{% endif %} | + {% if selected == "nominate" %}Nominate{% else %}Nominate{% endif %} |
diff --git a/ietf/templates/nomcom/nomcom_public_base.html b/ietf/templates/nomcom/nomcom_public_base.html index acbea0acb..2ba448ebc 100644 --- a/ietf/templates/nomcom/nomcom_public_base.html +++ b/ietf/templates/nomcom/nomcom_public_base.html @@ -6,7 +6,7 @@
{% if selected == "index" %}Home{% else %}Home{% endif %} | - {% if selected == "nominate" %}Nominate{% else %}Nominate{% endif %} | + {% if selected == "nominate" %}Nominate{% else %}Nominate{% endif %} | {% if selected == "requirements" %}Requirements{% else %}Requirements{% endif %} | {% if selected == "questionnaires" %}Questionnaires{% else %}Questionnaires{% endif %} | {% if selected == "comments" %}Provide Comments{% else %}Provide Comments{% endif %} diff --git a/ietf/templates/nomcom/nominate.html b/ietf/templates/nomcom/nominate.html index f8b45518b..65a830238 100644 --- a/ietf/templates/nomcom/nominate.html +++ b/ietf/templates/nomcom/nominate.html @@ -1,5 +1,3 @@ -{% extends "nomcom/nomcom_public_base.html" %} - {% block subtitle %} - Nominate{% endblock %} {% block pagehead %} diff --git a/ietf/templates/nomcom/private_nominate.html b/ietf/templates/nomcom/private_nominate.html new file mode 100644 index 000000000..9324e80bf --- /dev/null +++ b/ietf/templates/nomcom/private_nominate.html @@ -0,0 +1,40 @@ +{% extends "nomcom/nomcom_private_base.html" %} + +{% block subtitle %} - Nominate{% endblock %} + +{% block pagehead %} +{{ form.media }} +{% endblock %} + +{% block nomcom_content %} + + +{% if message %} +
{{ message.1 }}
+{% endif %} + +{% if has_publickey %} + +
+ Your browser has Javascript disabled. Please enable javascript and reload the page. + +
+ + + {% if form.errors %}
Please correct the following errors
{% endif %} + +
{% csrf_token %} + {{ form }} + +
+ +
+ +
+{% endif %} + +{% endblock %} \ No newline at end of file diff --git a/ietf/templates/nomcom/public_nominate.html b/ietf/templates/nomcom/public_nominate.html new file mode 100644 index 000000000..f8b45518b --- /dev/null +++ b/ietf/templates/nomcom/public_nominate.html @@ -0,0 +1,40 @@ +{% extends "nomcom/nomcom_public_base.html" %} + +{% block subtitle %} - Nominate{% endblock %} + +{% block pagehead %} +{{ form.media }} +{% endblock %} + +{% block nomcom_content %} + + +{% if message %} +
{{ message.1 }}
+{% endif %} + +{% if has_publickey %} + +
+ Your browser has Javascript disabled. Please enable javascript and reload the page. + +
+ + + {% if form.errors %}
Please correct the following errors
{% endif %} + +
{% csrf_token %} + {{ form }} + +
+ +
+ +
+{% endif %} + +{% endblock %} \ No newline at end of file