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
|
||||
|
||||
|
||||
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',
|
||||
|
@ -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'}),
|
||||
|
@ -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])
|
||||
|
Loading…
x
Reference in New Issue
Block a user