annotate gpp/forums/views/favorites.py @ 232:a46788862737

Implement a forum favorites feature for #82
author Brian Neal <bgneal@gmail.com>
date Sun, 01 Aug 2010 21:26:12 +0000
parents
children b2b37cdd020a
rev   line source
bgneal@232 1 """
bgneal@232 2 This module contains view functions related to forum favorites (bookmarks).
bgneal@232 3 """
bgneal@232 4 from django.contrib.auth.decorators import login_required
bgneal@232 5 from django.core.urlresolvers import reverse
bgneal@232 6 from django.views.decorators.http import require_POST
bgneal@232 7 from django.shortcuts import get_object_or_404
bgneal@232 8 from django.shortcuts import render_to_response
bgneal@232 9 from django.template import RequestContext
bgneal@232 10 from django.http import HttpResponseRedirect
bgneal@232 11 from django.http import HttpResponseForbidden
bgneal@232 12 from django.http import Http404
bgneal@232 13
bgneal@232 14 from core.paginator import DiggPaginator
bgneal@232 15 from forums.models import Topic
bgneal@232 16
bgneal@232 17
bgneal@232 18 @login_required
bgneal@232 19 @require_POST
bgneal@232 20 def favorite_topic(request, topic_id):
bgneal@232 21 """
bgneal@232 22 This function handles the "favoriting" (bookmarking) of a forum topic by a
bgneal@232 23 user.
bgneal@232 24 """
bgneal@232 25 topic = get_object_or_404(Topic.objects.select_related(), id=topic_id)
bgneal@232 26 if topic.forum.category.can_access(request.user):
bgneal@232 27 topic.bookmarkers.add(request.user)
bgneal@232 28 return HttpResponseRedirect(
bgneal@232 29 reverse("forums-favorites_status", args=[topic.id]))
bgneal@232 30 raise Http404 # TODO return HttpResponseForbidden instead
bgneal@232 31
bgneal@232 32
bgneal@232 33 @login_required
bgneal@232 34 def manage_favorites(request):
bgneal@232 35 """Display a user's favorite topics and allow them to be deleted."""
bgneal@232 36
bgneal@232 37 user = request.user
bgneal@232 38 if request.method == "POST":
bgneal@232 39 if request.POST.get('delete_all'):
bgneal@232 40 user.favorite_topics.clear()
bgneal@232 41 else:
bgneal@232 42 delete_ids = request.POST.getlist('delete_ids')
bgneal@232 43 try:
bgneal@232 44 delete_ids = [int(id) for id in delete_ids]
bgneal@232 45 except ValueError:
bgneal@232 46 raise Http404
bgneal@232 47 for topic in user.favorite_topics.filter(id__in=delete_ids):
bgneal@232 48 user.favorite_topics.remove(topic)
bgneal@232 49
bgneal@232 50 page_num = request.POST.get('page', 1)
bgneal@232 51 else:
bgneal@232 52 page_num = request.GET.get('page', 1)
bgneal@232 53
bgneal@232 54 topics = user.favorite_topics.select_related().order_by('-update_date')
bgneal@232 55 paginator = DiggPaginator(topics, 20, body=5, tail=2, margin=3, padding=2)
bgneal@232 56 try:
bgneal@232 57 page_num = int(page_num)
bgneal@232 58 except ValueError:
bgneal@232 59 page_num = 1
bgneal@232 60 try:
bgneal@232 61 page = paginator.page(page_num)
bgneal@232 62 except InvalidPage:
bgneal@232 63 raise Http404
bgneal@232 64
bgneal@232 65 return render_to_response('forums/manage_topics.html', {
bgneal@232 66 'page_title': 'Favorite Topics',
bgneal@232 67 'description': 'Your favorite topics are listed below.',
bgneal@232 68 'page': page,
bgneal@232 69 },
bgneal@232 70 context_instance=RequestContext(request))
bgneal@232 71
bgneal@232 72 @login_required
bgneal@232 73 def favorites_status(request, topic_id):
bgneal@232 74 """Display the favorite status for the given topic."""
bgneal@232 75 topic = get_object_or_404(Topic.objects.select_related(), id=topic_id)
bgneal@232 76 is_favorite = request.user in topic.bookmarkers.all()
bgneal@232 77 return render_to_response('forums/favorite_status.html', {
bgneal@232 78 'topic': topic,
bgneal@232 79 'is_favorite': is_favorite,
bgneal@232 80 },
bgneal@232 81 context_instance=RequestContext(request))
bgneal@232 82
bgneal@232 83 @login_required
bgneal@232 84 @require_POST
bgneal@232 85 def unfavorite_topic(request, topic_id):
bgneal@232 86 """
bgneal@232 87 Un-favorite the user from the requested topic.
bgneal@232 88 """
bgneal@232 89 topic = get_object_or_404(Topic, id=topic_id)
bgneal@232 90 topic.bookmarkers.remove(request.user)
bgneal@232 91 return HttpResponseRedirect(
bgneal@232 92 reverse("forums-favorites_status", args=[topic.id]))