first commit

This commit is contained in:
2026-03-19 22:54:29 +03:30
parent 1a178f39b7
commit 035bc6f74d
91 changed files with 3821 additions and 130 deletions
+84 -1
View File
@@ -1,9 +1,16 @@
from django.db import transaction
from drf_spectacular.utils import (
OpenApiExample,
OpenApiResponse,
extend_schema,
inline_serializer,
)
from rest_framework import serializers as drf_serializers
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from soil_data.models import SoilLocation
from location_data.models import SoilLocation
from .models import ParameterUpdateLog, SensorData, SensorDataHistory, SensorParameter
from .serializers import (
@@ -18,9 +25,47 @@ class SensorDataUpdateView(APIView):
آپدیت داده سنسور. هنگام آپدیت، نسخه فعلی در SensorDataHistory ذخیره می‌شود.
"""
@extend_schema(
tags=["Sensor Data"],
summary="آپدیت کامل داده سنسور",
description="داده سنسور را بر اساس uuid_sensor آپدیت (یا ایجاد) می‌کند. نسخه قبلی در تاریخچه ذخیره می‌شود.",
request=SensorDataUpdateSerializer,
responses={
200: SensorDataResponseSerializer,
400: OpenApiResponse(description="داده نامعتبر"),
404: OpenApiResponse(description="location_id یافت نشد"),
},
examples=[
OpenApiExample(
"نمونه درخواست",
value={
"location_id": 1,
"soil_moisture": 45.2,
"soil_temperature": 22.5,
"soil_ph": 6.8,
"electrical_conductivity": 1.2,
"nitrogen": 30.0,
"phosphorus": 15.0,
"potassium": 20.0,
},
request_only=True,
),
],
)
def put(self, request, uuid_sensor):
return self._update(request, uuid_sensor)
@extend_schema(
tags=["Sensor Data"],
summary="آپدیت جزئی داده سنسور",
description="فقط فیلدهای ارسال‌شده آپدیت می‌شوند.",
request=SensorDataUpdateSerializer,
responses={
200: SensorDataResponseSerializer,
400: OpenApiResponse(description="داده نامعتبر"),
404: OpenApiResponse(description="location_id یافت نشد"),
},
)
def patch(self, request, uuid_sensor):
return self._update(request, uuid_sensor, partial=True)
@@ -35,6 +80,7 @@ class SensorDataUpdateView(APIView):
)
location_id = serializer.validated_data.pop("location_id")
plant_ids = serializer.validated_data.pop("plant_ids", None)
location = SoilLocation.objects.filter(pk=location_id).first()
if not location:
return Response(
@@ -67,6 +113,9 @@ class SensorDataUpdateView(APIView):
potassium=sensor_data.potassium,
)
if plant_ids is not None:
sensor_data.plants.set(plant_ids)
return Response(
{
"code": 200,
@@ -82,6 +131,40 @@ class SensorParameterCreateView(APIView):
اضافه کردن پارامتر جدید و ثبت در ParameterUpdateLog.
"""
@extend_schema(
tags=["Sensor Parameters"],
summary="افزودن/ویرایش پارامتر سنسور",
description="پارامتر جدید اضافه یا پارامتر موجود را ویرایش می‌کند و در لاگ ثبت می‌شود.",
request=SensorParameterSerializer,
responses={
201: inline_serializer(
name="SensorParameterResponse",
fields={
"code": drf_serializers.IntegerField(),
"msg": drf_serializers.CharField(),
"data": inline_serializer(
name="SensorParameterData",
fields={
"id": drf_serializers.IntegerField(),
"code": drf_serializers.CharField(),
"name_fa": drf_serializers.CharField(),
"unit": drf_serializers.CharField(),
"created_at": drf_serializers.DateTimeField(),
"action": drf_serializers.CharField(),
},
),
},
),
400: OpenApiResponse(description="داده نامعتبر"),
},
examples=[
OpenApiExample(
"نمونه درخواست",
value={"code": "soil_moisture", "name_fa": "رطوبت خاک", "unit": "%"},
request_only=True,
),
],
)
def post(self, request):
serializer = SensorParameterSerializer(data=request.data)
if not serializer.is_valid():