From e709378ddbf4caa75fb7bf246fe078eb2533f624 Mon Sep 17 00:00:00 2001 From: Kevin Brown Date: Wed, 13 Nov 2019 22:06:47 -0500 Subject: [PATCH] Do not extend AND/OR/NOT from BasePermission This can be done in a separate pull request, but it was reverted out of this one because it made it more difficult to review and increased its chances of not being accepted. --- rest_framework/permissions.py | 90 +++++++++++++++++------------------ 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/rest_framework/permissions.py b/rest_framework/permissions.py index 24b3e4ec9..f880fcc25 100644 --- a/rest_framework/permissions.py +++ b/rest_framework/permissions.py @@ -47,6 +47,51 @@ class OperandHolder(OperationHolderMixin): return self.operator_class(op1, op2) +class AND: + def __init__(self, *args): + self.permissions = args + + def has_permission(self, request, view): + for permission in self.permissions: + if not permission.has_permission(request, view): + return False + return True + + def has_object_permission(self, request, view, obj): + for permission in self.permissions: + if not permission.has_object_permission(request, view, obj): + return False + return True + + +class OR: + def __init__(self, *args): + self.permissions = args + + def has_permission(self, request, view): + for permission in self.permissions: + if permission.has_permission(request, view): + return True + return False + + def has_object_permission(self, request, view, obj): + for permission in self.permissions: + if permission.has_object_permission(request, view, obj): + return True + return False + + +class NOT: + def __init__(self, op1): + self.op1 = op1 + + def has_permission(self, request, view): + return not self.op1.has_permission(request, view) + + def has_object_permission(self, request, view, obj): + return not self.op1.has_object_permission(request, view, obj) + + class BasePermissionMetaclass(OperationHolderMixin, type): pass @@ -69,51 +114,6 @@ class BasePermission(metaclass=BasePermissionMetaclass): return True -class AND(BasePermission): - def __init__(self, *args): - self.permissions = args - - def has_permission(self, request, view): - for permission in self.permissions: - if not permission.has_permission(request, view): - return False - return True - - def has_object_permission(self, request, view, obj): - for permission in self.permissions: - if not permission.has_object_permission(request, view, obj): - return False - return True - - -class OR(BasePermission): - def __init__(self, *args): - self.permissions = args - - def has_permission(self, request, view): - for permission in self.permissions: - if permission.has_permission(request, view): - return True - return False - - def has_object_permission(self, request, view, obj): - for permission in self.permissions: - if permission.has_object_permission(request, view, obj): - return True - return False - - -class NOT(BasePermission): - def __init__(self, op1): - self.op1 = op1 - - def has_permission(self, request, view): - return not self.op1.has_permission(request, view) - - def has_object_permission(self, request, view, obj): - return not self.op1.has_object_permission(request, view, obj) - - class AllowAny(BasePermission): """ Allow any access.