This commit is contained in:
2026-03-30 23:29:03 +03:30
parent 9323000bac
commit c97b90bfaf
13 changed files with 945 additions and 131 deletions
+33 -5
View File
@@ -4,11 +4,12 @@ from rest_framework import serializers, status
from rest_framework.response import Response
from rest_framework.views import APIView
from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import extend_schema
from drf_spectacular.utils import OpenApiParameter, extend_schema
from config.swagger import status_response
from .services import (
create_zones_and_dispatch,
ensure_latest_area_ready_for_processing,
get_cultivation_risk_payload,
get_default_area_feature,
get_initial_zones_payload,
@@ -23,10 +24,31 @@ from .services import (
class AreaView(APIView):
@extend_schema(
tags=["Crop Zoning"],
responses={200: status_response("CropZoningAreaResponse", data=serializers.JSONField())},
parameters=[
OpenApiParameter(
name="sensor_uuid",
type=OpenApiTypes.UUID,
location=OpenApiParameter.QUERY,
required=True,
description="UUID سنسور ارسالی کاربر برای گرفتن یا ساخت task فعال همان سنسور.",
)
],
responses={
200: status_response("CropZoningAreaResponse", data=serializers.JSONField()),
400: status_response("CropZoningAreaValidationError", data=serializers.JSONField()),
500: status_response("CropZoningAreaServerError", data=serializers.JSONField()),
},
)
def get(self, request):
return Response({"status": "success", "data": get_latest_area_payload()}, status=status.HTTP_200_OK)
sensor_uuid = request.query_params.get("sensor_uuid")
try:
crop_area = ensure_latest_area_ready_for_processing(sensor_uuid=sensor_uuid)
except ValueError as exc:
return Response({"status": "error", "message": str(exc)}, status=status.HTTP_400_BAD_REQUEST)
except ImproperlyConfigured as exc:
return Response({"status": "error", "message": str(exc)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
return Response({"status": "success", "data": get_latest_area_payload(crop_area)}, status=status.HTTP_200_OK)
class ProductsView(APIView):
@@ -45,10 +67,16 @@ class ZonesInitialView(APIView):
responses={200: status_response("CropZoningZonesInitialResponse", data=serializers.JSONField())},
)
def post(self, request):
area_feature = request.data.get("area") or request.data.get("area_geojson") or get_default_area_feature()
area_feature = (
request.data.get("area")
or request.data.get("area_geojson")
or request.data.get("boundary")
or get_default_area_feature()
)
cell_side_km = request.data.get("cell_side_km")
try:
crop_area, _zones = create_zones_and_dispatch(area_feature)
crop_area, _zones = create_zones_and_dispatch(area_feature, cell_side_km=cell_side_km)
except ValueError as exc:
return Response({"status": "error", "message": str(exc)}, status=status.HTTP_400_BAD_REQUEST)
except ImproperlyConfigured as exc: