diff antispam/utils.py @ 581:ee87ea74d46b

For Django 1.4, rearranged project structure for new manage.py.
author Brian Neal <bgneal@gmail.com>
date Sat, 05 May 2012 17:10:48 -0500
parents gpp/antispam/utils.py@93f049a241ff
children c8b4dfb2d1e5
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/antispam/utils.py	Sat May 05 17:10:48 2012 -0500
@@ -0,0 +1,103 @@
+"""Antispam utility functions other apps can use."""
+import datetime
+import logging
+import textwrap
+
+from django.core.cache import cache
+
+from antispam import SPAM_PHRASE_KEY
+from antispam.models import SpamPhrase
+from core.functions import email_admins
+from bio.models import STA_SUSPENDED, STA_SPAMMER
+from comments.models import Comment
+from forums.tools import delete_user_posts
+
+
+def contains_spam(s):
+    """This function returns True if the supplied string s contains any spam
+    phrases and False otherwise.
+    """
+    phrases = _get_spam_phrases()
+    s = s.lower()
+    for spam in phrases:
+        if spam in s:
+            return True
+
+    return False
+
+
+def spam_check(request, content):
+    """This function checks the supplied content for spam if the user from the
+    supplied request is a stranger (new to the site). If spam is found, the
+    function makes a log entry, emails the admins, suspends the user's account
+    and returns True. If spam is not found, False is returned.
+    It is assumed that request.user is an authenticated user and thus has a
+    user profile.
+    """
+    user = request.user
+    if user.get_profile().is_stranger() and contains_spam(content):
+
+        ip = request.META.get('REMOTE_ADDR', "unknown")
+
+        msg = textwrap.dedent("""\
+            SPAM FILTER TRIPPED by %s
+            PATH: %s
+            IP: %s
+            Message:
+            %s
+            """ % (user.username, request.path, ip, content))
+
+        logging.info(msg)
+        email_admins("SPAM FILTER TRIPPED BY %s" % user.username, msg)
+        suspend_user(user)
+        return True
+
+    return False
+
+
+def suspend_user(user):
+    """This function marks the user as suspended."""
+    user.is_active = False
+    user.save()
+    profile = user.get_profile()
+    profile.status = STA_SUSPENDED
+    profile.status_date = datetime.datetime.now()
+    profile.save(content_update=False)
+    logging.info("User suspended: %s", user.username)
+
+
+def deactivate_spammer(user):
+    """
+    This function deactivate's the user, marks them as a spammer, then
+    deletes the user's comments and forum posts. The spammer's profile is
+    cleared so any spam links won't show up anymore.
+
+    """
+    user.is_active = False
+    user.save()
+
+    profile = user.get_profile()
+    profile.status = STA_SPAMMER
+    profile.status_date = datetime.datetime.now()
+    profile.reset_text_fields()
+    profile.save()
+
+    Comment.objects.filter(user=user).delete()
+    delete_user_posts(user)
+
+    logging.info("User deactivated for spam: %s", user.username)
+
+
+def _get_spam_phrases():
+    """
+    This function returns the current list of spam phrase strings.
+    The strings are cached to avoid hitting the database.
+
+    """
+    phrases = cache.get(SPAM_PHRASE_KEY)
+    if phrases:
+        return phrases
+
+    phrases = SpamPhrase.objects.values_list('phrase', flat=True)
+    cache.set(SPAM_PHRASE_KEY, phrases)
+    return phrases