from pydantic import BaseModel from typing import Optional, List from datetime import datetime from decimal import Decimal from enum import Enum class Priority(str, Enum): LOW = "low" MEDIUM = "medium" HIGH = "high" URGENT = "urgent" class TaskBase(BaseModel): title: str description: Optional[str] = None priority: Priority = Priority.MEDIUM original_estimate: Optional[Decimal] = None due_date: Optional[datetime] = None class TaskCreate(TaskBase): parent_task_id: Optional[str] = None assignee_id: Optional[str] = None status_id: Optional[str] = None class TaskUpdate(BaseModel): title: Optional[str] = None description: Optional[str] = None priority: Optional[Priority] = None original_estimate: Optional[Decimal] = None time_spent: Optional[Decimal] = None due_date: Optional[datetime] = None position: Optional[int] = None class TaskStatusUpdate(BaseModel): status_id: str class TaskAssignUpdate(BaseModel): assignee_id: Optional[str] = None class TaskResponse(TaskBase): id: str project_id: str parent_task_id: Optional[str] = None assignee_id: Optional[str] = None status_id: Optional[str] = None time_spent: Decimal blocker_flag: bool position: int created_by: str created_at: datetime updated_at: datetime class Config: from_attributes = True class TaskWithDetails(TaskResponse): assignee_name: Optional[str] = None status_name: Optional[str] = None status_color: Optional[str] = None creator_name: Optional[str] = None subtask_count: int = 0 class TaskListResponse(BaseModel): tasks: List[TaskWithDetails] total: int