mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-08-09 12:40:59 +00:00
Merge remote-tracking branch 'origin/master' into dev/4.11.x
This commit is contained in:
@@ -30,12 +30,14 @@ def _workspace_payload(workspace: Workspace) -> dict[str, typing.Any]:
|
||||
def _membership_payload(
|
||||
membership: WorkspaceMembership,
|
||||
*,
|
||||
display_name: str,
|
||||
email: str,
|
||||
) -> dict[str, typing.Any]:
|
||||
return {
|
||||
'uuid': membership.uuid,
|
||||
'workspace_uuid': membership.workspace_uuid,
|
||||
'account_uuid': membership.account_uuid,
|
||||
'display_name': display_name,
|
||||
'email': email,
|
||||
'role': membership.role,
|
||||
'status': membership.status,
|
||||
@@ -94,7 +96,11 @@ class WorkspacesRouterGroup(group.RouterGroup):
|
||||
workspaces.append(
|
||||
{
|
||||
'workspace': _workspace_payload(access.workspace),
|
||||
'membership': _membership_payload(access.membership, email=account.user),
|
||||
'membership': _membership_payload(
|
||||
access.membership,
|
||||
display_name=account.user,
|
||||
email=account.normalized_email,
|
||||
),
|
||||
'permissions': sorted(permissions_for_role(access.membership.role)),
|
||||
'placement_generation': access.execution.placement_generation,
|
||||
'plan_name': plan_name,
|
||||
@@ -137,6 +143,7 @@ class WorkspacesRouterGroup(group.RouterGroup):
|
||||
'uuid': None,
|
||||
'workspace_uuid': request_context.workspace_uuid,
|
||||
'account_uuid': None,
|
||||
'display_name': None,
|
||||
'email': None,
|
||||
'role': 'owner',
|
||||
'status': 'active',
|
||||
@@ -154,7 +161,11 @@ class WorkspacesRouterGroup(group.RouterGroup):
|
||||
return self.success(
|
||||
data={
|
||||
'workspace': _workspace_payload(workspace),
|
||||
'membership': _membership_payload(membership, email=account.user),
|
||||
'membership': _membership_payload(
|
||||
membership,
|
||||
display_name=account.user,
|
||||
email=account.normalized_email,
|
||||
),
|
||||
'permissions': sorted(request_context.workspace.permissions),
|
||||
'placement_generation': request_context.placement_generation,
|
||||
'plan_name': plan_name,
|
||||
@@ -283,7 +294,8 @@ class WorkspacesRouterGroup(group.RouterGroup):
|
||||
data={
|
||||
'member': _membership_payload(
|
||||
member,
|
||||
email=account.user if account is not None else '',
|
||||
display_name=account.user if account is not None else '',
|
||||
email=account.normalized_email if account is not None else '',
|
||||
)
|
||||
}
|
||||
)
|
||||
@@ -302,7 +314,11 @@ class WorkspacesRouterGroup(group.RouterGroup):
|
||||
|
||||
@staticmethod
|
||||
def _member_view_payload(view: WorkspaceMemberView) -> dict[str, typing.Any]:
|
||||
return _membership_payload(view.membership, email=view.email)
|
||||
return _membership_payload(
|
||||
view.membership,
|
||||
display_name=view.display_name,
|
||||
email=view.email,
|
||||
)
|
||||
|
||||
|
||||
@group.group_class('invitations', '/api/v1/invitations')
|
||||
|
||||
@@ -88,6 +88,7 @@ class ResolvedWorkspaceAccess:
|
||||
@dataclasses.dataclass(frozen=True, slots=True)
|
||||
class WorkspaceMemberView:
|
||||
membership: WorkspaceMembership
|
||||
display_name: str
|
||||
email: str
|
||||
|
||||
|
||||
@@ -294,7 +295,7 @@ class WorkspaceCollaborationService:
|
||||
async def operation(active_session: AsyncSession) -> list[WorkspaceMemberView]:
|
||||
await self._load_actor(active_session, workspace_uuid, actor)
|
||||
statement = (
|
||||
sqlalchemy.select(WorkspaceMembership, User.user)
|
||||
sqlalchemy.select(WorkspaceMembership, User.user, User.normalized_email)
|
||||
.join(User, User.uuid == WorkspaceMembership.account_uuid)
|
||||
.where(
|
||||
WorkspaceMembership.workspace_uuid == workspace_uuid,
|
||||
@@ -304,8 +305,12 @@ class WorkspaceCollaborationService:
|
||||
.order_by(WorkspaceMembership.created_at, WorkspaceMembership.uuid)
|
||||
)
|
||||
return [
|
||||
WorkspaceMemberView(membership=membership, email=email)
|
||||
for membership, email in (await active_session.execute(statement)).all()
|
||||
WorkspaceMemberView(
|
||||
membership=membership,
|
||||
display_name=display_name,
|
||||
email=email,
|
||||
)
|
||||
for membership, display_name, email in (await active_session.execute(statement)).all()
|
||||
]
|
||||
|
||||
return await self._run(operation, session=session, read_only=True)
|
||||
|
||||
Reference in New Issue
Block a user