Skip to content

Commit

Permalink
Merge e7b6269 into 2b79375
Browse files Browse the repository at this point in the history
  • Loading branch information
sergioisidoro committed Dec 22, 2021
2 parents 2b79375 + e7b6269 commit 34961ac
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 4 deletions.
7 changes: 5 additions & 2 deletions rules/contrib/rest_framework.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from django.core.exceptions import ImproperlyConfigured, PermissionDenied

from ..viewsets import BaseAutoPermissionMixin

class AutoPermissionViewSetMixin:

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

# Finally, check permission
perm = self.get_queryset().model.get_perm(perm_type)
model = self.get_queryset().model
perm = self.get_permission_for_model(model, perm_type)
if not self.request.user.has_perm(perm, obj):
raise PermissionDenied
6 changes: 4 additions & 2 deletions rules/contrib/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
# versions before 1.9. For usage help see Django's docs for 1.9 or later.
from django.views.generic.edit import BaseCreateView

from ..viewsets import BaseAutoPermissionMixin

LoginRequiredMixin = mixins.LoginRequiredMixin
UserPassesTestMixin = mixins.UserPassesTestMixin

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


class AutoPermissionRequiredMixin(PermissionRequiredMixin):
class AutoPermissionRequiredMixin(PermissionRequiredMixin, BaseAutoPermissionMixin):
"""
An extended variant of PermissionRequiredMixin which automatically determines
the permission to check based on the type of view it's used with.
Expand Down Expand Up @@ -119,7 +121,7 @@ def get_permission_required(self):
model = getattr(self, "model", None)
if model is None:
model = self.get_queryset().model
perms.append(model.get_perm(perm_type))
perms.append(self.get_permission_for_model(model, perm_type))

# If additional permissions have been defined, consider them as well
if self.permission_required is not None:
Expand Down
5 changes: 5 additions & 0 deletions rules/viewsets.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# All auto permission mixins (both for DRF and Django views)
# inherit from this mixin.
class BaseAutoPermissionMixin:
def get_permission_for_model(self, model, perm_type):
return model.get_perm(perm_type)

0 comments on commit 34961ac

Please sign in to comment.