From 0ee0b51078019215aeb79ae608008ebdda037651 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniele=20Vigan=C3=B2?= Date: Wed, 10 Jun 2020 23:17:30 +0200 Subject: [PATCH] Add time filtering to Telemetry (#12) --- docker/simulator/device_simulator.py | 9 ++++---- freedcs/telemetry/urls.py | 11 +++++++++- freedcs/telemetry/views.py | 31 ++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/docker/simulator/device_simulator.py b/docker/simulator/device_simulator.py index 7fff546..ad394db 100644 --- a/docker/simulator/device_simulator.py +++ b/docker/simulator/device_simulator.py @@ -90,12 +90,11 @@ def main(): data = {'serial': args.serial} post_json(args.endpoint, subscribe, data) - data = { - 'device': args.serial, - 'clock': int(datetime.datetime.now().timestamp()), - } - while True: + data = { + 'device': args.serial, + 'clock': int(datetime.datetime.now().timestamp()), + } payload = { 'id': 'device_simulator', 'light': random.randint(300, 500), diff --git a/freedcs/telemetry/urls.py b/freedcs/telemetry/urls.py index baa3486..c7a26e0 100644 --- a/freedcs/telemetry/urls.py +++ b/freedcs/telemetry/urls.py @@ -14,7 +14,7 @@ Including another URLconf 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.urls import path -from telemetry.views import TelemetryView +from telemetry.views import TelemetryView, TelemetryLatest, TelemetryRange urlpatterns = [ path('', @@ -23,4 +23,13 @@ urlpatterns = [ path('/', TelemetryView.as_view({'get': 'list'}), name='device-telemetry'), + path('/latest/', + TelemetryLatest.as_view({'get': 'retrieve'}), + name='device-telemetry-latest'), + path('//', + TelemetryRange.as_view({'get': 'list'}), + name='device-telemetry-single'), + path('///', + TelemetryRange.as_view({'get': 'list'}), + name='device-telemetry-range'), ] diff --git a/freedcs/telemetry/views.py b/freedcs/telemetry/views.py index 4bb5965..f8a6999 100644 --- a/freedcs/telemetry/views.py +++ b/freedcs/telemetry/views.py @@ -1,3 +1,4 @@ +from datetime import datetime from django.http import Http404 from rest_framework.viewsets import ModelViewSet @@ -9,6 +10,7 @@ from rest_framework.response import Response class TelemetryView(ModelViewSet): queryset = Telemetry.objects.all() serializer_class = TelemetrySerializer + lookup_field = 'device' def list(self, request, device=None): queryset = Telemetry.objects.filter(device__serial=device) @@ -16,3 +18,32 @@ class TelemetryView(ModelViewSet): raise Http404 serializer = TelemetrySerializer(queryset, many=True) return Response(serializer.data) + + +class TelemetryRange(ModelViewSet): + queryset = Telemetry.objects.all() + serializer_class = TelemetrySerializer + lookup_field = 'device' + + def list(self, request, device, time_from, time_to=None): + queryset = Telemetry.objects.filter( + device__serial=device, + time__range=[time_from, datetime.now()]) + if not queryset: + raise Http404 + serializer = TelemetrySerializer(queryset, many=True) + return Response(serializer.data) + + +class TelemetryLatest(ModelViewSet): + queryset = Telemetry.objects.all() + serializer_class = TelemetrySerializer + lookup_field = 'device' + + def retrieve(self, request, device=None): + queryset = Telemetry.objects.filter( + device__serial=device).order_by('-time')[0] + if not queryset: + raise Http404 + serializer = TelemetrySerializer(queryset) + return Response(serializer.data)