Files
Schemas/farm_data_upsert.py
T
2026-04-27 03:12:33 +03:30

54 lines
1.5 KiB
Python

from __future__ import annotations
from uuid import UUID
from pydantic import Field, model_validator
from .common import ApiEnvelope, JsonObject, RouteContract, SchemaModel
HTTP_METHOD = 'POST'
ROUTE_PATH = '/api/farm-data/'
class FarmBoundaryCorner(SchemaModel):
lat: float
lon: float
class FarmDataUpsertRequest(SchemaModel):
farm_uuid: UUID
farm_boundary: JsonObject
sensor_key: str | None = 'sensor-7-1'
sensor_payload: JsonObject | None = None
plant_ids: list[int] = Field(default_factory=list)
irrigation_method_id: int | None = None
@model_validator(mode='after')
def validate_payload_sources(self) -> 'FarmDataUpsertRequest':
if not self.sensor_payload and not self.plant_ids and self.irrigation_method_id is None:
raise ValueError('At least one of sensor_payload, plant_ids or irrigation_method_id must be provided.')
return self
class FarmDataUpsertResponseData(SchemaModel):
farm_uuid: UUID
center_location_id: int | None = None
weather_forecast_id: int | None = None
sensor_payload: JsonObject = Field(default_factory=dict)
plant_ids: list[int] = Field(default_factory=list)
irrigation_method_id: int | None = None
created_at: str | None = None
updated_at: str | None = None
class FarmDataUpsertResponse(ApiEnvelope[FarmDataUpsertResponseData]):
pass
CONTRACT = RouteContract(
method=HTTP_METHOD,
path=ROUTE_PATH,
request_model=FarmDataUpsertRequest.__name__,
response_model=FarmDataUpsertResponse.__name__,
)