annotate gpp/forums/views/subscriptions.py @ 271:4746df47a538

Follow on to last rev (r292) for #126. Missed updating a shoutbox template. Also the repoze.timeago package uses UTC time by default. Change this to local time for now until we decide to switch over to UTC for everything.
author Brian Neal <bgneal@gmail.com>
date Sun, 26 Sep 2010 17:42:00 +0000
parents a46788862737
children ee451ad46af1
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@232 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@232 21 """The argument post is a newly created post. Send out an email
bgneal@232 22 notification to all subscribers of the post's parent Topic."""
bgneal@232 23
bgneal@232 24 topic = post.topic
bgneal@232 25 recipients = topic.subscribers.exclude(
bgneal@232 26 id=post.user.id).values_list('email', flat=True)
bgneal@232 27
bgneal@232 28 if recipients:
bgneal@232 29 site = Site.objects.get_current()
bgneal@232 30 subject = "[%s] Topic Reply: %s" % (site.name, topic.name)
bgneal@232 31 url_prefix = "http://%s" % site.domain
bgneal@232 32 post_url = url_prefix + post.get_absolute_url()
bgneal@232 33 unsubscribe_url = url_prefix + reverse("forums-manage_subscriptions")
bgneal@232 34 msg = render_to_string("forums/topic_notify_email.txt", {
bgneal@232 35 'poster': post.user.username,
bgneal@232 36 'topic_name': topic.name,
bgneal@232 37 'message': post.body,
bgneal@232 38 'post_url': post_url,
bgneal@232 39 'unsubscribe_url': unsubscribe_url,
bgneal@232 40 })
bgneal@232 41 for recipient in recipients:
bgneal@232 42 send_mail(subject, msg, settings.DEFAULT_FROM_EMAIL, [recipient])
bgneal@232 43
bgneal@232 44
bgneal@232 45 @login_required
bgneal@232 46 @require_POST
bgneal@232 47 def subscribe_topic(request, topic_id):
bgneal@232 48 """Subscribe the user to the requested topic."""
bgneal@232 49 topic = get_object_or_404(Topic.objects.select_related(), id=topic_id)
bgneal@232 50 if topic.forum.category.can_access(request.user):
bgneal@232 51 topic.subscribers.add(request.user)
bgneal@232 52 return HttpResponseRedirect(
bgneal@232 53 reverse("forums-subscription_status", args=[topic.id]))
bgneal@232 54 raise Http404 # TODO return HttpResponseForbidden instead
bgneal@232 55
bgneal@232 56
bgneal@232 57 @login_required
bgneal@232 58 @require_POST
bgneal@232 59 def unsubscribe_topic(request, topic_id):
bgneal@232 60 """Unsubscribe the user to the requested topic."""
bgneal@232 61 topic = get_object_or_404(Topic, id=topic_id)
bgneal@232 62 topic.subscribers.remove(request.user)
bgneal@232 63 return HttpResponseRedirect(
bgneal@232 64 reverse("forums-subscription_status", args=[topic.id]))
bgneal@232 65
bgneal@232 66
bgneal@232 67 @login_required
bgneal@232 68 def subscription_status(request, topic_id):
bgneal@232 69 """Display the subscription status for the given topic."""
bgneal@232 70 topic = get_object_or_404(Topic.objects.select_related(), id=topic_id)
bgneal@232 71 is_subscribed = request.user in topic.subscribers.all()
bgneal@232 72 return render_to_response('forums/subscription_status.html', {
bgneal@232 73 'topic': topic,
bgneal@232 74 'is_subscribed': is_subscribed,
bgneal@232 75 },
bgneal@232 76 context_instance=RequestContext(request))
bgneal@232 77
bgneal@232 78
bgneal@232 79 @login_required
bgneal@232 80 def manage_subscriptions(request):
bgneal@232 81 """Display a user's topic subscriptions, and allow them to be deleted."""
bgneal@232 82
bgneal@232 83 user = request.user
bgneal@232 84 if request.method == "POST":
bgneal@232 85 if request.POST.get('delete_all'):
bgneal@232 86 user.subscriptions.clear()
bgneal@232 87 else:
bgneal@232 88 delete_ids = request.POST.getlist('delete_ids')
bgneal@232 89 try:
bgneal@232 90 delete_ids = [int(id) for id in delete_ids]
bgneal@232 91 except ValueError:
bgneal@232 92 raise Http404
bgneal@232 93 for topic in user.subscriptions.filter(id__in=delete_ids):
bgneal@232 94 user.subscriptions.remove(topic)
bgneal@232 95
bgneal@232 96 page_num = request.POST.get('page', 1)
bgneal@232 97 else:
bgneal@232 98 page_num = request.GET.get('page', 1)
bgneal@232 99
bgneal@232 100 topics = user.subscriptions.select_related().order_by('-update_date')
bgneal@232 101 paginator = DiggPaginator(topics, 20, body=5, tail=2, margin=3, padding=2)
bgneal@232 102 try:
bgneal@232 103 page_num = int(page_num)
bgneal@232 104 except ValueError:
bgneal@232 105 page_num = 1
bgneal@232 106 try:
bgneal@232 107 page = paginator.page(page_num)
bgneal@232 108 except InvalidPage:
bgneal@232 109 raise Http404
bgneal@232 110
bgneal@232 111 return render_to_response('forums/manage_topics.html', {
bgneal@232 112 'page_title': 'Topic Subscriptions',
bgneal@232 113 'description': 'The forum topics you are currently subscribed to are listed below.',
bgneal@232 114 'page': page,
bgneal@232 115 },
bgneal@232 116 context_instance=RequestContext(request))