Replace run_databaseUpdate with m2m receiver

- listed to user group changes -> queue service group update
Should help with #318
This commit is contained in:
Adarnof 2016-03-22 06:04:08 +00:00
parent 3b62c5eaaf
commit 71779a8ab2
3 changed files with 45 additions and 153 deletions

View File

@ -0,0 +1 @@
import signals

28
celerytask/signals.py Normal file
View File

@ -0,0 +1,28 @@
from django.db.models.signals import m2m_changed
from django.dispatch import receiver
from django.contrib.auth.models import User
import logging
from .tasks import update_jabber_groups
from .tasks import update_mumble_groups
from .tasks import update_forum_groups
from .tasks import update_ipboard_groups
from .tasks import update_discord_groups
logger = logging.getLogger(__name__)
@receiver(m2m_changed, sender=User.groups.through)
def m2m_changed_user_groups(sender, instance, action, *args, **kwargs):
logger.debug("Received m2m_changed from %s groups with action %s" % (instance, action))
if action=="post_add" or action=="post_remove" or action=="post_clear":
logger.debug("Triggering service group update for %s" % instance)
auth, c = AuthServicesInfo.objects.get_or_create(user=instance)
if auth.jabber_username:
update_jabber_groups.delay(instance)
if auth.jabber_username:
update_jabber_groups.delay(instance)
if auth.forum_username:
update_forum_groups.delay(instance)
if auth.ipboard_groups:
update_ipboard_groups.delay(instance)
if auth.discord_groups:
update_discord_groups.delay(instance)

View File

