Louis Mazin d424689e12 big maj
2026-09-24 19:35:37 +02:00

95 lines
3.6 KiB
Python

from rest_framework import generics
from rest_framework.response import Response
from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework.views import APIView
from rest_framework.exceptions import PermissionDenied, ValidationError
from django.utils import timezone
from datetime import timedelta
from .models import Invitation, User
from .serializers import UserSerializer, RegisterSerializer
class RegisterView(generics.CreateAPIView):
queryset = User.objects.all()
permission_classes = (AllowAny,)
serializer_class = RegisterSerializer
class UserMeView(generics.RetrieveAPIView):
permission_classes = (IsAuthenticated,)
serializer_class = UserSerializer
def get_object(self):
return self.request.user
class UserListView(generics.ListAPIView):
permission_classes = (IsAuthenticated,)
serializer_class = UserSerializer
def get_queryset(self):
if not (self.request.user.is_staff or self.request.user.is_superuser):
raise PermissionDenied('Seuls les administrateurs peuvent consulter les comptes.')
return User.objects.order_by('-date_joined')
class UserDetailView(generics.RetrieveUpdateDestroyAPIView):
permission_classes = (IsAuthenticated,)
serializer_class = UserSerializer
lookup_field = 'id'
lookup_url_kwarg = 'user'
def get_queryset(self):
if not (self.request.user.is_staff or self.request.user.is_superuser):
raise PermissionDenied('Seuls les administrateurs peuvent modifier les comptes.')
return User.objects.all()
def update(self, request, *args, **kwargs):
if not (request.user.is_staff or request.user.is_superuser):
raise PermissionDenied('Seuls les administrateurs peuvent modifier les comptes.')
return super().update(request, *args, **kwargs)
def perform_destroy(self, instance):
if instance.pk == self.request.user.pk:
raise ValidationError({'error': 'Vous ne pouvez pas supprimer votre propre compte.'})
if instance.is_superuser and not self.request.user.is_superuser:
raise PermissionDenied('Seul un superutilisateur peut supprimer ce compte.')
instance.delete()
class UserPromoteView(APIView):
permission_classes = (IsAuthenticated,)
def post(self, request, user):
if not (request.user.is_staff or request.user.is_superuser):
raise PermissionDenied('Seuls les administrateurs peuvent promouvoir des utilisateurs.')
try:
user_obj = User.objects.get(id=user)
if user_obj.is_superuser and not request.user.is_superuser:
raise PermissionDenied('Seul un superutilisateur peut modifier ce compte.')
user_obj.is_staff = True
user_obj.save()
return Response({'message': 'Utilisateur promu avec succès'}, status=200)
except User.DoesNotExist:
return Response({'error': 'Utilisateur non trouvé'}, status=404)
class UserDeleteView(UserDetailView):
http_method_names = ['delete', 'options']
class InvitationCreateView(APIView):
permission_classes = (IsAuthenticated,)
def post(self, request):
if not (request.user.is_staff or request.user.is_superuser):
raise PermissionDenied('Seuls les administrateurs peuvent créer une invitation.')
invitation = Invitation.objects.create(
created_by=request.user,
expires_at=timezone.now() + timedelta(days=7),
)
return Response({
'token': str(invitation.token),
'expires_at': invitation.expires_at,
}, status=201)