Add nomination private process

See #929
 - Legacy-Id: 5180
This commit is contained in:
Emilio Jiménez 2013-01-13 20:34:27 +00:00
parent 57ccf2d5fc
commit de7bab7de4
10 changed files with 153 additions and 20 deletions

View file

@ -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",

View file

@ -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

View file

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

View file

@ -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:

View file

@ -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,

View file

@ -7,6 +7,7 @@
<div class="ietf-navset">
{% 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 == "merge" %}<span class="selected">Merge nominee email addr{% else %}<a href="{% url nomcom_private_merge year %}">Merge nominee email addr</a>{% endif %} |
{% if selected == "nominate" %}<span class="selected">Nominate{% else %}<a href="{% url nomcom_private_nominate year %}">Nominate</a>{% endif %} |
</div>

View file

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

View file

@ -1,5 +1,3 @@
{% extends "nomcom/nomcom_public_base.html" %}
{% block subtitle %} - Nominate{% endblock %}
{% block pagehead %}

View file

@ -0,0 +1,40 @@
{% extends "nomcom/nomcom_private_base.html" %}
{% block subtitle %} - Nominate{% 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>
{% if form.errors %}<div class="info-message-error">Please correct the following errors</div>{% endif %}
<form id="nominateform" action="" method="post">{% csrf_token %}
{{ form }}
<div class="submitrow">
<input type="submit" value="Save" name="save" />
</div>
</form>
{% endif %}
{% endblock %}

View file

@ -0,0 +1,40 @@
{% extends "nomcom/nomcom_public_base.html" %}
{% block subtitle %} - Nominate{% 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>
{% if form.errors %}<div class="info-message-error">Please correct the following errors</div>{% endif %}
<form id="nominateform" action="" method="post">{% csrf_token %}
{{ form }}
<div class="submitrow">
<input type="submit" value="Save" name="save" />
</div>
</form>
{% endif %}
{% endblock %}