54 lines
1.5 KiB
Python
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__,
|
|
)
|