Композитные разрешения DRF
У меня есть класс представления, унаследованный от RetrieveUpdateDestroyAPIView. Мне нужно иметь разные классы разрешений для разных методов, поэтому я переписываю метод get_permissions, но получаю ошибку
TypeError: неподдерживаемый тип(ы) операнда(ов) для |: 'IsSuperAdmin' и 'IsOwner.
views.py
class UserView(RetrieveUpdateDestroyAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
http_method_names = ['patch', 'get', 'delete']
def get_permissions(self):
if self.request.method == 'GET':
return [IsAuthenticated(), IsSuperAdmin()|IsOwner()|IsAdmin(), ]
elif self.request.method == 'DELETE':
return [IsAuthenticated(), IsSuperAdmin()|IsAdmin()]
else:
return [IsAuthenticated(), IsSuperAdmin()|IsAdmin()|IsOwner(), ]
permissions.py
class IsSuperAdmin(BasePermission):
message = "You must be super admin to perform requested operation"
def has_permission(self, request, view):
if request.user.role == "super_admin":
return True
return False
class IsAdmin(BasePermission):
message = "You must be admin to perform requested operation"
def has_permission(self, request, view):
if request.user.role == "admin":
return True
return False
class IsOwner(BasePermission):
message = "You must be owner of resource to perform requested operaton"
def has_object_permission(self, request, view, obj):
if obj.id == request.user.id:
return True
return False
Вам не нужно инстанцировать классы разрешений, поэтому код
return [IsAuthenticated(), IsSuperAdmin()|IsOwner()|IsAdmin(), ]
Должно быть как
return [IsAuthenticated, IsSuperAdmin |IsOwner | IsAdmin ]
См. остальную часть документа: https://www.django-rest-framework.org/api-guide/permissions/#setting-the-permission-policy