2026-02-19 01:19:22 +03:30
|
|
|
from rest_framework import serializers
|
|
|
|
|
|
2026-03-23 22:24:30 +03:30
|
|
|
from .models import Sensor
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SensorSerializer(serializers.ModelSerializer):
|
|
|
|
|
last_updated = serializers.DateTimeField(source="updated_at", read_only=True)
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
model = Sensor
|
|
|
|
|
fields = [
|
|
|
|
|
"uuid_sensor",
|
|
|
|
|
"name",
|
|
|
|
|
"is_active",
|
|
|
|
|
"specifications",
|
|
|
|
|
"power_source",
|
|
|
|
|
"customized_sensors",
|
|
|
|
|
"last_updated",
|
|
|
|
|
]
|
|
|
|
|
read_only_fields = ["uuid_sensor", "last_updated"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SensorCreateSerializer(serializers.ModelSerializer):
|
2026-03-29 15:07:14 +03:30
|
|
|
area_geojson = serializers.JSONField(write_only=True, required=False)
|
|
|
|
|
|
2026-03-23 22:24:30 +03:30
|
|
|
class Meta:
|
|
|
|
|
model = Sensor
|
|
|
|
|
fields = [
|
|
|
|
|
"name",
|
|
|
|
|
"specifications",
|
|
|
|
|
"power_source",
|
|
|
|
|
"customized_sensors",
|
2026-03-29 15:07:14 +03:30
|
|
|
"area_geojson",
|
2026-03-23 22:24:30 +03:30
|
|
|
]
|
2026-03-26 15:39:31 +03:30
|
|
|
|
2026-03-29 15:07:14 +03:30
|
|
|
def validate_area_geojson(self, value):
|
|
|
|
|
if not isinstance(value, dict):
|
|
|
|
|
raise serializers.ValidationError("`area_geojson` must be a GeoJSON object.")
|
|
|
|
|
|
|
|
|
|
geometry = value.get("geometry") if value.get("type") == "Feature" else value
|
|
|
|
|
if not isinstance(geometry, dict):
|
|
|
|
|
raise serializers.ValidationError("`area_geojson.geometry` is required.")
|
|
|
|
|
|
|
|
|
|
if geometry.get("type") != "Polygon":
|
|
|
|
|
raise serializers.ValidationError("`area_geojson.geometry.type` must be `Polygon`.")
|
|
|
|
|
|
|
|
|
|
coordinates = geometry.get("coordinates")
|
|
|
|
|
if not isinstance(coordinates, list) or not coordinates or not isinstance(coordinates[0], list):
|
|
|
|
|
raise serializers.ValidationError("`area_geojson.geometry.coordinates` must be a polygon ring.")
|
|
|
|
|
|
|
|
|
|
return value
|
|
|
|
|
|
2026-03-30 23:29:03 +03:30
|
|
|
def create(self, validated_data):
|
|
|
|
|
validated_data.pop("area_geojson", None)
|
|
|
|
|
return super().create(validated_data)
|
|
|
|
|
|
|
|
|
|
def update(self, instance, validated_data):
|
|
|
|
|
validated_data.pop("area_geojson", None)
|
|
|
|
|
return super().update(instance, validated_data)
|
|
|
|
|
|
2026-03-26 15:39:31 +03:30
|
|
|
|
|
|
|
|
class SensorToggleSerializer(serializers.Serializer):
|
|
|
|
|
uuid_sensor = serializers.UUIDField()
|