0

This is my View Set:

class MyViewSet(ModelViewSet):
    serializer_class = MySerializer
    queryset = MyClass.objects.all()

   def get_serializer_class(self):
        if self.request.user.is_superuser:
            return self.serializer_class 

        return serializers.MyUserSerializer   

    def perform_create(self, serializer):
        employee = models.Employee.objects.get(user=self.request.user)
        serializer.save(employee=employee)

I want to apply permission before perform_create, this perform_create() should only be called if a currently logged in user is not a super user. If a currently logged in user is a superuser, default perform_create function should be called.

Edit: Basically I want to implement the following logic, but with the help of permissions.

def perform_create(self, serializer):
        if self.request.user.is_superuser:
            serializer.save()
        else:
            employee = models.Employee.objects.get(user=self.request.user)
            serializer.save(employee=employee)

How to do that?

Waleed Farrukh
  • 205
  • 1
  • 10

4 Answers4

0

Try this logic

def perform_create(self, serializer):
  self.request.data.get("title", None)  # read data from request
  if self.request.user.is_authenticated and not self.request.user.is_superuser:
      instance = serializer.save(author=self.request.user)
  else:
      instance = serializer.save() 
0

You can use permission_classes in your Viewset class

from rest_framework.permissions import IsAuthenticated
class MyViewSet(ModelViewSet):
    permission_classes = (IsAuthenticated,)
    serializer_class = MySerializer
    queryset = MyClass.objects.all()

    ...
Dmitry Yudin
  • 1,033
  • 1
  • 10
  • 31
0

Try like this:

class MyViewSet(ModelViewSet):
    serializer_class = MySerializer
    queryset = MyClass.objects.all()

    def get_serializer_class(self):
        if self.request.user.is_superuser:
            return self.serializer_class 

        return serializers.MyUserSerializer   

    def perform_create(self, serializer):
        employee = models.Employee.objects.get(user=self.request.user)
        serializer.save(employee=employee)

    def has_permission(self, request, view):
        if request.user.is_superuser:
            return True
        return super().has_permission(request, view)

perform_create method will be called only then if the user is not a superuser and have permissions. has_permission method will returns True for superusers.

Myth
  • 338
  • 7
  • I tried this, but perform_create is being called for superuser as well. Basically I want to apply following login with the help of permissions: def perform_create(self, serializer): if self.request.user.is_superuser: serializer.save() else: employee = models.Employee.objects.get(user=self.request.user) serializer.save(employee=employee) – Waleed Farrukh Jan 19 '23 at 10:44
0

You can create a Custom permission see the following example.

from rest_framework import permissions

class IsNotSuperuserPermission(permissions.BasePermission):
    message = 'You are super user.' # Your custom message.

    def has_permission(self, request, view):
        if request.user.is_authenticated:
            return not request.user.is_superuser
        self.message = 'you are not logged in' # your custom message
        return False



class MyViewSet(ModelViewSet):
    serializer_class = MySerializer
    queryset = MyClass.objects.all()

    def get_serializer_class(self):
        if self.request.user.is_superuser:
            return self.serializer_class 

        return serializers.MyUserSerializer 

    def get_permissions(self):
        if self.action == 'create':
            permission_classes = [IsNotSuperuserPermission]
        else:
            permission_classes = [IsAuthenticated]
        return [permission() for permission in permission_classes]

    def perform_create(self, serializer):
        employee = models.Employee.objects.get(user=self.request.user)
        serializer.save(employee=employee)

in get_permissions you can assign one or more permission to every action.

Ahmed Samy
  • 53
  • 1
  • 10