Files
Ai/farm_alerts/views.py
T

115 lines
4.8 KiB
Python
Raw Normal View History

2026-04-25 17:22:41 +03:30
from drf_spectacular.utils import OpenApiExample, extend_schema
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from config.openapi import build_envelope_serializer, build_response
from .serializers import FarmAlertsRequestSerializer
from .services import get_farm_alerts_timeline, get_farm_alerts_tracker
FarmAlertsValidationErrorSerializer = build_envelope_serializer(
"FarmAlertsValidationErrorSerializer",
data_required=False,
allow_null=True,
)
FarmAlertsTrackerResponseSerializer = build_envelope_serializer(
"FarmAlertsTrackerResponseSerializer",
data_schema=None,
)
FarmAlertsTimelineResponseSerializer = build_envelope_serializer(
"FarmAlertsTimelineResponseSerializer",
data_schema=None,
)
class FarmAlertsTrackerView(APIView):
@extend_schema(
tags=["Farm Alerts"],
summary="ارزیابی tracker هشدارهای مزرعه",
description=(
"با دریافت farm_uuid، هشدارهای مزرعه را تحلیل می کند، "
"کانتکست مزرعه را به RAG می فرستد، و notificationهای سطح خطر/هشدار/اطلاع رسانی را در دیتابیس ذخیره می کند."
),
request=FarmAlertsRequestSerializer,
responses={
200: build_response(FarmAlertsTrackerResponseSerializer, "خروجی tracker هشدارهای مزرعه."),
400: build_response(FarmAlertsValidationErrorSerializer, "پارامتر ورودی نامعتبر است."),
500: build_response(FarmAlertsValidationErrorSerializer, "خطا در تولید خروجی tracker هشدارها."),
},
examples=[
OpenApiExample(
"نمونه درخواست tracker",
value={
"farm_uuid": "11111111-1111-1111-1111-111111111111",
},
request_only=True,
),
],
)
def post(self, request):
serializer = FarmAlertsRequestSerializer(data=request.data)
if not serializer.is_valid():
return Response(
{"code": 400, "msg": "داده نامعتبر.", "data": serializer.errors},
status=status.HTTP_400_BAD_REQUEST,
)
validated = serializer.validated_data
try:
result = get_farm_alerts_tracker(
farm_uuid=validated["farm_uuid"],
query=validated.get("query"),
)
except Exception as exc:
return Response(
{"code": 500, "msg": f"خطا در تولید tracker هشدارها: {exc}", "data": None},
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
)
return Response({"code": 200, "msg": "success", "data": result}, status=status.HTTP_200_OK)
class FarmAlertsTimelineView(APIView):
@extend_schema(
tags=["Farm Alerts"],
summary="دریافت timeline هشدارهای مزرعه",
description=(
"با دریافت farm_uuid، timeline هشدارهای مزرعه را با کمک RAG می سازد "
"و notificationهای استخراج شده را در دیتابیس ذخیره می کند."
),
request=FarmAlertsRequestSerializer,
responses={
200: build_response(FarmAlertsTimelineResponseSerializer, "خروجی timeline هشدارهای مزرعه."),
400: build_response(FarmAlertsValidationErrorSerializer, "پارامتر ورودی نامعتبر است."),
500: build_response(FarmAlertsValidationErrorSerializer, "خطا در تولید timeline هشدارها."),
},
examples=[
OpenApiExample(
"نمونه درخواست timeline",
value={
"farm_uuid": "11111111-1111-1111-1111-111111111111",
},
request_only=True,
),
],
)
def post(self, request):
serializer = FarmAlertsRequestSerializer(data=request.data)
if not serializer.is_valid():
return Response(
{"code": 400, "msg": "داده نامعتبر.", "data": serializer.errors},
status=status.HTTP_400_BAD_REQUEST,
)
validated = serializer.validated_data
try:
result = get_farm_alerts_timeline(
farm_uuid=validated["farm_uuid"],
query=validated.get("query"),
)
except Exception as exc:
return Response(
{"code": 500, "msg": f"خطا در تولید timeline هشدارها: {exc}", "data": None},
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
)
return Response({"code": 200, "msg": "success", "data": result}, status=status.HTTP_200_OK)