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