Skip to content

Commit 6cd67cc

Browse files
committed
Isolate viewset get permission from model
1 parent 2b79375 commit 6cd67cc

File tree

3 files changed

+14
-4
lines changed

3 files changed

+14
-4
lines changed

rules/contrib/rest_framework.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
from django.core.exceptions import ImproperlyConfigured, PermissionDenied
22

3+
from ..viewsets import BaseAutoPermissionMixin
34

4-
class AutoPermissionViewSetMixin:
5+
6+
class AutoPermissionViewSetMixin(BaseAutoPermissionMixin):
57
"""
68
Enforces object-level permissions in ``rest_framework.viewsets.ViewSet``,
79
deriving the permission type from the particular action to be performed..
@@ -70,6 +72,7 @@ def initial(self, *args, **kwargs):
7072
obj = self.get_object()
7173

7274
# Finally, check permission
73-
perm = self.get_queryset().model.get_perm(perm_type)
75+
model = self.get_queryset().model
76+
perm = self.get_permission_for_model(model, perm_type)
7477
if not self.request.user.has_perm(perm, obj):
7578
raise PermissionDenied

rules/contrib/views.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
# versions before 1.9. For usage help see Django's docs for 1.9 or later.
1313
from django.views.generic.edit import BaseCreateView
1414

15+
from ..viewsets import BaseAutoPermissionMixin
16+
1517
LoginRequiredMixin = mixins.LoginRequiredMixin
1618
UserPassesTestMixin = mixins.UserPassesTestMixin
1719

@@ -47,7 +49,7 @@ def has_permission(self):
4749
return self.request.user.has_perms(perms, obj)
4850

4951

50-
class AutoPermissionRequiredMixin(PermissionRequiredMixin):
52+
class AutoPermissionRequiredMixin(PermissionRequiredMixin, BaseAutoPermissionMixin):
5153
"""
5254
An extended variant of PermissionRequiredMixin which automatically determines
5355
the permission to check based on the type of view it's used with.
@@ -119,7 +121,7 @@ def get_permission_required(self):
119121
model = getattr(self, "model", None)
120122
if model is None:
121123
model = self.get_queryset().model
122-
perms.append(model.get_perm(perm_type))
124+
perms.append(self.get_permission_for_model(model, perm_type))
123125

124126
# If additional permissions have been defined, consider them as well
125127
if self.permission_required is not None:

rules/viewsets.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# All auto permission mixins (both for DRF and Django views)
2+
# inherit from this mixin.
3+
class BaseAutoPermissionMixin:
4+
def get_permission_for_model(self, model, perm_type):
5+
return model.get_perm(perm_type)

0 commit comments

Comments
 (0)