datatracker/ietf/nomcom/views.py
Emilio A. Sánchez López 9b00517449 View to enter a private key that will be encrypted and saved into the user session.
Util functions to encrypt/decrypt the private key.
Decorator to redirect to the private key input view if there is no key defined in the user session.
Templatetag 'decrypt' that decrypts text using the private key provided to the templatetag.
Fixes #947
 - Legacy-Id: 5335
2013-01-30 16:48:19 +00:00

274 lines
10 KiB
Python

# -*- coding: utf-8 -*-
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from django.http import HttpResponse, Http404, HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.template.loader import render_to_string
from django.utils import simplejson
from ietf.dbtemplate.models import DBTemplate
from ietf.dbtemplate.views import template_edit
from ietf.nomcom.decorators import member_required, private_key_required
from ietf.nomcom.forms import (EditPublicKeyForm, NominateForm, MergeForm,
NomComTemplateForm, PositionForm, PrivateKeyForm)
from ietf.nomcom.models import Position
from ietf.nomcom.utils import (get_nomcom_by_year, HOME_TEMPLATE,
retrieve_nomcom_private_key,
store_nomcom_private_key)
def index(request, year):
nomcom = get_nomcom_by_year(year)
home_template = '/nomcom/%s/%s' % (nomcom.group.acronym, HOME_TEMPLATE)
template = render_to_string(home_template, {})
return render_to_response('nomcom/index.html',
{'nomcom': nomcom,
'year': year,
'selected': 'index',
'template': template}, RequestContext(request))
@member_required(role='member')
def private_key(request, year):
nomcom = get_nomcom_by_year(year)
private_key = retrieve_nomcom_private_key(request, year)
back_url = request.GET.get('back_to', reverse('nomcom_private_index', None, args=(year, )))
if request.method == 'POST':
form = PrivateKeyForm(data=request.POST)
if form.is_valid():
store_nomcom_private_key(request, year, form.cleaned_data.get('key', ''))
return HttpResponseRedirect(back_url)
else:
form = PrivateKeyForm(initial={'key': private_key})
return render_to_response('nomcom/private_key.html',
{'nomcom': nomcom,
'year': year,
'back_url': back_url,
'form': form,
'private_key': private_key,
'selected': 'private_key'}, RequestContext(request))
@member_required(role='member')
def private_index(request, year):
nomcom = get_nomcom_by_year(year)
return render_to_response('nomcom/private_index.html',
{'nomcom': nomcom,
'year': year,
'selected': 'index'}, RequestContext(request))
@member_required(role='chair')
def private_merge(request, year):
nomcom = get_nomcom_by_year(year)
message = None
if request.method == 'POST':
form = MergeForm(request.POST, nomcom=nomcom)
if form.is_valid():
form.save()
message = ('success', 'The emails has been unified')
else:
form = MergeForm(nomcom=nomcom)
return render_to_response('nomcom/private_merge.html',
{'nomcom': nomcom,
'year': year,
'form': form,
'message': message,
'selected': 'merge'}, RequestContext(request))
def requirements(request, year):
nomcom = get_nomcom_by_year(year)
positions = nomcom.position_set.all()
return render_to_response('nomcom/requirements.html',
{'nomcom': nomcom,
'positions': positions,
'year': year,
'selected': 'requirements'}, RequestContext(request))
def questionnaires(request, year):
nomcom = get_nomcom_by_year(year)
positions = nomcom.position_set.all()
return render_to_response('nomcom/questionnaires.html',
{'nomcom': nomcom,
'positions': positions,
'year': year,
'selected': 'questionnaires'}, RequestContext(request))
@login_required
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(template,
{'has_publickey': has_publickey,
'message': message,
'nomcom': nomcom,
'year': year,
'selected': 'nominate'}, RequestContext(request))
message = None
if request.method == 'POST':
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, public=public)
return render_to_response(template,
{'has_publickey': has_publickey,
'form': form,
'message': message,
'nomcom': nomcom,
'year': year,
'selected': 'nominate'}, RequestContext(request))
@login_required
def comments(request, year):
# TODO: complete to do comments
nomcom = get_nomcom_by_year(year)
return render_to_response('nomcom/comments.html',
{'nomcom': nomcom,
'year': year,
'selected': 'comments'}, RequestContext(request))
@member_required(role='chair')
def edit_publickey(request, year):
nomcom = get_nomcom_by_year(year)
message = ('warning', 'Previous data will remain encrypted with the old key')
if request.method == 'POST':
form = EditPublicKeyForm(request.POST,
request.FILES,
instance=nomcom,
initial={'public_key': None})
if form.is_valid():
form.save()
message = ('success', 'The public key has been changed')
else:
form = EditPublicKeyForm()
return render_to_response('nomcom/edit_publickey.html',
{'form': form,
'group': nomcom.group,
'message': message,
'year': year,
'selected': 'edit_publickey'}, RequestContext(request))
@member_required(role='chair')
def list_templates(request, year):
nomcom = get_nomcom_by_year(year)
positions = nomcom.position_set.all()
template_list = DBTemplate.objects.filter(group=nomcom.group).exclude(path__contains='/position/')
return render_to_response('nomcom/list_templates.html',
{'template_list': template_list,
'positions': positions,
'year': year,
'selected': 'edit_templates',
'nomcom': nomcom}, RequestContext(request))
@member_required(role='chair')
def edit_template(request, year, template_id):
nomcom = get_nomcom_by_year(year)
return_url = request.META.get('HTTP_REFERER', None)
return template_edit(request, nomcom.group.acronym, template_id,
base_template='nomcom/edit_template.html',
formclass=NomComTemplateForm,
extra_context={'year': year,
'return_url': return_url,
'nomcom': nomcom})
@member_required(role='chair')
def list_positions(request, year):
nomcom = get_nomcom_by_year(year)
positions = nomcom.position_set.all()
return render_to_response('nomcom/list_positions.html',
{'positions': positions,
'year': year,
'selected': 'edit_positions',
'nomcom': nomcom}, RequestContext(request))
@member_required(role='chair')
def remove_position(request, year, position_id):
nomcom = get_nomcom_by_year(year)
try:
position = nomcom.position_set.get(id=position_id)
except Position.DoesNotExist:
raise Http404
if request.POST.get('remove', None):
position.delete()
return HttpResponseRedirect(reverse('nomcom_list_positions', None, args=(year, )))
return render_to_response('nomcom/remove_position.html',
{'year': year,
'position': position,
'nomcom': nomcom}, RequestContext(request))
@member_required(role='chair')
def edit_position(request, year, position_id=None):
nomcom = get_nomcom_by_year(year)
if position_id:
try:
position = nomcom.position_set.get(id=position_id)
except Position.DoesNotExist:
raise Http404
else:
position = None
if request.method == 'POST':
form = PositionForm(request.POST, instance=position, nomcom=nomcom)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('nomcom_list_positions', None, args=(year, )))
else:
form = PositionForm(instance=position, nomcom=nomcom)
return render_to_response('nomcom/edit_position.html',
{'form': form,
'position': position,
'year': year,
'nomcom': nomcom}, RequestContext(request))
def ajax_position_text(request, position_id):
try:
position_text = Position.objects.get(id=position_id).initial_text
except Position.DoesNotExist:
position_text = ""
result = {'text': position_text}
json_result = simplejson.dumps(result)
return HttpResponse(json_result, mimetype='application/json')