add savedpoint views

This commit is contained in:
ThePetrovich 2025-07-01 22:07:12 +08:00
parent 741aefca31
commit c446ac5a1b
4 changed files with 59 additions and 5 deletions

View file

@ -6,3 +6,11 @@ class ReadOnlyOrAuthenticated(BasePermission):
request.method in SAFE_METHODS or request.method in SAFE_METHODS or
request.user and request.user.is_authenticated 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

View file

@ -1,5 +1,5 @@
from rest_framework import serializers from rest_framework import serializers
from .models import Prediction from .models import Prediction, SavedPoint, SavedRateProfile, PreditctionTemplate
from datetime import datetime from datetime import datetime
from .validators import ( from .validators import (
validate_custom_curve, rate_clip, validate_custom_curve, rate_clip,
@ -12,7 +12,6 @@ class PredictionSerializer(serializers.ModelSerializer):
fields = ['id', 'created_at', 'updated_at', 'result'] fields = ['id', 'created_at', 'updated_at', 'result']
PROFILE_STANDARD = "standard_profile" PROFILE_STANDARD = "standard_profile"
PROFILE_FLOAT = "float" PROFILE_FLOAT = "float"
PROFILE_REVERSE = "reverse" PROFILE_REVERSE = "reverse"
@ -93,4 +92,37 @@ class TelemetryPacketSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = TelemetryPacket model = TelemetryPacket
fields = ['id', 'timestamp', 'lat', 'lon', 'alt', 'payload'] 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']

View file

@ -5,6 +5,7 @@ from .views import (PredictionCreateView, PredictionListView,
PredictionHistoryDeleteView, PredictionHistoryDeleteView,
SessionView, SessionView,
WhoAmIView, WhoAmIView,
SavedPointViewset,
get_csrf, get_csrf,
login_view, login_view,
logout_view) logout_view)
@ -18,6 +19,7 @@ urlpatterns = [
path("history/<uuid:pk>/", PredictionHistoryDetailView.as_view(), name='view_history_detail'), path("history/<uuid:pk>/", PredictionHistoryDetailView.as_view(), name='view_history_detail'),
path("history/<uuid:pk>/delete/", PredictionHistoryDeleteView.as_view(), name='delete_history'), path("history/<uuid:pk>/delete/", PredictionHistoryDeleteView.as_view(), name='delete_history'),
path("<uuid:pk>/telemetry/", TelemetryListCreateView.as_view(), name="create_telemetry"), path("<uuid:pk>/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('csrf/', get_csrf, name='api-csrf'),
path('login/', login_view, name='api-login'), path('login/', login_view, name='api-login'),
path('logout/', logout_view, name='api-logout'), path('logout/', logout_view, name='api-logout'),

View file

@ -1,9 +1,10 @@
from rest_framework import status, generics, permissions from rest_framework import status, generics, permissions
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet
from django.utils import timezone from django.utils import timezone
from .models import Prediction, User from .models import Prediction, User, Satellite, SavedPoint, SavedRateProfile, PreditctionTemplate
from .serializers import PredictionSerializer, PredictionRequestSerializer, PredictionListSerializer, PredictionDetailSerializer from .serializers import PredictionSerializer, PredictionRequestSerializer, PredictionListSerializer, PredictionDetailSerializer, SavedPointSerializer, SavedRateProfileSerializer, PreditctionTemplateSerializer
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
import requests import requests
from django.views.decorators.csrf import csrf_exempt 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 django.contrib.auth import get_user_model
from .models import Satellite, TelemetryPacket from .models import Satellite, TelemetryPacket
from .serializers import TelemetryPacketSerializer from .serializers import TelemetryPacketSerializer
from .permissions import ReadOnlyOrAuthenticated from .permissions import ReadOnlyOrAuthenticated, IsOwner
import time import time
from django.http import JsonResponse from django.http import JsonResponse
from rest_framework.authentication import SessionAuthentication, BasicAuthentication from rest_framework.authentication import SessionAuthentication, BasicAuthentication
@ -222,6 +223,17 @@ def logout_view(request):
return JsonResponse({'detail': 'Successfully logged out.'}) 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): #class PredictionCreateView(APIView):
#permission_classes = [IsAuthenticated] #permission_classes = [IsAuthenticated]