diff --git a/bite/telemetry/serializers.py b/bite/telemetry/serializers.py index c12fb9c..1ef6c13 100644 --- a/bite/telemetry/serializers.py +++ b/bite/telemetry/serializers.py @@ -22,6 +22,17 @@ from api.models import Device from telemetry.models import Telemetry +class TelemetryStatsSerializer(serializers.Serializer): + count_samples = serializers.IntegerField() + first_sample = serializers.DateTimeField() + last_sample = serializers.DateTimeField() + + +class TelemetrySummarySerializer(serializers.Serializer): + device = serializers.CharField() + stats = TelemetryStatsSerializer() + + class TelemetrySerializer(serializers.ModelSerializer): device = serializers.SlugRelatedField( slug_field='serial', diff --git a/bite/telemetry/urls.py b/bite/telemetry/urls.py index a1889c3..ce36725 100644 --- a/bite/telemetry/urls.py +++ b/bite/telemetry/urls.py @@ -33,14 +33,15 @@ Including another URLconf 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.urls import path -from telemetry.views import TelemetryView, TelemetryLatest, TelemetryRange +from telemetry.views import (TelemetryView, TelemetrySummaryView, + TelemetryLatest, TelemetryRange) urlpatterns = [ path('', TelemetryView.as_view({'post': 'create'}), name='telemetry'), path('/', - TelemetryView.as_view({'get': 'list'}), + TelemetrySummaryView.as_view(), name='device-telemetry'), path('/last/', TelemetryLatest.as_view({'get': 'retrieve'}), diff --git a/bite/telemetry/views.py b/bite/telemetry/views.py index fc10bba..1c643cd 100644 --- a/bite/telemetry/views.py +++ b/bite/telemetry/views.py @@ -17,12 +17,14 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from datetime import datetime +from datetime import datetime, timedelta from django.http import Http404 +from rest_framework.views import APIView from rest_framework.viewsets import ModelViewSet from telemetry.models import Telemetry -from telemetry.serializers import TelemetrySerializer +from telemetry.serializers import (TelemetrySerializer, + TelemetrySummarySerializer) from rest_framework.response import Response @@ -39,15 +41,38 @@ class TelemetryView(ModelViewSet): return Response(serializer.data) +class TelemetrySummaryView(APIView): + def get(self, request, device, format=None): + count = Telemetry.objects.filter(device__serial=device).count() + if count == 0: + raise Http404 + first = Telemetry.objects.filter( + device__serial=device).order_by('-time')[:1][0] + last = Telemetry.objects.filter( + device__serial=device).order_by('time')[:1][0] + data = { + 'device': device, + 'stats': { + 'count_samples': count, + 'first_sample': first.time, + 'last_sample': last.time} + } + + serializer = TelemetrySummarySerializer(data) + + 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): + time_to = datetime.now() if time_to is None else time_to queryset = Telemetry.objects.filter( device__serial=device, - time__range=[time_from, datetime.now()]) + time__range=[time_from, time_to]) if not queryset: raise Http404 serializer = TelemetrySerializer(queryset, many=True) @@ -61,7 +86,7 @@ class TelemetryLatest(ModelViewSet): def retrieve(self, request, device=None): queryset = Telemetry.objects.filter( - device__serial=device).order_by('-time') + device__serial=device).order_by('-time')[:1] if not queryset: raise Http404 serializer = TelemetrySerializer(queryset[0])