From cd189927fe8731195848126cc7bd899f2aace846 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Wed, 7 Sep 2022 23:01:07 +0200 Subject: [PATCH] [ADDED] Update displayed name when main is changed --- .../services/modules/smf/auth_hooks.py | 6 ++++ allianceauth/services/modules/smf/manager.py | 25 ++++++++++++++ allianceauth/services/modules/smf/tasks.py | 34 +++++++++++++++++++ 3 files changed, 65 insertions(+) diff --git a/allianceauth/services/modules/smf/auth_hooks.py b/allianceauth/services/modules/smf/auth_hooks.py index d2c9618d..8065e935 100644 --- a/allianceauth/services/modules/smf/auth_hooks.py +++ b/allianceauth/services/modules/smf/auth_hooks.py @@ -38,6 +38,12 @@ class SmfService(ServicesHook): if SmfTasks.has_account(user): SmfTasks.update_groups.delay(user.pk) + def sync_nickname(self, user): + logger.debug(f"Updating {self.name} displayed name for {user}") + + if SmfTasks.has_account(user): + SmfTasks.update_display_name.apply_async(args=[user.pk], countdown=5) # cooldown on this task to ensure DB clean when syncing + def update_all_groups(self): logger.debug('Update all %s groups called' % self.name) SmfTasks.update_all_groups.delay() diff --git a/allianceauth/services/modules/smf/manager.py b/allianceauth/services/modules/smf/manager.py index 1d406a79..9a3d7049 100644 --- a/allianceauth/services/modules/smf/manager.py +++ b/allianceauth/services/modules/smf/manager.py @@ -11,6 +11,8 @@ from packaging import version from django.db import connections from django.conf import settings +from django.contrib.auth.models import User + from allianceauth.eveonline.models import EveCharacter logger = logging.getLogger(__name__) @@ -40,6 +42,8 @@ class SmfManager: SQL_UPD_USER = r"UPDATE %smembers SET email_address = %%s, passwd = %%s, real_name = %%s WHERE member_name = %%s" % TABLE_PREFIX + SQL_UPD_DISPLAY_NAME = r"UPDATE %smembers SET real_name = %%s WHERE member_name = %%s" % TABLE_PREFIX + SQL_DIS_USER = r"UPDATE %smembers SET email_address = %%s, passwd = %%s WHERE member_name = %%s" % TABLE_PREFIX SQL_USER_ID_FROM_USERNAME = r"SELECT id_member from %smembers WHERE member_name = %%s" % TABLE_PREFIX @@ -273,6 +277,27 @@ class SmfManager: logger.error(f"Unable to delete smf user {username} - user not found on smf.") return False + @classmethod + def update_display_name(cls, user: User): + logger.debug(f"Updating SMF displayed name for user {user}") + cursor = connections['smf'].cursor() + smf_username = user.smf.username + + try: + display_name = user.profile.main_character.character_name + except Exception as exc: + logger.exception( + f"Unable to find a main character name for {user}, skipping... ({exc})" + ) + display_name = smf_username + + if cls.check_user(smf_username): + cursor.execute(cls.SQL_UPD_DISPLAY_NAME, [display_name, smf_username]) + logger.info(f"Updated displayed name for smf user {smf_username}") + return True + logger.error(f"Unable to update smf user {smf_username} - user not found on smf.") + return False + @classmethod def update_groups(cls, username, groups): userid = cls.get_user_id(username) diff --git a/allianceauth/services/modules/smf/tasks.py b/allianceauth/services/modules/smf/tasks.py index 580c8e86..3f6392e0 100644 --- a/allianceauth/services/modules/smf/tasks.py +++ b/allianceauth/services/modules/smf/tasks.py @@ -57,6 +57,40 @@ class SmfTasks: else: logger.debug("User does not have an smf account") + @staticmethod + @shared_task(bind=True, name="smf.update_display_name", base=QueueOnce) + def update_display_name(self, pk): + user = User.objects.get(pk=pk) + logger.debug(f"Updating SMF displayed name user {user}") + + if SmfTasks.has_account(user): + try: + if not SmfManager.update_display_name(user): + raise Exception("SMF Displayed Name Sync failed") + logger.debug(f"Updated user {user} SMF displayed name.") + return True + except SmfUser.DoesNotExist: + logger.info( + f"SMF displayed name sync failed for {user}, " + "user does not have a SMF account" + ) + except: + logger.exception( + f"SMF displayed name sync failed for {user}, retrying in 10 mins" + ) + raise self.retry(countdown=60 * 10) + else: + logger.debug(f"User {user} does not have a SMF account, skipping") + + return False + + @staticmethod + @shared_task(name="smf.update_all_display_names") + def update_all_display_names(): + logger.debug("Updating ALL SMF display names") + for smf_user in SmfUser.objects.exclude(username__exact=''): + SmfTasks.update_display_name.delay(smf_user) + @staticmethod @shared_task(name="smf.update_all_groups") def update_all_groups():