from pydantic import BaseModel, ConfigDict, Field from datetime import datetime, date, time from typing import Optional, Literal TodoPriority = Literal["none", "low", "medium", "high"] RecurrenceRule = Literal["daily", "weekly", "monthly"] class TodoCreate(BaseModel): model_config = ConfigDict(extra="forbid") title: str = Field(min_length=1, max_length=255) description: Optional[str] = Field(None, max_length=5000) priority: TodoPriority = "medium" due_date: Optional[date] = None due_time: Optional[time] = None category: Optional[str] = Field(None, max_length=100) recurrence_rule: Optional[RecurrenceRule] = None project_id: Optional[int] = None class TodoUpdate(BaseModel): model_config = ConfigDict(extra="forbid") title: Optional[str] = Field(None, min_length=1, max_length=255) description: Optional[str] = Field(None, max_length=5000) priority: Optional[TodoPriority] = None due_date: Optional[date] = None due_time: Optional[time] = None completed: Optional[bool] = None category: Optional[str] = Field(None, max_length=100) recurrence_rule: Optional[RecurrenceRule] = None project_id: Optional[int] = None class TodoResponse(BaseModel): id: int title: str description: Optional[str] priority: str due_date: Optional[date] due_time: Optional[time] completed: bool completed_at: Optional[datetime] category: Optional[str] recurrence_rule: Optional[str] reset_at: Optional[datetime] next_due_date: Optional[date] project_id: Optional[int] created_at: datetime updated_at: datetime model_config = ConfigDict(from_attributes=True)