This commit is contained in:
2026-04-27 00:40:59 +03:30
parent 2cd96ceec6
commit 64e67c282c
56 changed files with 3912 additions and 745 deletions
+111 -35
View File
@@ -1,40 +1,5 @@
from rest_framework import serializers
from .mock_data import CONFIG_SLIDERS_ONLY
START_ENVIRONMENT_KEYS = [
item["key"]
for item in CONFIG_SLIDERS_ONLY["sliders"]
if item["key"] != "growth_speed"
]
def _defaults_from_sliders():
return {
item["key"]: item["default_value"]
for item in CONFIG_SLIDERS_ONLY["sliders"]
}
START_REQUEST_EXAMPLE = {
"environment": {
key: value for key, value in _defaults_from_sliders().items() if key != "growth_speed"
},
"growth_speed": _defaults_from_sliders().get("growth_speed", 1.5),
}
START_REQUEST_EXAMPLE_STATIC = {
"environment": {
"light": 75,
"water": 65,
"soil_ph": 6.5,
},
"growth_speed": 1.5,
}
def success_response():
return {"status": "success"}
@@ -86,3 +51,114 @@ class YieldHarvestSummarySerializer(serializers.Serializer):
yield_prediction_card = YieldPredictionCardSerializer(required=False)
yield_prediction_chart = YieldPredictionChartSerializer(required=False)
harvest_prediction_card = HarvestPredictionCardSerializer(required=False)
class CropSimulationRequestSerializer(serializers.Serializer):
farm_uuid = serializers.UUIDField(required=True, help_text="UUID مزرعه برای اجرای شبیه‌سازی.")
plant_name = serializers.CharField(required=False, allow_blank=True, default="", help_text="نام گیاه یا محصول.")
class GrowthSimulationRequestSerializer(serializers.Serializer):
plant_name = serializers.CharField(required=True, help_text="نام گیاه برای شروع شبیه‌سازی رشد.")
dynamic_parameters = serializers.ListField(
child=serializers.CharField(),
required=True,
allow_empty=False,
help_text="لیست پارامترهای دینامیک موردنیاز مانند DVS یا LAI.",
)
farm_uuid = serializers.UUIDField(required=False, allow_null=True, help_text="UUID مزرعه؛ در صورت نبود باید weather ارسال شود.")
weather = serializers.JSONField(required=False, help_text="آب‌وهوا به‌صورت object یا array.")
soil_parameters = serializers.DictField(required=False, help_text="پارامترهای خاک.")
site_parameters = serializers.DictField(required=False, help_text="پارامترهای سایت.")
crop_parameters = serializers.DictField(required=False, help_text="پارامترهای محصول.")
agromanagement = serializers.DictField(required=False, help_text="تنظیمات مدیریت زراعی.")
page_size = serializers.IntegerField(required=False, min_value=1, max_value=50, help_text="اندازه صفحه بین 1 تا 50.")
def validate(self, attrs):
if not attrs.get("farm_uuid") and attrs.get("weather") in (None, "", [], {}):
raise serializers.ValidationError("At least one of 'farm_uuid' or 'weather' must be provided.")
return attrs
class GrowthSimulationQueuedDataSerializer(serializers.Serializer):
task_id = serializers.CharField(required=False, allow_blank=True, help_text="شناسه تسک شبیه‌سازی رشد.")
status_url = serializers.CharField(required=False, allow_blank=True, help_text="آدرس بررسی وضعیت تسک.")
plant_name = serializers.CharField(required=False, allow_blank=True, help_text="نام گیاه شبیه‌سازی‌شده.")
class GrowthSimulationProgressSerializer(serializers.Serializer):
current = serializers.IntegerField(required=False, help_text="مرحله فعلی پیشرفت.")
total = serializers.IntegerField(required=False, help_text="تعداد کل مراحل.")
percent = serializers.FloatField(required=False, help_text="درصد پیشرفت.")
class GrowthSimulationPaginationSerializer(serializers.Serializer):
page = serializers.IntegerField(required=False, help_text="شماره صفحه فعلی.")
page_size = serializers.IntegerField(required=False, help_text="اندازه صفحه.")
total_items = serializers.IntegerField(required=False, help_text="تعداد کل آیتم‌ها.")
total_pages = serializers.IntegerField(required=False, help_text="تعداد کل صفحات.")
has_next = serializers.BooleanField(required=False, help_text="آیا صفحه بعدی وجود دارد.")
has_previous = serializers.BooleanField(required=False, help_text="آیا صفحه قبلی وجود دارد.")
class GrowthSimulationResultSerializer(serializers.Serializer):
plant_name = serializers.CharField(required=False, allow_blank=True)
dynamic_parameters = serializers.ListField(child=serializers.CharField(), required=False)
engine = serializers.CharField(required=False, allow_blank=True, allow_null=True)
model_name = serializers.CharField(required=False, allow_blank=True, allow_null=True)
scenario_id = serializers.IntegerField(required=False)
simulation_warning = serializers.CharField(required=False, allow_blank=True)
summary_metrics = serializers.DictField(required=False)
stage_timeline = serializers.ListField(child=serializers.DictField(), required=False)
stages_page = serializers.ListField(child=serializers.DictField(), required=False)
pagination = GrowthSimulationPaginationSerializer(required=False)
daily_records_count = serializers.IntegerField(required=False)
default_page_size = serializers.IntegerField(required=False)
class GrowthSimulationStatusDataSerializer(serializers.Serializer):
task_id = serializers.CharField(required=False, allow_blank=True)
status = serializers.CharField(required=False, allow_blank=True)
message = serializers.CharField(required=False, allow_blank=True)
progress = GrowthSimulationProgressSerializer(required=False)
result = GrowthSimulationResultSerializer(required=False)
error = serializers.CharField(required=False, allow_blank=True)
class CurrentFarmChartSerializer(serializers.Serializer):
farm_uuid = serializers.CharField(required=False, allow_blank=True, allow_null=True)
plant_name = serializers.CharField(required=False, allow_blank=True)
engine = serializers.CharField(required=False, allow_blank=True, allow_null=True)
model_name = serializers.CharField(required=False, allow_blank=True, allow_null=True)
scenario_id = serializers.IntegerField(required=False)
simulation_warning = serializers.CharField(required=False, allow_blank=True)
categories = serializers.ListField(child=serializers.CharField(), required=False)
series = serializers.DictField(required=False)
summary = serializers.DictField(required=False)
current_state = serializers.DictField(required=False)
metrics = serializers.DictField(required=False)
daily_output = serializers.DictField(required=False)
class HarvestPredictionSerializer(serializers.Serializer):
date = serializers.CharField(required=False, allow_blank=True)
dateFormatted = serializers.CharField(required=False, allow_blank=True)
daysUntil = serializers.IntegerField(required=False)
description = serializers.CharField(required=False, allow_blank=True)
optimalWindowStart = serializers.CharField(required=False, allow_blank=True)
optimalWindowEnd = serializers.CharField(required=False, allow_blank=True)
gddDetails = serializers.DictField(required=False)
class YieldPredictionSerializer(serializers.Serializer):
farm_uuid = serializers.CharField(required=False, allow_blank=True)
plant_name = serializers.CharField(required=False, allow_blank=True, allow_null=True)
predictedYieldTons = serializers.FloatField(required=False)
predictedYieldRaw = serializers.FloatField(required=False)
unit = serializers.CharField(required=False, allow_blank=True)
sourceUnit = serializers.CharField(required=False, allow_blank=True)
simulationEngine = serializers.CharField(required=False, allow_blank=True, allow_null=True)
simulationModel = serializers.CharField(required=False, allow_blank=True, allow_null=True)
scenarioId = serializers.IntegerField(required=False)
simulationWarning = serializers.CharField(required=False, allow_blank=True)
supportingMetrics = serializers.DictField(required=False)