2026-09-25 17:50:02 +02:00

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