"""permission classes for django restframework""" from rest_framework.permissions import BasePermission, DjangoObjectPermissions from passbook.policies.engine import PolicyEngine from passbook.policies.models import PolicyBindingModel class CustomObjectPermissions(DjangoObjectPermissions): """Similar to `DjangoObjectPermissions`, but adding 'view' permissions.""" perms_map = { "GET": ["%(app_label)s.view_%(model_name)s"], "OPTIONS": ["%(app_label)s.view_%(model_name)s"], "HEAD": ["%(app_label)s.view_%(model_name)s"], "POST": ["%(app_label)s.add_%(model_name)s"], "PUT": ["%(app_label)s.change_%(model_name)s"], "PATCH": ["%(app_label)s.change_%(model_name)s"], "DELETE": ["%(app_label)s.delete_%(model_name)s"], } class PolicyPermissions(BasePermission): """Permission checker based on PolicyEngine""" policy_engine: PolicyEngine def has_object_permission(self, request, view, obj: PolicyBindingModel) -> bool: self.policy_engine = PolicyEngine(obj.policies, request.user, request) self.policy_engine.request.obj = obj return self.policy_engine.build().passing