parent
57ccf2d5fc
commit
de7bab7de4
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'),
|
||||
|
||||
)
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
{% extends "nomcom/nomcom_public_base.html" %}
|
||||
|
||||
{% block subtitle %} - Nominate{% endblock %}
|
||||
|
||||
{% block pagehead %}
|
||||
|
|
40
ietf/templates/nomcom/private_nominate.html
Normal file
40
ietf/templates/nomcom/private_nominate.html
Normal 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 %}
|
40
ietf/templates/nomcom/public_nominate.html
Normal file
40
ietf/templates/nomcom/public_nominate.html
Normal 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 %}
|
Loading…
Reference in a new issue