8000 Let AND and OR operators have multiple members · coderanger/django-rest-framework@74855ff · GitHub
[go: up one dir, main page]

Skip to content

Commit 74855ff

Browse files
authored
Let AND and OR operators have multiple members
resolve permission AND(OR(a,b,c), d, e) with logic (a v b v c) ^ d ^ e
1 parent 72de94a commit 74855ff

File tree

1 file changed

+44
-46
lines changed

1 file changed

+44
-46
lines changed

rest_framework/permissions.py

Lines changed: 44 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -47,73 +47,71 @@ def __call__(self, *args, **kwargs):
4747
return self.operator_class(op1, op2)
4848

4949

50-
class AND:
51-
def __init__(self, op1, op2):
52-
self.op1 = op1
53-
self.op2 = op2
50+
class BasePermissionMetaclass(OperationHolderMixin, type):
51+
pass
52+
53+
54+
class BasePermission(metaclass=BasePermissionMetaclass):
55+
"""
56+
A base class from which all permission classes should inherit.
57+
"""
5458

5559
def has_permission(self, request, view):
56-
return (
57-
self.op1.has_permission(request, view) and
58-
self.op2.has_permission(request, view)
59-
)
60+
"""
61+
Return `True` if permission is granted, `False` otherwise.
62+
"""
63+
return True
6064

6165
def has_object_permission(self, request, view, obj):
62-
return (
63-
self.op1.has_object_permission(request, view, obj) and
64-
self.op2.has_object_permission(request, view, obj)
65-
)
66-
66+
"""
67+
Return `True` if permission is granted, `False` otherwise.
68+
"""
69+
return True
6770

68-
class OR:
69-
def __init__(self, op1, op2):
70-
self.op1 = op1
71-
self.op2 = op2
71+
class AND(BasePermission):
72+
def __init__(self, *args):
73+
self.permissions = args
7274

7375
def has_permission(self, request, view):
74-
return (
75-
self.op1.has_permission(request, view< 10000 /span>) or
76-
self.op2.has_permission(request, view)
77-
)
76+
for permission in self.permissions:
77+
if not permissions.has_permission(request, view):
78+
return False
79+
return True
7880

7981
def has_object_permission(self, request, view, obj):
80-
return (
81-
self.op1.has_object_permission(request, view, obj) or
82-
self.op2.has_object_permission(request, view, obj)
83-
)
82+
for permission in self.permissions:
83+
if not permissions.has_object_permission(request, view, obj):
84+
return False
85+
return True
8486

8587

86-
class NOT:
87-
def __init__(self, op1):
88-
self.op1 = op1
88+
class OR(BasePermission):
89+
def __init__(self, *args):
90+
self.permissions = op1
8991

9092
def has_permission(self, request, view):
91-
return not self.op1.has_permission(request, view)
93+
for permission in self.permissions:
94+
if permission.has_permission(request, view):
95+
return True
96+
return False
9297

9398
def has_object_permission(self, request, view, obj):
94-
return not self.op1.has_object_permission(request, view, obj)
99+
for permission in self.permissions:
100+
if permission.has_object_permission(request, view, obj):
101+
return True
102+
return False
95103

96104

97-
class BasePermissionMetaclass(OperationHolderMixin, type):
98-
pass
99-
100-
101-
class BasePermission(metaclass=BasePermissionMetaclass):
102-
"""
103-
A base class from which all permission classes should inherit.
104-
"""
105+
class NOT(BasePermission):
106+
def __init__(self, op1):
107+
self.op1 = op1
105108

106109
def has_permission(self, request, view):
107-
"""
108-
Return `True` if permission is granted, `False` otherwise.
109-
"""
110-
return True
110+
return not self.op1.has_permission(request, view)
111111

112112
def has_object_permission(self, request, view, obj):
113-
"""
114-
Return `True` if permission is granted, `False` otherwise.
115-
"""
116-
return True
113+
return not self.op1.has_object_permission(request, view, obj)
114+
117115

118116

119117
class AllowAny(BasePermission):

0 commit comments

Comments
 (0)
0