1
0
mirror of https://github.com/daniviga/bite.git synced 2025-04-20 14:31:20 +02:00

API improvements

This commit is contained in:
Daniele Viganò 2020-06-26 17:42:28 +02:00
parent 6970a7c95b
commit 61fd6263f1
Signed by: dani
GPG Key ID: DB49AFC03C40EE02
3 changed files with 43 additions and 6 deletions

View File

@ -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',

View File

@ -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('<str:device>/',
TelemetryView.as_view({'get': 'list'}),
TelemetrySummaryView.as_view(),
name='device-telemetry'),
path('<str:device>/last/',
TelemetryLatest.as_view({'get': 'retrieve'}),

View File

@ -17,12 +17,14 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
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])