This commit is contained in:
2026-05-05 01:46:10 +03:30
parent 2016aa2058
commit 5301071df5
23 changed files with 962 additions and 136 deletions
+57 -1
View File
@@ -21,10 +21,14 @@ from .serializers import (
SensorParameterSerializer,
)
from .services import (
BackendSyncError,
assign_farm_plants_from_backend_ids,
ExternalDataSyncError,
ensure_location_and_weather_data,
get_farm_details,
resolve_center_location_from_boundary,
sync_sensor_parameters_from_payload,
sync_plant_catalog_from_backend,
)
@@ -188,6 +192,7 @@ class FarmDataUpsertView(APIView):
)
with transaction.atomic():
sync_sensor_parameters_from_payload(sensor_payload)
farm_data, created = SensorData.objects.get_or_create(
farm_uuid=farm_uuid,
defaults={
@@ -227,7 +232,13 @@ class FarmDataUpsertView(APIView):
farm_data.save()
if plant_ids is not None:
farm_data.plants.set(plant_ids)
try:
assign_farm_plants_from_backend_ids(farm_data, plant_ids)
except BackendSyncError as exc:
return Response(
{"code": 400, "msg": str(exc), "data": None},
status=status.HTTP_400_BAD_REQUEST,
)
response_status = (
status.HTTP_201_CREATED if created else status.HTTP_200_OK
@@ -276,6 +287,51 @@ class FarmDetailView(APIView):
)
class PlantCatalogSyncView(APIView):
@extend_schema(
tags=["Farm Data"],
summary="همگام‌سازی کاتالوگ گیاه از Backend",
description="payload گیاه‌های canonical را از Backend دریافت و در `farm_data` snapshot می‌کند.",
request=drf_serializers.ListSerializer(
child=inline_serializer(
name="PlantCatalogSyncItem",
fields={
"id": drf_serializers.IntegerField(),
"name": drf_serializers.CharField(),
},
)
),
responses={
200: OpenApiResponse(description="کاتالوگ گیاه با موفقیت sync شد."),
400: OpenApiResponse(description="payload نامعتبر است."),
},
)
def post(self, request):
if not isinstance(request.data, list):
return Response(
{"code": 400, "msg": "payload باید آرایه‌ای از گیاه‌ها باشد.", "data": None},
status=status.HTTP_400_BAD_REQUEST,
)
try:
snapshots = sync_plant_catalog_from_backend(request.data)
except BackendSyncError as exc:
return Response(
{"code": 400, "msg": str(exc), "data": None},
status=status.HTTP_400_BAD_REQUEST,
)
return Response(
{
"code": 200,
"msg": "success",
"data": {
"count": len(snapshots),
"plant_ids": [snapshot.backend_plant_id for snapshot in snapshots],
},
},
status=status.HTTP_200_OK,
)
class SensorParameterCreateView(APIView):
"""
اضافه کردن پارامتر جدید و ثبت در ParameterUpdateLog.