from django.contrib.auth import get_user_model from django.shortcuts import get_object_or_404 from django_core.mixins import BaseViewSetMixin from drf_spectacular.utils import extend_schema from rest_framework import generics, filters from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView from rest_framework.viewsets import ModelViewSet from core.apps.accounts.choices.user import RoleChoice from core.apps.accounts.serializers.user import UserSerializer, AdminUserSerializer, UserCreateSerializer User = get_user_model() @extend_schema(tags=['User']) class UserListApiView(generics.ListAPIView): queryset = User.objects.filter(role=RoleChoice.USER) serializer_class = UserSerializer permission_classes = [IsAuthenticated] filter_backends = [filters.SearchFilter] search_fields = ['phone', 'first_name', 'last_name'] def serializer_context(self): return self.serializer_class(context={"request": self.request}) @extend_schema(tags=['User']) class AdminUserListApiView(generics.ListAPIView): queryset = User.objects.exclude(role=RoleChoice.USER) serializer_class = UserSerializer permission_classes = [IsAuthenticated] filter_backends = [filters.SearchFilter] search_fields = ['phone', 'first_name', 'last_name'] @extend_schema(tags=["User"], request=AdminUserSerializer) class AdminUserView(BaseViewSetMixin, ModelViewSet): queryset = User.objects.filter(role=RoleChoice.USER) serializer_class = AdminUserSerializer permission_classes = [IsAuthenticated] filter_backends = [filters.SearchFilter] search_fields = ['phone', 'first_name', 'last_name'] def serializer_context(self): return self.serializer_class(context={"request": self.request}) @extend_schema(tags=['User'], responses={200: UserSerializer}, request=UserCreateSerializer) class AdminCreateAPIView(APIView): permission_classes = [IsAuthenticated] def post(self, request): if request.user.role not in (RoleChoice.SUPERUSER, RoleChoice.ADMIN): return Response({'detail': 'Forbidden'}, status=403) serializer = UserCreateSerializer(data=request.data) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data, status=201) @extend_schema(tags=['User'],) class AdminUpdateAPIView(generics.GenericAPIView): permission_classes = [IsAuthenticated] serializer_class = UserCreateSerializer def put(self, request, pk): if request.user.role not in (RoleChoice.SUPERUSER, RoleChoice.ADMIN): return Response({'detail': 'Forbidden'}, status=403) user = get_object_or_404(User, pk=pk) serializer = UserCreateSerializer(user, data=request.data) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data, status=200)