annotate gpp/forums/views/subscriptions.py @ 429:d0f0800eef0c

Making the jquery tabbed version of the messages app the current version and removing the old. Also figured out how to dynamically update the base template's count of unread messages when messages are read.
author Brian Neal <bgneal@gmail.com>
date Tue, 03 May 2011 02:56:58 +0000
parents 9fcd366f22dc
children 9d3bd7304050
rev   line source
bgneal@232 1 """This module handles the subscriptions of users to forum topics."""
bgneal@232 2 from django.conf import settings
bgneal@232 3 from django.contrib.auth.decorators import login_required
bgneal@232 4 from django.contrib.sites.models import Site
bgneal@232 5 from django.core.paginator import InvalidPage
bgneal@232 6 from django.core.urlresolvers import reverse
bgneal@232 7 from django.http import HttpResponseRedirect
bgneal@232 8 from django.http import Http404
bgneal@232 9 from django.template.loader import render_to_string
bgneal@232 10 from django.shortcuts import get_object_or_404
bgneal@232 11 from django.shortcuts import render_to_response
bgneal@232 12 from django.template import RequestContext
bgneal@232 13 from django.views.decorators.http import require_POST
bgneal@232 14
bgneal@386 15 from forums.models import Topic
bgneal@232 16 from core.functions import send_mail
bgneal@232 17 from core.paginator import DiggPaginator
bgneal@232 18
bgneal@232 19
bgneal@232 20 def notify_topic_subscribers(post):
bgneal@301 21 """
bgneal@301 22 The argument post is a newly created post. Send out an email
bgneal@301 23 notification to all subscribers of the post's parent Topic.
bgneal@301 24 """
bgneal@301 25 #TODO: consider moving this function of the HTTP request/response cycle.
bgneal@232 26
bgneal@232 27 topic = post.topic
bgneal@386 28 recipients = topic.subscribers.exclude(id=post.user.id).values_list(
bgneal@386 29 'email', flat=True)
bgneal@232 30
bgneal@232 31 if recipients:
bgneal@232 32 site = Site.objects.get_current()
bgneal@232 33 subject = "[%s] Topic Reply: %s" % (site.name, topic.name)
bgneal@232 34 url_prefix = "http://%s" % site.domain
bgneal@232 35 post_url = url_prefix + post.get_absolute_url()
bgneal@232 36 unsubscribe_url = url_prefix + reverse("forums-manage_subscriptions")
bgneal@232 37 msg = render_to_string("forums/topic_notify_email.txt", {
bgneal@232 38 'poster': post.user.username,
bgneal@232 39 'topic_name': topic.name,
bgneal@232 40 'message': post.body,
bgneal@232 41 'post_url': post_url,
bgneal@232 42 'unsubscribe_url': unsubscribe_url,
bgneal@232 43 })
bgneal@232 44 for recipient in recipients:
bgneal@232 45 send_mail(subject, msg, settings.DEFAULT_FROM_EMAIL, [recipient])
bgneal@232 46
bgneal@232 47
bgneal@232 48 @login_required
bgneal@232 49 @require_POST
bgneal@232 50 def subscribe_topic(request, topic_id):
bgneal@232 51 """Subscribe the user to the requested topic."""
bgneal@232 52 topic = get_object_or_404(Topic.objects.select_related(), id=topic_id)
bgneal@232 53 if topic.forum.category.can_access(request.user):
bgneal@386 54 topic.subscribers.add(request.user)
bgneal@232 55 return HttpResponseRedirect(
bgneal@232 56 reverse("forums-subscription_status", args=[topic.id]))
bgneal@386 57 raise Http404
bgneal@232 58
bgneal@232 59
bgneal@232 60 @login_required
bgneal@232 61 @require_POST
bgneal@232 62 def unsubscribe_topic(request, topic_id):
bgneal@232 63 """Unsubscribe the user to the requested topic."""
bgneal@232 64 topic = get_object_or_404(Topic, id=topic_id)
bgneal@386 65 topic.subscribers.remove(request.user)
bgneal@232 66 return HttpResponseRedirect(
bgneal@232 67 reverse("forums-subscription_status", args=[topic.id]))
bgneal@232 68
bgneal@232 69
bgneal@232 70 @login_required
bgneal@232 71 def subscription_status(request, topic_id):
bgneal@232 72 """Display the subscription status for the given topic."""
bgneal@232 73 topic = get_object_or_404(Topic.objects.select_related(), id=topic_id)
bgneal@232 74 is_subscribed = request.user in topic.subscribers.all()
bgneal@232 75 return render_to_response('forums/subscription_status.html', {
bgneal@232 76 'topic': topic,
bgneal@232 77 'is_subscribed': is_subscribed,
bgneal@232 78 },
bgneal@232 79 context_instance=RequestContext(request))
bgneal@232 80
bgneal@232 81
bgneal@232 82 @login_required
bgneal@232 83 def manage_subscriptions(request):
bgneal@232 84 """Display a user's topic subscriptions, and allow them to be deleted."""
bgneal@232 85
bgneal@232 86 user = request.user
bgneal@232 87 if request.method == "POST":
bgneal@232 88 if request.POST.get('delete_all'):
bgneal@386 89 user.subscriptions.clear()
bgneal@232 90 else:
bgneal@232 91 delete_ids = request.POST.getlist('delete_ids')
bgneal@232 92 try:
bgneal@232 93 delete_ids = [int(id) for id in delete_ids]
bgneal@232 94 except ValueError:
bgneal@232 95 raise Http404
bgneal@232 96
bgneal@386 97 for topic in user.subscriptions.filter(id__in=delete_ids):
bgneal@386 98 user.subscriptions.remove(topic)
bgneal@232 99
bgneal@383 100 return HttpResponseRedirect(reverse("forums-manage_subscriptions"))
bgneal@383 101
bgneal@383 102 page_num = request.GET.get('page', 1)
bgneal@232 103 topics = user.subscriptions.select_related().order_by('-update_date')
bgneal@232 104 paginator = DiggPaginator(topics, 20, body=5, tail=2, margin=3, padding=2)
bgneal@232 105 try:
bgneal@232 106 page_num = int(page_num)
bgneal@232 107 except ValueError:
bgneal@232 108 page_num = 1
bgneal@232 109 try:
bgneal@232 110 page = paginator.page(page_num)
bgneal@232 111 except InvalidPage:
bgneal@232 112 raise Http404
bgneal@232 113
bgneal@232 114 return render_to_response('forums/manage_topics.html', {
bgneal@232 115 'page_title': 'Topic Subscriptions',
bgneal@232 116 'description': 'The forum topics you are currently subscribed to are listed below.',
bgneal@232 117 'page': page,
bgneal@232 118 },
bgneal@232 119 context_instance=RequestContext(request))