|
1 | 1 | # -*- coding: utf-8 -*- |
| 2 | +import datetime |
| 3 | + |
| 4 | +from django.views.generic.create_update import delete_object |
2 | 5 | from django.conf import settings |
3 | 6 | from django.contrib.auth.decorators import login_required |
4 | 7 | from django.core.urlresolvers import reverse |
5 | | -from django.http import HttpResponse, Http404, HttpResponseRedirect |
| 8 | +from django.http import HttpResponse, Http404, HttpResponseRedirect, HttpResponseForbidden |
6 | 9 | from django.shortcuts import render_to_response, get_object_or_404 |
7 | 10 | from django.template import RequestContext |
8 | 11 | from django.template.loader import render_to_string |
|
17 | 20 | from ietf.name.models import NomineePositionState, FeedbackType |
18 | 21 |
|
19 | 22 | from ietf.nomcom.decorators import member_required, private_key_required |
20 | | -from ietf.nomcom.forms import (EditPublicKeyForm, NominateForm, FeedbackForm, MergeForm, |
21 | | - NomComTemplateForm, PositionForm, PrivateKeyForm) |
22 | | -from ietf.nomcom.models import Position, NomineePosition, Nominee, Feedback |
| 23 | +from ietf.nomcom.forms import (NominateForm, FeedbackForm, MergeForm, |
| 24 | + NomComTemplateForm, PositionForm, PrivateKeyForm, |
| 25 | + EditNomcomForm) |
| 26 | +from ietf.nomcom.models import Position, NomineePosition, Nominee, Feedback, NomCom |
23 | 27 | from ietf.nomcom.utils import (get_nomcom_by_year, HOME_TEMPLATE, |
24 | 28 | retrieve_nomcom_private_key, |
25 | | - store_nomcom_private_key, NOMINEE_REMINDER_TEMPLATE) |
| 29 | + store_nomcom_private_key, get_hash_nominee_position, |
| 30 | + NOMINEE_REMINDER_TEMPLATE) |
26 | 31 |
|
27 | 32 |
|
28 | 33 | def index(request, year): |
@@ -71,13 +76,13 @@ def private_index(request, year): |
71 | 76 | nominations = all_nominee_positions.filter(id__in=nominations_to_modify) |
72 | 77 | if action == "set_as_accepted": |
73 | 78 | nominations.update(state='accepted') |
74 | | - message = ('success', 'The selected nominations has been set as accepted') |
| 79 | + message = ('success', 'The selected nominations have been set as accepted') |
75 | 80 | elif action == "set_as_declined": |
76 | 81 | nominations.update(state='declined') |
77 | | - message = ('success', 'The selected nominations has been set as declined') |
| 82 | + message = ('success', 'The selected nominations have been set as declined') |
78 | 83 | elif action == "set_as_pending": |
79 | 84 | nominations.update(state='pending') |
80 | | - message = ('success', 'The selected nominations has been set as pending') |
| 85 | + message = ('success', 'The selected nominations have been set as pending') |
81 | 86 | else: |
82 | 87 | message = ('warning', "Please, select some nominations to work with") |
83 | 88 |
|
@@ -164,7 +169,7 @@ def private_merge(request, year): |
164 | 169 | form = MergeForm(request.POST, nomcom=nomcom) |
165 | 170 | if form.is_valid(): |
166 | 171 | form.save() |
167 | | - message = ('success', 'The emails has been unified') |
| 172 | + message = ('success', 'The emails have been unified') |
168 | 173 | else: |
169 | 174 | form = MergeForm(nomcom=nomcom) |
170 | 175 |
|
@@ -251,6 +256,42 @@ def private_feedback(request, year): |
251 | 256 | return feedback(request, year, False) |
252 | 257 |
|
253 | 258 |
|
| 259 | +def process_nomination_status(request, year, nominee_position_id, state, date, hash): |
| 260 | + valid = get_hash_nominee_position(date, nominee_position_id) == hash |
| 261 | + if not valid: |
| 262 | + return HttpResponseForbidden("Bad hash!") |
| 263 | + expiration_days = getattr(settings, 'DAYS_TO_EXPIRE_NOMINATION_LINK', None) |
| 264 | + if expiration_days: |
| 265 | + request_date = datetime.date(int(date[:4]), int(date[4:6]), int(date[6:])) |
| 266 | + if datetime.date.today() > (request_date + datetime.timedelta(days=settings.DAYS_TO_EXPIRE_REGISTRATION_LINK)): |
| 267 | + return HttpResponseForbidden("Link expired") |
| 268 | + |
| 269 | + need_confirmation = True |
| 270 | + nomcom = get_nomcom_by_year(year) |
| 271 | + nominee_position = get_object_or_404(NomineePosition, id=nominee_position_id) |
| 272 | + if nominee_position.state.slug != "pending": |
| 273 | + return HttpResponseForbidden("The nomination already was %s" % nominee_position.state) |
| 274 | + |
| 275 | + state = get_object_or_404(NomineePositionState, slug=state) |
| 276 | + message = ('warning', "Are you sure to change the nomination on %s as %s?" % (nominee_position.position.name, |
| 277 | + state.name)) |
| 278 | + if request.method == 'POST': |
| 279 | + nominee_position.state = state |
| 280 | + nominee_position.save() |
| 281 | + need_confirmation = False |
| 282 | + message = message = ('success', 'Your nomination on %s has been set as %s' % (nominee_position.position.name, |
| 283 | + state.name)) |
| 284 | + |
| 285 | + return render_to_response('nomcom/process_nomination_status.html', |
| 286 | + {'message': message, |
| 287 | + 'nomcom': nomcom, |
| 288 | + 'year': year, |
| 289 | + 'nominee_position': nominee_position, |
| 290 | + 'state': state, |
| 291 | + 'need_confirmation': need_confirmation, |
| 292 | + 'selected': 'feedback'}, RequestContext(request)) |
| 293 | + |
| 294 | + |
254 | 295 | def feedback(request, year, public): |
255 | 296 | nomcom = get_nomcom_by_year(year) |
256 | 297 | has_publickey = nomcom.public_key and True or False |
@@ -358,27 +399,42 @@ def view_feedback_nominee(request, year, nominee_id): |
358 | 399 |
|
359 | 400 |
|
360 | 401 | @member_required(role='chair') |
361 | | -def edit_publickey(request, year): |
| 402 | +def edit_nomcom(request, year): |
362 | 403 | nomcom = get_nomcom_by_year(year) |
363 | 404 |
|
364 | 405 | message = ('warning', 'Previous data will remain encrypted with the old key') |
365 | 406 | if request.method == 'POST': |
366 | | - form = EditPublicKeyForm(request.POST, |
367 | | - request.FILES, |
368 | | - instance=nomcom, |
369 | | - initial={'public_key': None}) |
| 407 | + form = EditNomcomForm(request.POST, |
| 408 | + request.FILES, |
| 409 | + instance=nomcom) |
370 | 410 | if form.is_valid(): |
371 | 411 | form.save() |
372 | | - message = ('success', 'The public key has been changed') |
| 412 | + message = ('success', 'The nomcom has been changed') |
373 | 413 | else: |
374 | | - form = EditPublicKeyForm() |
| 414 | + form = EditNomcomForm(instance=nomcom) |
375 | 415 |
|
376 | | - return render_to_response('nomcom/edit_publickey.html', |
| 416 | + return render_to_response('nomcom/edit_nomcom.html', |
377 | 417 | {'form': form, |
378 | | - 'group': nomcom.group, |
| 418 | + 'nomcom': nomcom, |
379 | 419 | 'message': message, |
380 | 420 | 'year': year, |
381 | | - 'selected': 'edit_publickey'}, RequestContext(request)) |
| 421 | + 'selected': 'edit_nomcom'}, RequestContext(request)) |
| 422 | + |
| 423 | + |
| 424 | +@member_required(role='chair') |
| 425 | +def delete_nomcom(request, year): |
| 426 | + nomcom = get_nomcom_by_year(year) |
| 427 | + post_delete_redirect = reverse('nomcom_deleted') |
| 428 | + extra_context = {'year': year, |
| 429 | + 'selected': 'edit_nomcom', |
| 430 | + 'nomcom': nomcom} |
| 431 | + |
| 432 | + return delete_object(request, |
| 433 | + model=NomCom, |
| 434 | + object_id=nomcom.id, |
| 435 | + post_delete_redirect=post_delete_redirect, |
| 436 | + template_name='nomcom/delete_nomcom.html', |
| 437 | + extra_context=extra_context) |
382 | 438 |
|
383 | 439 |
|
384 | 440 | @member_required(role='chair') |
|
0 commit comments