annotate gpp/forums/views/spam.py @ 505:a5d11471d031

Refactor the logic in the rate limiter decorator. Check to see if the request was ajax, as the ajax view always returns 200. Have to decode the JSON response to see if an error occurred or not.
author Brian Neal <bgneal@gmail.com>
date Sat, 03 Dec 2011 19:13:38 +0000
parents 2ff5f4c1476d
children 98b373ca09f3
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@460 20 import forums.permissions as perms
bgneal@232 21 import bio.models
bgneal@232 22 from core.functions import email_admins
bgneal@232 23
bgneal@232 24
bgneal@232 25 SPAMMER_NAILED_SUBJECT = "Spammer Nailed: %s"
bgneal@232 26 SPAMMER_NAILED_MSG_BODY = """
bgneal@232 27 The admin/moderator user %s has just deactivated the account of %s for spam.
bgneal@232 28 """
bgneal@232 29
bgneal@232 30 def deactivate_spammer(user):
bgneal@232 31 """This function deactivate's the user, marks them as a spammer, then
bgneal@348 32 deletes the user's comments and forum posts. The spammer's profile is
bgneal@348 33 cleared so any spam links won't show up anymore.
bgneal@232 34 """
bgneal@232 35 user.is_active = False
bgneal@232 36 user.save()
bgneal@232 37
bgneal@232 38 profile = user.get_profile()
bgneal@232 39 profile.status = bio.models.STA_SPAMMER
bgneal@232 40 profile.status_date = datetime.datetime.now()
bgneal@363 41 profile.reset_text_fields()
bgneal@232 42 profile.save()
bgneal@232 43
bgneal@232 44 Comment.objects.filter(user=user).delete()
bgneal@232 45 delete_user_posts(user)
bgneal@232 46
bgneal@232 47
bgneal@232 48 def promote_stranger(user):
bgneal@232 49 """This function upgrades the user from stranger status to a regular user.
bgneal@232 50 """
bgneal@232 51 profile = user.get_profile()
bgneal@232 52 if user.is_active and profile.status == bio.models.STA_STRANGER:
bgneal@232 53 profile.status = bio.models.STA_ACTIVE
bgneal@232 54 profile.status_date = datetime.datetime.now()
bgneal@232 55 profile.save()
bgneal@232 56
bgneal@232 57
bgneal@232 58 @login_required
bgneal@232 59 def spammer(request, post_id):
bgneal@232 60 """This view allows moderators to deactivate spammer accounts."""
bgneal@232 61
bgneal@232 62 post = get_object_or_404(Post.objects.select_related(), pk=post_id)
bgneal@232 63 poster = post.user
bgneal@232 64 poster_profile = poster.get_profile()
bgneal@232 65
bgneal@460 66 can_moderate = perms.can_moderate(post.topic.forum, request.user)
bgneal@232 67 can_deactivate = (poster_profile.status == bio.models.STA_STRANGER and not
bgneal@232 68 poster.is_superuser)
bgneal@232 69
bgneal@232 70 if request.method == "POST" and can_moderate and can_deactivate:
bgneal@232 71 deactivate_spammer(poster)
bgneal@232 72
bgneal@316 73 email_admins(SPAMMER_NAILED_SUBJECT % poster.username,
bgneal@232 74 SPAMMER_NAILED_MSG_BODY % (
bgneal@232 75 request.user.username, poster.username))
bgneal@232 76
bgneal@232 77 logging.info(textwrap.dedent("""\
bgneal@232 78 SPAMMER DEACTIVATED: %s nailed %s for spam.
bgneal@232 79 IP: %s
bgneal@232 80 Message:
bgneal@232 81 %s
bgneal@316 82 """),
bgneal@316 83 request.user.username, poster.username, post.user_ip, post.body)
bgneal@232 84
bgneal@232 85 return HttpResponseRedirect(reverse('forums-spammer_nailed', args=[
bgneal@232 86 poster.id]))
bgneal@232 87
bgneal@232 88 return render_to_response('forums/spammer.html', {
bgneal@232 89 'can_moderate': can_moderate,
bgneal@232 90 'can_deactivate': can_deactivate,
bgneal@232 91 'post': post,
bgneal@232 92 },
bgneal@232 93 context_instance=RequestContext(request))
bgneal@232 94
bgneal@232 95
bgneal@232 96 @login_required
bgneal@232 97 def spammer_nailed(request, spammer_id):
bgneal@232 98 """This view presents a confirmation screen that the spammer has been
bgneal@232 99 deactivated.
bgneal@232 100 """
bgneal@232 101 user = get_object_or_404(User, pk=spammer_id)
bgneal@232 102 profile = user.get_profile()
bgneal@232 103
bgneal@232 104 success = not user.is_active and profile.status == bio.models.STA_SPAMMER
bgneal@232 105
bgneal@232 106 return render_to_response('forums/spammer_nailed.html', {
bgneal@232 107 'spammer': user,
bgneal@232 108 'success': success,
bgneal@232 109 },
bgneal@232 110 context_instance=RequestContext(request))
bgneal@232 111
bgneal@232 112
bgneal@232 113 @login_required
bgneal@232 114 def stranger(request, post_id):
bgneal@232 115 """This view allows a forum moderator or super user to promote a user from
bgneal@232 116 stranger status to regular user.
bgneal@232 117 """
bgneal@232 118 post = get_object_or_404(Post.objects.select_related(), pk=post_id)
bgneal@232 119 poster = post.user
bgneal@232 120 poster_profile = poster.get_profile()
bgneal@232 121
bgneal@460 122 can_moderate = perms.can_moderate(post.topic.forum, request.user)
bgneal@232 123 can_promote = poster_profile.status == bio.models.STA_STRANGER
bgneal@232 124
bgneal@232 125 if request.method == "POST" and can_moderate and can_promote:
bgneal@232 126 promote_stranger(poster)
bgneal@232 127
bgneal@316 128 logging.info("STRANGER PROMOTED: %s promoted %s.",
bgneal@316 129 request.user.username, poster.username)
bgneal@232 130
bgneal@232 131 return HttpResponseRedirect(post.get_absolute_url())
bgneal@232 132
bgneal@232 133 return render_to_response('forums/stranger.html', {
bgneal@232 134 'can_moderate': can_moderate,
bgneal@232 135 'can_promote': can_promote,
bgneal@232 136 'post': post,
bgneal@232 137 },
bgneal@232 138 context_instance=RequestContext(request))