summaryrefslogtreecommitdiff
path: root/polls/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'polls/views.py')
-rw-r--r--polls/views.py287
1 files changed, 97 insertions, 190 deletions
diff --git a/polls/views.py b/polls/views.py
index 8f5b2c1..7abd3a3 100644
--- a/polls/views.py
+++ b/polls/views.py
@@ -33,7 +33,8 @@ from django.http import HttpResponseRedirect
from papillon.settings import LANGUAGES, BASE_SITE
from papillon.polls.models import Poll, PollUser, Choice, Voter, Vote, \
Category, Comment
-from papillon.polls.forms import CreatePollForm, AdminPollForm
+from papillon.polls.forms import CreatePollForm, AdminPollForm, ChoiceForm, \
+ DatedChoiceForm
def getBaseResponse(request):
"""Manage basic fields for the template
@@ -98,7 +99,7 @@ def create(request):
poll.admin_url = genRandomURL()
poll.base_url = genRandomURL()
poll.save()
- return HttpResponseRedirect('http://%sedit/%s/' % (
+ return HttpResponseRedirect('http://%seditChoicesAdmin/%s/' % (
response_dct['root_url'], poll.admin_url))
else:
form = CreatePollForm()
@@ -113,8 +114,9 @@ def edit(request, admin_url):
poll = Poll.objects.filter(admin_url=admin_url)[0]
except IndexError:
# if the poll don't exist redirect to the creation page
- url = response_dct['admin_url']
- return response_dct, HttpResponseRedirect(url)
+ url = response_dct['root_url']
+ return HttpResponseRedirect('http://%screate' % (
+ response_dct['root_url']))
Form = AdminPollForm
if request.method == 'POST':
@@ -129,210 +131,115 @@ def edit(request, admin_url):
response_dct['poll'] = poll
return render_to_response('edit.html', response_dct)
-def createOrEdit(request, admin_url):
- '''Creation or edition of a poll.
- admin_url is given to identify a particular poll
- admin_url is equal to 0 for a new poll
- response_dct is given to the template with some particular keys:
- - error is an error message
- - new is set to true if it is a new poll
- - admin_url is the url of the current page
- '''
- def genRandomURL():
- "Generation of a random url"
- chars = string.letters + string.digits
- url = ''
- for i in xrange(6):
- url += random_choice(chars)
- url += str(int(time.time()))
- return url
-
- def submitNewPoll(request, response_dct):
- "A new poll is submited"
- # verify if all the mandatory_fields are set
- mandatory_fields = (('author_name', _("Author name")),
- ('poll_name', _("Poll name")),
- ('poll_desc', _("Poll description")),
- ('poll_type', _("Poll type")),
- )
- error = ""
- for key, label in mandatory_fields:
- if key not in request.POST or not request.POST[key]:
- # only the first error is reported
- if not error:
- error = _("%s is a mandatory field") % label
- else:
- response_dct[key] = request.POST[key]
- if error:
- response_dct['new'] = True
- response_dct['error'] = error
- response_dct['admin_url'] += '/0/'
- return response_dct, None
- author = PollUser(name=request.POST['author_name'])
- author.save()
- base_url = 'b' + genRandomURL()
- admin_url = 'a' + genRandomURL()
- category = None
- if 'poll_category' in request.POST and request.POST['poll_category']:
- category = \
- Category.objects.get(id=int(request.POST['poll_category']))
- public = False
- if 'poll_public' in request.POST and request.POST['poll_public']:
- value = False
- if request.POST['poll_public'] == '1':
- value = True
- public = value
- poll = Poll(name=request.POST['poll_name'],
-description=request.POST['poll_desc'], author=author, base_url=base_url,
-admin_url=admin_url, type=request.POST['poll_type'], category=category,
-public=public)
- poll.save()
- url = response_dct['admin_url'] + '/%s/' % poll.admin_url
+def editChoicesAdmin(request, admin_url):
+ response_dct, redirect = getBaseResponse(request)
+ if redirect:
+ return redirect
+ try:
+ poll = Poll.objects.filter(admin_url=admin_url)[0]
+ except IndexError:
+ # if the poll don't exist redirect to the main page
+ url = "/".join(request.path.split('/')[:-2])
return response_dct, HttpResponseRedirect(url)
+ response_dct['poll'] = poll
+ return editChoices(request, response_dct, admin=True)
- def getAndUpdateExistingPoll(request, response_dct, admin_url):
- "Get an existing poll"
- try:
- poll = Poll.objects.filter(admin_url=admin_url)[0]
- except IndexError:
- # if the poll don't exist redirect to the creation page
- url = response_dct['admin_url'] + '/0/'
- return response_dct, HttpResponseRedirect(url)
- # update the poll
- updated = None
- if 'poll_name' in request.POST and request.POST['poll_name']:
- updated = True
- poll.name = request.POST['poll_name']
- if 'poll_desc' in request.POST and request.POST['poll_desc']:
- updated = True
- poll.description = request.POST['poll_desc']
- if 'poll_open' in request.POST and request.POST['poll_open']:
- updated = True
- value = False
- if request.POST['poll_open'] == '1':
- value = True
- poll.open = value
- if 'poll_public' in request.POST and request.POST['poll_public']:
- updated = True
- value = False
- if request.POST['poll_public'] == '1':
- value = True
- poll.public = value
- if updated:
- poll.save()
- # base feed of the template
- new_dct = {'poll':poll,
- 'choices':Choice.objects.filter(poll=poll).order_by('order'),
- 'type_name':poll.getTypeLabel()}
- response_dct.update(new_dct)
+def editChoicesUser(request, poll_url):
+ response_dct, redirect = getBaseResponse(request)
+ if redirect:
+ return redirect
+ try:
+ poll = Poll.objects.filter(poll_url=poll_url)[0]
+ except IndexError:
+ poll = None
+ if not poll or not poll.opened_admin:
+ # if the poll don't exist redirect to the main page
+ url = "/".join(request.path.split('/')[:-2])
+ return HttpResponseRedirect(url)
+ response_dct['poll'] = poll
+ return editChoices(request, response_dct)
- # urls
- base_path = request.META['HTTP_HOST'] + \
- "/".join(request.path.split('/')[:-3])
- response_dct['base_url'] = poll.base_url
- response_dct['full_base_url'] = base_path + "/poll/" \
- + poll.base_url + "/"
- response_dct['admin_url'] += '/%s/' % poll.admin_url
- response_dct['full_admin_url'] = base_path + "/edit/" \
- + admin_url + "/"
+def editChoices(request, response_dct, admin=False):
+ '''Edition of choices.
+ '''
+ poll = response_dct['poll']
+ tpl = 'editChoicesAdmin.html'
+ if not admin:
+ tpl = 'editChoicesUser.html'
+ Form = ChoiceForm
+ if poll.dated_choices:
+ Form = DatedChoiceForm
+ try:
+ order = Choice.objects.order_by('-order')[0].order
+ order += 1
+ except IndexError:
+ order = 0
+ form = Form(initial={'poll':poll.id, 'order':str(order)})
+ if request.method == 'POST':
# if a new choice is submitted
- if 'new_choice' in request.POST and request.POST['new_choice']:
+ if 'add' in request.POST and request.POST['poll'] == str(poll.id):
+ f = Form(request.POST)
+ if f.is_valid():
+ choice = f.save()
+ poll.reorder()
+ else:
+ form = f
+ if admin and 'edit' in request.POST \
+ and request.POST['poll'] == str(poll.id):
try:
- order = Choice.objects.order_by('-order')[0].order
- order += 1
- except IndexError:
- order = 0
- limit = None
- if 'limit' in request.POST:
- try:
- limit = int(request.POST['limit'])
- except ValueError:
- # non numeric limit given : no limit set
- pass
- choice = Choice(poll=poll, name=request.POST['new_choice'],
- order=order, limit=limit)
- choice.save()
- # check if the order of a choice has to be changed
+ choice = Choice.objects.get(id=int(request.POST['edit']))
+ if choice.poll != poll:
+ raise ValueError
+ f = Form(request.POST, instance=choice)
+ if f.is_valid():
+ choice = f.save()
+ poll.reorder()
+ except (Choice.DoesNotExist, ValueError):
+ pass
+ if admin:
+ # check if a choice has been choosen for deletion
+ for key in request.POST:
+ if key.startswith('delete_') and request.POST[key]:
+ try:
+ choice = Choice.objects.get(id=int(key[len('delete_'):]))
+ if choice.poll != poll:
+ raise ValueError
+ Vote.objects.filter(choice=choice).delete()
+ choice.delete()
+ except (Choice.DoesNotExist, ValueError):
+ pass
+ # check if the order of a choice has to be changed
+ if admin and request.method == 'GET':
for key in request.GET:
try:
+ current_url = request.path.split('?')[0]
if 'up_choice' in key:
choice = Choice.objects.get(id=int(request.GET[key]))
+ if choice.poll != poll:
+ raise ValueError
choice.changeOrder(-1)
+ poll.reorder()
# redirect in order to avoid a change with a refresh
- url = response_dct['admin_url']
- return response_dct, HttpResponseRedirect(url)
+ return HttpResponseRedirect(current_url)
if 'down_choice' in key:
choice = Choice.objects.get(id=int(request.GET[key]))
+ if choice.poll != poll:
+ raise ValueError
choice.changeOrder(1)
+ poll.reorder()
# redirect in order to avoid a change with a refresh
- url = response_dct['admin_url']
- return response_dct, HttpResponseRedirect(url)
+ return HttpResponseRedirect(current_url)
except (ValueError, Choice.DoesNotExist):
pass
- # check if a choice has been choosen for deletion or for modification
- for key in request.POST:
- if key.startswith('delete_') and request.POST[key]:
- choice = Choice.objects.get(id=int(key[len('delete_'):]))
- Vote.objects.filter(choice=choice).delete()
- choice.delete()
- if key.startswith('modify_') and request.POST[key]:
- try:
- choice = Choice.objects.get(id=int(key[len('modify_'):]))
- choice.name = request.POST[key]
- choice.save()
- except Choice.DoesNotExist:
- # throw when want to modify a deleted choice
- pass
-
- if key.startswith('limit_'):
- try:
- choice = Choice.objects.get(id=int(key[len('limit_'):]))
- if not request.POST[key]:
- choice.limit = None
- choice.save()
- else:
- try:
- new_limit = int(request.POST[key])
- sum = choice.getSum()
- if new_limit < sum:
- response_dct['error'] = _("You cannot lower \
-%(name)s's limit to this number : there is currently %(sum)d votes for this \
-choice.") % {'name':choice.name, 'sum':sum}
- else:
- choice.limit = new_limit
- choice.save()
- except ValueError:
- response_dct['error'] = _("Non-numeric value for \
-limit")
- except Choice.DoesNotExist:
- # throw when want to modify a deleted choice
- pass
- return response_dct, None
-
- response_dct, redirect = getBaseResponse(request)
- if redirect:
- return redirect
- response_dct['TYPES'] = Poll.TYPE
- response_dct['categories'] = Category.objects.all()
- response_dct['admin_url'] = \
- "/".join(request.path.split('/')[:-2])
- redirection = None
- if 'new' in request.POST:
- # new poll is submited
- response_dct, redirection = submitNewPoll(request, response_dct)
- elif admin_url == '0':
- # new empty poll
- response_dct['new'] = True
- response_dct['admin_url'] += '/0/'
- else:
- # existing poll
- response_dct, redirection = getAndUpdateExistingPoll(request,
- response_dct, admin_url)
- if redirection:
- return redirection
- return render_to_response('createOrEdit.html', response_dct)
-
+ choices = Choice.objects.filter(poll=poll).order_by('order')
+ for choice in choices:
+ if poll.dated_choices:
+ choice.name = datetime.strptime(choice.name, '%Y-%m-%d %H:%M:%S')
+ choice.form = Form(instance=choice)
+ response_dct['choices'] = choices
+ response_dct['form_new_choice'] = form
+ return render_to_response(tpl, response_dct)
def poll(request, poll_url):
"""Display a poll