"""Pydantic schemas для user_custom_pois (#254). CustomPoiCreate — тело POST-запроса. CustomPoiUpdate — тело PATCH-запроса (все поля опциональны). CustomPoiOut — ответ API (включает id, created_at, updated_at). """ from __future__ import annotations from datetime import datetime from pydantic import BaseModel, Field # Диапазон весов кастомных POI шире системных ([-5, 5]), # чтобы пользователь мог сильно усилить или исключить POI. _CUSTOM_WEIGHT_MIN: float = -5.0 _CUSTOM_WEIGHT_MAX: float = 5.0 class CustomPoiCreate(BaseModel): name: str = Field(..., min_length=1, max_length=200, description="Отображаемое название точки") category: str | None = Field(None, max_length=100, description="Произвольная категория") weight: float = Field( ..., ge=_CUSTOM_WEIGHT_MIN, le=_CUSTOM_WEIGHT_MAX, description="Вес точки в scoring [-5, 5]", ) lon: float = Field(..., ge=-180.0, le=180.0, description="Долгота WGS-84") lat: float = Field(..., ge=-90.0, le=90.0, description="Широта WGS-84") parcel_cad: str | None = Field( None, max_length=100, description="Кадастровый номер участка; NULL = глобальная для пользователя", ) notes: str | None = Field(None, max_length=2000, description="Примечания") class CustomPoiUpdate(BaseModel): name: str | None = Field(None, min_length=1, max_length=200) category: str | None = None weight: float | None = Field(None, ge=_CUSTOM_WEIGHT_MIN, le=_CUSTOM_WEIGHT_MAX) lon: float | None = Field(None, ge=-180.0, le=180.0) lat: float | None = Field(None, ge=-90.0, le=90.0) parcel_cad: str | None = Field(None, max_length=100) notes: str | None = None class CustomPoiOut(BaseModel): id: int user_id: str parcel_cad: str | None name: str category: str | None weight: float lon: float lat: float notes: str | None created_at: datetime updated_at: datetime