ptitlutins-backend/voyage/views.py
2025-09-15 19:06:30 +02:00

80 lines
2.7 KiB
Python

from rest_framework import viewsets
from rest_framework.response import Response
from django.db.models import Q
from .models import VoyageLink, Location, Event, Need, Trip
from .serializers import VoyageLinkSerializer, LocationSerializer, EventSerializer, NeedSerializer, TripSerializer
from .permissions import HasVoyagePermission, HasLinkPermission
class VoyageLinkViewSet(viewsets.ModelViewSet):
queryset = VoyageLink.objects.all()
serializer_class = VoyageLinkSerializer
permission_classes = [HasLinkPermission]
def list(self, request):
queryset = self.filter_queryset(self.get_queryset())
user = request.user
if user.is_anonymous:
return Response([])
queryset = queryset.select_related('voyage', 'permission').filter(
Q(voyage__creator=user) |
Q(voyage__collaborators__in=[user], primary=True) |
Q(voyage__collaborator_permissions__user=user, voyage__collaborator_permissions__change=True)
).distinct()
# generic code for listing view
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
def perform_create(self, serializer):
user = self.request.user
serializer.save(voyage_creator=None if user.is_anonymous else user)
def perform_destroy(self, instance):
if instance.primary:
instance.voyage.delete()
super().perform_destroy(instance)
class GenericLinkedVoyageViewSet(viewsets.ModelViewSet):
permission_classes = [HasVoyagePermission]
def get_queryset(self):
voyage_link = VoyageLink.objects.get(pk=self.kwargs["voyage_link_pk"])
return self.model.objects.filter(voyage_id=voyage_link.voyage_id)
def perform_create(self, serializer):
voyage_link = VoyageLink.objects.get(pk=self.kwargs["voyage_link_pk"])
serializer.save(voyage_id=voyage_link.voyage_id)
class LocationViewSet(GenericLinkedVoyageViewSet):
model = Location
serializer_class = LocationSerializer
class EventViewSet(GenericLinkedVoyageViewSet):
model = Event
serializer_class = EventSerializer
class NeedViewSet(GenericLinkedVoyageViewSet):
model = Need
serializer_class = NeedSerializer
def perform_create(self, serializer):
serializer.save(proposed_by=self.request.user)
super().perform_create(serializer)
class TripViewSet(GenericLinkedVoyageViewSet):
model = Trip
serializer_class = TripSerializer