diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gpp/forums/views/favorites.py	Sun Aug 01 21:26:12 2010 +0000
@@ -0,0 +1,92 @@
+"""
+This module contains view functions related to forum favorites (bookmarks).
+"""
+from django.contrib.auth.decorators import login_required
+from django.core.urlresolvers import reverse
+from django.views.decorators.http import require_POST
+from django.shortcuts import get_object_or_404
+from django.shortcuts import render_to_response
+from django.template import RequestContext
+from django.http import HttpResponseRedirect
+from django.http import HttpResponseForbidden
+from django.http import Http404
+
+from core.paginator import DiggPaginator
+from forums.models import Topic
+
+
+@login_required
+@require_POST
+def favorite_topic(request, topic_id):
+    """
+    This function handles the "favoriting" (bookmarking) of a forum topic by a
+    user.
+    """
+    topic = get_object_or_404(Topic.objects.select_related(), id=topic_id)
+    if topic.forum.category.can_access(request.user):
+        topic.bookmarkers.add(request.user)
+        return HttpResponseRedirect(
+            reverse("forums-favorites_status", args=[topic.id]))
+    raise Http404   # TODO return HttpResponseForbidden instead
+
+
+@login_required
+def manage_favorites(request):
+    """Display a user's favorite topics and allow them to be deleted."""
+
+    user = request.user
+    if request.method == "POST":
+        if request.POST.get('delete_all'):
+            user.favorite_topics.clear()
+        else:
+            delete_ids = request.POST.getlist('delete_ids')
+            try:
+                delete_ids = [int(id) for id in delete_ids]
+            except ValueError:
+                raise Http404
+            for topic in user.favorite_topics.filter(id__in=delete_ids):
+                user.favorite_topics.remove(topic)
+
+        page_num = request.POST.get('page', 1)
+    else:
+        page_num = request.GET.get('page', 1)
+
+    topics = user.favorite_topics.select_related().order_by('-update_date')
+    paginator = DiggPaginator(topics, 20, body=5, tail=2, margin=3, padding=2)
+    try:
+        page_num = int(page_num)
+    except ValueError:
+        page_num = 1
+    try:
+        page = paginator.page(page_num)
+    except InvalidPage:
+        raise Http404
+
+    return render_to_response('forums/manage_topics.html', {
+        'page_title': 'Favorite Topics',
+        'description': 'Your favorite topics are listed below.',
+        'page': page,
+        },
+        context_instance=RequestContext(request))
+
+@login_required
+def favorites_status(request, topic_id):
+    """Display the favorite status for the given topic."""
+    topic = get_object_or_404(Topic.objects.select_related(), id=topic_id)
+    is_favorite = request.user in topic.bookmarkers.all()
+    return render_to_response('forums/favorite_status.html', {
+        'topic': topic,
+        'is_favorite': is_favorite,
+        },
+        context_instance=RequestContext(request))
+
+@login_required
+@require_POST
+def unfavorite_topic(request, topic_id):
+    """
+    Un-favorite the user from the requested topic.
+    """
+    topic = get_object_or_404(Topic, id=topic_id)
+    topic.bookmarkers.remove(request.user)
+    return HttpResponseRedirect(
+        reverse("forums-favorites_status", args=[topic.id]))