import uuid from datetime import datetime from typing import Literal from pydantic import BaseModel, ConfigDict, Field class TodoCreate(BaseModel): title: str body: str | None = None url: str | None = None domains: list[str] = Field(default_factory=list) category: str | None = None tags: list[str] = Field(default_factory=list) status: Literal["pending", "done", "cancelled"] = "pending" priority: Literal["low", "medium", "high"] = "medium" due_date: datetime | None = None photo_path: str | None = None gps_lat: float | None = None gps_lng: float | None = None class TodoUpdate(BaseModel): title: str | None = None body: str | None = None url: str | None = None domains: list[str] | None = None category: str | None = None tags: list[str] | None = None status: Literal["pending", "done", "cancelled"] | None = None priority: Literal["low", "medium", "high"] | None = None due_date: datetime | None = None photo_path: str | None = None gps_lat: float | None = None gps_lng: float | None = None class PostponeRequest(BaseModel): days: Literal[1, 7] class TodoResponse(BaseModel): model_config = ConfigDict(from_attributes=True) id: uuid.UUID title: str body: str | None url: str | None domains: list[str] category: str | None tags: list[str] status: str priority: str due_date: datetime | None postponed_count: int created_at: datetime updated_at: datetime | None owner_id: uuid.UUID | None photo_path: str | None gps_lat: float | None gps_lng: float | None