50 lines
1.1 KiB
Python
50 lines
1.1 KiB
Python
from typing import Any
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class ParcelFilter(BaseModel):
|
|
vri: list[str] | None = None
|
|
area_min_sqm: float | None = None
|
|
area_max_sqm: float | None = None
|
|
region: str | None = None
|
|
polygon_geojson: dict[str, Any] | None = None
|
|
text_search: str | None = None
|
|
|
|
|
|
class ScoringWeights(BaseModel):
|
|
distance_to_center: float = 0.4
|
|
poi_density: float = 0.3
|
|
neighborhood_price: float = 0.3
|
|
|
|
|
|
class ParcelSearchRequest(BaseModel):
|
|
filters: ParcelFilter = Field(default_factory=ParcelFilter)
|
|
weights: ScoringWeights = Field(default_factory=ScoringWeights)
|
|
limit: int = 50
|
|
|
|
|
|
class ScoreBreakdown(BaseModel):
|
|
total: float
|
|
distance_to_center: float
|
|
poi_density: float
|
|
neighborhood_price: float
|
|
|
|
|
|
class ParcelSummary(BaseModel):
|
|
id: str
|
|
cadastral_number: str
|
|
area_sqm: float
|
|
vri: str
|
|
address: str | None
|
|
score: ScoreBreakdown
|
|
|
|
|
|
class ParcelSearchResponse(BaseModel):
|
|
items: list[ParcelSummary]
|
|
total: int
|
|
|
|
|
|
class ParcelDetail(ParcelSummary):
|
|
geometry_geojson: dict[str, Any]
|
|
enrichment: dict[str, Any]
|