From 4cebe6a8f59a31ae22129b5cbae8ac09bb0442fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniele=20Vigan=C3=B2?= Date: Wed, 3 Jun 2020 18:57:53 +0200 Subject: [PATCH] Manage serial numbers on POST (#7) * Update subscription if exists * POST with serial # --- .gitignore | 2 ++ arduino/tempLightSensor/tempLightSensor.ino | 2 +- freedcs/api/models.py | 10 ++++++++-- freedcs/api/serializers.py | 21 ++++++++++++++------- freedcs/freedcs/settings.py | 2 ++ freedcs/telemetry/serializers.py | 16 +++++----------- freedcs/telemetry/tests/sample.json | 3 ++- 7 files changed, 34 insertions(+), 22 deletions(-) diff --git a/.gitignore b/.gitignore index b6e4761..9dd28e5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +*.swp + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/arduino/tempLightSensor/tempLightSensor.ino b/arduino/tempLightSensor/tempLightSensor.ino index 9bde4c4..65c203d 100644 --- a/arduino/tempLightSensor/tempLightSensor.ino +++ b/arduino/tempLightSensor/tempLightSensor.ino @@ -80,7 +80,7 @@ void setup(void) { Serial.println("DEBUG: clock updated via NTP."); #endif - json["device"] = 1; // FIXME + json["device"] = serial; // payload["id"] = serverName; } diff --git a/freedcs/api/models.py b/freedcs/api/models.py index 6e22b08..aaab60e 100644 --- a/freedcs/api/models.py +++ b/freedcs/api/models.py @@ -1,10 +1,16 @@ from django.db import models +from django.conf import settings from django.core.exceptions import ValidationError def device_validation(value): - published_devices = WhiteList.objects.filter(serial=value, - is_published=True) + if settings.SKIP_WHITELIST and settings.DEBUG: + return # skip validation in debug mode when SKIP_WHITELIST is True + + published_devices = WhiteList.objects.filter( + serial=value, + is_published=True + ) if not published_devices: raise ValidationError("Device is not published") diff --git a/freedcs/api/serializers.py b/freedcs/api/serializers.py index cce3fbe..80d4434 100644 --- a/freedcs/api/serializers.py +++ b/freedcs/api/serializers.py @@ -1,14 +1,21 @@ from rest_framework import serializers -from api.models import Device, WhiteList +from api.models import Device, device_validation class DeviceSerializer(serializers.ModelSerializer): + serial = serializers.CharField( + max_length=128, + validators=[device_validation], + ) # disable unique validation + class Meta: model = Device - fields = ('serial', 'creation_time', 'updated_time',) + fields = '__all__' + read_only_fields = ('creation_time', 'updated_time') - -# class WhiteListSerializer(serializers.ModelSerializer): -# class Meta: -# model = Device -# fields = ('serial', 'creation_time', 'updated_time',) + def create(self, validated_data): + device, created = Device.objects.update_or_create( + serial=validated_data['serial'], + defaults={'serial': validated_data['serial']}, + ) + return device diff --git a/freedcs/freedcs/settings.py b/freedcs/freedcs/settings.py index ff87f36..17d4151 100644 --- a/freedcs/freedcs/settings.py +++ b/freedcs/freedcs/settings.py @@ -125,3 +125,5 @@ USE_TZ = True # https://docs.djangoproject.com/en/3.0/howto/static-files/ STATIC_URL = '/static/' + +SKIP_WHITELIST = True diff --git a/freedcs/telemetry/serializers.py b/freedcs/telemetry/serializers.py index 5bd8ab7..2149af4 100644 --- a/freedcs/telemetry/serializers.py +++ b/freedcs/telemetry/serializers.py @@ -1,20 +1,14 @@ from rest_framework import serializers -from api.serializers import DeviceSerializer +from api.models import Device from telemetry.models import Telemetry class TelemetrySerializer(serializers.ModelSerializer): - # device = DeviceSerializer(read_only=True) - - def validate(self, data): - return data + device = serializers.SlugRelatedField( + slug_field='serial', + queryset=Device.objects.all() + ) class Meta: model = Telemetry fields = ('time', 'device', 'clock', 'payload',) - - -# class WhiteListSerializer(serializers.ModelSerializer): -# class Meta: -# model = Device -# fields = ('serial', 'creation_time', 'updated_time',) diff --git a/freedcs/telemetry/tests/sample.json b/freedcs/telemetry/tests/sample.json index 2cf3097..fff12b8 100644 --- a/freedcs/telemetry/tests/sample.json +++ b/freedcs/telemetry/tests/sample.json @@ -1,4 +1,5 @@ -{"device": 1, +{"device": "abcde1234", + "clock": 1591194712, "payload": { "id": "sensor.server.domain", "light": 434,