from drf_spectacular.utils import ( OpenApiExample, OpenApiResponse, extend_schema, ) from rest_framework import status from rest_framework.response import Response from rest_framework.views import APIView from .models import IrrigationMethod from .serializers import IrrigationMethodSerializer class IrrigationMethodListCreateView(APIView): """لیست تمام روش‌های آبیاری و ایجاد روش جدید.""" @extend_schema( tags=["Irrigation"], summary="لیست روش‌های آبیاری", description="لیست تمام روش‌های آبیاری ذخیره‌شده را برمی‌گرداند.", responses={200: IrrigationMethodSerializer(many=True)}, ) def get(self, request): methods = IrrigationMethod.objects.all() serializer = IrrigationMethodSerializer(methods, many=True) return Response( {"code": 200, "msg": "success", "data": serializer.data}, status=status.HTTP_200_OK, ) @extend_schema( tags=["Irrigation"], summary="ایجاد روش آبیاری جدید", description="یک روش آبیاری جدید ایجاد می‌کند.", request=IrrigationMethodSerializer, responses={ 201: IrrigationMethodSerializer, 400: OpenApiResponse(description="داده نامعتبر"), }, examples=[ OpenApiExample( "نمونه درخواست", value={ "name": "آبیاری قطره‌ای", "category": "موضعی", "description": "آبیاری با دبی کم و فشار مناسب", "water_efficiency_percent": 90.0, "water_pressure_required": "۱-۲ اتمسفر", "flow_rate": "۲-۸ لیتر در ساعت", "coverage_area": "بسته به طراحی سیستم", "soil_type": "تمام انواع خاک", "climate_suitability": "گرم و خشک", }, request_only=True, ), ], ) def post(self, request): serializer = IrrigationMethodSerializer(data=request.data) if not serializer.is_valid(): return Response( {"code": 400, "msg": "داده نامعتبر.", "data": serializer.errors}, status=status.HTTP_400_BAD_REQUEST, ) serializer.save() return Response( {"code": 201, "msg": "success", "data": serializer.data}, status=status.HTTP_201_CREATED, ) class IrrigationMethodDetailView(APIView): """دریافت، ویرایش و حذف یک روش آبیاری.""" def _get_method(self, pk): return IrrigationMethod.objects.filter(pk=pk).first() @extend_schema( tags=["Irrigation"], summary="جزئیات روش آبیاری", description="مشخصات یک روش آبیاری را بر اساس شناسه برمی‌گرداند.", responses={ 200: IrrigationMethodSerializer, 404: OpenApiResponse(description="روش آبیاری یافت نشد"), }, ) def get(self, request, pk): method = self._get_method(pk) if not method: return Response( {"code": 404, "msg": "روش آبیاری یافت نشد.", "data": None}, status=status.HTTP_404_NOT_FOUND, ) serializer = IrrigationMethodSerializer(method) return Response( {"code": 200, "msg": "success", "data": serializer.data}, status=status.HTTP_200_OK, ) @extend_schema( tags=["Irrigation"], summary="ویرایش کامل روش آبیاری", description="تمام فیلدهای یک روش آبیاری را آپدیت می‌کند.", request=IrrigationMethodSerializer, responses={ 200: IrrigationMethodSerializer, 400: OpenApiResponse(description="داده نامعتبر"), 404: OpenApiResponse(description="روش آبیاری یافت نشد"), }, ) def put(self, request, pk): method = self._get_method(pk) if not method: return Response( {"code": 404, "msg": "روش آبیاری یافت نشد.", "data": None}, status=status.HTTP_404_NOT_FOUND, ) serializer = IrrigationMethodSerializer(method, data=request.data) if not serializer.is_valid(): return Response( {"code": 400, "msg": "داده نامعتبر.", "data": serializer.errors}, status=status.HTTP_400_BAD_REQUEST, ) serializer.save() return Response( {"code": 200, "msg": "success", "data": serializer.data}, status=status.HTTP_200_OK, ) @extend_schema( tags=["Irrigation"], summary="ویرایش جزئی روش آبیاری", description="فقط فیلدهای ارسال‌شده آپدیت می‌شوند.", request=IrrigationMethodSerializer, responses={ 200: IrrigationMethodSerializer, 400: OpenApiResponse(description="داده نامعتبر"), 404: OpenApiResponse(description="روش آبیاری یافت نشد"), }, ) def patch(self, request, pk): method = self._get_method(pk) if not method: return Response( {"code": 404, "msg": "روش آبیاری یافت نشد.", "data": None}, status=status.HTTP_404_NOT_FOUND, ) serializer = IrrigationMethodSerializer(method, data=request.data, partial=True) if not serializer.is_valid(): return Response( {"code": 400, "msg": "داده نامعتبر.", "data": serializer.errors}, status=status.HTTP_400_BAD_REQUEST, ) serializer.save() return Response( {"code": 200, "msg": "success", "data": serializer.data}, status=status.HTTP_200_OK, ) @extend_schema( tags=["Irrigation"], summary="حذف روش آبیاری", description="یک روش آبیاری را حذف می‌کند.", responses={ 200: OpenApiResponse(description="حذف موفق"), 404: OpenApiResponse(description="روش آبیاری یافت نشد"), }, ) def delete(self, request, pk): method = self._get_method(pk) if not method: return Response( {"code": 404, "msg": "روش آبیاری یافت نشد.", "data": None}, status=status.HTTP_404_NOT_FOUND, ) method.delete() return Response( {"code": 200, "msg": "روش آبیاری با موفقیت حذف شد.", "data": None}, status=status.HTTP_200_OK, )