Unverified Commit cb7357a5 authored by Marius van den Beek's avatar Marius van den Beek Committed by GitHub
Browse files

Merge pull request #18381 from davelopez/24.0_fix_private_role_can_be_none

[24.0] Fix user's private role can be missing
parents 62b60bd6 cc931e1d
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -144,15 +144,13 @@ class UserManager(base.ModelManager, deletable.PurgableManagerMixin):
        else:
            # Activation is off, every new user is active by default.
            user.active = True
        self.session().add(user)
        try:
        session = self.session()
            with transaction(session):
                session.commit()
            # TODO:?? flush needed for permissions below? If not, make optional
        session.add(user)
        try:
            # Creating a private role will commit the session
            self.app.security_agent.create_user_role(user, self.app)
        except exc.IntegrityError as db_err:
            raise exceptions.Conflict(str(db_err))
        self.app.security_agent.create_user_role(user, self.app)
        return user

    def delete(self, user, flush=True):
@@ -197,6 +195,10 @@ class UserManager(base.ModelManager, deletable.PurgableManagerMixin):
        if not user.deleted:
            raise exceptions.MessageException("User '%s' has not been deleted, so they cannot be purged." % user.email)
        private_role = self.app.security_agent.get_private_user_role(user)
        if private_role is None:
            raise exceptions.InconsistentDatabase(
                "User '%s' private role is missing while attempting to purge deleted user." % user.email
            )
        # Delete History
        for active_history in user.active_histories:
            self.session().refresh(active_history)
+3 −0
Original line number Diff line number Diff line
@@ -765,6 +765,9 @@ WHERE history.user_id != :user_id and history_dataset_association.dataset_id = :
        return self.get_private_user_role(user)

    def get_private_user_role(self, user, auto_create=False):
        if auto_create and user.id is None:
            # New user, directly create private role
            return self.create_private_user_role(user)
        stmt = (
            select(Role)
            .where(