This commit is contained in:
2026-05-05 01:32:27 +03:30
parent cfe60f6729
commit 39efd537bf
27 changed files with 1874 additions and 101 deletions
+96 -20
View File
@@ -1,19 +1,25 @@
from rest_framework import serializers
from .models import FarmSensor, SensorCatalog, SensorExternalRequestLog
from .models import DeviceCatalog, FarmDevice, SensorExternalRequestLog
class SensorCatalogSerializer(serializers.ModelSerializer):
class DeviceCatalogSerializer(serializers.ModelSerializer):
class Meta:
model = SensorCatalog
model = DeviceCatalog
fields = [
"uuid",
"code",
"name",
"description",
"device_communication_type",
"customizable_fields",
"supported_power_sources",
"returned_data_fields",
"payload_mapping",
"display_schema",
"supported_widgets",
"commands_schema",
"capabilities",
"sample_payload",
"is_active",
]
@@ -42,14 +48,16 @@ class SensorExternalRequestLogQuerySerializer(serializers.Serializer):
return attrs
class FarmSensorLogSerializer(serializers.ModelSerializer):
class FarmDeviceLogSerializer(serializers.ModelSerializer):
sensor_catalog_uuid = serializers.UUIDField(source="sensor_catalog.uuid", read_only=True)
device_catalogs = DeviceCatalogSerializer(many=True, read_only=True)
class Meta:
model = FarmSensor
model = FarmDevice
fields = [
"uuid",
"sensor_catalog_uuid",
"device_catalogs",
"physical_device_uuid",
"name",
"sensor_type",
@@ -61,17 +69,23 @@ class FarmSensorLogSerializer(serializers.ModelSerializer):
]
class SensorCatalogLogSerializer(serializers.ModelSerializer):
class DeviceCatalogLogSerializer(serializers.ModelSerializer):
class Meta:
model = SensorCatalog
model = DeviceCatalog
fields = [
"uuid",
"code",
"name",
"description",
"device_communication_type",
"customizable_fields",
"supported_power_sources",
"returned_data_fields",
"payload_mapping",
"display_schema",
"supported_widgets",
"commands_schema",
"capabilities",
"sample_payload",
"is_active",
"created_at",
@@ -79,8 +93,70 @@ class SensorCatalogLogSerializer(serializers.ModelSerializer):
]
class DeviceDetailSerializer(serializers.ModelSerializer):
device_catalog = DeviceCatalogSerializer(source="sensor_catalog", read_only=True)
device_catalogs = serializers.SerializerMethodField()
last_payload_at = serializers.SerializerMethodField()
class Meta:
model = FarmDevice
fields = [
"uuid",
"physical_device_uuid",
"name",
"sensor_type",
"is_active",
"specifications",
"power_source",
"device_catalog",
"device_catalogs",
"last_payload_at",
"created_at",
"updated_at",
]
def get_last_payload_at(self, obj):
latest_log = self.context.get("latest_log")
if latest_log is None:
return None
return latest_log.created_at
def get_device_catalogs(self, obj):
return DeviceCatalogSerializer(obj.get_device_catalogs(), many=True).data
class DeviceLatestPayloadSerializer(serializers.Serializer):
physical_device_uuid = serializers.UUIDField()
device_code = serializers.CharField()
device_catalog_code = serializers.CharField(allow_blank=True, allow_null=True)
raw_payload = serializers.JSONField()
normalized_payload = serializers.JSONField()
readings = serializers.JSONField()
created_at = serializers.DateTimeField(allow_null=True)
class DeviceCommandRequestSerializer(serializers.Serializer):
device_code = serializers.CharField()
command = serializers.CharField()
payload = serializers.JSONField(required=False, default=dict)
class DeviceCodeQuerySerializer(serializers.Serializer):
device_code = serializers.CharField()
class DeviceRangeQuerySerializer(DeviceCodeQuerySerializer):
range = serializers.CharField()
class DeviceCommandResponseSerializer(serializers.Serializer):
physical_device_uuid = serializers.UUIDField()
command = serializers.CharField()
status = serializers.CharField()
class SensorExternalRequestLogSerializer(serializers.ModelSerializer):
farm_sensor = serializers.SerializerMethodField()
farm_device = serializers.SerializerMethodField()
sensor_catalog = serializers.SerializerMethodField()
class Meta:
@@ -90,26 +166,26 @@ class SensorExternalRequestLogSerializer(serializers.ModelSerializer):
"farm_uuid",
"sensor_catalog_uuid",
"physical_device_uuid",
"farm_sensor",
"farm_device",
"sensor_catalog",
"payload",
"created_at",
]
def get_farm_sensor(self, obj):
farm_sensor_map = self.context.get("farm_sensor_map", {})
farm_sensor = farm_sensor_map.get(
def get_farm_device(self, obj):
farm_device_map = self.context.get("farm_device_map", {})
farm_device = farm_device_map.get(
(obj.farm_uuid, obj.sensor_catalog_uuid, obj.physical_device_uuid)
) or farm_sensor_map.get((obj.farm_uuid, None, obj.physical_device_uuid))
if farm_sensor is None:
) or farm_device_map.get((obj.farm_uuid, None, obj.physical_device_uuid))
if farm_device is None:
return None
return FarmSensorLogSerializer(farm_sensor).data
return FarmDeviceLogSerializer(farm_device).data
def get_sensor_catalog(self, obj):
farm_sensor_map = self.context.get("farm_sensor_map", {})
farm_sensor = farm_sensor_map.get(
farm_device_map = self.context.get("farm_device_map", {})
farm_device = farm_device_map.get(
(obj.farm_uuid, obj.sensor_catalog_uuid, obj.physical_device_uuid)
) or farm_sensor_map.get((obj.farm_uuid, None, obj.physical_device_uuid))
if farm_sensor is None or farm_sensor.sensor_catalog is None:
) or farm_device_map.get((obj.farm_uuid, None, obj.physical_device_uuid))
if farm_device is None or farm_device.sensor_catalog is None:
return None
return SensorCatalogLogSerializer(farm_sensor.sensor_catalog).data
return DeviceCatalogLogSerializer(farm_device.sensor_catalog).data