76 lines
2.5 KiB
Python
76 lines
2.5 KiB
Python
from rest_framework import status
|
|
from rest_framework.response import Response
|
|
from rest_framework.views import APIView
|
|
|
|
from external_api_adapter import request as external_api_request
|
|
|
|
from .serializers import AlertTimelineSerializer, AlertTrackerSerializer
|
|
|
|
|
|
class FarmAlertsBaseView(APIView):
|
|
@staticmethod
|
|
def _extract_result(adapter_data):
|
|
if not isinstance(adapter_data, dict):
|
|
return {}
|
|
|
|
data = adapter_data.get("data")
|
|
if isinstance(data, dict) and isinstance(data.get("result"), dict):
|
|
return data["result"]
|
|
if isinstance(data, dict):
|
|
return data
|
|
|
|
result = adapter_data.get("result")
|
|
if isinstance(result, dict):
|
|
return result
|
|
|
|
return adapter_data
|
|
|
|
@staticmethod
|
|
def _error_response(adapter_response):
|
|
response_data = (
|
|
adapter_response.data
|
|
if isinstance(adapter_response.data, dict)
|
|
else {"message": str(adapter_response.data)}
|
|
)
|
|
return Response(
|
|
{"code": adapter_response.status_code, "msg": "error", "data": response_data},
|
|
status=adapter_response.status_code,
|
|
)
|
|
|
|
|
|
class AlertTrackerView(FarmAlertsBaseView):
|
|
def post(self, request):
|
|
adapter_response = external_api_request(
|
|
"ai",
|
|
"/api/farm-alerts/tracker/",
|
|
method="POST",
|
|
payload=request.data,
|
|
)
|
|
if adapter_response.status_code >= 400:
|
|
return self._error_response(adapter_response)
|
|
|
|
payload = self._extract_result(adapter_response.data)
|
|
serializer = AlertTrackerSerializer(data=payload)
|
|
serializer.is_valid(raise_exception=True)
|
|
return Response({"code": 200, "msg": "success", "data": serializer.validated_data}, status=status.HTTP_200_OK)
|
|
|
|
|
|
class AlertTimelineView(FarmAlertsBaseView):
|
|
def post(self, request):
|
|
adapter_response = external_api_request(
|
|
"ai",
|
|
"/api/farm-alerts/timeline/",
|
|
method="POST",
|
|
payload=request.data,
|
|
)
|
|
if adapter_response.status_code >= 400:
|
|
return self._error_response(adapter_response)
|
|
|
|
payload = self._extract_result(adapter_response.data)
|
|
serializer = AlertTimelineSerializer(data=payload)
|
|
serializer.is_valid(raise_exception=True)
|
|
return Response(
|
|
{"code": 200, "msg": "success", "data": serializer.validated_data},
|
|
status=status.HTTP_200_OK,
|
|
)
|