from rest_framework import serializers from .models import SoilDepthData, SoilLocation class SoilDataRequestSerializer(serializers.Serializer): """سریالایزر ورودی: lon و lat برای درخواست داده خاک.""" lon = serializers.DecimalField(max_digits=9, decimal_places=6, required=True) lat = serializers.DecimalField(max_digits=9, decimal_places=6, required=True) class SoilDepthDataSerializer(serializers.ModelSerializer): """سریالایزر خروجی برای هر عمق خاک.""" class Meta: model = SoilDepthData fields = [ "depth_label", "bdod", "cec", "cfvo", "clay", "nitrogen", "ocd", "ocs", "phh2o", "sand", "silt", "soc", "wv0010", "wv0033", "wv1500", ] class SoilLocationResponseSerializer(serializers.ModelSerializer): """سریالایزر خروجی برای SoilLocation همراه با depths.""" lon = serializers.DecimalField( source="longitude", max_digits=9, decimal_places=6, read_only=True, ) lat = serializers.DecimalField( source="latitude", max_digits=9, decimal_places=6, read_only=True, ) depths = serializers.SerializerMethodField() class Meta: model = SoilLocation fields = ["id", "lon", "lat", "depths"] def get_depths(self, obj): from .tasks import DEPTHS depth_qs = obj.depths.all() order = {d: i for i, d in enumerate(DEPTHS)} sorted_depths = sorted( depth_qs, key=lambda d: order.get(d.depth_label, 99) ) return SoilDepthDataSerializer(sorted_depths, many=True).data class SoilDataTaskResponseSerializer(serializers.Serializer): """سریالایزر خروجی وقتی تسک در صف قرار گرفته (۲۰۲).""" source = serializers.CharField(default="task") task_id = serializers.CharField() lon = serializers.FloatField(source="longitude") lat = serializers.FloatField(source="latitude") status_url = serializers.URLField(required=False)