"""截图相关的请求/响应模型。""" from __future__ import annotations from datetime import datetime from typing import Optional from pydantic import BaseModel, Field class TagOut(BaseModel): id: int name: str color: Optional[str] = None class Config: from_attributes = True class CategoryOut(BaseModel): id: int name: str color: Optional[str] = None class Config: from_attributes = True class ScreenshotBrief(BaseModel): """卡片列表用:尽量精简。""" id: int path: str width: int height: int captured_at: datetime thumb_url: Optional[str] = None ai_title: Optional[str] = None ai_status: str ocr_status: str is_favorite: bool = False category: Optional[CategoryOut] = None tags: list[TagOut] = [] class TodoBrief(BaseModel): id: int title: str note: Optional[str] = None kind: Optional[str] = None status: str created_at: datetime completed_at: Optional[datetime] = None screenshot_id: int class Config: from_attributes = True class TodoListResp(BaseModel): items: list[TodoBrief] total: int page: int size: int class ScreenshotDetail(ScreenshotBrief): """详情页用:含 OCR 与 AI 文本。""" file_url: str size: int ocr_text: Optional[str] = None ai_summary: Optional[str] = None ai_suggestion: Optional[str] = None todos: list[TodoBrief] = [] class ScreenshotListResp(BaseModel): items: list[ScreenshotBrief] total: int page: int size: int class ScreenshotUpdate(BaseModel): """前端更新可写字段。""" category_id: Optional[int] = None is_favorite: Optional[bool] = None is_hidden: Optional[bool] = None tags: Optional[list[str]] = Field(default=None, description="标签名列表,自动新建")