69 lines
2.4 KiB
Python
69 lines
2.4 KiB
Python
from django.db.models import Q
|
|
from rest_framework import generics, status
|
|
from rest_framework.permissions import BasePermission, IsAuthenticated, SAFE_METHODS
|
|
from rest_framework.response import Response
|
|
|
|
from .models import Event
|
|
from .serializers import EventSerializer, EventCreateSerializer, EventUpdateSerializer
|
|
|
|
|
|
class IsEventCreatorOrReadOnly(BasePermission):
|
|
message = 'Seul le créateur peut modifier ou supprimer cet événement.'
|
|
|
|
def has_object_permission(self, request, view, obj):
|
|
return request.method in SAFE_METHODS or obj.created_by_id == request.user.pk
|
|
|
|
|
|
class VisibleEventsMixin:
|
|
def get_queryset(self):
|
|
return Event.objects.filter(
|
|
Q(is_public=True) | Q(created_by=self.request.user)
|
|
).order_by('start_date', 'start_time', 'pk')
|
|
|
|
|
|
class EventListView(VisibleEventsMixin, generics.ListCreateAPIView):
|
|
serializer_class = EventSerializer
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def create(self, request, *args, **kwargs):
|
|
serializer = EventCreateSerializer(
|
|
data=request.data, context=self.get_serializer_context(),
|
|
)
|
|
serializer.is_valid(raise_exception=True)
|
|
event = serializer.save(created_by=request.user)
|
|
return Response(
|
|
EventSerializer(event, context=self.get_serializer_context()).data,
|
|
status=status.HTTP_201_CREATED,
|
|
)
|
|
|
|
|
|
class EventDetailView(VisibleEventsMixin, generics.RetrieveUpdateDestroyAPIView):
|
|
serializer_class = EventSerializer
|
|
permission_classes = [IsAuthenticated, IsEventCreatorOrReadOnly]
|
|
lookup_url_kwarg = 'id'
|
|
|
|
def update(self, request, *args, **kwargs):
|
|
partial = kwargs.pop('partial', False)
|
|
instance = self.get_object()
|
|
serializer = EventUpdateSerializer(
|
|
instance, data=request.data, partial=partial,
|
|
context=self.get_serializer_context(),
|
|
)
|
|
serializer.is_valid(raise_exception=True)
|
|
self.perform_update(serializer)
|
|
return Response(
|
|
EventSerializer(serializer.instance, context=self.get_serializer_context()).data,
|
|
)
|
|
|
|
def destroy(self, request, *args, **kwargs):
|
|
self.perform_destroy(self.get_object())
|
|
return Response(
|
|
{'message': 'Event deleted successfully'},
|
|
status=status.HTTP_200_OK,
|
|
)
|
|
|
|
|
|
class EventCreateView(EventListView):
|
|
http_method_names = ['post', 'options']
|
|
serializer_class = EventCreateSerializer
|