bgneal@439: """ bgneal@439: Views for the polls application. gremmie@1: bgneal@439: """ bgneal@447: import datetime bgneal@447: bgneal@439: from django.shortcuts import render gremmie@1: from django.contrib.auth.decorators import login_required gremmie@1: from django.shortcuts import get_object_or_404 gremmie@1: from django.http import Http404 gremmie@1: from django.http import HttpResponseRedirect gremmie@1: from django.core.urlresolvers import reverse bgneal@439: from django.views.decorators.http import require_POST bgneal@439: from django.db.models import F gremmie@1: gremmie@1: from polls.models import Poll gremmie@1: from polls.models import Choice gremmie@1: from polls.forms import VoteForm gremmie@1: gremmie@1: ####################################################################### gremmie@1: bgneal@439: def get_user_choice(user, poll): bgneal@439: """ bgneal@447: Return the Choice object the given user voted for from the given poll, bgneal@447: or None if no vote has been recorded (or the user is not authenticated. bgneal@439: bgneal@439: """ bgneal@439: user_choice = None bgneal@439: if user.is_authenticated(): bgneal@439: user_choices = user.choice_set.filter(poll=poll) bgneal@439: if user_choices: bgneal@439: user_choice = user_choices[0] bgneal@439: bgneal@439: return user_choice bgneal@439: bgneal@439: ####################################################################### bgneal@439: gremmie@1: def poll_index(request): bgneal@439: current_polls = Poll.objects.get_current_polls() bgneal@439: old_polls = Poll.objects.get_old_polls() bgneal@439: return render(request, 'polls/index.html', { bgneal@439: 'current_polls': current_polls, bgneal@439: 'old_polls': old_polls, bgneal@439: }) gremmie@1: gremmie@1: ####################################################################### gremmie@1: gremmie@1: def poll_detail(request, poll_id): bgneal@439: poll = get_object_or_404(Poll, pk=poll_id) bgneal@447: if not poll.is_enabled or poll.start_date > datetime.datetime.now(): bgneal@439: raise Http404 gremmie@1: bgneal@447: total_votes, choices = poll.results() bgneal@447: bgneal@447: return render(request, 'polls/poll_detail.html', { bgneal@439: 'poll': poll, bgneal@447: 'total_votes': total_votes, bgneal@447: 'choices': choices, bgneal@439: 'user_choice': get_user_choice(request.user, poll), bgneal@439: }) gremmie@1: gremmie@1: ####################################################################### gremmie@1: gremmie@1: @login_required gremmie@1: def poll_vote(request, poll_id): bgneal@439: poll = get_object_or_404(Poll, pk=poll_id) bgneal@439: if not poll.is_enabled: bgneal@439: raise Http404 bgneal@439: if not poll.is_open(): bgneal@447: return HttpResponseRedirect(reverse('polls-detail', bgneal@447: kwargs={'poll_id': poll_id})) gremmie@1: bgneal@439: user_choice = get_user_choice(request.user, poll) gremmie@1: bgneal@439: if request.method == "POST": bgneal@447: vote_form = VoteForm(poll, request.POST, user=request.user, bgneal@447: user_choice=user_choice) bgneal@439: if vote_form.is_valid(): bgneal@439: vote_form.save() bgneal@447: return HttpResponseRedirect(reverse('polls-detail', bgneal@447: kwargs={'poll_id': poll_id})) bgneal@439: else: bgneal@439: vote_form = VoteForm(poll) bgneal@439: bgneal@439: return render(request, 'polls/poll_vote.html', { bgneal@439: 'poll': poll, bgneal@439: 'vote_form': vote_form, bgneal@439: 'user_choice': user_choice, bgneal@439: }) gremmie@1: gremmie@1: ####################################################################### gremmie@1: bgneal@439: @require_POST bgneal@439: @login_required bgneal@439: def poll_delete_vote(request): bgneal@439: poll = get_object_or_404(Poll, pk=request.POST.get('poll_id')) bgneal@439: user_choice = get_user_choice(request.user, poll) bgneal@439: if user_choice: bgneal@439: Choice.objects.filter(id=user_choice.id).update(votes=F('votes') - 1) bgneal@439: user_choice.voters.remove(request.user) bgneal@439: bgneal@447: return HttpResponseRedirect(reverse('polls-detail', kwargs={'poll_id': poll.id}))