"""Pydantic-схемы API M1."""
from datetime import datetime
from typing import Any
from pydantic import BaseModel, ConfigDict, Field
# --- Task ---
class TagOut(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: int
name: str
class ProjectOut(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: int
name: str
relevance_status: str
priority: int | None
note: str
class TaskCreate(BaseModel):
title: str = Field(min_length=1, max_length=500)
description: str = ""
parent_task_id: int | None = None # подзадача (M3)
class TaskUpdate(BaseModel):
"""Частичное обновление метаданных задачи (ручная детализация)."""
title: str | None = Field(None, max_length=500)
description: str | None = None
project_id: int | None = None
parent_task_id: int | None = None
tag_ids: list[int] | None = None
priority: int | None = None
status: str | None = None
class TaskOut(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: int
title: str
description: str
task_type: str
status: str
detail_state: str
parent_task_id: int | None
project: ProjectOut | None
priority: int | None
tags: list[TagOut]
ai_proposal: dict[str, Any] | None
created_at: datetime
approved_at: datetime | None
done_at: datetime | None
class ApproveIn(BaseModel):
"""Утверждение детализации; apply_proposal=True — принять предложение LLM."""
apply_proposal: bool = False
# --- Project / Tag ---
class AttachmentOut(BaseModel):
"""Вложение задачи (изображение)."""
model_config = ConfigDict(from_attributes=True)
id: int
task_id: int
filename: str
original_name: str
mime: str
size: int
created_at: datetime
class ProjectCreate(BaseModel):
name: str = Field(min_length=1, max_length=200)
priority: int | None = None
note: str = ""
class ProjectUpdate(BaseModel):
name: str | None = Field(None, max_length=200)
relevance_status: str | None = None
priority: int | None = None
note: str | None = None
class TagCreate(BaseModel):
name: str = Field(min_length=1, max_length=100)