114 lines
3.2 KiB
Python
114 lines
3.2 KiB
Python
from __future__ import annotations
|
|
|
|
from pydantic import Field
|
|
|
|
from .common import ApiEnvelope, JsonObject, RouteContract, SchemaModel
|
|
|
|
HTTP_METHOD = 'GET'
|
|
ROUTE_PATH = '/api/farm-data/<farm_uuid>/detail/'
|
|
|
|
|
|
class FarmDetailRequest(SchemaModel):
|
|
farm_uuid: str
|
|
|
|
|
|
class FarmCenterLocationSchema(SchemaModel):
|
|
id: int
|
|
lat: float
|
|
lon: float
|
|
farm_boundary: JsonObject = Field(default_factory=dict)
|
|
|
|
|
|
class WeatherForecastDetailSchema(SchemaModel):
|
|
id: int
|
|
forecast_date: str | None = None
|
|
temperature_min: float | None = None
|
|
temperature_max: float | None = None
|
|
temperature_mean: float | None = None
|
|
precipitation: float | None = None
|
|
precipitation_probability: float | None = None
|
|
humidity_mean: float | None = None
|
|
wind_speed_max: float | None = None
|
|
et0: float | None = None
|
|
weather_code: int | None = None
|
|
|
|
|
|
class FarmSoilDepthSchema(SchemaModel):
|
|
depth_label: str
|
|
bdod: float | None = None
|
|
cec: float | None = None
|
|
cfvo: float | None = None
|
|
clay: float | None = None
|
|
nitrogen: float | None = None
|
|
ocd: float | None = None
|
|
ocs: float | None = None
|
|
phh2o: float | None = None
|
|
sand: float | None = None
|
|
silt: float | None = None
|
|
soc: float | None = None
|
|
wv0010: float | None = None
|
|
wv0033: float | None = None
|
|
wv1500: float | None = None
|
|
|
|
|
|
class FarmSoilPayloadSchema(SchemaModel):
|
|
resolved_metrics: JsonObject = Field(default_factory=dict)
|
|
metric_sources: JsonObject = Field(default_factory=dict)
|
|
depths: list[FarmSoilDepthSchema] = Field(default_factory=list)
|
|
|
|
|
|
class FarmPlantSchema(SchemaModel):
|
|
id: int
|
|
name: str
|
|
light: str | None = None
|
|
watering: str | None = None
|
|
soil: str | None = None
|
|
temperature: str | None = None
|
|
growth_stage: str | None = None
|
|
planting_season: str | None = None
|
|
harvest_time: str | None = None
|
|
spacing: str | None = None
|
|
fertilizer: str | None = None
|
|
created_at: str | None = None
|
|
updated_at: str | None = None
|
|
|
|
|
|
class FarmIrrigationMethodSchema(SchemaModel):
|
|
id: int
|
|
name: str
|
|
category: str | None = None
|
|
description: str | None = None
|
|
water_efficiency_percent: float | None = None
|
|
water_pressure_required: str | None = None
|
|
flow_rate: str | None = None
|
|
coverage_area: str | None = None
|
|
soil_type: str | None = None
|
|
climate_suitability: str | None = None
|
|
created_at: str | None = None
|
|
updated_at: str | None = None
|
|
|
|
|
|
class FarmDetailResponseData(SchemaModel):
|
|
center_location: FarmCenterLocationSchema
|
|
weather: WeatherForecastDetailSchema | None = None
|
|
sensor_payload: JsonObject = Field(default_factory=dict)
|
|
soil: FarmSoilPayloadSchema
|
|
plant_ids: list[int] = Field(default_factory=list)
|
|
plants: list[FarmPlantSchema] = Field(default_factory=list)
|
|
irrigation_method_id: int | None = None
|
|
irrigation_method: FarmIrrigationMethodSchema | None = None
|
|
created_at: str | None = None
|
|
updated_at: str | None = None
|
|
|
|
|
|
class FarmDetailResponse(ApiEnvelope[FarmDetailResponseData]):
|
|
pass
|
|
|
|
|
|
CONTRACT = RouteContract(
|
|
method=HTTP_METHOD,
|
|
path=ROUTE_PATH,
|
|
request_model=FarmDetailRequest.__name__,
|
|
response_model=FarmDetailResponse.__name__,
|
|
)
|