diff --git a/project/settings/base.py b/project/settings/base.py index d4fae57..e5976c5 100644 --- a/project/settings/base.py +++ b/project/settings/base.py @@ -66,7 +66,20 @@ SPECTACULAR_SETTINGS = { 'TITLE': 'Weather Mikro API', 'DESCRIPTION': 'Weather stats by weather', 'VERSION': '1.0.0', - 'COMPONENT_SPLIT_REQUEST': True + 'COMPONENT_SPLIT_REQUEST': True, + 'SECURITY': [{ + 'Mikro-Key': [] + }], + 'COMPONENTS': { + 'securitySchemes': { + 'Mikro-Key': { + 'type': 'apiKey', + 'in': 'header', + 'name': 'X-Mikro-Key', + 'description': 'Secret key for mikrocontroller' + } + } + }, } CORS_ALLOW_ALL_ORIGINS = True diff --git a/project/urls.py b/project/urls.py index aac0d51..3c0e18b 100644 --- a/project/urls.py +++ b/project/urls.py @@ -24,6 +24,6 @@ urlpatterns = [ path('api/schema/', SpectacularAPIView.as_view(), name='schema'), path('swagger/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'), path('api/', include([ - # path('', include('weather.urls')), + path('', include('weather.urls')), ])), ] diff --git a/weather/admin.py b/weather/admin.py index 8c38f3f..5550a6a 100644 --- a/weather/admin.py +++ b/weather/admin.py @@ -1,3 +1,9 @@ from django.contrib import admin +from .models import WeatherStats # Register your models here. +class WeatherStatsAdmin(admin.ModelAdmin): + list_display = ('temperature', 'humidityAir', 'humidityGround', 'light', 'created_at') + readonly_fields = ('created_at',) + +admin.site.register(WeatherStats, WeatherStatsAdmin) \ No newline at end of file diff --git a/weather/models.py b/weather/models.py index 93ba297..f181b27 100644 --- a/weather/models.py +++ b/weather/models.py @@ -9,4 +9,4 @@ class WeatherStats(models.Model): created_at = models.DateTimeField(auto_now_add=True) def __str__(self): - return 'Weather data by ' + self.created_at \ No newline at end of file + return 'Weather data by ' + str(self.created_at) \ No newline at end of file diff --git a/weather/serializers.py b/weather/serializers.py new file mode 100644 index 0000000..e1102d6 --- /dev/null +++ b/weather/serializers.py @@ -0,0 +1,9 @@ +from rest_framework import serializers +from .models import WeatherStats + +class WeatherStatSerializer(serializers.ModelSerializer): + created_at = serializers.DateTimeField(read_only=True) + + class Meta: + model = WeatherStats + fields = ('humidityAir', 'humidityGround', 'temperature', 'light', 'created_at') \ No newline at end of file diff --git a/weather/urls.py b/weather/urls.py index e69de29..f06d9b0 100644 --- a/weather/urls.py +++ b/weather/urls.py @@ -0,0 +1,6 @@ +from django.urls import path +from .views import CreateStatAPI + +urlpatterns = [ + path('stats/', CreateStatAPI.as_view()) +] diff --git a/weather/utils.py b/weather/utils.py new file mode 100644 index 0000000..1f13436 --- /dev/null +++ b/weather/utils.py @@ -0,0 +1,11 @@ +import os +from rest_framework.request import Request +from rest_framework import permissions + +class IsMikrokontroller(permissions.BasePermission): + + def has_permission(self, request: Request, view): + mikro_key = os.environ['MIKRO_SECRET_KEY'] + request_key = request.headers.get('X-Mikro-Key') + + return request_key == mikro_key \ No newline at end of file diff --git a/weather/views.py b/weather/views.py index 91ea44a..784036c 100644 --- a/weather/views.py +++ b/weather/views.py @@ -1,3 +1,24 @@ -from django.shortcuts import render +from rest_framework.generics import CreateAPIView +from drf_spectacular.utils import extend_schema, OpenApiParameter + +from .models import WeatherStats +from .serializers import WeatherStatSerializer +from .utils import IsMikrokontroller # Create your views here. +@extend_schema(tags=['Weather'], + description="Call method by mikrocontroller to set new data (required MIKRO_SECRET_KEY with header X-Mikro-Key)", + parameters=[ + OpenApiParameter( + name='X-Mikro-Key', + type=str, + location=OpenApiParameter.HEADER, + description='Secret Key for microcontroller', + required=True + ) + ] + ) +class CreateStatAPI(CreateAPIView): + serializer_class = WeatherStatSerializer + permission_classes = [ IsMikrokontroller ] + queryset = WeatherStats.objects.all() \ No newline at end of file