From c446ac5a1bc06cbbdd3b94827fe561f4a0cd1acc Mon Sep 17 00:00:00 2001 From: ThePetrovich Date: Tue, 1 Jul 2025 22:07:12 +0800 Subject: [PATCH] add savedpoint views --- api/permissions.py | 8 ++++++++ api/serializers.py | 36 ++++++++++++++++++++++++++++++++++-- api/urls.py | 2 ++ api/views.py | 18 +++++++++++++++--- 4 files changed, 59 insertions(+), 5 deletions(-) diff --git a/api/permissions.py b/api/permissions.py index 20785ca..84c2ed4 100644 --- a/api/permissions.py +++ b/api/permissions.py @@ -6,3 +6,11 @@ class ReadOnlyOrAuthenticated(BasePermission): request.method in SAFE_METHODS or request.user and request.user.is_authenticated ) + + +class IsOwner(BasePermission): + def has_object_permission(self, request, view, obj): + return obj.user == request.user + + def has_permission(self, request, view): + return request.user and request.user.is_authenticated \ No newline at end of file diff --git a/api/serializers.py b/api/serializers.py index 31e9554..7b9688c 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -1,5 +1,5 @@ from rest_framework import serializers -from .models import Prediction +from .models import Prediction, SavedPoint, SavedRateProfile, PreditctionTemplate from datetime import datetime from .validators import ( validate_custom_curve, rate_clip, @@ -12,7 +12,6 @@ class PredictionSerializer(serializers.ModelSerializer): fields = ['id', 'created_at', 'updated_at', 'result'] - PROFILE_STANDARD = "standard_profile" PROFILE_FLOAT = "float" PROFILE_REVERSE = "reverse" @@ -93,4 +92,37 @@ class TelemetryPacketSerializer(serializers.ModelSerializer): class Meta: model = TelemetryPacket fields = ['id', 'timestamp', 'lat', 'lon', 'alt', 'payload'] + read_only_fields = ['id'] + +class SavedPointSerializer(serializers.ModelSerializer): + user = serializers.HiddenField( + default=serializers.CurrentUserDefault() + ) + class Meta: + model = SavedPoint + fields = ['user', 'id', 'name', 'lat', 'lon', 'alt'] + read_only_fields = ['id'] + + validators = [ + serializers.UniqueTogetherValidator( + queryset=SavedPoint.objects.all(), + fields=['user', 'name'], + message="A saved point with this name already exists for the user." + ) + ] + + + +class SavedRateProfileSerializer(serializers.ModelSerializer): + class Meta: + model = SavedRateProfile + fields = ['id', 'name', 'rate_profile_data'] + read_only_fields = ['id'] + + +class PreditctionTemplateSerializer(serializers.ModelSerializer): + class Meta: + model = PreditctionTemplate + fields = ['id', 'name', 'template_data', 'is_default'] + read_only_fields = ['id'] diff --git a/api/urls.py b/api/urls.py index 32a2a2b..08a6a9b 100644 --- a/api/urls.py +++ b/api/urls.py @@ -5,6 +5,7 @@ from .views import (PredictionCreateView, PredictionListView, PredictionHistoryDeleteView, SessionView, WhoAmIView, + SavedPointViewset, get_csrf, login_view, logout_view) @@ -18,6 +19,7 @@ urlpatterns = [ path("history//", PredictionHistoryDetailView.as_view(), name='view_history_detail'), path("history//delete/", PredictionHistoryDeleteView.as_view(), name='delete_history'), path("/telemetry/", TelemetryListCreateView.as_view(), name="create_telemetry"), + path('saved-points/', SavedPointViewset.as_view({'get': 'list', 'post': 'create', 'put': 'update', 'delete': 'destroy'}), name='saved_points'), path('csrf/', get_csrf, name='api-csrf'), path('login/', login_view, name='api-login'), path('logout/', logout_view, name='api-logout'), diff --git a/api/views.py b/api/views.py index 7b659c8..a30c1bb 100644 --- a/api/views.py +++ b/api/views.py @@ -1,9 +1,10 @@ from rest_framework import status, generics, permissions from rest_framework.response import Response from rest_framework.views import APIView +from rest_framework.viewsets import ModelViewSet from django.utils import timezone -from .models import Prediction, User -from .serializers import PredictionSerializer, PredictionRequestSerializer, PredictionListSerializer, PredictionDetailSerializer +from .models import Prediction, User, Satellite, SavedPoint, SavedRateProfile, PreditctionTemplate +from .serializers import PredictionSerializer, PredictionRequestSerializer, PredictionListSerializer, PredictionDetailSerializer, SavedPointSerializer, SavedRateProfileSerializer, PreditctionTemplateSerializer from rest_framework.permissions import IsAuthenticated import requests from django.views.decorators.csrf import csrf_exempt @@ -13,7 +14,7 @@ from .services.tawhiri import TawhiriClient from django.contrib.auth import get_user_model from .models import Satellite, TelemetryPacket from .serializers import TelemetryPacketSerializer -from .permissions import ReadOnlyOrAuthenticated +from .permissions import ReadOnlyOrAuthenticated, IsOwner import time from django.http import JsonResponse from rest_framework.authentication import SessionAuthentication, BasicAuthentication @@ -222,6 +223,17 @@ def logout_view(request): return JsonResponse({'detail': 'Successfully logged out.'}) +class SavedPointViewset(ModelViewSet): + authentication_classes = [SessionAuthentication, BasicAuthentication] + permission_classes = [IsOwner] + serializer_class = SavedPointSerializer + pagination_class = None + + def get_queryset(self): + return SavedPoint.objects.filter(user=self.request.user) + + def perform_create(self, serializer): + serializer.save(user=self.request.user) #class PredictionCreateView(APIView): #permission_classes = [IsAuthenticated]