Louis Mazin 4db822aebe big maj
2026-10-05 17:52:28 +02:00

115 lines
4.0 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, 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)