- Added tenant API for managing workspaces, including listing, creating, and inviting members. - Introduced new models for organizations, workspaces, and workspace memberships in the backend. - Created frontend components for workspace administration, allowing users to manage workspaces and invite members. - Updated document listing to support workspace-specific filtering. - Implemented account settings page for user profile management and password changes. - Added end-to-end tests for workspace administration and dashboard functionalities.
68 lines
1.6 KiB
Python
68 lines
1.6 KiB
Python
from datetime import datetime
|
|
from typing import Any, Literal
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
CreateType = Literal["shed", "silo", "sketch", "stead"]
|
|
MemberRole = Literal["editor", "viewer"]
|
|
Visibility = Literal["private", "members"]
|
|
|
|
|
|
class DocumentMember(BaseModel):
|
|
user_id: int
|
|
role: MemberRole
|
|
name: str = ""
|
|
email: str = ""
|
|
|
|
|
|
class DocumentCreate(BaseModel):
|
|
type: CreateType
|
|
title: str
|
|
content: dict[str, Any] = Field(default_factory=dict)
|
|
template_id: str | None = None
|
|
stead_id: str | None = None
|
|
parent_page_id: str | None = None
|
|
workspace_id: int | None = None
|
|
|
|
|
|
class DocumentUpdate(BaseModel):
|
|
title: str | None = None
|
|
content: dict[str, Any] | None = None
|
|
starred: bool | None = None
|
|
stead_id: str | None = None
|
|
parent_page_id: str | None = None
|
|
workspace_id: int | None = None
|
|
|
|
|
|
class ShareRequest(BaseModel):
|
|
email_or_username: str
|
|
role: MemberRole = "editor"
|
|
|
|
|
|
class DocumentResponse(BaseModel):
|
|
id: str
|
|
type: CreateType
|
|
title: str
|
|
template_id: str | None = None
|
|
stead_id: str | None = None
|
|
parent_page_id: str | None = None
|
|
content: dict[str, Any]
|
|
created_by: str
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
starred: bool = False
|
|
last_visited_at: datetime | None = None
|
|
owner_id: int | None = None
|
|
visibility: Visibility = "private"
|
|
members: list[DocumentMember] = Field(default_factory=list)
|
|
workspace_id: int | None = None
|
|
|
|
|
|
class DocumentVersionResponse(BaseModel):
|
|
id: str
|
|
document_id: str
|
|
title: str
|
|
content: dict[str, Any]
|
|
created_by: str
|
|
created_at: datetime
|
|
reason: str
|