"""Pydantic schemas for Epic model""" from datetime import datetime from typing import Any, Dict, List, Optional from pydantic import BaseModel, ConfigDict, Field class EpicCreateRequest(BaseModel): """Schema for creating a new epic""" model_config = ConfigDict( json_schema_extra={ "example": { "name": "User Authentication", "description": "Implement login and registration", "content": [ {"type": "paragraph", "children": [{"text": "Details..."}]} ], "color": "#3b82f6", "pos": 1.0, "depth_limit": 5, "parent_epic_id": None, "completed_list_id": 5, } } ) name: str = Field(..., min_length=1, max_length=200, description="Epic name") description: Optional[str] = Field(None, description="Epic description") content: Optional[Any] = Field(None, description="Rich text content") color: Optional[str] = Field(None, max_length=7, description="Hex color code") pos: Optional[float] = Field(None, description="Position for ordering") depth_limit: Optional[int] = Field( None, ge=1, le=10, description="Maximum depth for hierarchy" ) parent_epic_id: Optional[int] = Field( None, description="Parent epic ID for nesting" ) completed_list_id: Optional[int] = Field( None, description="List ID that marks cards as completed" ) class EpicResponse(BaseModel): """Schema for epic response""" model_config = ConfigDict( from_attributes=True, json_schema_extra={ "example": { "id": 1, "name": "User Authentication", "description": "Implement login and registration", "content": [ {"type": "paragraph", "children": [{"text": "Details..."}]} ], "color": "#3b82f6", "closed": False, "pos": 1.0, "depth_limit": 5, "board_id": 1, "parent_epic_id": None, "metrics": {"card_count": 5, "progress": 60}, "date_last_activity": "2024-01-15T10:30:00", "created_at": "2024-01-01T10:00:00", "updated_at": "2024-01-15T10:30:00", } }, ) id: int name: str description: Optional[str] = None content: Optional[Any] = None color: Optional[str] = None closed: bool pos: Optional[float] = None depth_limit: Optional[int] = None board_id: int parent_epic_id: Optional[int] = None completed_list_id: Optional[int] = None metrics: Optional[Dict[str, Any]] = None date_last_activity: Optional[datetime] = None created_at: Optional[datetime] = None updated_at: Optional[datetime] = None class EpicUpdateRequest(BaseModel): """Schema for updating an epic""" model_config = ConfigDict( json_schema_extra={ "example": { "name": "Updated Epic Name", "description": "Updated description", "content": [ {"type": "paragraph", "children": [{"text": "Updated..."}]} ], "color": "#ef4444", "closed": True, "pos": 2.0, "depth_limit": 3, "parent_epic_id": 2, "completed_list_id": 5, } } ) name: Optional[str] = Field(None, min_length=1, max_length=200) description: Optional[str] = None content: Optional[Any] = None color: Optional[str] = Field(None, max_length=7) closed: Optional[bool] = None pos: Optional[float] = None depth_limit: Optional[int] = Field(None, ge=1, le=10) parent_epic_id: Optional[int] = None completed_list_id: Optional[int] = None class EpicWithCardsResponse(BaseModel): """Schema for epic response with cards""" model_config = ConfigDict(from_attributes=True) id: int name: str description: Optional[str] = None content: Optional[Any] = None color: Optional[str] = None closed: bool pos: Optional[float] = None depth_limit: Optional[int] = None board_id: int parent_epic_id: Optional[int] = None metrics: Optional[Dict[str, Any]] = None date_last_activity: Optional[datetime] = None created_at: Optional[datetime] = None updated_at: Optional[datetime] = None cards: List[Dict[str, Any]] = Field(default_factory=list)