from datetime import datetime from uuid import UUID from pydantic import BaseModel, ConfigDict, Field, field_validator from .models import TaskStatus class TaskBase(BaseModel): title: str = Field(min_length=1, max_length=200) description: str | None = Field(default=None, max_length=5000) status: TaskStatus = TaskStatus.pending due_at: datetime | None = None @field_validator("title") @classmethod def title_not_blank(cls, value: str) -> str: value = value.strip() if not value: raise ValueError("title must not be blank") return value class TaskCreate(TaskBase): pass class TaskUpdate(BaseModel): title: str | None = Field(default=None, min_length=1, max_length=200) description: str | None = Field(default=None, max_length=5000) status: TaskStatus | None = None due_at: datetime | None = None @field_validator("title") @classmethod def title_not_blank(cls, value: str | None) -> str | None: if value is not None: value = value.strip() if not value: raise ValueError("title must not be blank") return value class TaskRead(TaskBase): id: UUID created_at: datetime updated_at: datetime model_config = ConfigDict(from_attributes=True) class ErrorDetail(BaseModel): loc: list[str | int] = [] msg: str type: str | None = None class ErrorBody(BaseModel): code: str message: str details: list[ErrorDetail] = [] class ErrorResponse(BaseModel): error: ErrorBody