UPDATE
This commit is contained in:
@@ -1,17 +1,7 @@
|
||||
from django.apps import AppConfig
|
||||
from functools import cached_property
|
||||
|
||||
|
||||
class PestDiseaseConfig(AppConfig):
|
||||
default_auto_field = "django.db.models.BigAutoField"
|
||||
name = "pest_disease"
|
||||
verbose_name = "Pest & Disease"
|
||||
|
||||
@cached_property
|
||||
def risk_summary_service(self):
|
||||
from .services import build_pest_disease_risk_summary
|
||||
|
||||
return build_pest_disease_risk_summary
|
||||
|
||||
def get_risk_summary_service(self):
|
||||
return self.risk_summary_service
|
||||
|
||||
@@ -29,22 +29,3 @@ class PestDiseaseRiskRequestSerializer(serializers.Serializer):
|
||||
raise serializers.ValidationError({"farm_uuid": "farm_uuid الزامی است."})
|
||||
attrs["farm_uuid"] = farm_uuid
|
||||
return attrs
|
||||
|
||||
|
||||
class PestDiseaseRiskSummaryRequestSerializer(serializers.Serializer):
|
||||
farm_uuid = serializers.CharField(required=False, help_text="شناسه یکتای مزرعه")
|
||||
sensor_uuid = serializers.CharField(required=False, help_text="نام قدیمی برای farm_uuid")
|
||||
|
||||
def validate(self, attrs):
|
||||
farm_uuid = attrs.get("farm_uuid") or attrs.get("sensor_uuid")
|
||||
if not farm_uuid:
|
||||
raise serializers.ValidationError({"farm_uuid": "farm_uuid الزامی است."})
|
||||
attrs["farm_uuid"] = farm_uuid
|
||||
return attrs
|
||||
|
||||
|
||||
class PestDiseaseRiskSummaryResponseSerializer(serializers.Serializer):
|
||||
farm_uuid = serializers.CharField()
|
||||
diseaseRisk = serializers.JSONField()
|
||||
pestRisk = serializers.JSONField()
|
||||
drivers = serializers.JSONField()
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Any
|
||||
|
||||
from rag.services import get_pest_disease_risk
|
||||
|
||||
|
||||
def _stats_label(level: str | None) -> str:
|
||||
if level == "high":
|
||||
return "بالا"
|
||||
if level == "medium":
|
||||
return "متوسط"
|
||||
return "پایین"
|
||||
|
||||
|
||||
def _normalize_risk_block(block: dict[str, Any] | None) -> dict[str, Any]:
|
||||
payload = dict(block or {})
|
||||
payload.setdefault("score", 0.0)
|
||||
payload.setdefault("level", "low")
|
||||
payload["statsLabel"] = _stats_label(payload.get("level"))
|
||||
return payload
|
||||
|
||||
|
||||
def build_pest_disease_risk_summary(*, farm_uuid: str) -> dict[str, Any]:
|
||||
rag_result = get_pest_disease_risk(farm_uuid=farm_uuid)
|
||||
|
||||
return {
|
||||
"farm_uuid": farm_uuid,
|
||||
"diseaseRisk": _normalize_risk_block(rag_result.get("disease_risk")),
|
||||
"pestRisk": _normalize_risk_block(rag_result.get("pest_risk")),
|
||||
"drivers": {
|
||||
"keyDrivers": rag_result.get("key_drivers") or [],
|
||||
"summary": rag_result.get("summary"),
|
||||
"forecastWindow": rag_result.get("forecast_window"),
|
||||
"source": "rag",
|
||||
},
|
||||
}
|
||||
@@ -1,10 +1,9 @@
|
||||
from django.urls import path
|
||||
|
||||
from .views import PestDiseaseDetectionView, PestDiseaseRiskSummaryView, PestDiseaseRiskView
|
||||
from .views import PestDiseaseDetectionView, PestDiseaseRiskView
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
path("detect/", PestDiseaseDetectionView.as_view(), name="pest-disease-detect"),
|
||||
path("risk/", PestDiseaseRiskView.as_view(), name="pest-disease-risk"),
|
||||
path("risk-summary/", PestDiseaseRiskSummaryView.as_view(), name="pest-disease-risk-summary"),
|
||||
]
|
||||
|
||||
@@ -13,8 +13,6 @@ from rag.services import get_pest_disease_detection, get_pest_disease_risk
|
||||
from .serializers import (
|
||||
PestDiseaseDetectionRequestSerializer,
|
||||
PestDiseaseRiskRequestSerializer,
|
||||
PestDiseaseRiskSummaryRequestSerializer,
|
||||
PestDiseaseRiskSummaryResponseSerializer,
|
||||
)
|
||||
|
||||
|
||||
@@ -31,12 +29,6 @@ PestDiseaseRiskResponseSerializer = build_envelope_serializer(
|
||||
"PestDiseaseRiskResponseSerializer",
|
||||
data_schema=None,
|
||||
)
|
||||
PestDiseaseRiskSummaryEnvelopeSerializer = build_envelope_serializer(
|
||||
"PestDiseaseRiskSummaryEnvelopeSerializer",
|
||||
PestDiseaseRiskSummaryResponseSerializer,
|
||||
)
|
||||
|
||||
|
||||
class _ImageMixin:
|
||||
parser_classes = [JSONParser, MultiPartParser, FormParser]
|
||||
|
||||
@@ -160,44 +152,3 @@ class PestDiseaseRiskView(APIView):
|
||||
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
)
|
||||
return Response({"code": 200, "msg": "success", "data": result}, status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
class PestDiseaseRiskSummaryView(APIView):
|
||||
@extend_schema(
|
||||
tags=["Pest & Disease"],
|
||||
summary="خلاصه ریسک بیماری و آفات",
|
||||
description=(
|
||||
"با دریافت farm_uuid، خلاصه ریسک بیماری و آفات را از سرویس RAG "
|
||||
"گرفته و در قالب سبک تر برای KPI بازمی گرداند."
|
||||
),
|
||||
request=PestDiseaseRiskSummaryRequestSerializer,
|
||||
responses={
|
||||
200: build_response(PestDiseaseRiskSummaryEnvelopeSerializer, "خلاصه ریسک بیماری و آفات."),
|
||||
400: build_response(PestDiseaseValidationErrorSerializer, "پارامتر ورودی نامعتبر است."),
|
||||
404: build_response(PestDiseaseValidationErrorSerializer, "مزرعه یافت نشد."),
|
||||
},
|
||||
examples=[
|
||||
OpenApiExample(
|
||||
"نمونه درخواست risk summary",
|
||||
value={"farm_uuid": "11111111-1111-1111-1111-111111111111"},
|
||||
request_only=True,
|
||||
)
|
||||
],
|
||||
)
|
||||
def post(self, request):
|
||||
from .services import build_pest_disease_risk_summary
|
||||
|
||||
serializer = PestDiseaseRiskSummaryRequestSerializer(data=request.data)
|
||||
if not serializer.is_valid():
|
||||
return Response(
|
||||
{"code": 400, "msg": "داده نامعتبر.", "data": serializer.errors},
|
||||
status=status.HTTP_400_BAD_REQUEST,
|
||||
)
|
||||
try:
|
||||
result = build_pest_disease_risk_summary(farm_uuid=serializer.validated_data["farm_uuid"])
|
||||
except ValueError as exc:
|
||||
return Response(
|
||||
{"code": 404, "msg": str(exc), "data": None},
|
||||
status=status.HTTP_404_NOT_FOUND,
|
||||
)
|
||||
return Response({"code": 200, "msg": "success", "data": result}, status=status.HTTP_200_OK)
|
||||
|
||||
Reference in New Issue
Block a user