annotate forums/views/subscriptions.py @ 631:f36d1a168be7

For issue 27, disable login dialog button during POST. This seems to prevent multiple logins most of the time. You can still bang on the enter key and sometimes get more through.
author Brian Neal <bgneal@gmail.com>
date Wed, 14 Nov 2012 20:57:05 -0600
parents ee87ea74d46b
children 4aadaf3bc234
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@459 16 import forums.permissions as perms
bgneal@232 17 from core.functions import send_mail
bgneal@232 18 from core.paginator import DiggPaginator
bgneal@232 19
bgneal@232 20
bgneal@522 21 def notify_topic_subscribers(post, defer=True):
bgneal@301 22 """
bgneal@301 23 The argument post is a newly created post. Send out an email
bgneal@301 24 notification to all subscribers of the post's parent Topic.
bgneal@522 25
bgneal@522 26 The defer flag is passed to core.functions.send_mail. If True, the mail is
bgneal@522 27 sent on a Celery task. If False, the mail is sent on the caller's thread.
bgneal@301 28 """
bgneal@232 29 topic = post.topic
bgneal@386 30 recipients = topic.subscribers.exclude(id=post.user.id).values_list(
bgneal@386 31 'email', flat=True)
bgneal@232 32
bgneal@232 33 if recipients:
bgneal@232 34 site = Site.objects.get_current()
bgneal@232 35 subject = "[%s] Topic Reply: %s" % (site.name, topic.name)
bgneal@232 36 url_prefix = "http://%s" % site.domain
bgneal@232 37 post_url = url_prefix + post.get_absolute_url()
bgneal@232 38 unsubscribe_url = url_prefix + reverse("forums-manage_subscriptions")
bgneal@232 39 msg = render_to_string("forums/topic_notify_email.txt", {
bgneal@232 40 'poster': post.user.username,
bgneal@232 41 'topic_name': topic.name,
bgneal@232 42 'message': post.body,
bgneal@232 43 'post_url': post_url,
bgneal@232 44 'unsubscribe_url': unsubscribe_url,
bgneal@232 45 })
bgneal@232 46 for recipient in recipients:
bgneal@522 47 send_mail(subject, msg, settings.DEFAULT_FROM_EMAIL, [recipient],
bgneal@522 48 defer=defer)
bgneal@232 49
bgneal@232 50
bgneal@232 51 @login_required
bgneal@232 52 @require_POST
bgneal@232 53 def subscribe_topic(request, topic_id):
bgneal@232 54 """Subscribe the user to the requested topic."""
bgneal@232 55 topic = get_object_or_404(Topic.objects.select_related(), id=topic_id)
bgneal@459 56 if perms.can_access(topic.forum.category, request.user):
bgneal@386 57 topic.subscribers.add(request.user)
bgneal@232 58 return HttpResponseRedirect(
bgneal@232 59 reverse("forums-subscription_status", args=[topic.id]))
bgneal@386 60 raise Http404
bgneal@232 61
bgneal@232 62
bgneal@232 63 @login_required
bgneal@232 64 @require_POST
bgneal@232 65 def unsubscribe_topic(request, topic_id):
bgneal@232 66 """Unsubscribe the user to the requested topic."""
bgneal@232 67 topic = get_object_or_404(Topic, id=topic_id)
bgneal@386 68 topic.subscribers.remove(request.user)
bgneal@232 69 return HttpResponseRedirect(
bgneal@232 70 reverse("forums-subscription_status", args=[topic.id]))
bgneal@232 71
bgneal@232 72
bgneal@232 73 @login_required
bgneal@232 74 def subscription_status(request, topic_id):
bgneal@232 75 """Display the subscription status for the given topic."""
bgneal@232 76 topic = get_object_or_404(Topic.objects.select_related(), id=topic_id)
bgneal@232 77 is_subscribed = request.user in topic.subscribers.all()
bgneal@232 78 return render_to_response('forums/subscription_status.html', {
bgneal@232 79 'topic': topic,
bgneal@232 80 'is_subscribed': is_subscribed,
bgneal@232 81 },
bgneal@232 82 context_instance=RequestContext(request))
bgneal@232 83
bgneal@232 84
bgneal@232 85 @login_required
bgneal@232 86 def manage_subscriptions(request):
bgneal@232 87 """Display a user's topic subscriptions, and allow them to be deleted."""
bgneal@232 88
bgneal@232 89 user = request.user
bgneal@232 90 if request.method == "POST":
bgneal@232 91 if request.POST.get('delete_all'):
bgneal@386 92 user.subscriptions.clear()
bgneal@232 93 else:
bgneal@232 94 delete_ids = request.POST.getlist('delete_ids')
bgneal@232 95 try:
bgneal@232 96 delete_ids = [int(id) for id in delete_ids]
bgneal@232 97 except ValueError:
bgneal@232 98 raise Http404
bgneal@232 99
bgneal@386 100 for topic in user.subscriptions.filter(id__in=delete_ids):
bgneal@386 101 user.subscriptions.remove(topic)
bgneal@232 102
bgneal@383 103 return HttpResponseRedirect(reverse("forums-manage_subscriptions"))
bgneal@383 104
bgneal@383 105 page_num = request.GET.get('page', 1)
bgneal@232 106 topics = user.subscriptions.select_related().order_by('-update_date')
bgneal@232 107 paginator = DiggPaginator(topics, 20, body=5, tail=2, margin=3, padding=2)
bgneal@232 108 try:
bgneal@232 109 page_num = int(page_num)
bgneal@232 110 except ValueError:
bgneal@232 111 page_num = 1
bgneal@232 112 try:
bgneal@232 113 page = paginator.page(page_num)
bgneal@232 114 except InvalidPage:
bgneal@232 115 raise Http404
bgneal@232 116
bgneal@232 117 return render_to_response('forums/manage_topics.html', {
bgneal@232 118 'page_title': 'Topic Subscriptions',
bgneal@232 119 'description': 'The forum topics you are currently subscribed to are listed below.',
bgneal@232 120 'page': page,
bgneal@232 121 },
bgneal@232 122 context_instance=RequestContext(request))