annotate gpp/forums/views/favorites.py @ 445:e9f203c5f5bb

Attempting to fix #218; update the topic last visit time with 'now' when viewing the last page of a topic, otherwise use the creation time of the last post on the page.
author Brian Neal <bgneal@gmail.com>
date Wed, 08 Jun 2011 00:24:41 +0000
parents b2b37cdd020a
children 9d3bd7304050
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@383 50 return HttpResponseRedirect(reverse("forums-manage_favorites"))
bgneal@232 51
bgneal@383 52 page_num = request.GET.get('page', 1)
bgneal@232 53 topics = user.favorite_topics.select_related().order_by('-update_date')
bgneal@232 54 paginator = DiggPaginator(topics, 20, body=5, tail=2, margin=3, padding=2)
bgneal@232 55 try:
bgneal@232 56 page_num = int(page_num)
bgneal@232 57 except ValueError:
bgneal@232 58 page_num = 1
bgneal@232 59 try:
bgneal@232 60 page = paginator.page(page_num)
bgneal@232 61 except InvalidPage:
bgneal@232 62 raise Http404
bgneal@232 63
bgneal@232 64 return render_to_response('forums/manage_topics.html', {
bgneal@232 65 'page_title': 'Favorite Topics',
bgneal@232 66 'description': 'Your favorite topics are listed below.',
bgneal@232 67 'page': page,
bgneal@232 68 },
bgneal@232 69 context_instance=RequestContext(request))
bgneal@232 70
bgneal@232 71 @login_required
bgneal@232 72 def favorites_status(request, topic_id):
bgneal@232 73 """Display the favorite status for the given topic."""
bgneal@232 74 topic = get_object_or_404(Topic.objects.select_related(), id=topic_id)
bgneal@232 75 is_favorite = request.user in topic.bookmarkers.all()
bgneal@232 76 return render_to_response('forums/favorite_status.html', {
bgneal@232 77 'topic': topic,
bgneal@232 78 'is_favorite': is_favorite,
bgneal@232 79 },
bgneal@232 80 context_instance=RequestContext(request))
bgneal@232 81
bgneal@232 82 @login_required
bgneal@232 83 @require_POST
bgneal@232 84 def unfavorite_topic(request, topic_id):
bgneal@232 85 """
bgneal@232 86 Un-favorite the user from the requested topic.
bgneal@232 87 """
bgneal@232 88 topic = get_object_or_404(Topic, id=topic_id)
bgneal@232 89 topic.bookmarkers.remove(request.user)
bgneal@232 90 return HttpResponseRedirect(
bgneal@232 91 reverse("forums-favorites_status", args=[topic.id]))