from datetime import datetime from enum import Enum from typing import Optional from uuid import UUID from pydantic import BaseModel, Field class TemplateType(str, Enum): ROLE = "ROLE" SCENARIO = "SCENARIO" CUSTOM = "CUSTOM" class PermissionTemplateVersionRead(BaseModel): id: UUID version: int change_log: Optional[str] = None created_at: datetime class PermissionTemplateCreate(BaseModel): name: str = Field(..., min_length=1, max_length=100) description: Optional[str] = Field(None, max_length=500) template_type: TemplateType permissions: dict # {role: {endpoint_key: allowed}} tags: Optional[str] = Field(None, max_length=200) category: Optional[str] = Field(None, max_length=50) recommended_roles: Optional[str] = Field(None, max_length=200) class PermissionTemplateUpdate(BaseModel): name: Optional[str] = Field(None, min_length=1, max_length=100) description: Optional[str] = Field(None, max_length=500) permissions: Optional[dict] = None tags: Optional[str] = Field(None, max_length=200) category: Optional[str] = Field(None, max_length=50) recommended_roles: Optional[str] = Field(None, max_length=200) class PermissionTemplateRead(BaseModel): id: UUID name: str description: Optional[str] = None template_type: TemplateType is_system: bool created_by: Optional[UUID] = None created_at: datetime updated_at: datetime permissions: dict tags: Optional[str] = None category: Optional[str] = None recommended_roles: Optional[str] = None versions: list[PermissionTemplateVersionRead] = [] class Config: from_attributes = True class ApplyTemplateRequest(BaseModel): template_id: UUID roles: Optional[list[str]] = None override: bool = True class ApplyTemplateResponse(BaseModel): study_id: UUID applied_roles: list[str] permissions: dict