mirror of
https://github.com/daniviga/bite.git
synced 2025-04-20 14:31:20 +02:00
API improvements
This commit is contained in:
parent
6970a7c95b
commit
61fd6263f1
@ -22,6 +22,17 @@ from api.models import Device
|
|||||||
from telemetry.models import Telemetry
|
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):
|
class TelemetrySerializer(serializers.ModelSerializer):
|
||||||
device = serializers.SlugRelatedField(
|
device = serializers.SlugRelatedField(
|
||||||
slug_field='serial',
|
slug_field='serial',
|
||||||
|
@ -33,14 +33,15 @@ Including another URLconf
|
|||||||
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||||
"""
|
"""
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
from telemetry.views import TelemetryView, TelemetryLatest, TelemetryRange
|
from telemetry.views import (TelemetryView, TelemetrySummaryView,
|
||||||
|
TelemetryLatest, TelemetryRange)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('',
|
path('',
|
||||||
TelemetryView.as_view({'post': 'create'}),
|
TelemetryView.as_view({'post': 'create'}),
|
||||||
name='telemetry'),
|
name='telemetry'),
|
||||||
path('<str:device>/',
|
path('<str:device>/',
|
||||||
TelemetryView.as_view({'get': 'list'}),
|
TelemetrySummaryView.as_view(),
|
||||||
name='device-telemetry'),
|
name='device-telemetry'),
|
||||||
path('<str:device>/last/',
|
path('<str:device>/last/',
|
||||||
TelemetryLatest.as_view({'get': 'retrieve'}),
|
TelemetryLatest.as_view({'get': 'retrieve'}),
|
||||||
|
@ -17,12 +17,14 @@
|
|||||||
# You should have received a copy of the GNU Affero General Public License
|
# 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/>.
|
# 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 django.http import Http404
|
||||||
|
from rest_framework.views import APIView
|
||||||
from rest_framework.viewsets import ModelViewSet
|
from rest_framework.viewsets import ModelViewSet
|
||||||
|
|
||||||
from telemetry.models import Telemetry
|
from telemetry.models import Telemetry
|
||||||
from telemetry.serializers import TelemetrySerializer
|
from telemetry.serializers import (TelemetrySerializer,
|
||||||
|
TelemetrySummarySerializer)
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
|
|
||||||
|
|
||||||
@ -39,15 +41,38 @@ class TelemetryView(ModelViewSet):
|
|||||||
return Response(serializer.data)
|
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):
|
class TelemetryRange(ModelViewSet):
|
||||||
queryset = Telemetry.objects.all()
|
queryset = Telemetry.objects.all()
|
||||||
serializer_class = TelemetrySerializer
|
serializer_class = TelemetrySerializer
|
||||||
lookup_field = 'device'
|
lookup_field = 'device'
|
||||||
|
|
||||||
def list(self, request, device, time_from, time_to=None):
|
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(
|
queryset = Telemetry.objects.filter(
|
||||||
device__serial=device,
|
device__serial=device,
|
||||||
time__range=[time_from, datetime.now()])
|
time__range=[time_from, time_to])
|
||||||
if not queryset:
|
if not queryset:
|
||||||
raise Http404
|
raise Http404
|
||||||
serializer = TelemetrySerializer(queryset, many=True)
|
serializer = TelemetrySerializer(queryset, many=True)
|
||||||
@ -61,7 +86,7 @@ class TelemetryLatest(ModelViewSet):
|
|||||||
|
|
||||||
def retrieve(self, request, device=None):
|
def retrieve(self, request, device=None):
|
||||||
queryset = Telemetry.objects.filter(
|
queryset = Telemetry.objects.filter(
|
||||||
device__serial=device).order_by('-time')
|
device__serial=device).order_by('-time')[:1]
|
||||||
if not queryset:
|
if not queryset:
|
||||||
raise Http404
|
raise Http404
|
||||||
serializer = TelemetrySerializer(queryset[0])
|
serializer = TelemetrySerializer(queryset[0])
|
||||||
|
Loading…
x
Reference in New Issue
Block a user