65 lines
1.5 KiB
Python
65 lines
1.5 KiB
Python
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
|