annotate gpp/forums/views/favorites.py @ 318:c550933ff5b6

Fix a bug where you'd get an error when trying to delete a forum thread (topic does not exist). Apparently when you call topic.delete() the posts would get deleted, but the signal handler for each one would run, and it would try to update the topic's post count or something, but the topic was gone? Reworked the code a bit and explicitly delete the posts first. I also added a sync() call on the parent forum since post counts were not getting adjusted.
author Brian Neal <bgneal@gmail.com>
date Sat, 05 Feb 2011 21:46:52 +0000
parents a46788862737
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]))