annotate gpp/forums/views/spam.py @ 348:d1b11096595b

Fix #168; when nailing a spammer, clear their profile text fields. Guard against topics and forums that don't exist when deleting posts in the signal handler. Make the forum stats template tag only display the latest active users.
author Brian Neal <bgneal@gmail.com>
date Wed, 02 Mar 2011 02:18:28 +0000
parents 767cedc7d12a
children 9d470c7a2b93
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@348 31 deletes the user's comments and forum posts. The spammer's profile is
bgneal@348 32 cleared so any spam links won't show up anymore.
bgneal@232 33 """
bgneal@232 34 user.is_active = False
bgneal@232 35 user.save()
bgneal@232 36
bgneal@232 37 profile = user.get_profile()
bgneal@232 38 profile.status = bio.models.STA_SPAMMER
bgneal@232 39 profile.status_date = datetime.datetime.now()
bgneal@348 40 profile.location = ''
bgneal@348 41 profile.occupation = ''
bgneal@348 42 profile.interests = ''
bgneal@348 43 profile.profile_text = ''
bgneal@348 44 profile.signature = ''
bgneal@232 45 profile.save()
bgneal@232 46
bgneal@232 47 Comment.objects.filter(user=user).delete()
bgneal@232 48 delete_user_posts(user)
bgneal@232 49
bgneal@232 50
bgneal@232 51 def promote_stranger(user):
bgneal@232 52 """This function upgrades the user from stranger status to a regular user.
bgneal@232 53 """
bgneal@232 54 profile = user.get_profile()
bgneal@232 55 if user.is_active and profile.status == bio.models.STA_STRANGER:
bgneal@232 56 profile.status = bio.models.STA_ACTIVE
bgneal@232 57 profile.status_date = datetime.datetime.now()
bgneal@232 58 profile.save()
bgneal@232 59
bgneal@232 60
bgneal@232 61 @login_required
bgneal@232 62 def spammer(request, post_id):
bgneal@232 63 """This view allows moderators to deactivate spammer accounts."""
bgneal@232 64
bgneal@232 65 post = get_object_or_404(Post.objects.select_related(), pk=post_id)
bgneal@232 66 poster = post.user
bgneal@232 67 poster_profile = poster.get_profile()
bgneal@232 68
bgneal@232 69 can_moderate = request.user.is_superuser or (
bgneal@232 70 request.user in post.topic.forum.moderators.all())
bgneal@232 71
bgneal@232 72 can_deactivate = (poster_profile.status == bio.models.STA_STRANGER and not
bgneal@232 73 poster.is_superuser)
bgneal@232 74
bgneal@232 75 if request.method == "POST" and can_moderate and can_deactivate:
bgneal@232 76 deactivate_spammer(poster)
bgneal@232 77
bgneal@316 78 email_admins(SPAMMER_NAILED_SUBJECT % poster.username,
bgneal@232 79 SPAMMER_NAILED_MSG_BODY % (
bgneal@232 80 request.user.username, poster.username))
bgneal@232 81
bgneal@232 82 logging.info(textwrap.dedent("""\
bgneal@232 83 SPAMMER DEACTIVATED: %s nailed %s for spam.
bgneal@232 84 IP: %s
bgneal@232 85 Message:
bgneal@232 86 %s
bgneal@316 87 """),
bgneal@316 88 request.user.username, poster.username, post.user_ip, post.body)
bgneal@232 89
bgneal@232 90 return HttpResponseRedirect(reverse('forums-spammer_nailed', args=[
bgneal@232 91 poster.id]))
bgneal@232 92
bgneal@232 93 return render_to_response('forums/spammer.html', {
bgneal@232 94 'can_moderate': can_moderate,
bgneal@232 95 'can_deactivate': can_deactivate,
bgneal@232 96 'post': post,
bgneal@232 97 },
bgneal@232 98 context_instance=RequestContext(request))
bgneal@232 99
bgneal@232 100
bgneal@232 101 @login_required
bgneal@232 102 def spammer_nailed(request, spammer_id):
bgneal@232 103 """This view presents a confirmation screen that the spammer has been
bgneal@232 104 deactivated.
bgneal@232 105 """
bgneal@232 106 user = get_object_or_404(User, pk=spammer_id)
bgneal@232 107 profile = user.get_profile()
bgneal@232 108
bgneal@232 109 success = not user.is_active and profile.status == bio.models.STA_SPAMMER
bgneal@232 110
bgneal@232 111 return render_to_response('forums/spammer_nailed.html', {
bgneal@232 112 'spammer': user,
bgneal@232 113 'success': success,
bgneal@232 114 },
bgneal@232 115 context_instance=RequestContext(request))
bgneal@232 116
bgneal@232 117
bgneal@232 118 @login_required
bgneal@232 119 def stranger(request, post_id):
bgneal@232 120 """This view allows a forum moderator or super user to promote a user from
bgneal@232 121 stranger status to regular user.
bgneal@232 122 """
bgneal@232 123 post = get_object_or_404(Post.objects.select_related(), pk=post_id)
bgneal@232 124 poster = post.user
bgneal@232 125 poster_profile = poster.get_profile()
bgneal@232 126
bgneal@232 127 can_moderate = request.user.is_superuser or (
bgneal@232 128 request.user in post.topic.forum.moderators.all())
bgneal@232 129
bgneal@232 130 can_promote = poster_profile.status == bio.models.STA_STRANGER
bgneal@232 131
bgneal@232 132 if request.method == "POST" and can_moderate and can_promote:
bgneal@232 133 promote_stranger(poster)
bgneal@232 134
bgneal@316 135 logging.info("STRANGER PROMOTED: %s promoted %s.",
bgneal@316 136 request.user.username, poster.username)
bgneal@232 137
bgneal@232 138 return HttpResponseRedirect(post.get_absolute_url())
bgneal@232 139
bgneal@232 140 return render_to_response('forums/stranger.html', {
bgneal@232 141 'can_moderate': can_moderate,
bgneal@232 142 'can_promote': can_promote,
bgneal@232 143 'post': post,
bgneal@232 144 },
bgneal@232 145 context_instance=RequestContext(request))