diff options
Diffstat (limited to 'polls/views.py')
-rw-r--r-- | polls/views.py | 287 |
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 |