annotate forums/views/spam.py @ 661:15dbe0ccda95

Prevent exceptions when viewing downloads in the admin when the file doesn't exist on the filesystem. This is usually seen in development but can also happen in production if the file is missing.
author Brian Neal <bgneal@gmail.com>
date Tue, 14 May 2013 21:02:47 -0500
parents ee87ea74d46b
children 9e803323a0d0
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.shortcuts import get_object_or_404
bgneal@232 12 from django.shortcuts import render_to_response
bgneal@232 13 from django.template import RequestContext
bgneal@232 14 from django.contrib.auth.models import User
bgneal@232 15
bgneal@232 16 from forums.models import Post
bgneal@460 17 import forums.permissions as perms
bgneal@232 18 import bio.models
bgneal@232 19 from core.functions import email_admins
bgneal@563 20 from antispam.utils import deactivate_spammer
bgneal@232 21
bgneal@232 22
bgneal@232 23 SPAMMER_NAILED_SUBJECT = "Spammer Nailed: %s"
bgneal@232 24 SPAMMER_NAILED_MSG_BODY = """
bgneal@232 25 The admin/moderator user %s has just deactivated the account of %s for spam.
bgneal@232 26 """
bgneal@232 27
bgneal@232 28
bgneal@232 29 def promote_stranger(user):
bgneal@232 30 """This function upgrades the user from stranger status to a regular user.
bgneal@232 31 """
bgneal@232 32 profile = user.get_profile()
bgneal@232 33 if user.is_active and profile.status == bio.models.STA_STRANGER:
bgneal@232 34 profile.status = bio.models.STA_ACTIVE
bgneal@232 35 profile.status_date = datetime.datetime.now()
bgneal@562 36 profile.save(content_update=False)
bgneal@232 37
bgneal@232 38
bgneal@232 39 @login_required
bgneal@232 40 def spammer(request, post_id):
bgneal@232 41 """This view allows moderators to deactivate spammer accounts."""
bgneal@232 42
bgneal@232 43 post = get_object_or_404(Post.objects.select_related(), pk=post_id)
bgneal@232 44 poster = post.user
bgneal@232 45 poster_profile = poster.get_profile()
bgneal@232 46
bgneal@460 47 can_moderate = perms.can_moderate(post.topic.forum, request.user)
bgneal@232 48 can_deactivate = (poster_profile.status == bio.models.STA_STRANGER and not
bgneal@232 49 poster.is_superuser)
bgneal@232 50
bgneal@232 51 if request.method == "POST" and can_moderate and can_deactivate:
bgneal@232 52 deactivate_spammer(poster)
bgneal@232 53
bgneal@316 54 email_admins(SPAMMER_NAILED_SUBJECT % poster.username,
bgneal@232 55 SPAMMER_NAILED_MSG_BODY % (
bgneal@232 56 request.user.username, poster.username))
bgneal@232 57
bgneal@232 58 logging.info(textwrap.dedent("""\
bgneal@232 59 SPAMMER DEACTIVATED: %s nailed %s for spam.
bgneal@232 60 IP: %s
bgneal@232 61 Message:
bgneal@232 62 %s
bgneal@316 63 """),
bgneal@316 64 request.user.username, poster.username, post.user_ip, post.body)
bgneal@232 65
bgneal@232 66 return HttpResponseRedirect(reverse('forums-spammer_nailed', args=[
bgneal@232 67 poster.id]))
bgneal@232 68
bgneal@232 69 return render_to_response('forums/spammer.html', {
bgneal@232 70 'can_moderate': can_moderate,
bgneal@232 71 'can_deactivate': can_deactivate,
bgneal@232 72 'post': post,
bgneal@232 73 },
bgneal@232 74 context_instance=RequestContext(request))
bgneal@232 75
bgneal@232 76
bgneal@232 77 @login_required
bgneal@232 78 def spammer_nailed(request, spammer_id):
bgneal@232 79 """This view presents a confirmation screen that the spammer has been
bgneal@232 80 deactivated.
bgneal@232 81 """
bgneal@232 82 user = get_object_or_404(User, pk=spammer_id)
bgneal@232 83 profile = user.get_profile()
bgneal@232 84
bgneal@232 85 success = not user.is_active and profile.status == bio.models.STA_SPAMMER
bgneal@232 86
bgneal@232 87 return render_to_response('forums/spammer_nailed.html', {
bgneal@232 88 'spammer': user,
bgneal@232 89 'success': success,
bgneal@232 90 },
bgneal@232 91 context_instance=RequestContext(request))
bgneal@232 92
bgneal@232 93
bgneal@232 94 @login_required
bgneal@232 95 def stranger(request, post_id):
bgneal@232 96 """This view allows a forum moderator or super user to promote a user from
bgneal@232 97 stranger status to regular user.
bgneal@232 98 """
bgneal@232 99 post = get_object_or_404(Post.objects.select_related(), pk=post_id)
bgneal@232 100 poster = post.user
bgneal@232 101 poster_profile = poster.get_profile()
bgneal@232 102
bgneal@460 103 can_moderate = perms.can_moderate(post.topic.forum, request.user)
bgneal@232 104 can_promote = poster_profile.status == bio.models.STA_STRANGER
bgneal@232 105
bgneal@232 106 if request.method == "POST" and can_moderate and can_promote:
bgneal@232 107 promote_stranger(poster)
bgneal@232 108
bgneal@316 109 logging.info("STRANGER PROMOTED: %s promoted %s.",
bgneal@316 110 request.user.username, poster.username)
bgneal@232 111
bgneal@232 112 return HttpResponseRedirect(post.get_absolute_url())
bgneal@232 113
bgneal@232 114 return render_to_response('forums/stranger.html', {
bgneal@232 115 'can_moderate': can_moderate,
bgneal@232 116 'can_promote': can_promote,
bgneal@232 117 'post': post,
bgneal@232 118 },
bgneal@232 119 context_instance=RequestContext(request))