diff polls/views.py @ 581:ee87ea74d46b

For Django 1.4, rearranged project structure for new manage.py.
author Brian Neal <bgneal@gmail.com>
date Sat, 05 May 2012 17:10:48 -0500
parents gpp/polls/views.py@8f46ba2f1b81
children 71685387dd11
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/polls/views.py	Sat May 05 17:10:48 2012 -0500
@@ -0,0 +1,102 @@
+"""
+Views for the polls application.
+
+"""
+import datetime
+
+from django.shortcuts import render
+from django.contrib.auth.decorators import login_required
+from django.shortcuts import get_object_or_404
+from django.http import Http404
+from django.http import HttpResponseRedirect
+from django.core.urlresolvers import reverse
+from django.views.decorators.http import require_POST
+from django.db.models import F
+
+from polls.models import Poll
+from polls.models import Choice
+from polls.forms import VoteForm
+
+#######################################################################
+
+def get_user_choice(user, poll):
+    """
+    Return the Choice object the given user voted for from the given poll,
+    or None if no vote has been recorded (or the user is not authenticated.
+
+    """
+    user_choice = None
+    if user.is_authenticated():
+        user_choices = user.choice_set.filter(poll=poll)
+        if user_choices:
+            user_choice = user_choices[0]
+
+    return user_choice
+
+#######################################################################
+
+def poll_index(request):
+    current_polls = Poll.objects.get_current_polls()
+    old_polls = Poll.objects.get_old_polls()
+    return render(request, 'polls/index.html', {
+        'current_polls': current_polls,
+        'old_polls': old_polls,
+        })
+
+#######################################################################
+
+def poll_detail(request, poll_id):
+    poll = get_object_or_404(Poll, pk=poll_id)
+    if not poll.is_enabled or poll.start_date > datetime.datetime.now():
+        raise Http404
+
+    total_votes, choices = poll.results()
+
+    return render(request, 'polls/poll_detail.html', {
+        'poll': poll,
+        'total_votes': total_votes,
+        'choices': choices,
+        'user_choice': get_user_choice(request.user, poll),
+        })
+
+#######################################################################
+
+@login_required
+def poll_vote(request, poll_id):
+    poll = get_object_or_404(Poll, pk=poll_id)
+    if not poll.is_enabled:
+        raise Http404
+    if not poll.is_open():
+        return HttpResponseRedirect(reverse('polls-detail',
+                                            kwargs={'poll_id': poll_id}))
+
+    user_choice = get_user_choice(request.user, poll)
+
+    if request.method == "POST":
+        vote_form = VoteForm(poll, request.POST, user=request.user,
+                             user_choice=user_choice)
+        if vote_form.is_valid():
+            vote_form.save()
+            return HttpResponseRedirect(reverse('polls-detail',
+                                                kwargs={'poll_id': poll_id}))
+    else:
+        vote_form = VoteForm(poll)
+
+    return render(request, 'polls/poll_vote.html', {
+        'poll': poll,
+        'vote_form': vote_form,
+        'user_choice': user_choice,
+        })
+
+#######################################################################
+
+@require_POST
+@login_required
+def poll_delete_vote(request):
+    poll = get_object_or_404(Poll, pk=request.POST.get('poll_id'))
+    user_choice = get_user_choice(request.user, poll)
+    if user_choice:
+        Choice.objects.filter(id=user_choice.id).update(votes=F('votes') - 1)
+        user_choice.voters.remove(request.user)
+
+    return HttpResponseRedirect(reverse('polls-detail', kwargs={'poll_id': poll.id}))