From 127e98ecbc5c03fbc736e6bd15480ec741d9fb16 Mon Sep 17 00:00:00 2001 From: Andrew Williams Date: Wed, 9 Mar 2011 12:53:07 +0000 Subject: [PATCH] Move blacklist checking out of the Application model --- hr/models.py | 44 +------------------------------------------- hr/tasks.py | 20 ++++++++++++++++++++ hr/utils.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 43 deletions(-) create mode 100644 hr/tasks.py create mode 100644 hr/utils.py diff --git a/hr/models.py b/hr/models.py index d374897..3de5b23 100644 --- a/hr/models.py +++ b/hr/models.py @@ -33,49 +33,7 @@ class Application(models.Model): @property def blacklist_values(self): - """ - Returns a list of blacklist values that apply to the application - """ - - blacklist = [] - bl_items = Blacklist.objects.filter(models.Q(expiry_date__gt=datetime.now()) | models.Q(expiry_date=None)) - - # Check Reddit blacklists - if installed('reddit'): - reddit_uids = self.user.redditaccount_set.all().values_list('username', flat=True) - objs = bl_items.filter(type=BLACKLIST_TYPE_REDDIT, value__in=reddit_uids) - blacklist.extend(objs) - - # Check email blacklists - blacklist.extend(bl_items.filter(type=BLACKLIST_TYPE_EMAIL, value=self.user.email.lower())) - - # Check Auth blacklists - blacklist.extend(bl_items.filter(type=BLACKLIST_TYPE_AUTH, value=self.user.username.lower())) - - # Check EVE Related blacklists - evechars = EVEPlayerCharacter.objects.filter(eveaccount__user=self.user).select_related('corporation__alliance') - - # Check Character blacklists - characters = evechars.values_list('name', flat=True) - objs = bl_items.filter(type=BLACKLIST_TYPE_CHARACTER, value__in=characters) - blacklist.extend(objs) - - # Check Corporation blacklists - corporations = evechars.values_list('corporation__name', flat=True) - objs = bl_items.filter(type=BLACKLIST_TYPE_CORPORATION, value__in=corporations) - blacklist.extend(objs) - - # Check Alliance blacklists - alliances = evechars.values_list('corporation__alliance__name', flat=True) - objs = bl_items.filter(type=BLACKLIST_TYPE_ALLIANCE, value__in=alliances) - blacklist.extend(objs) - - # Check API Key blacklists - keys = self.user.eveaccount_set.all().values_list('api_user_id', flat=True) - objs = bl_items.filter(type=BLACKLIST_TYPE_APIUSERID, value__in=keys) - blacklist.extend(objs) - - return blacklist + return blacklist_values(self.user) @property def last_action(self): diff --git a/hr/tasks.py b/hr/tasks.py new file mode 100644 index 0000000..d0a797b --- /dev/null +++ b/hr/tasks.py @@ -0,0 +1,20 @@ +from django.conf import settings +import logging +from datetime import datetime, timedelta +from celery.decorators import task +from hr.utils import blacklist_values +from django.contrib.auth.models import User + +@task(ignore_result=True) +def blacklist_check(): + log = blacklist_check.get_logger() + + users = User.objects.filter(active=True) + + for u in users: + if users.groups.count() > 0: + # Has groups + val = blacklist_values(user) + if len(val) > 0: + # Report possible issue + log.warn("Suspect User: %s, %s entries found" % (u.username, len(val))) diff --git a/hr/utils.py b/hr/utils.py new file mode 100644 index 0000000..09c4992 --- /dev/null +++ b/hr/utils.py @@ -0,0 +1,48 @@ +from hr.app_defines import * +from hr.models import Blacklist + +def blacklist_values(user): + """ + Returns a list of blacklist values that apply to the application + """ + + blacklist = [] + bl_items = Blacklist.objects.filter(models.Q(expiry_date__gt=datetime.now()) | models.Q(expiry_date=None)) + + # Check Reddit blacklists + if installed('reddit'): + reddit_uids = user.redditaccount_set.all().values_list('username', flat=True) + objs = bl_items.filter(type=BLACKLIST_TYPE_REDDIT, value__in=reddit_uids) + blacklist.extend(objs) + + # Check email blacklists + blacklist.extend(bl_items.filter(type=BLACKLIST_TYPE_EMAIL, value=user.email.lower())) + + # Check Auth blacklists + blacklist.extend(bl_items.filter(type=BLACKLIST_TYPE_AUTH, value=user.username.lower())) + + # Check EVE Related blacklists + evechars = EVEPlayerCharacter.objects.filter(eveaccount__user=user).select_related('corporation__alliance') + + # Check Character blacklists + characters = evechars.values_list('name', flat=True) + objs = bl_items.filter(type=BLACKLIST_TYPE_CHARACTER, value__in=characters) + blacklist.extend(objs) + + # Check Corporation blacklists + corporations = evechars.values_list('corporation__name', flat=True) + objs = bl_items.filter(type=BLACKLIST_TYPE_CORPORATION, value__in=corporations) + blacklist.extend(objs) + + # Check Alliance blacklists + alliances = evechars.values_list('corporation__alliance__name', flat=True) + objs = bl_items.filter(type=BLACKLIST_TYPE_ALLIANCE, value__in=alliances) + blacklist.extend(objs) + + # Check API Key blacklists + keys = user.eveaccount_set.all().values_list('api_user_id', flat=True) + objs = bl_items.filter(type=BLACKLIST_TYPE_APIUSERID, value__in=keys) + blacklist.extend(objs) + + return blacklist +