This commit is contained in:
Artem Tsyrulnikov
2025-12-16 15:13:33 +03:00
parent 18b30eaf7f
commit 23eb5ae13d
19 changed files with 115 additions and 126 deletions

View File

@@ -47,6 +47,35 @@ class WorkspaceMemberOutput(pydantic.BaseModel):
user: WorkspaceMemberUserOutput
permissions: list[WorkspacePermissionOutput]
@classmethod
def from_domain(cls, member: domain.WorkspaceUser) -> 'WorkspaceMemberOutput':
if member.user is None:
raise ValueError('Workspace member user relation is not loaded')
permissions_map: dict[domain.PermissionKey, list[WorkspacePermissionScopeOutput]] = {}
for permission in getattr(member, 'permissions', []) or []:
permissions_map.setdefault(permission.permission, [])
for scope in getattr(member, 'permission_scopes', []) or []:
permissions_map.setdefault(scope.permission, []).append(
WorkspacePermissionScopeOutput(type=scope.scope_type, id=scope.scope_id)
)
return cls(
id=member.id,
status=member.status,
user=WorkspaceMemberUserOutput(
id=member.user.id,
telegram_id=member.user.telegram_id,
username=member.user.username,
),
permissions=[
WorkspacePermissionOutput(key=key, scopes=scopes)
for key, scopes in sorted(permissions_map.items(), key=lambda item: item[0].value)
],
)
class GetWorkspaceMembersOutput(pydantic.BaseModel):
members: list[WorkspaceMemberOutput]
@@ -119,6 +148,26 @@ class WorkspaceInviteOutput(pydantic.BaseModel):
user: WorkspaceMemberUserOutput
invited_by: WorkspaceMemberUserOutput
@classmethod
def from_domain(cls, invite: domain.WorkspaceInvite) -> 'WorkspaceInviteOutput':
if invite.user is None or invite.invited_by is None:
raise ValueError('Workspace invite relations are not loaded')
return cls(
id=invite.id,
status=invite.status,
user=WorkspaceMemberUserOutput(
id=invite.user.id,
telegram_id=invite.user.telegram_id,
username=invite.user.username,
),
invited_by=WorkspaceMemberUserOutput(
id=invite.invited_by.id,
telegram_id=invite.invited_by.telegram_id,
username=invite.invited_by.username,
),
)
class GetWorkspaceInvitesOutput(pydantic.BaseModel):
invites: list[WorkspaceInviteOutput]