This commit is contained in:
2026-04-24 03:02:22 +03:30
parent a76af4e766
commit f04a9fe71f
6 changed files with 246 additions and 79 deletions
+47 -15
View File
@@ -5,6 +5,8 @@
import json
import logging
from django.db import transaction
from irrigation.models import IrrigationMethod
from irrigation.evapotranspiration import calculate_forecast_water_needs, resolve_crop_profile, resolve_kc
from farm_data.models import SensorData
from rag.api_provider import get_chat_client
@@ -42,6 +44,31 @@ DEFAULT_IRRIGATION_PROMPT = (
)
def _resolve_irrigation_method(
sensor: SensorData | None,
irrigation_method_name: str | None,
) -> IrrigationMethod | None:
if irrigation_method_name:
return IrrigationMethod.objects.filter(name=irrigation_method_name).first()
if sensor is not None:
return sensor.irrigation_method
return None
def _persist_irrigation_method_on_farm(
sensor: SensorData | None,
irrigation_method: IrrigationMethod | None,
) -> None:
if sensor is None or irrigation_method is None:
return
if sensor.irrigation_method_id == irrigation_method.id:
return
with transaction.atomic():
sensor.irrigation_method = irrigation_method
sensor.save(update_fields=["irrigation_method", "updated_at"])
def get_irrigation_recommendation(
sensor_uuid: str,
plant_name: str | None = None,
@@ -89,6 +116,9 @@ def get_irrigation_recommendation(
.filter(farm_uuid=sensor_uuid)
.first()
)
irrigation_method = _resolve_irrigation_method(sensor, irrigation_method_name)
_persist_irrigation_method_on_farm(sensor, irrigation_method)
plant = None
resolved_plant_name = plant_name
if sensor is not None and plant_name:
@@ -106,19 +136,11 @@ def get_irrigation_recommendation(
WeatherForecast.objects.filter(location=sensor.center_location, forecast_date__isnull=False)
.order_by("forecast_date")[:7]
)
efficiency_percent = None
resolved_irrigation_method_name = irrigation_method_name
method = None
if irrigation_method_name:
from irrigation.models import IrrigationMethod
method = IrrigationMethod.objects.filter(name=irrigation_method_name).first()
elif sensor is not None:
method = sensor.irrigation_method
if method is not None:
resolved_irrigation_method_name = method.name
efficiency_percent = getattr(method, "water_efficiency_percent", None) if method else None
efficiency_percent = (
getattr(irrigation_method, "water_efficiency_percent", None)
if irrigation_method
else None
)
daily_water_needs = calculate_forecast_water_needs(
forecasts=forecasts,
latitude_deg=float(sensor.center_location.latitude),
@@ -132,8 +154,8 @@ def get_irrigation_recommendation(
)
extra_parts: list[str] = []
resolved_irrigation_method_name = irrigation_method_name or (
sensor.irrigation_method.name if sensor is not None and sensor.irrigation_method else None
resolved_irrigation_method_name = (
irrigation_method.name if irrigation_method is not None else None
)
if resolved_plant_name and growth_stage:
plant_text = build_plant_text(resolved_plant_name, growth_stage)
@@ -222,6 +244,16 @@ def get_irrigation_recommendation(
"crop_profile": crop_profile,
"active_kc": active_kc,
}
result["selected_irrigation_method"] = (
{
"id": irrigation_method.id,
"name": irrigation_method.name,
"category": irrigation_method.category,
"water_efficiency_percent": irrigation_method.water_efficiency_percent,
}
if irrigation_method is not None
else None
)
_complete_audit_log(
audit_log,
json.dumps(result, ensure_ascii=False, default=str),