diff options
| author | etienne <etienne@07715635-78ed-41b0-aaf1-0afda6c37f35> | 2008-08-05 21:48:10 +0000 | 
|---|---|---|
| committer | etienne <etienne@07715635-78ed-41b0-aaf1-0afda6c37f35> | 2008-08-05 21:48:10 +0000 | 
| commit | b10461003a785b6579e82fae380161396d94b68e (patch) | |
| tree | eb47f649ce160eddf79315036031e72aa67fbd17 /polls/views.py | |
| download | Papillon-b10461003a785b6579e82fae380161396d94b68e.tar.bz2 Papillon-b10461003a785b6579e82fae380161396d94b68e.zip  | |
Initial import
Diffstat (limited to 'polls/views.py')
| -rw-r--r-- | polls/views.py | 210 | 
1 files changed, 210 insertions, 0 deletions
diff --git a/polls/views.py b/polls/views.py new file mode 100644 index 0000000..f63d31f --- /dev/null +++ b/polls/views.py @@ -0,0 +1,210 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (C) 2008  Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet> +# This program can be distributed under the terms of the GNU GPL. +# See the file COPYING. + +from random import choice +import string +import time + +from django.shortcuts import render_to_response +from django.http import HttpResponseRedirect + +from papillon.polls.models import Poll, PollUser, Choice, Vote + +def getBaseResponse(request): +    url = "/".join([request.META['HTTP_HOST'],  +                    request.path.split('/')[1], ''])  +    return {'root_url':url} + +def index(request): +    response_dct = getBaseResponse(request) +    error = '' +    if 'bad_poll' in request.GET: +        response_dct['error'] = "The poll requested don't exist (anymore?)" +    return render_to_response('main.html', response_dct) + +def createOrEdit(request, admin_url): + +    def genRandomURL(): +        chars = string.letters + string.digits +        url = ''     +        for i in range(6): +            url += choice(chars) +        url += str(int(time.time())) +        return url +     +    response_dct = getBaseResponse(request) +    response_dct['TYPES'] = Poll.TYPE +    error = None +    poll = None +    if 'new' in request.POST: +        mandatory_fields = (('author_name', "Author name"), +                            ('poll_name', "Poll name"), +                            ('poll_desc', "Poll description"), +                            ('poll_type', "Poll type"), +                            ) +        for key, label in mandatory_fields: +            if key not in request.POST or not request.POST[key]: +                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'] = \ +                         "/".join(request.path.split('/')[:-2]) + '/0/' +        else: +            author = PollUser(name=request.POST['author_name']) +            author.save() +            base_url = 'b' + genRandomURL() +            admin_url = 'a' + genRandomURL() +            poll = Poll(name=request.POST['poll_name'], +description=request.POST['poll_desc'], author=author, base_url=base_url, +admin_url=admin_url, status = 'D', type=request.POST['poll_type']) +            poll.save() +            url = "/".join(request.path.split('/')[:-2]) \ +                  + '/%s/' % poll.admin_url +            return HttpResponseRedirect(url) +    elif admin_url == '0': +        response_dct['new'] = True +        response_dct['admin_url'] = \ +                         "/".join(request.path.split('/')[:-2]) + '/0/' +    else: +        try: +            poll = Poll.objects.filter(admin_url=admin_url)[0] +        except IndexError: +            url = "/".join(request.path.split('/')[:-2]) + '/0/' +            return HttpResponseRedirect(url) +        response_dct['choices'] = Choice.objects.filter(poll=poll).order_by('order') +        response_dct['author_name'] = poll.author.name +        response_dct['poll_name'] = poll.name +        response_dct['poll_desc'] = poll.description +        idx = [type[0] for type in poll.TYPE].index(poll.type) +        response_dct['type_name'] = Poll.TYPE[idx][1] +        response_dct['poll_status'] = poll.status +        response_dct['admin_url'] = \ +       "/".join(request.path.split('/')[:-2]) + '/%s/' % poll.admin_url +        base_path = request.META['HTTP_HOST'] + \ +                    "/".join(request.path.split('/')[:-3]) +        response_dct['full_admin_url'] = base_path + "/edit/" \ +                                         + admin_url + "/" +        response_dct['base_url'] = poll.base_url +        response_dct['full_base_url'] = base_path + "/poll/" \ +                                   + poll.base_url + "/" +        response_dct['choiceform'] = "<input type='text' name='new_choice'/>" +        if 'new_choice' in request.POST and request.POST['new_choice']: +            try: +                order = Choice.objects.order_by('-order')[0].order +                order += 1 +            except IndexError: +                order = 0 +            choice = Choice(poll=poll, name=request.POST['new_choice'], +                            order=order)  +            choice.save() +        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() +    return render_to_response('createOrEdit.html', response_dct) + + +def poll(request, poll_url): +    response_dct = getBaseResponse(request) +    error = None +    try: +        poll = Poll.objects.filter(base_url=poll_url)[0] +    except IndexError: +        url = "/".join(request.path.split('/')[:-3]) +        url += "?bad_poll=1" +        return HttpResponseRedirect(url) +    response_dct['base_url'] = \ +       "/".join(request.path.split('/')[:-2]) + '/%s/' % poll.base_url +         +    choices = Choice.objects.filter(poll=poll).order_by('order') +    response_dct['choices'] = choices +    if 'author_name' in request.POST: +        if 'voter' in request.POST: +            try: +                author = PollUser.objects.filter(id=int(request.POST['voter']))[0] +            except ValueError, IndexError: +                author = None +            if author: +                author.name = request.POST['author_name'] +                author.save() +                selected_choices = [] +                for key in request.POST: +                    if key.startswith('vote_') and request.POST[key]: +                        try: +                            id = int(key.split('_')[1]) +                            vote = Vote.objects.filter(id=id)[0] +                            if vote.choice not in choices: +                                raise ValueError +                            vote.vote = 1 +                            vote.save() +                        except (ValueError, IndexError): +                            url = "/".join(request.path.split('/')[:-3]) +                            url += "?bad_poll=1" +                            return HttpResponseRedirect(url) +                        selected_choices.append(vote.choice) +                for choice in choices: +                    if choice not in selected_choices: +                        try: +                            v = Vote.objects.filter(voter=author, choice=choice)[0] +                            v.vote = 0 +                        except IndexError: +                            v = Vote(voter=author, choice=choice, vote=0) +                        v.save() +                 +        else: +            author = PollUser(name=request.POST['author_name']) +            author.save() +            selected_choices = [] +            for key in request.POST: +                if key.startswith('choice_') and request.POST[key]: +                    try: +                        id = int(key.split('_')[1]) +                        choice = Choice.objects.filter(id=id)[0] +                        if choice not in choices: +                            raise ValueError +                    except (ValueError, IndexError): +                        url = "/".join(request.path.split('/')[:-3]) +                        url += "?bad_poll=1" +                        return HttpResponseRedirect(url) +                    v = Vote(voter=author, choice=choice, vote=1) +                    selected_choices.append(choice) +                    v.save() +                for choice in choices: +                    if choice not in selected_choices: +                        v = Vote(voter=author, choice=choice, vote=0) +                        v.save() +    votes = Vote.objects.extra(where=['choice_id IN (%s)' \ +                   % ",".join([str(choice.id) for choice in choices])]) +    voters = [] +    choices_sum = [0 for choice in choices] +    choices_ids = [choice.id for choice in choices] +    for vote in votes: +        if vote.voter not in voters: +            vote.voter.votes = [None for choice in choices] +            voters.append(vote.voter) +            voter = vote.voter +        else: +            voter = voters[voters.index(vote.voter)] +        idx = choices_ids.index(vote.choice.id) +        voter.votes[idx] = vote +        choices_sum[idx] += vote.vote +    response_dct['voters'] = voters +    if 'voter' in request.GET: +        try: +            response_dct['current_voter_id'] = int(request.GET['voter']) +        except ValueError: +            pass +    response_dct['voter'] = voters +    response_dct['choices_sum'] = [str(sum) for sum in choices_sum] +    response_dct['poll_type_name'] = poll.getTypeLabel() +    response_dct['poll_name'] = poll.name +    response_dct['poll_desc'] = poll.description +    return render_to_response('vote.html', response_dct)  | 
