from typing import Annotated, Optional, Literal from pydantic import BaseModel, ConfigDict, Field from datetime import datetime MemberPermission = Literal["read_only", "create_modify"] MemberStatus = Literal["pending", "accepted", "rejected"] InviteResponse = Literal["accepted", "rejected"] class ProjectMemberInvite(BaseModel): model_config = ConfigDict(extra="forbid") user_ids: list[Annotated[int, Field(ge=1, le=2147483647)]] = Field(min_length=1, max_length=10) permission: MemberPermission = "create_modify" class ProjectMemberUpdate(BaseModel): model_config = ConfigDict(extra="forbid") permission: MemberPermission class ProjectMemberRespond(BaseModel): model_config = ConfigDict(extra="forbid") response: InviteResponse class ProjectMemberResponse(BaseModel): id: int project_id: int user_id: int invited_by: int permission: str status: str source: str user_name: str | None = None inviter_name: str | None = None created_at: datetime updated_at: datetime accepted_at: datetime | None = None model_config = ConfigDict(from_attributes=True)