from rest_framework import viewsets, mixins, permissions from apps.compliance.permissions import IsAdmin from .models import User from .serializers import UserSerializer, UserDetailSerializer, UserCreateSerializer class UserViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, viewsets.GenericViewSet): queryset = User.objects.all() serializer_class = UserSerializer # A signed-in user may read their own record (get_queryset scopes a # non-admin to it) but must not be able to write one. Without this, a buyer # could PATCH their own row and set role to "admin", which would then pass # every IsOpsOrAdmin check on the platform. Role and is_active are read-only # in the serializer as well, so no API caller can change them. permission_classes = [permissions.IsAuthenticated] def get_permissions(self): if self.action in ("create", "update", "partial_update", "destroy"): return [IsAdmin()] return super().get_permissions() def get_serializer_class(self): if self.action == "retrieve": return UserDetailSerializer if self.action == "create": return UserCreateSerializer return UserSerializer def get_queryset(self): user = self.request.user if user.role == "admin": return User.objects.all() return User.objects.filter(id=user.id)