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