80 lines
2.7 KiB
Python
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
|