120 lines
5.5 KiB
Python
120 lines
5.5 KiB
Python
from rest_framework import serializers
|
|
|
|
from .models import IrrigationMethod
|
|
|
|
|
|
class IrrigationMethodSerializer(serializers.ModelSerializer):
|
|
"""سریالایزر خروجی / ورودی برای IrrigationMethod."""
|
|
|
|
class Meta:
|
|
model = IrrigationMethod
|
|
fields = [
|
|
"id",
|
|
"name",
|
|
"category",
|
|
"description",
|
|
"water_efficiency_percent",
|
|
"water_pressure_required",
|
|
"flow_rate",
|
|
"coverage_area",
|
|
"soil_type",
|
|
"climate_suitability",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
|
|
class IrrigationRecommendRequestSerializer(serializers.Serializer):
|
|
"""سریالایزر ورودی برای درخواست توصیه آبیاری."""
|
|
|
|
farm_uuid = serializers.CharField(required=False, help_text="شناسه یکتای مزرعه (اجباری)")
|
|
sensor_uuid = serializers.CharField(required=False, help_text="نام قدیمی برای farm_uuid")
|
|
plant_name = serializers.CharField(required=False, allow_blank=True, help_text="نام گیاه")
|
|
growth_stage = serializers.CharField(required=False, allow_blank=True, help_text="مرحله رشد گیاه")
|
|
irrigation_method_name = serializers.CharField(
|
|
required=False, allow_blank=True, help_text="نام روش آبیاری"
|
|
)
|
|
query = serializers.CharField(required=False, allow_blank=True, help_text="سوال اختیاری")
|
|
|
|
def validate(self, attrs):
|
|
farm_uuid = attrs.get("farm_uuid") or attrs.get("sensor_uuid")
|
|
if not farm_uuid:
|
|
raise serializers.ValidationError({"farm_uuid": "farm_uuid الزامی است."})
|
|
attrs["farm_uuid"] = farm_uuid
|
|
return attrs
|
|
|
|
|
|
class IrrigationPlanSerializer(serializers.Serializer):
|
|
"""سریالایزر خروجی برای پلن توصیه آبیاری."""
|
|
|
|
frequencyPerWeek = serializers.IntegerField(help_text="تعداد دفعات آبیاری در هفته")
|
|
durationMinutes = serializers.IntegerField(help_text="مدت هر بار آبیاری به دقیقه")
|
|
bestTimeOfDay = serializers.CharField(help_text="بهترین زمان آبیاری")
|
|
moistureLevel = serializers.IntegerField(help_text="سطح رطوبت مطلوب خاک به درصد")
|
|
warning = serializers.CharField(help_text="هشدار یا توصیه مهم", allow_blank=True)
|
|
|
|
|
|
class IrrigationRecommendResponseSerializer(serializers.Serializer):
|
|
"""سریالایزر خروجی برای ریسپانس توصیه آبیاری."""
|
|
|
|
code = serializers.IntegerField()
|
|
msg = serializers.CharField()
|
|
data = serializers.DictField(child=serializers.JSONField())
|
|
|
|
|
|
class WaterStressRequestSerializer(serializers.Serializer):
|
|
farm_uuid = serializers.CharField(required=False, help_text="شناسه یکتای مزرعه")
|
|
sensor_uuid = serializers.CharField(required=False, help_text="نام قدیمی برای farm_uuid")
|
|
plant_name = serializers.CharField(required=False, allow_blank=True, help_text="نام گیاه")
|
|
irrigation_recommendation = serializers.JSONField(required=False)
|
|
fertilization_recommendation = serializers.JSONField(required=False)
|
|
|
|
def validate(self, attrs):
|
|
farm_uuid = attrs.get("farm_uuid") or attrs.get("sensor_uuid")
|
|
if not farm_uuid:
|
|
raise serializers.ValidationError({"farm_uuid": "farm_uuid الزامی است."})
|
|
attrs["farm_uuid"] = farm_uuid
|
|
return attrs
|
|
|
|
|
|
class WaterStressResponseSerializer(serializers.Serializer):
|
|
farm_uuid = serializers.CharField()
|
|
waterStressIndex = serializers.IntegerField()
|
|
level = serializers.CharField()
|
|
sourceMetric = serializers.JSONField()
|
|
|
|
|
|
class IrrigationPlanParserRequestSerializer(serializers.Serializer):
|
|
message = serializers.CharField(required=False, allow_blank=True, help_text="توضیح آزاد کاربر درباره برنامه آبیاری")
|
|
answers = serializers.JSONField(required=False, help_text="پاسخ های تکمیلی کاربر به سوالات مرحله قبل")
|
|
partial_plan = serializers.JSONField(required=False, help_text="داده استخراج شده مرحله قبل برای ادامه تکمیل")
|
|
farm_uuid = serializers.CharField(required=False, allow_blank=True, help_text="شناسه مزرعه برای غنی سازی context")
|
|
|
|
def validate(self, attrs):
|
|
message = (attrs.get("message") or "").strip()
|
|
answers = attrs.get("answers")
|
|
partial_plan = attrs.get("partial_plan")
|
|
if not message and not isinstance(answers, dict) and not isinstance(partial_plan, dict):
|
|
raise serializers.ValidationError(
|
|
"حداقل یکی از message، answers یا partial_plan باید ارسال شود."
|
|
)
|
|
return attrs
|
|
|
|
|
|
class PlanClarificationQuestionSerializer(serializers.Serializer):
|
|
id = serializers.CharField()
|
|
field = serializers.CharField()
|
|
question = serializers.CharField()
|
|
rationale = serializers.CharField(required=False, allow_blank=True)
|
|
|
|
|
|
class IrrigationPlanParserResponseSerializer(serializers.Serializer):
|
|
status = serializers.CharField()
|
|
status_fa = serializers.CharField()
|
|
summary = serializers.CharField()
|
|
missing_fields = serializers.ListField(child=serializers.CharField())
|
|
questions = PlanClarificationQuestionSerializer(many=True)
|
|
collected_data = serializers.JSONField()
|
|
final_plan = serializers.JSONField(required=False, allow_null=True)
|