from typing import Dict class CRUDPermissionsMixin: view_permission_codes: tuple = () create_permission_codes: tuple = () destroy_permission_codes: tuple = () update_permission_codes: tuple = () action_permissions: Dict[str, tuple] = {} def get_default_action_permissions(self): return { "list": self.view_permission_codes, "retrieve": self.view_permission_codes, "create": self.create_permission_codes, "update": self.update_permission_codes, "partial_update": self.update_permission_codes, "destroy": self.destroy_permission_codes, } def has_perm_for_action(self, request, action) -> bool: default_action_permissions = self.get_default_action_permissions() action_permissions = {**default_action_permissions, **self.action_permissions} perms = action_permissions.get(action, ()) return request.user.has_perms(perms) def has_permission(self, request, view): user = request.user if user.is_superuser: return True if not user.is_staff: return False return self.has_perm_for_action(request=request, action=view.action)