@@ -606,6 +606,8 @@ async def update_member_role(
606606 ) -> WorkspaceMembership :
607607 if role not in {item .value for item in MembershipRole }:
608608 raise MembershipPermissionError ('Unknown Workspace role' )
609+ if role == MembershipRole .OWNER .value :
610+ raise MembershipPermissionError ('Workspace ownership cannot be transferred' )
609611
610612 async def operation (active_session : AsyncSession ) -> WorkspaceMembership :
611613 await self ._require_active_workspace (active_session , workspace_uuid )
@@ -617,8 +619,8 @@ async def operation(active_session: AsyncSession) -> WorkspaceMembership:
617619 target_account_uuid ,
618620 )
619621 self ._require_can_manage_target (persisted_actor , target , new_role = role )
620- if target .role == MembershipRole .OWNER .value and role != MembershipRole . OWNER . value :
621- await self . _require_another_owner ( active_session , workspace_uuid , target . account_uuid )
622+ if target .role == MembershipRole .OWNER .value :
623+ raise LastOwnerError ( 'The Workspace owner cannot be removed or demoted' )
622624 target .role = role
623625 await active_session .flush ()
624626 return target
@@ -644,7 +646,7 @@ async def operation(active_session: AsyncSession) -> WorkspaceMembership:
644646 )
645647 self ._require_can_manage_target (persisted_actor , target )
646648 if target .role == MembershipRole .OWNER .value :
647- await self . _require_another_owner ( active_session , workspace_uuid , target . account_uuid )
649+ raise LastOwnerError ( 'The Workspace owner cannot be removed or demoted' )
648650 target .status = MembershipStatus .REMOVED .value
649651 await active_session .flush ()
650652 return target
@@ -751,26 +753,6 @@ async def _load_actor(
751753 raise WorkspaceNotFoundError ('Workspace not found' )
752754 return persisted_actor
753755
754- async def _require_another_owner (
755- self ,
756- session : AsyncSession ,
757- workspace_uuid : str ,
758- excluded_account_uuid : str ,
759- ) -> None :
760- owners = (
761- await session .scalars (
762- sqlalchemy .select (WorkspaceMembership )
763- .where (
764- WorkspaceMembership .workspace_uuid == workspace_uuid ,
765- WorkspaceMembership .status == MembershipStatus .ACTIVE .value ,
766- WorkspaceMembership .role == MembershipRole .OWNER .value ,
767- )
768- .with_for_update ()
769- )
770- ).all ()
771- if not any (owner .account_uuid != excluded_account_uuid for owner in owners ):
772- raise LastOwnerError ('The last Workspace owner cannot be removed or demoted' )
773-
774756 def _require_actor_workspace (self , actor : WorkspaceMembership , workspace_uuid : str ) -> None :
775757 if actor .workspace_uuid != workspace_uuid or actor .status != MembershipStatus .ACTIVE .value :
776758 raise WorkspaceNotFoundError ('Workspace not found' )
0 commit comments