This commit is contained in:
2026-03-24 20:10:48 +03:30
parent 7ab1ee3104
commit 0eda50f1c3
100 changed files with 2081 additions and 104 deletions
+60 -31
View File
@@ -1,16 +1,17 @@
"""
Crop Zoning API views.
Plain Django only; no DRF. No database. All responses are static mock data.
No database. All responses are static mock data.
Response format: {"status": "success", "data": <payload>}. HTTP 200 only.
No processing, validation, or use of input parameters in responses.
CSRF exempt on POST so frontend can call without token.
"""
from django.http import JsonResponse
from django.utils.decorators import method_decorator
from django.views import View
from django.views.decorators.csrf import csrf_exempt
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 config.swagger import status_response
from .mock_data import (
AREA_RESPONSE_DATA,
PRODUCTS_RESPONSE_DATA,
@@ -22,7 +23,7 @@ from .mock_data import (
)
class AreaView(View):
class AreaView(APIView):
"""
GET endpoint for fixed land area (GeoJSON polygon).
@@ -40,14 +41,18 @@ class AreaView(View):
No processing or validation is performed on inputs.
"""
@extend_schema(
tags=["Crop Zoning"],
responses={200: status_response("CropZoningAreaResponse", data=serializers.JSONField())},
)
def get(self, request):
return JsonResponse(
return Response(
{"status": "success", "data": AREA_RESPONSE_DATA},
status=200,
status=status.HTTP_200_OK,
)
class ProductsView(View):
class ProductsView(APIView):
"""
GET endpoint for list of crop products and colors.
@@ -67,15 +72,18 @@ class ProductsView(View):
No processing or validation is performed on inputs.
"""
@extend_schema(
tags=["Crop Zoning"],
responses={200: status_response("CropZoningProductsResponse", data=serializers.JSONField())},
)
def get(self, request):
return JsonResponse(
return Response(
{"status": "success", "data": PRODUCTS_RESPONSE_DATA},
status=200,
status=status.HTTP_200_OK,
)
@method_decorator(csrf_exempt, name="dispatch")
class ZonesInitialView(View):
class ZonesInitialView(APIView):
"""
POST endpoint for initial zone data (map + hover/tooltip).
@@ -99,15 +107,19 @@ class ZonesInitialView(View):
not used in the response.
"""
@extend_schema(
tags=["Crop Zoning"],
request=OpenApiTypes.OBJECT,
responses={200: status_response("CropZoningZonesInitialResponse", data=serializers.JSONField())},
)
def post(self, request):
return JsonResponse(
return Response(
{"status": "success", "data": ZONES_INITIAL_RESPONSE_DATA},
status=200,
status=status.HTTP_200_OK,
)
@method_decorator(csrf_exempt, name="dispatch")
class ZonesWaterNeedView(View):
class ZonesWaterNeedView(APIView):
"""
POST endpoint for water need per zone (water need layer).
@@ -126,15 +138,19 @@ class ZonesWaterNeedView(View):
No processing or validation is performed on inputs.
"""
@extend_schema(
tags=["Crop Zoning"],
request=OpenApiTypes.OBJECT,
responses={200: status_response("CropZoningZonesWaterNeedResponse", data=serializers.JSONField())},
)
def post(self, request):
return JsonResponse(
return Response(
{"status": "success", "data": ZONES_WATER_NEED_RESPONSE_DATA},
status=200,
status=status.HTTP_200_OK,
)
@method_decorator(csrf_exempt, name="dispatch")
class ZonesSoilQualityView(View):
class ZonesSoilQualityView(APIView):
"""
POST endpoint for soil quality per zone (soil quality layer).
@@ -153,15 +169,19 @@ class ZonesSoilQualityView(View):
No processing or validation is performed on inputs.
"""
@extend_schema(
tags=["Crop Zoning"],
request=OpenApiTypes.OBJECT,
responses={200: status_response("CropZoningZonesSoilQualityResponse", data=serializers.JSONField())},
)
def post(self, request):
return JsonResponse(
return Response(
{"status": "success", "data": ZONES_SOIL_QUALITY_RESPONSE_DATA},
status=200,
status=status.HTTP_200_OK,
)
@method_decorator(csrf_exempt, name="dispatch")
class ZonesCultivationRiskView(View):
class ZonesCultivationRiskView(APIView):
"""
POST endpoint for cultivation risk per zone (cultivation risk layer).
@@ -180,14 +200,19 @@ class ZonesCultivationRiskView(View):
No processing or validation is performed on inputs.
"""
@extend_schema(
tags=["Crop Zoning"],
request=OpenApiTypes.OBJECT,
responses={200: status_response("CropZoningZonesCultivationRiskResponse", data=serializers.JSONField())},
)
def post(self, request):
return JsonResponse(
return Response(
{"status": "success", "data": ZONES_CULTIVATION_RISK_RESPONSE_DATA},
status=200,
status=status.HTTP_200_OK,
)
class ZoneDetailsView(View):
class ZoneDetailsView(APIView):
"""
GET endpoint for zone detail data (detail panel after click).
@@ -208,9 +233,13 @@ class ZoneDetailsView(View):
not used in the response.
"""
@extend_schema(
tags=["Crop Zoning"],
responses={200: status_response("CropZoningZoneDetailsResponse", data=serializers.JSONField())},
)
def get(self, request, zone_id):
data = ZONE_DETAILS_BY_ID.get(zone_id, ZONE_DETAILS_BY_ID["zone-0"])
return JsonResponse(
return Response(
{"status": "success", "data": data},
status=200,
status=status.HTTP_200_OK,
)