31 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			31 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """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
 | 
