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