125 lines
2.9 KiB
Python
125 lines
2.9 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from uuid import UUID
|
||
|
|
|
||
|
|
from pydantic import Field
|
||
|
|
|
||
|
|
from .common import ApiEnvelope, JsonObject, JsonValue, RouteContract, SchemaModel
|
||
|
|
|
||
|
|
|
||
|
|
class SoilDataCoordinatesRequest(SchemaModel):
|
||
|
|
lat: float
|
||
|
|
lon: float
|
||
|
|
|
||
|
|
|
||
|
|
class SoilDepthDataSchema(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 SoilLocationPayload(SchemaModel):
|
||
|
|
source: str
|
||
|
|
id: int
|
||
|
|
lon: float
|
||
|
|
lat: float
|
||
|
|
depths: list[SoilDepthDataSchema] = Field(default_factory=list)
|
||
|
|
|
||
|
|
|
||
|
|
class SoilTaskQueuedResponseData(SchemaModel):
|
||
|
|
source: str = 'task'
|
||
|
|
task_id: str
|
||
|
|
lon: float
|
||
|
|
lat: float
|
||
|
|
status_url: str | None = None
|
||
|
|
|
||
|
|
|
||
|
|
class SoilTaskStatusResponseData(SchemaModel):
|
||
|
|
task_id: str
|
||
|
|
status: str
|
||
|
|
message: str | None = None
|
||
|
|
progress: JsonObject = Field(default_factory=dict)
|
||
|
|
result: JsonValue | None = None
|
||
|
|
error: str | None = None
|
||
|
|
|
||
|
|
|
||
|
|
class NdviHealthRequest(SchemaModel):
|
||
|
|
farm_uuid: UUID
|
||
|
|
|
||
|
|
|
||
|
|
class NdviHealthDataItem(SchemaModel):
|
||
|
|
title: str
|
||
|
|
value: JsonValue | None = None
|
||
|
|
color: str
|
||
|
|
icon: str
|
||
|
|
|
||
|
|
|
||
|
|
class NdviHealthResponseData(SchemaModel):
|
||
|
|
ndviIndex: float | None = None
|
||
|
|
mean_ndvi: float | None = None
|
||
|
|
ndvi_map: JsonObject = Field(default_factory=dict)
|
||
|
|
vegetation_health_class: str | None = None
|
||
|
|
observation_date: str | None = None
|
||
|
|
satellite_source: str | None = None
|
||
|
|
healthData: list[NdviHealthDataItem] = Field(default_factory=list)
|
||
|
|
|
||
|
|
|
||
|
|
class SoilDataResponse(ApiEnvelope[SoilLocationPayload]):
|
||
|
|
pass
|
||
|
|
|
||
|
|
|
||
|
|
class SoilTaskQueuedResponse(ApiEnvelope[SoilTaskQueuedResponseData]):
|
||
|
|
pass
|
||
|
|
|
||
|
|
|
||
|
|
class SoilTaskStatusResponse(ApiEnvelope[SoilTaskStatusResponseData]):
|
||
|
|
pass
|
||
|
|
|
||
|
|
|
||
|
|
class NdviHealthResponse(ApiEnvelope[NdviHealthResponseData]):
|
||
|
|
pass
|
||
|
|
|
||
|
|
|
||
|
|
CONTRACTS = [
|
||
|
|
RouteContract(
|
||
|
|
method='GET',
|
||
|
|
path='/api/soil-data/',
|
||
|
|
request_model=SoilDataCoordinatesRequest.__name__,
|
||
|
|
response_model=SoilDataResponse.__name__,
|
||
|
|
),
|
||
|
|
RouteContract(
|
||
|
|
method='POST',
|
||
|
|
path='/api/soil-data/',
|
||
|
|
request_model=SoilDataCoordinatesRequest.__name__,
|
||
|
|
response_model=SoilDataResponse.__name__,
|
||
|
|
),
|
||
|
|
RouteContract(
|
||
|
|
method='GET',
|
||
|
|
path='/api/soil-data/tasks/<task_id>/status/',
|
||
|
|
request_model='SoilTaskStatusRequest',
|
||
|
|
response_model=SoilTaskStatusResponse.__name__,
|
||
|
|
),
|
||
|
|
RouteContract(
|
||
|
|
method='POST',
|
||
|
|
path='/api/soil-data/ndvi-health/',
|
||
|
|
request_model=NdviHealthRequest.__name__,
|
||
|
|
response_model=NdviHealthResponse.__name__,
|
||
|
|
),
|
||
|
|
]
|
||
|
|
|
||
|
|
|
||
|
|
class SoilTaskStatusRequest(SchemaModel):
|
||
|
|
task_id: str
|