2026-03-21 23:50:36 +03:30
|
|
|
from rest_framework import serializers
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FertilizationRecommendRequestSerializer(serializers.Serializer):
|
|
|
|
|
"""سریالایزر ورودی برای درخواست توصیه کودهی."""
|
|
|
|
|
|
2026-04-28 04:11:49 +03:30
|
|
|
farm_uuid = serializers.CharField(required=False, help_text="شناسه یکتای مزرعه")
|
2026-04-24 22:20:15 +03:30
|
|
|
sensor_uuid = serializers.CharField(required=False, help_text="نام قدیمی برای farm_uuid")
|
2026-04-28 04:11:49 +03:30
|
|
|
crop_id = serializers.CharField(required=False, allow_blank=True, help_text="شناسه یا نام محصول")
|
2026-03-21 23:50:36 +03:30
|
|
|
plant_name = serializers.CharField(required=False, allow_blank=True, help_text="نام گیاه")
|
|
|
|
|
growth_stage = serializers.CharField(required=False, allow_blank=True, help_text="مرحله رشد گیاه")
|
|
|
|
|
query = serializers.CharField(required=False, allow_blank=True, help_text="سوال اختیاری")
|
|
|
|
|
|
2026-04-24 22:20:15 +03:30
|
|
|
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 الزامی است."})
|
2026-04-28 04:11:49 +03:30
|
|
|
|
|
|
|
|
crop_id = (attrs.get("crop_id") or "").strip()
|
|
|
|
|
plant_name = (attrs.get("plant_name") or "").strip()
|
|
|
|
|
if crop_id and not plant_name:
|
|
|
|
|
attrs["plant_name"] = crop_id
|
2026-04-24 22:20:15 +03:30
|
|
|
attrs["farm_uuid"] = farm_uuid
|
|
|
|
|
return attrs
|
|
|
|
|
|
2026-03-21 23:50:36 +03:30
|
|
|
|
2026-04-28 04:11:49 +03:30
|
|
|
class NpkRatioSerializer(serializers.Serializer):
|
|
|
|
|
n = serializers.FloatField()
|
|
|
|
|
p = serializers.FloatField()
|
|
|
|
|
k = serializers.FloatField()
|
|
|
|
|
label = serializers.CharField()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FertilizationApplicationMethodSerializer(serializers.Serializer):
|
|
|
|
|
id = serializers.CharField()
|
|
|
|
|
label = serializers.CharField()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FertilizationApplicationIntervalSerializer(serializers.Serializer):
|
|
|
|
|
value = serializers.IntegerField()
|
|
|
|
|
unit = serializers.CharField()
|
|
|
|
|
label = serializers.CharField()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FertilizationDosageSerializer(serializers.Serializer):
|
|
|
|
|
base_amount_per_hectare = serializers.FloatField()
|
|
|
|
|
base_amount_per_square_meter = serializers.FloatField()
|
|
|
|
|
unit = serializers.CharField()
|
|
|
|
|
label = serializers.CharField()
|
|
|
|
|
calculation_basis = serializers.CharField()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PrimaryFertilizationRecommendationSerializer(serializers.Serializer):
|
|
|
|
|
fertilizer_code = serializers.CharField()
|
|
|
|
|
fertilizer_name = serializers.CharField()
|
|
|
|
|
display_title = serializers.CharField()
|
|
|
|
|
fertilizer_type = serializers.CharField()
|
|
|
|
|
npk_ratio = NpkRatioSerializer()
|
|
|
|
|
application_method = FertilizationApplicationMethodSerializer()
|
|
|
|
|
application_interval = FertilizationApplicationIntervalSerializer()
|
|
|
|
|
dosage = FertilizationDosageSerializer()
|
|
|
|
|
reasoning = serializers.CharField()
|
|
|
|
|
summary = serializers.CharField()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FertilizationNutrientSerializer(serializers.Serializer):
|
|
|
|
|
key = serializers.CharField()
|
|
|
|
|
name = serializers.CharField()
|
|
|
|
|
value = serializers.FloatField()
|
|
|
|
|
unit = serializers.CharField()
|
|
|
|
|
description = serializers.CharField(required=False, allow_blank=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FertilizationNutrientAnalysisSerializer(serializers.Serializer):
|
|
|
|
|
macro = FertilizationNutrientSerializer(many=True)
|
|
|
|
|
micro = FertilizationNutrientSerializer(many=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FertilizationGuideStepSerializer(serializers.Serializer):
|
|
|
|
|
step_number = serializers.IntegerField()
|
|
|
|
|
title = serializers.CharField()
|
|
|
|
|
description = serializers.CharField()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FertilizationApplicationGuideSerializer(serializers.Serializer):
|
|
|
|
|
safety_warning = serializers.CharField()
|
|
|
|
|
steps = FertilizationGuideStepSerializer(many=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AlternativeFertilizationRecommendationSerializer(serializers.Serializer):
|
|
|
|
|
fertilizer_code = serializers.CharField()
|
|
|
|
|
fertilizer_name = serializers.CharField()
|
|
|
|
|
fertilizer_type = serializers.CharField()
|
|
|
|
|
usage_method = serializers.CharField()
|
|
|
|
|
description = serializers.CharField()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FertilizationSectionSerializer(serializers.Serializer):
|
|
|
|
|
type = serializers.CharField()
|
|
|
|
|
title = serializers.CharField()
|
|
|
|
|
icon = serializers.CharField(required=False, allow_blank=True)
|
|
|
|
|
content = serializers.CharField(required=False, allow_blank=True)
|
|
|
|
|
items = serializers.ListField(child=serializers.CharField(), required=False)
|
|
|
|
|
fertilizerType = serializers.CharField(required=False, allow_blank=True)
|
|
|
|
|
amount = serializers.CharField(required=False, allow_blank=True)
|
|
|
|
|
applicationMethod = serializers.CharField(required=False, allow_blank=True)
|
|
|
|
|
timing = serializers.CharField(required=False, allow_blank=True)
|
|
|
|
|
validityPeriod = serializers.CharField(required=False, allow_blank=True)
|
|
|
|
|
expandableExplanation = serializers.CharField(required=False, allow_blank=True)
|
|
|
|
|
|
2026-03-21 23:50:36 +03:30
|
|
|
|
2026-04-28 04:11:49 +03:30
|
|
|
class FertilizationRecommendationResponseDataSerializer(serializers.Serializer):
|
|
|
|
|
primary_recommendation = PrimaryFertilizationRecommendationSerializer()
|
|
|
|
|
nutrient_analysis = FertilizationNutrientAnalysisSerializer()
|
|
|
|
|
application_guide = FertilizationApplicationGuideSerializer()
|
|
|
|
|
alternative_recommendations = AlternativeFertilizationRecommendationSerializer(many=True)
|
|
|
|
|
sections = FertilizationSectionSerializer(many=True, required=False)
|