annotate gpp/forums/views/spam.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 767cedc7d12a
children d1b11096595b
rev   line source
bgneal@232 1 """
bgneal@232 2 This module contains views for dealing with spam and spammers.
bgneal@232 3 """
bgneal@232 4 import datetime
bgneal@232 5 import logging
bgneal@232 6 import textwrap
bgneal@232 7
bgneal@232 8 from django.contrib.auth.decorators import login_required
bgneal@232 9 from django.core.urlresolvers import reverse
bgneal@232 10 from django.http import HttpResponseRedirect
bgneal@232 11 from django.http import HttpResponseForbidden
bgneal@232 12 from django.shortcuts import get_object_or_404
bgneal@232 13 from django.shortcuts import render_to_response
bgneal@232 14 from django.template import RequestContext
bgneal@232 15 from django.contrib.auth.models import User
bgneal@232 16
bgneal@232 17 from comments.models import Comment
bgneal@232 18 from forums.models import Post
bgneal@232 19 from forums.tools import delete_user_posts
bgneal@232 20 import bio.models
bgneal@232 21 from core.functions import email_admins
bgneal@232 22
bgneal@232 23
bgneal@232 24 SPAMMER_NAILED_SUBJECT = "Spammer Nailed: %s"
bgneal@232 25 SPAMMER_NAILED_MSG_BODY = """
bgneal@232 26 The admin/moderator user %s has just deactivated the account of %s for spam.
bgneal@232 27 """
bgneal@232 28
bgneal@232 29 def deactivate_spammer(user):
bgneal@232 30 """This function deactivate's the user, marks them as a spammer, then
bgneal@232 31 deletes the user's comments and forum posts.
bgneal@232 32 """
bgneal@232 33 user.is_active = False
bgneal@232 34 user.save()
bgneal@232 35
bgneal@232 36 profile = user.get_profile()
bgneal@232 37 profile.status = bio.models.STA_SPAMMER
bgneal@232 38 profile.status_date = datetime.datetime.now()
bgneal@232 39 profile.save()
bgneal@232 40
bgneal@232 41 Comment.objects.filter(user=user).delete()
bgneal@232 42 delete_user_posts(user)
bgneal@232 43
bgneal@232 44
bgneal@232 45 def promote_stranger(user):
bgneal@232 46 """This function upgrades the user from stranger status to a regular user.
bgneal@232 47 """
bgneal@232 48 profile = user.get_profile()
bgneal@232 49 if user.is_active and profile.status == bio.models.STA_STRANGER:
bgneal@232 50 profile.status = bio.models.STA_ACTIVE
bgneal@232 51 profile.status_date = datetime.datetime.now()
bgneal@232 52 profile.save()
bgneal@232 53
bgneal@232 54
bgneal@232 55 @login_required
bgneal@232 56 def spammer(request, post_id):
bgneal@232 57 """This view allows moderators to deactivate spammer accounts."""
bgneal@232 58
bgneal@232 59 post = get_object_or_404(Post.objects.select_related(), pk=post_id)
bgneal@232 60 poster = post.user
bgneal@232 61 poster_profile = poster.get_profile()
bgneal@232 62
bgneal@232 63 can_moderate = request.user.is_superuser or (
bgneal@232 64 request.user in post.topic.forum.moderators.all())
bgneal@232 65
bgneal@232 66 can_deactivate = (poster_profile.status == bio.models.STA_STRANGER and not
bgneal@232 67 poster.is_superuser)
bgneal@232 68
bgneal@232 69 if request.method == "POST" and can_moderate and can_deactivate:
bgneal@232 70 deactivate_spammer(poster)
bgneal@232 71
bgneal@316 72 email_admins(SPAMMER_NAILED_SUBJECT % poster.username,
bgneal@232 73 SPAMMER_NAILED_MSG_BODY % (
bgneal@232 74 request.user.username, poster.username))
bgneal@232 75
bgneal@232 76 logging.info(textwrap.dedent("""\
bgneal@232 77 SPAMMER DEACTIVATED: %s nailed %s for spam.
bgneal@232 78 IP: %s
bgneal@232 79 Message:
bgneal@232 80 %s
bgneal@316 81 """),
bgneal@316 82 request.user.username, poster.username, post.user_ip, post.body)
bgneal@232 83
bgneal@232 84 return HttpResponseRedirect(reverse('forums-spammer_nailed', args=[
bgneal@232 85 poster.id]))
bgneal@232 86
bgneal@232 87 return render_to_response('forums/spammer.html', {
bgneal@232 88 'can_moderate': can_moderate,
bgneal@232 89 'can_deactivate': can_deactivate,
bgneal@232 90 'post': post,
bgneal@232 91 },
bgneal@232 92 context_instance=RequestContext(request))
bgneal@232 93
bgneal@232 94
bgneal@232 95 @login_required
bgneal@232 96 def spammer_nailed(request, spammer_id):
bgneal@232 97 """This view presents a confirmation screen that the spammer has been
bgneal@232 98 deactivated.
bgneal@232 99 """
bgneal@232 100 user = get_object_or_404(User, pk=spammer_id)
bgneal@232 101 profile = user.get_profile()
bgneal@232 102
bgneal@232 103 success = not user.is_active and profile.status == bio.models.STA_SPAMMER
bgneal@232 104
bgneal@232 105 return render_to_response('forums/spammer_nailed.html', {
bgneal@232 106 'spammer': user,
bgneal@232 107 'success': success,
bgneal@232 108 },
bgneal@232 109 context_instance=RequestContext(request))
bgneal@232 110
bgneal@232 111
bgneal@232 112 @login_required
bgneal@232 113 def stranger(request, post_id):
bgneal@232 114 """This view allows a forum moderator or super user to promote a user from
bgneal@232 115 stranger status to regular user.
bgneal@232 116 """
bgneal@232 117 post = get_object_or_404(Post.objects.select_related(), pk=post_id)
bgneal@232 118 poster = post.user
bgneal@232 119 poster_profile = poster.get_profile()
bgneal@232 120
bgneal@232 121 can_moderate = request.user.is_superuser or (
bgneal@232 122 request.user in post.topic.forum.moderators.all())
bgneal@232 123
bgneal@232 124 can_promote = poster_profile.status == bio.models.STA_STRANGER
bgneal@232 125
bgneal@232 126 if request.method == "POST" and can_moderate and can_promote:
bgneal@232 127 promote_stranger(poster)
bgneal@232 128
bgneal@316 129 logging.info("STRANGER PROMOTED: %s promoted %s.",
bgneal@316 130 request.user.username, poster.username)
bgneal@232 131
bgneal@232 132 return HttpResponseRedirect(post.get_absolute_url())
bgneal@232 133
bgneal@232 134 return render_to_response('forums/stranger.html', {
bgneal@232 135 'can_moderate': can_moderate,
bgneal@232 136 'can_promote': can_promote,
bgneal@232 137 'post': post,
bgneal@232 138 },
bgneal@232 139 context_instance=RequestContext(request))