@ -4,7 +4,6 @@ from django.contrib.auth.models import User
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from notifications import notify from notifications import notify
from celery import task from celery import task
from models import SyncGroupCache
from celery.task.schedules import crontab from celery.task.schedules import crontab
from services.managers.openfire_manager import OpenfireManager from services.managers.openfire_manager import OpenfireManager
from services.managers.mumble_manager import MumbleManager from services.managers.mumble_manager import MumbleManager
@ -53,15 +52,13 @@ def disable_member(user):
def is_teamspeak3_active(): def is_teamspeak3_active():
return settings.ENABLE_AUTH_TEAMSPEAK3 or settings.ENABLE_BLUE_TEAMSPEAK3 return settings.ENABLE_AUTH_TEAMSPEAK3 or settings.ENABLE_BLUE_TEAMSPEAK3
@task
def update_jabber_groups(user): def update_jabber_groups(user):
logger.debug("Updating jabber groups for user %s" % user) logger.debug("Updating jabber groups for user %s" % user)
syncgroups = SyncGroupCache.objects.filter(user=user)
authserviceinfo = AuthServicesInfo.objects.get(user=user) authserviceinfo = AuthServicesInfo.objects.get(user=user)
groups = [] groups = []
logger.debug("User %s has %s syncgroups." % (user, len(syncgroups))) for group in user.groups.all():
for syncgroup in syncgroups: groups.append(str(group.name))
groups.append(str(syncgroup.groupname))
if len(groups) == 0: if len(groups) == 0:
groups.append('empty') groups.append('empty')
logger.debug("Updating user %s jabber groups to %s" % (user, groups)) logger.debug("Updating user %s jabber groups to %s" % (user, groups))
@ -69,52 +66,46 @@ def update_jabber_groups(user):
OpenfireManager.update_user_groups(authserviceinfo.jabber_username, authserviceinfo.jabber_password, groups) OpenfireManager.update_user_groups(authserviceinfo.jabber_username, authserviceinfo.jabber_password, groups)
logger.debug("Updated user %s jabber groups." % user) logger.debug("Updated user %s jabber groups." % user)
@task
def update_mumble_groups(user): def update_mumble_groups(user):
logger.debug("Updating mumble groups for user %s" % user) logger.debug("Updating mumble groups for user %s" % user)
syncgroups = SyncGroupCache.objects.filter(user=user)
authserviceinfo = AuthServicesInfo.objects.get(user=user) authserviceinfo = AuthServicesInfo.objects.get(user=user)
groups = [] groups = []
logger.debug("User %s has %s syncgroups." % (user, len(syncgroups))) for group in user.groups.all():
for syncgroup in syncgroups: groups.append(str(group.name))
groups.append(str(syncgroup.groupname))
if len(groups) == 0: if len(groups) == 0:
groups.append('empty') groups.append('empty')
logger.debug("Updating user %s mumble groups to %s" % (user, groups)) logger.debug("Updating user %s mumble groups to %s" % (user, groups))
MumbleManager.update_groups(authserviceinfo.mumble_username, groups) MumbleManager.update_groups(authserviceinfo.mumble_username, groups)
logger.debug("Updated user %s mumble groups." % user) logger.debug("Updated user %s mumble groups." % user)
@task
def update_forum_groups(user): def update_forum_groups(user):
logger.debug("Updating forum groups for user %s" % user) logger.debug("Updating forum groups for user %s" % user)
syncgroups = SyncGroupCache.objects.filter(user=user)
authserviceinfo = AuthServicesInfo.objects.get(user=user) authserviceinfo = AuthServicesInfo.objects.get(user=user)
groups = [] groups = []
logger.debug("User %s has %s syncgroups." % (user, len(syncgroups))) for group in user.groups.all():
for syncgroup in syncgroups: groups.append(str(group.name))
groups.append(str(syncgroup.groupname))
if len(groups) == 0: if len(groups) == 0:
groups.append('empty') groups.append('empty')
logger.debug("Updating user %s forum groups to %s" % (user, groups)) logger.debug("Updating user %s forum groups to %s" % (user, groups))
Phpbb3Manager.update_groups(authserviceinfo.forum_username, groups) Phpbb3Manager.update_groups(authserviceinfo.forum_username, groups)
logger.debug("Updated user %s forum groups." % user) logger.debug("Updated user %s forum groups." % user)
@task
def update_ipboard_groups(user): def update_ipboard_groups(user):
logger.debug("Updating user %s ipboard groups." % user) logger.debug("Updating user %s ipboard groups." % user)
syncgroups = SyncGroupCache.objects.filter(user=user)
authserviceinfo = AuthServicesInfo.objects.get(user=user) authserviceinfo = AuthServicesInfo.objects.get(user=user)
groups = [] groups = []
logger.debug("User %s has %s syncgroups." % (user, len(syncgroups))) for group in user.groups.all():
for syncgroup in syncgroups: groups.append(str(group.name))
groups.append(str(syncgroup.groupname))
if len(groups) == 0: if len(groups) == 0:
groups.append('empty') groups.append('empty')
logger.debug("Updating user %s ipboard groups to %s" % (user, groups)) logger.debug("Updating user %s ipboard groups to %s" % (user, groups))
IPBoardManager.update_groups(authserviceinfo.ipboard_username, groups) IPBoardManager.update_groups(authserviceinfo.ipboard_username, groups)
logger.debug("Updated user %s ipboard groups." % user) logger.debug("Updated user %s ipboard groups." % user)
@task
def update_teamspeak3_groups(user): def update_teamspeak3_groups(user):
logger.debug("Updating user %s teamspeak3 groups" % user) logger.debug("Updating user %s teamspeak3 groups" % user)
usergroups = user.groups.all() usergroups = user.groups.all()
@ -130,15 +121,12 @@ def update_teamspeak3_groups(user):
Teamspeak3Manager.update_groups(authserviceinfo.teamspeak3_uid, groups) Teamspeak3Manager.update_groups(authserviceinfo.teamspeak3_uid, groups)
logger.debug("Updated user %s teamspeak3 groups." % user) logger.debug("Updated user %s teamspeak3 groups." % user)
@task
def update_discord_groups(user): def update_discord_groups(user):
logger.debug("Updating discord groups for user %s" % user) logger.debug("Updating discord groups for user %s" % user)
syncgroups = SyncGroupCache.objects.filter(user=user)
authserviceinfo = AuthServicesInfo.objects.get(user=user) authserviceinfo = AuthServicesInfo.objects.get(user=user)
groups = [] for group in user.groups.all():
for syncgroup in syncgroups: groups.append(str(group.name))
groups.append(str(syncgroup.groupname))
logger.debug("User %s has %s syncgroups." % (user, len(syncgroups)))
if len(groups) == 0: if len(groups) == 0:
logger.debug("No syncgroups found for user. Adding empty group.") logger.debug("No syncgroups found for user. Adding empty group.")
groups.append('empty') groups.append('empty')
@ -146,113 +134,6 @@ def update_discord_groups(user):
DiscordManager.update_groups(authserviceinfo.discord_uid, groups) DiscordManager.update_groups(authserviceinfo.discord_uid, groups)
logger.debug("Updated user %s discord groups." % user) logger.debug("Updated user %s discord groups." % user)
def create_syncgroup_for_user(user, groupname, servicename):
logger.debug("Creating syncgroupcache for user %s group %s in service %s" % (user, groupname, servicename))
synccache = SyncGroupCache()
synccache.groupname = groupname
synccache.user = user
synccache.servicename = servicename
synccache.save()
logger.info("Created syncgroup for user %s group %s in service %s" % (user, groupname, servicename))
def remove_all_syncgroups_for_service(user, servicename):
logger.debug("Removing all syncgroups for user %s service %s" % (user, servicename))
syncgroups = SyncGroupCache.objects.filter(user=user)
logger.debug("User %s has %s syncgroups." % (user, len(syncgroups)))
for syncgroup in syncgroups:
if syncgroup.servicename == servicename:
logger.debug("Deleting syncgroups %s" % syncgroup)
syncgroup.delete()
logger.info("Removed all syncgroups for user %s service %s" % (user, servicename))
def add_to_databases(user, groups, syncgroups):
logger.debug("add_to_database for user %s called. groups %s - syncgroups %s" % (user, groups, syncgroups))
authserviceinfo = None
try:
authserviceinfo = AuthServicesInfo.objects.get(user=user)
logger.debug("Got authservicesinfo object %s" % authserviceinfo)
except:
logger.debug("No authservicesinfo object found for user %s" % user)
pass
if authserviceinfo:
authserviceinfo = AuthServicesInfo.objects.get(user=user)
if authserviceinfo.teamspeak3_uid and authserviceinfo.teamspeak3_uid != "":
logger.debug("Updating user TS groups.")
update_teamspeak3_groups(user)
for group in groups:
if authserviceinfo.jabber_username and authserviceinfo.jabber_username != "":
if syncgroups.filter(groupname=group.name).filter(servicename="openfire").exists() is not True:
logger.debug("User %s has jabber username %s - missing group %s." % (user, authserviceinfo.jabber_username, group.name))
create_syncgroup_for_user(user, group.name, "openfire")
update_jabber_groups(user)
if authserviceinfo.mumble_username and authserviceinfo.mumble_username != "":
if syncgroups.filter(groupname=group.name).filter(servicename="mumble").exists() is not True:
logger.debug("User %s has mumble username %s - missing group %s." % (user, authserviceinfo.mumble_username, group.name))
create_syncgroup_for_user(user, group.name, "mumble")
update_mumble_groups(user)
if authserviceinfo.forum_username and authserviceinfo.forum_username != "":
if syncgroups.filter(groupname=group.name).filter(servicename="phpbb3").exists() is not True:
logger.debug("User %s has phpbb username %s - missing group %s." % (user, authserviceinfo.forum_username, group.name))
create_syncgroup_for_user(user, group.name, "phpbb3")
update_forum_groups(user)
if authserviceinfo.ipboard_username and authserviceinfo.ipboard_username != "":
if syncgroups.filter(groupname=group.name).filter(servicename="ipboard").exists() is not True:
logger.debug("User %s has ipboard username %s - missing group %s." % (user, authserviceinfo.ipboard_username, group.name))
create_syncgroup_for_user(user, group.name, "ipboard")
update_ipboard_groups(user)
if authserviceinfo.discord_uid and authserviceinfo.discord_uid != "":
if syncgroups.filter(groupname=group.name).filter(servicename="discord").exists() is not True:
logger.debug("User %s has discord uid %s - missing group %s." % (user, authserviceinfo.discord_uid, group.name))
create_syncgroup_for_user(user, group.name, "discord")
update_discord_groups(user)
def remove_from_databases(user, groups, syncgroups):
logger.debug("remove_from_database for user %s called. groups %s - syncgroups %s" % (user, groups, syncgroups))
authserviceinfo = None
try:
authserviceinfo = AuthServicesInfo.objects.get(user=user)
logger.debug("Got authservicesinfo object %s" % authserviceinfo)
except:
logger.debug("No authservicesinfo object found for user %s" % user)
pass
if authserviceinfo:
update = False
for syncgroup in syncgroups:
group = groups.filter(name=syncgroup.groupname)
logger.debug("Got group %s for syncgroup %s" % (group, syncgroup))
if not group:
logger.debug("Deleting syncgroup %s" % syncgroup)
syncgroup.delete()
update = True
if update:
logger.debug("Syncgroups updated. Propogating to services for user %s" % user)
if authserviceinfo.jabber_username and authserviceinfo.jabber_username != "":
logger.debug("User %s has jabber username %s - updating groups." % (user, authserviceinfo.jabber_username))
update_jabber_groups(user)
if authserviceinfo.mumble_username and authserviceinfo.mumble_username != "":
logger.debug("User %s has mumble username %s - updating groups." % (user, authserviceinfo.mumble_username))
update_mumble_groups(user)
if authserviceinfo.forum_username and authserviceinfo.forum_username != "":
logger.debug("User %s has forum username %s - updating groups." % (user, authserviceinfo.forum_username))
update_forum_groups(user)
if authserviceinfo.ipboard_username and authserviceinfo.ipboard_username != "":
logger.debug("User %s has ipboard username %s - updating groups." % (user, authserviceinfo.ipboard_username))
update_ipboard_groups(user)
if authserviceinfo.teamspeak3_uid and authserviceinfo.teamspeak3_uid != "":
logger.debug("User %s has ts3 uid %s - updating groups." % (user, authserviceinfo.teamspeak3_uid))
update_teamspeak3_groups(user)
if authserviceinfo.discord_uid and authserviceinfo.discord_uid != "":
logger.debug("User %s has discord uid %s - updating groups." % (user, authserviceinfo.discord_uid))
update_discord_groups(user)
def assign_corp_group(auth): def assign_corp_group(auth):
corp_group = None corp_group = None
if auth.main_char_id: if auth.main_char_id:
@ -420,24 +301,6 @@ def set_state(user):
if change: if change:
notify(user, "Membership State Change", message="You membership state has been changed to %s" % state) notify(user, "Membership State Change", message="You membership state has been changed to %s" % state)
# Run every minute
@periodic_task(run_every=crontab(minute="*/10"))
def run_databaseUpdate():
logger.debug("Starting database update.")
users = User.objects.all()
if (is_teamspeak3_active()):
logger.debug("TS3 installed. Syncing local group objects.")
Teamspeak3Manager._sync_ts_group_db()
for user in users:
logger.debug("Initiating database update for user %s" % user)
groups = user.groups.all()
logger.debug("User has groups %s" % groups)
syncgroups = SyncGroupCache.objects.filter(user=user)
logger.debug("User has syncgroups %s" % syncgroups)
add_to_databases(user, groups, syncgroups)
remove_from_databases(user, groups, syncgroups)
time.sleep(1)
# Run every 2 hours # Run every 2 hours
@periodic_task(run_every=crontab(minute="0", hour="*/2")) @periodic_task(run_every=crontab(minute="0", hour="*/2"))
def run_discord_token_cleanup(): def run_discord_token_cleanup():