"""业务分组 Schemas""" from pydantic import BaseModel, Field class PhaseOption(BaseModel): """可选的生命周期阶段 —— 由服务端下发,前端不要写死这两个值""" value: str label: str class GroupMemberOut(BaseModel): user_id: str # MOM 短账号(与 Task.assignee_id 同口径) display_name: str is_leader: bool class GroupOut(BaseModel): id: int name: str parent_id: int | None = None parent_name: str | None = None description: str | None = None sort_order: int = 0 is_active: bool = True phases: list[str] = [] # 该组自己的可见范围(不含继承) effective_phases: list[str] = [] # 实际生效范围(自己没配则取父组的) phase_labels: list[str] = [] # 生效范围的中文标签 member_count: int = 0 # ---- 当前用户对这个组能做什么(服务端算好,前端别自己推导)---- can_manage_members: bool = False # 能加/移成员、设组长 can_manage_group: bool = False # 能改组名/范围/启停/删除 —— 仅超管 is_my_leader: bool = False # 我是这个组的组长 class GroupDetailOut(GroupOut): members: list[GroupMemberOut] = [] class GroupCreate(BaseModel): name: str = Field(..., min_length=1, max_length=50, description="分组显示名") parent_id: int | None = Field(None, description="上级大组ID;为空则建的是大组") description: str | None = Field(None, max_length=200) sort_order: int = 0 phases: list[str] = Field(default_factory=list, description="可见的生命周期阶段") class GroupUpdate(BaseModel): name: str | None = Field(None, min_length=1, max_length=50) parent_id: int | None = None description: str | None = Field(None, max_length=200) sort_order: int | None = None is_active: bool | None = None phases: list[str] | None = Field( None, description="整组覆盖式更新;传 [] 表示清空(此时继承父组)", ) class GroupMemberAdd(BaseModel): user_id: str = Field(..., min_length=1, max_length=64, description="MOM 账号") is_leader: bool = False class GroupMemberUpdate(BaseModel): is_leader: bool class MemberCandidate(BaseModel): username: str # 短账号,存进组的就是它 full_name: str # 真实姓名,仅供界面展示