OpenSlides/openslides/poll/views.py
2011-07-31 10:46:29 +02:00

192 lines
6.4 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
openslides.poll.views
~~~~~~~~~~~~~~~~~~~~~
Views for the poll app.
:copyright: 2011 by the OpenSlides team, see AUTHORS.
:license: GNU GPL, see LICENSE for more details.
"""
from django.shortcuts import render_to_response, redirect
from django.template import RequestContext
from django.core.urlresolvers import reverse
from django.contrib import messages
from django.utils.translation import ugettext as _
from poll.models import Poll, Option
from poll.forms import PollForm, OptionForm, OptionResultForm
from utils.utils import template, permission_required, gen_confirm_form
#from utils.pdf import print_poll
@permission_required('poll.can_view_poll')
@template('poll/overview.html')
def get_overview(request):
query = Poll.objects.filter(assignment=None).filter(application=None)
try:
sort = request.GET['sort']
if sort in ['title']:
query = query.order_by(sort)
except KeyError:
pass
if 'reverse' in request.GET:
query = query.reverse()
polls = query.all()
return {
'polls': polls,
}
@template('poll/view.html')
@permission_required('poll.can_view_poll')
def view(request, poll_id):
poll = Poll.objects.get(pk=poll_id)
if poll.application and not request.path.startswith('/application'):
return redirect(reverse('application_poll_view', args=[poll_id]))
if poll.assignment and not request.path.startswith('/assignment'):
return redirect(reverse('assignment_poll_view', args=[poll_id, 0]))
if not (poll.application or poll.assignment) and not request.path.startswith('/poll'):
return redirect(reverse('poll_view', args=[poll_id]))
options = poll.option_set.all()
if request.user.has_perm('poll.can_manage_poll'):
success = 0
for option in options:
if request.method == 'POST':
option.form = OptionResultForm(request.POST, prefix="o%d" % option.id)
if option.form.is_valid():
option.voteyes = option.form.cleaned_data['yes']
option.voteno = option.form.cleaned_data['no'] or 0
option.voteundesided = option.form.cleaned_data['undesided'] or 0
option.save()
success = success + 1
else:
messages.error(request, _('Please check the form for errors.'))
else:
option.form = OptionResultForm(initial={
'yes': option.voteyes,
'no': option.voteno,
'undesided': option.voteundesided,
}, prefix="o%d" % option.id)
if request.method == 'POST' and success == options.count():
messages.success(request, _("Votes are successfully saved.") )
if poll.application:
app = 'application/base_application.html'
elif poll.assignment:
app = 'assignment/base_assignment.html'
else:
app = 'poll/base_poll.html'
return {
'poll': poll,
'options': options,
'app': app,
}
@permission_required('poll.can_manage_poll')
@template('poll/edit.html')
def edit(request, poll_id=None):
"""
View zum editieren und neuanlegen von Wahlen
"""
if poll_id is not None:
poll = Poll.objects.get(id=poll_id)
else:
poll = None
if request.method == 'POST':
if poll_id is None:
form = PollForm(request.POST)
else:
form = PollForm(request.POST, instance=poll)
if form.is_valid():
poll = form.save()
if poll_id is None:
messages.success(request, _('New poll was successfully created.'))
else:
messages.success(request, _('Poll was successfully modified.'))
return redirect(reverse("poll_overview"))
messages.error(request, _('Please check the form for errors.'))
else:
if poll_id is None:
form = PollForm()
else:
form = PollForm(instance=poll)
try:
options = poll.option_set.all()
except AttributeError:
options = []
return {
'form': form,
'poll': poll,
'options': options,
}
@permission_required('poll.can_manage_poll')
def delete(request, poll_id):
poll = Poll.objects.get(id=poll_id)
if request.method == 'POST':
poll.delete()
messages.success(request, _('Poll <b>%s</b> was successfully deleted.') % poll)
else:
gen_confirm_form(request, _('Do you really want to delete <b>%s</b>?') % poll, reverse('poll_delete', args=[poll_id]))
return redirect(reverse('poll_overview'))
@permission_required('poll.can_manage_poll')
@template('poll/option_edit.html')
def option_edit(request, poll_id=None, option_id=None):
"""
View zum editieren und neuanlegen von Optionen für eine Wahl
"""
if option_id is not None:
option = Option.objects.get(id=option_id)
else:
option = None
if request.method == 'POST':
if option_id is None:
form = OptionForm(request.POST)
else:
form = OptionForm(request.POST, instance=option)
if form.is_valid():
option = form.save()
if option_id is None:
messages.success(request, _('New option was successfully created.'))
else:
messages.success(request, _('Option was successfully modified.'))
return redirect(reverse("poll_overview"))
messages.error(request, _('Please check the form for errors.'))
else:
if option_id is None:
if poll_id is None:
form = OptionForm()
else:
poll = poll = Poll.objects.get(id=poll_id)
form = OptionForm(initial={'poll': poll})
else:
form = OptionForm(instance=option)
return {
'form': form,
'option': option,
}
@permission_required('poll.can_manage_poll')
def option_delete(request, option_id):
option = Option.objects.get(id=option_id)
if request.method == 'POST':
option.delete()
messages.success(request, _('Option <b>%s</b> was successfully deleted.') % option)
else:
gen_confirm_form(request, _('Do you really want to delete the option <b>%s</b>?') % option_id, reverse('option_delete', args=[option_id]))
return redirect(reverse('poll_overview'))