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, EventProfile from users.permissions import require_permission from .serializers import ( EventSerializer, EventCreateSerializer, EventUpdateSerializer, EventProfileSerializer, ) 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): require_permission(request.user, 'create_personal_event') 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 class EventProfileListCreateView(generics.ListCreateAPIView): serializer_class = EventProfileSerializer permission_classes = [IsAuthenticated] def get_queryset(self): return EventProfile.objects.filter(created_by=self.request.user) def list(self, request, *args, **kwargs): require_permission(request.user, 'create_personal_event') return super().list(request, *args, **kwargs) def create(self, request, *args, **kwargs): require_permission(request.user, 'create_personal_event') serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) profile = serializer.save(created_by=request.user) return Response( self.get_serializer(profile).data, status=status.HTTP_201_CREATED, ) class EventProfileDetailView(generics.RetrieveUpdateDestroyAPIView): serializer_class = EventProfileSerializer permission_classes = [IsAuthenticated] lookup_url_kwarg = 'id' def get_queryset(self): return EventProfile.objects.filter(created_by=self.request.user) def update(self, request, *args, **kwargs): require_permission(request.user, 'create_personal_event') return super().update(request, *args, **kwargs) def destroy(self, request, *args, **kwargs): require_permission(request.user, 'create_personal_event') return super().destroy(request, *args, **kwargs)