diff --git a/sensorsafrica/api/v2/router.py b/sensorsafrica/api/v2/router.py index 6cc5a72..7accd8d 100644 --- a/sensorsafrica/api/v2/router.py +++ b/sensorsafrica/api/v2/router.py @@ -1,7 +1,7 @@ from rest_framework import routers from django.conf.urls import url, include -from .views import SensorDataStatView, CityView, NodesView, SensorsLocationView +from .views import SensorDataStatView, CityView, NodesView, SensorsLocationView, SensorTypeView, SensorsView data_router = routers.DefaultRouter() @@ -15,12 +15,20 @@ nodes_router.register(r"", NodesView, basename="map") +sensors_router = routers.DefaultRouter() +sensors_router.register(r"", SensorsView, basename="sensors") + sensors_location_router = routers.DefaultRouter() sensors_location_router.register(r"", SensorsLocationView, basename="location") +sensor_type_router = routers.DefaultRouter() +sensor_type_router.register(r"", SensorTypeView, basename="sensor_type") + api_urls = [ url(r"data/(?P[air]+)/", include(data_router.urls)), url(r"cities/", include(city_router.urls)), url(r"nodes/", include(nodes_router.urls)), url(r"locations/", include(sensors_location_router.urls)), + url(r"sensors/", include(sensors_router.urls)), + url(r"sensor-type/", include(sensor_type_router.urls)), ] diff --git a/sensorsafrica/api/v2/serializers.py b/sensorsafrica/api/v2/serializers.py index d5ab74e..7ebb29a 100644 --- a/sensorsafrica/api/v2/serializers.py +++ b/sensorsafrica/api/v2/serializers.py @@ -1,6 +1,6 @@ from rest_framework import serializers -from feinstaub.sensors.serializers import NestedSensorLocationSerializer -from feinstaub.sensors.models import Node +from feinstaub.sensors.serializers import NestedSensorLocationSerializer, NestedSensorTypeSerializer +from feinstaub.sensors.models import Node, Sensor class SensorDataStatSerializer(serializers.Serializer): @@ -24,6 +24,10 @@ class CitySerializer(serializers.Serializer): def get_label(self, obj): return "{}, {}".format(obj.name, obj.country) +class SensorSerializer(serializers.ModelSerializer): + class Meta: + model = Sensor + fields = ('id', 'node', 'description', 'pin', 'sensor_type', 'public') class SensorLocationSerializer(NestedSensorLocationSerializer): class Meta(NestedSensorLocationSerializer.Meta): diff --git a/sensorsafrica/api/v2/views.py b/sensorsafrica/api/v2/views.py index 344fa5c..2cec95c 100644 --- a/sensorsafrica/api/v2/views.py +++ b/sensorsafrica/api/v2/views.py @@ -11,12 +11,12 @@ from django.db.models.functions import Cast, TruncHour, TruncDay, TruncMonth from rest_framework import mixins, pagination, viewsets -from ..models import SensorDataStat, LastActiveNodes, City, Node, SensorLocation -from .serializers import SensorDataStatSerializer, CitySerializer, SensorLocationSerializer, NodeSerializer +from ..models import SensorDataStat, LastActiveNodes, City, Node, Sensor, SensorLocation +from .serializers import SensorDataStatSerializer, CitySerializer, NestedSensorTypeSerializer, NodeSerializer, SensorSerializer, SensorLocationSerializer from feinstaub.sensors.views import StandardResultsSetPagination -from feinstaub.sensors.models import SensorLocation, SensorData, SensorDataValue +from feinstaub.sensors.models import SensorLocation, SensorData, SensorDataValue, SensorType from django.utils.text import slugify @@ -310,3 +310,48 @@ def create(self, request): serializer.save() return Response(serializer.data, status=204) return Response(serializer.errors, status=400) + +class SensorsView(viewsets.ViewSet): + authentication_classes = [SessionAuthentication, TokenAuthentication] + permission_classes = [IsAuthenticated] + pagination_class = StandardResultsSetPagination + + def get_permissions(self): + if self.action == 'create': + permission_classes = [IsAuthenticated] + else: + permission_classes = [AllowAny] + return [permission() for permission in permission_classes] + + def list(self, request): + queryset = Sensor.objects.all() + serializer = SensorSerializer(queryset, many=True) + + return Response(serializer.data) + + def create(self, request): + serializer = SensorSerializer(data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=204) + + return Response(serializer.errors, status=400) + +class SensorTypeView(viewsets.ViewSet): + authentication_classes = [SessionAuthentication, TokenAuthentication] + permission_classes = [IsAuthenticated] + pagination_class = StandardResultsSetPagination + + def list(self, request): + queryset = SensorType.objects.all() + serializer = NestedSensorTypeSerializer(queryset, many=True) + + return Response(serializer.data) + + def create(self, request): + serializer = NestedSensorTypeSerializer(data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=204) + + return Response(serializer.errors, status=400)