UPDATE
This commit is contained in:
@@ -2,6 +2,8 @@ from __future__ import annotations
|
||||
|
||||
import json
|
||||
|
||||
from django.apps import apps
|
||||
|
||||
from rest_framework import serializers
|
||||
|
||||
|
||||
@@ -18,8 +20,38 @@ class QueryJSONField(serializers.JSONField):
|
||||
return super().to_internal_value(data)
|
||||
|
||||
|
||||
class GrowthSimulationRequestSerializer(serializers.Serializer):
|
||||
plant_name = serializers.CharField(help_text="نام گیاه")
|
||||
class PlantNameAliasMixin:
|
||||
plant_name_field = "plant_name"
|
||||
plant_alias_fields = ("crop", "crop_name")
|
||||
|
||||
def _get_raw_plant_name(self, attrs):
|
||||
value = attrs.get(self.plant_name_field)
|
||||
if value not in (None, ""):
|
||||
return value
|
||||
|
||||
for alias in self.plant_alias_fields:
|
||||
alias_value = self.initial_data.get(alias) if hasattr(self, "initial_data") else None
|
||||
if alias_value not in (None, ""):
|
||||
return alias_value
|
||||
return value
|
||||
|
||||
def _resolve_plant_name(self, attrs, *, required: bool) -> dict:
|
||||
raw_value = self._get_raw_plant_name(attrs)
|
||||
if raw_value in (None, ""):
|
||||
if required:
|
||||
raise serializers.ValidationError(
|
||||
{self.plant_name_field: "یکی از plant_name، crop یا crop_name باید ارسال شود."}
|
||||
)
|
||||
attrs[self.plant_name_field] = ""
|
||||
return attrs
|
||||
|
||||
resolved_value = apps.get_app_config("plant").resolve_plant_name(str(raw_value))
|
||||
attrs[self.plant_name_field] = resolved_value or str(raw_value).strip()
|
||||
return attrs
|
||||
|
||||
|
||||
class GrowthSimulationRequestSerializer(PlantNameAliasMixin, serializers.Serializer):
|
||||
plant_name = serializers.CharField(required=False, allow_blank=True, help_text="نام گیاه")
|
||||
dynamic_parameters = serializers.ListField(
|
||||
child=serializers.CharField(),
|
||||
allow_empty=False,
|
||||
@@ -36,6 +68,7 @@ class GrowthSimulationRequestSerializer(serializers.Serializer):
|
||||
page_size = serializers.IntegerField(required=False, min_value=1, max_value=50)
|
||||
|
||||
def validate(self, attrs):
|
||||
attrs = self._resolve_plant_name(attrs, required=True)
|
||||
if not attrs.get("farm_uuid") and not attrs.get("weather"):
|
||||
raise serializers.ValidationError(
|
||||
"یکی از farm_uuid یا weather باید ارسال شود."
|
||||
@@ -44,7 +77,7 @@ class GrowthSimulationRequestSerializer(serializers.Serializer):
|
||||
|
||||
|
||||
class GrowthSimulationQueuedSerializer(serializers.Serializer):
|
||||
task_id = serializers.CharField()
|
||||
task_id = serializers.UUIDField()
|
||||
status_url = serializers.CharField()
|
||||
plant_name = serializers.CharField()
|
||||
|
||||
@@ -92,12 +125,15 @@ class GrowthSimulationResultSerializer(serializers.Serializer):
|
||||
|
||||
|
||||
|
||||
class CurrentFarmChartRequestSerializer(serializers.Serializer):
|
||||
class CurrentFarmChartRequestSerializer(PlantNameAliasMixin, serializers.Serializer):
|
||||
farm_uuid = serializers.UUIDField(help_text="شناسه یکتای مزرعه")
|
||||
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):
|
||||
return self._resolve_plant_name(attrs, required=False)
|
||||
|
||||
|
||||
class CurrentFarmChartResponseSerializer(serializers.Serializer):
|
||||
farm_uuid = serializers.CharField(allow_null=True)
|
||||
@@ -114,12 +150,15 @@ class CurrentFarmChartResponseSerializer(serializers.Serializer):
|
||||
daily_output = serializers.JSONField()
|
||||
|
||||
|
||||
class HarvestPredictionRequestSerializer(serializers.Serializer):
|
||||
class HarvestPredictionRequestSerializer(PlantNameAliasMixin, serializers.Serializer):
|
||||
farm_uuid = serializers.UUIDField(help_text="شناسه یکتای مزرعه")
|
||||
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):
|
||||
return self._resolve_plant_name(attrs, required=False)
|
||||
|
||||
|
||||
class HarvestPredictionResponseSerializer(serializers.Serializer):
|
||||
date = serializers.CharField()
|
||||
@@ -131,12 +170,15 @@ class HarvestPredictionResponseSerializer(serializers.Serializer):
|
||||
gddDetails = serializers.JSONField()
|
||||
|
||||
|
||||
class YieldPredictionRequestSerializer(serializers.Serializer):
|
||||
class YieldPredictionRequestSerializer(PlantNameAliasMixin, serializers.Serializer):
|
||||
farm_uuid = serializers.UUIDField(help_text="شناسه یکتای مزرعه")
|
||||
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):
|
||||
return self._resolve_plant_name(attrs, required=False)
|
||||
|
||||
|
||||
class YieldPredictionResponseSerializer(serializers.Serializer):
|
||||
farm_uuid = serializers.CharField()
|
||||
@@ -172,6 +214,15 @@ class YieldHarvestSummaryQuerySerializer(serializers.Serializer):
|
||||
help_text="برنامه کودهی به صورت JSON برای تزریق به PCSE.",
|
||||
)
|
||||
|
||||
def validate(self, attrs):
|
||||
raw_crop_name = attrs.get("crop_name")
|
||||
if raw_crop_name in (None, "") and hasattr(self, "initial_data"):
|
||||
raw_crop_name = self.initial_data.get("plant_name") or self.initial_data.get("crop")
|
||||
if raw_crop_name not in (None, ""):
|
||||
resolved_crop_name = apps.get_app_config("plant").resolve_plant_name(str(raw_crop_name))
|
||||
attrs["crop_name"] = resolved_crop_name or str(raw_crop_name).strip()
|
||||
return attrs
|
||||
|
||||
|
||||
class YieldHarvestSummaryResponseSerializer(serializers.Serializer):
|
||||
farm_uuid = serializers.CharField()
|
||||
|
||||
Reference in New Issue
Block a user