diff options
Diffstat (limited to 'polls/views.py')
| -rw-r--r-- | polls/views.py | 491 | 
1 files changed, 0 insertions, 491 deletions
| diff --git a/polls/views.py b/polls/views.py deleted file mode 100644 index e9ef572..0000000 --- a/polls/views.py +++ /dev/null @@ -1,491 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (C) 2008  Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet> - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program.  If not, see <http://www.gnu.org/licenses/>. - -# See the file COPYING for details. - -''' -Views management -''' - -from random import choice as random_choice -import string -import time -from datetime import datetime - -from django.utils.translation import gettext_lazy as _ -from django.shortcuts import render_to_response -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, ChoiceForm, \ -                                 DatedChoiceForm, CommentForm - -def getBaseResponse(request): -    """Manage basic fields for the template -    If not null the second argument returned is a redirection. -    """ -    url = BASE_SITE -    # setting the current language and available languages -    if 'language' in request.GET: -        if request.GET['language'] in [language[0] for language in LANGUAGES]: -            request.session['django_language'] = request.GET['language'] -            return None, HttpResponseRedirect(request.path) -    languages = [] -    for language_code, language_label in LANGUAGES: -        languages.append((language_code, language_label)) -    return {'root_url':url, 'languages':languages}, None - -def index(request): -    "Main page" -    response_dct, redirect = getBaseResponse(request) -    if redirect: -        return redirect -    response_dct['polls'] = Poll.objects.filter(public=True, category=None) -    response_dct['categories'] = Category.objects.all() -    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 category(request, category_id): -    "Page for a category" -    response_dct, redirect = getBaseResponse(request) -    if redirect: -        return redirect -    category = Category.objects.get(id=int(category_id)) -    response_dct['category'] = category -    response_dct['polls'] = Poll.objects.filter(public=True, category=category) -    return render_to_response('category.html', response_dct) - -def create(request): -    '''Creation of a poll. -    ''' -    def genRandomURL(): -        "Generation of a random url" -        url = '' -        while not url or Poll.objects.filter(base_url=url).count() or\ -              Poll.objects.filter(admin_url=url).count(): -            url = '' -            chars = string.letters + string.digits -            for i in xrange(6): -                url += random_choice(chars) -            url += str(int(time.time())) -        return url - -    response_dct, redirect = getBaseResponse(request) -    if redirect: -        return redirect - -    if request.method == 'POST': -        form = CreatePollForm(request.POST) -        if form.is_valid(): -            poll = form.save() -            poll.admin_url = genRandomURL() -            poll.base_url = genRandomURL() -            poll.save() -            return HttpResponseRedirect('%seditChoicesAdmin/%s/' % ( -                            response_dct['root_url'], poll.admin_url)) -    else: -        form = CreatePollForm() -    response_dct['form'] = form -    return render_to_response('create.html', response_dct) - -def edit(request, admin_url): -    '''Edition of a poll. -    ''' -    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 creation page -        url = response_dct['root_url'] -        return HttpResponseRedirect('%screate' % ( -                            response_dct['root_url'])) -    Form = AdminPollForm - -    if request.method == 'POST': -        form = Form(request.POST, instance=poll) -        if form.is_valid(): -            poll = form.save() -            return HttpResponseRedirect('%sedit/%s/' % ( -                            response_dct['root_url'], poll.admin_url)) -    else: -        form = Form(instance=poll) -    response_dct['form'] = form -    response_dct['poll'] = poll -    return render_to_response('edit.html', response_dct) - -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 editChoicesUser(request, poll_url): -    response_dct, redirect = getBaseResponse(request) -    if redirect: -        return redirect -    try: -        poll = Poll.objects.filter(base_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) - -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 '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: -                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 -                    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 -                    return HttpResponseRedirect(current_url) -            except (ValueError, Choice.DoesNotExist): -                pass -    choices = Choice.objects.filter(poll=poll).order_by('order') -    for choice in choices: -        if admin and poll.dated_choices: -            choice.name = choice.date -        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 -    poll_url is given to identify the poll. If '_' is in the poll_url the second -    part of the url is the unix time given to highlight a particular vote -    modification -    """ - -    def modifyVote(request, choices): -        "Modify user's votes" -        try: -            voter = Voter.objects.filter( -                                  id=int(request.POST['voter']))[0] -        except (ValueError, IndexError): -            return -        # if no author_name is given deletion of associated votes and -        # author -        if not request.POST['author_name']: -            # verify if the author can be deleted -            delete_user = None -            if not voter.user.password: -                v = Voter.objects.filter(user=voter.user) -                if len(v) == 1 and v[0] == voter: -                    delete_user = voter.user -            for choice in choices: -                v = Vote.objects.filter(voter=voter, choice=choice) -                v.delete() -            voter.delete() -            if delete_user: -                delete_user.delete() -            return -        # update the name -        voter.user.name = request.POST['author_name'] -        voter.user.save() -        # update the modification date -        voter.save() -        selected_choices = [] -        # set the selected choices -        for key in request.POST: -            # modify a one choice poll -            if key == 'vote' and request.POST[key]: -                try: -                    id = int(request.POST[key]) -                    vote = Vote.objects.filter(id=id)[0] -                    if vote.choice not in choices: -                        # bad vote id : the associated choice has -                        # probably been deleted -                        vote.delete() -                    else: -                        vote.value = 1 -                        vote.save() -                        selected_choices.append(vote.choice) -                except (ValueError, IndexError): -                    # the vote don't exist anymore -                    pass -            # modify an existing vote -            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: -                        # bad vote id : the associated choice has -                        # probably been deleted -                        vote.delete() -                    else: -                        # try if a specific value is specified in the form -                        # like in balanced poll -                        try: -                            value = int(request.POST[key]) -                        except ValueError: -                            value = 1 -                        vote.value = value -                        vote.save() -                        selected_choices.append(vote.choice) -                except (ValueError, IndexError): -                    # the vote don't exist anymore -                    pass -        # update non selected choices -        for choice in choices: -            if choice not in selected_choices: -                try: -                    v = Vote.objects.filter(voter=voter, choice=choice)[0] -                    v.value = 0 -                except IndexError: -                    # the vote don't exist with this choice : probably -                    # a new choice -                    v = Vote(voter=voter, choice=choice, value=0) -                v.save() -    def newComment(request, poll): -        "Comment the poll" -        if 'comment_author' not in request.POST \ -           or not request.POST['comment_author'] \ -           or not request.POST['comment']: -            return -        c = Comment(poll=poll, author_name=request.POST['comment_author'], -                    text=request.POST['comment']) -        c.save() - -    def newVote(request, choices): -        "Create new votes" -        if not request.POST['author_name']: -            return -        author = PollUser(name=request.POST['author_name']) -        author.save() -        voter = Voter(user=author, poll=poll) -        voter.save() -        selected_choices = [] - -        # set the selected choices -        for key in request.POST: -            # standard vote -            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 -                    # try if a specific value is specified in the form -                    # like in balanced poll -                    try: -                        value = int(request.POST[key]) -                    except ValueError: -                        value = 1 -                    v = Vote(voter=voter, choice=choice, value=value) -                    v.save() -                    selected_choices.append(choice) -                except (ValueError, IndexError): -                    # bad choice id : the choice has probably been deleted -                    pass -            # one choice vote -            if key == 'choice' and request.POST[key]: -                try: -                    id = int(request.POST[key]) -                    choice = Choice.objects.filter(id=id)[0] -                    if choice not in choices: -                        raise ValueError -                    v = Vote(voter=voter, choice=choice, value=1) -                    v.save() -                    selected_choices.append(choice) -                except (ValueError, IndexError): -                    # bad choice id : the choice has probably been deleted -                    pass -        # set non selected choices -        for choice in choices: -            if choice not in selected_choices: -                v = Vote(voter=voter, choice=choice, value=0) -                v.save() -        # results can now be displayed -        request.session['knowned_vote_' + poll.base_url] = 1 -    response_dct, redirect = getBaseResponse(request) -    if redirect: -        return redirect -    highlight_vote_date = None -    if '_' in poll_url: -        url_spl = poll_url.split('_') -        if len(url_spl) == 2: -            poll_url, highlight_vote_date = url_spl -            try: -                highlight_vote_date = int(highlight_vote_date) -            except ValueError: -                highlight_vote_date = None -    try: -        poll = Poll.objects.filter(base_url=poll_url)[0] -    except IndexError: -        poll = None -    choices = list(Choice.objects.filter(poll=poll)) -    # if the poll don't exist or if it has no choices the user is -    # redirected to the main page -    if not choices or not poll: -        url = "/".join(request.path.split('/')[:-3]) -        url += "/?bad_poll=1" -        return HttpResponseRedirect(url) - -    # a vote is submitted -    if 'author_name' in request.POST and poll.open: -        if 'voter' in request.POST: -            # modification of an old vote -            modifyVote(request, choices) -        else: -            newVote(request, choices) -        # update the modification date of the poll -        poll.save() -    if 'comment' in request.POST and poll.open: -        # comment posted -        newComment(request, poll) - -    # 'voter' is in request.GET when the edit button is pushed -    if 'voter' in request.GET and poll.open: -        try: -            response_dct['current_voter_id'] = int(request.GET['voter']) -        except ValueError: -            pass - -    response_dct.update({'poll':poll, -                         'VOTE':Vote.VOTE,}) -    response_dct['base_url'] = "/".join(request.path.split('/')[:-2]) \ -                               + '/%s/' % poll.base_url - -    # get voters and sum for each choice for this poll -    voters = Voter.objects.filter(poll=poll) -    choice_ids = [choice.id for choice in choices] -    for voter in voters: -        # highlight a voter -        if time.mktime(voter.modification_date.timetuple()) \ -                                                         == highlight_vote_date: -            voter.highlight = True -        voter.votes = voter.getVotes(choice_ids) -        # initialize undefined vote -        choice_vote_ids = [vote.choice.id for vote in voter.votes] -        for choice in choices: -            if choice.id not in choice_vote_ids: -                vote = Vote(voter=voter, choice=choice, value=None) -                vote.save() -                idx = choices.index(choice) -                voter.votes.insert(idx, vote) -    sums = [choice.getSum(poll.type == 'B') for choice in choices] -    vote_max = max(sums) -    c_idx = 0 -    while c_idx < len(choices): -        try: -            c_idx = sums.index(vote_max, c_idx) -            choices[c_idx].highlight = True -            c_idx += 1 -        except ValueError: -            c_idx = len(choices) -    # set non-available choices if the limit is reached for a choice -    response_dct['limit_set'] = None -    for choice in choices: -        if choice.limit: -           response_dct['limit_set'] = True -        if choice.limit and sums[choices.index(choice)] >= choice.limit: -            choice.available = False -        else: -            choice.available = True -        choice.save() -    response_dct['voters'] = voters -    response_dct['choices'] = choices -    response_dct['comments'] = Comment.objects.filter(poll=poll) -    # verify if vote's result has to be displayed -    response_dct['hide_vote'] = poll.hide_choices -    if poll.hide_choices: -        if u'display_result' in request.GET: -            request.session['knowned_vote_' + poll.base_url] = 1 -        if 'knowned_vote_' + poll.base_url in request.session: -            response_dct['hide_vote'] = False -    response_dct['form_comment'] = CommentForm() -    return render_to_response('vote.html', response_dct) | 
