From ad15d25e954887161f79e84adb35177f989fd329 Mon Sep 17 00:00:00 2001 From: Manuel Reinhardt Date: Tue, 23 Apr 2024 12:39:12 +0200 Subject: [PATCH] Clean up references to guest accounts in last_modifier_id In acc2353126 we changed `transferGuestSession` to update `last_modifier_id` and delete the guest account after all sessions have been transferred. This upgrade step does a similar thing with existing sessions. We don't update the modification date because we don't know when the session was transferred. We also double check that the guest account doesn't have any sessions associated with it so that we can safely delete it. Fixes syslabcom/scrum#2155 --- .../__init__.py | 0 .../upgrade.py | 33 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 src/euphorie/upgrade/deployment/v1/20240423105626_clean_up_last_modifier_id/__init__.py create mode 100644 src/euphorie/upgrade/deployment/v1/20240423105626_clean_up_last_modifier_id/upgrade.py diff --git a/src/euphorie/upgrade/deployment/v1/20240423105626_clean_up_last_modifier_id/__init__.py b/src/euphorie/upgrade/deployment/v1/20240423105626_clean_up_last_modifier_id/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/euphorie/upgrade/deployment/v1/20240423105626_clean_up_last_modifier_id/upgrade.py b/src/euphorie/upgrade/deployment/v1/20240423105626_clean_up_last_modifier_id/upgrade.py new file mode 100644 index 000000000..d5d7ef1b1 --- /dev/null +++ b/src/euphorie/upgrade/deployment/v1/20240423105626_clean_up_last_modifier_id/upgrade.py @@ -0,0 +1,33 @@ +from euphorie.client.model import Account +from euphorie.client.model import Session +from euphorie.client.model import SurveySession +from ftw.upgrade import UpgradeStep + +import logging + + +logger = logging.getLogger(__name__) + + +class CleanUpLastModifierId(UpgradeStep): + """Clean up last_modifier_id.""" + + def __call__(self): + session = Session() + obsolete_guest_users = ( + session.query(Account, SurveySession) + .filter(Account.id == SurveySession.last_modifier_id) + .filter(Account.id != SurveySession.account_id) + .filter(Account.account_type == "guest") + ) + for guest_user, assessment in obsolete_guest_users: + assessment.last_modifier_id = assessment.account_id + logger.info("Updated session %s", assessment.id) + num_assessments = ( + session.query(SurveySession) + .filter(SurveySession.account_id == guest_user.id) + .count() + ) + if num_assessments == 0: + session.delete(guest_user) + logger.info("Deleted user %s", guest_user.id)