from django.contrib.auth.backends import ModelBackend from django.apps import apps class OrchestraPermissionBackend(ModelBackend): supports_object_permissions = True supports_anonymous_user = False supports_inactive_user = False def has_perm(self, user, perm, obj=None): """ perm 'app.action_model' """ if not user.is_active: return False perm_type = perm.split('.')[1].split('_')[0] if obj is None: app_label = perm.split('.')[0] model_label = perm.split('_')[1] model = apps.get_model(app_label, model_label) perm_manager = model else: perm_manager = obj try: is_authorized = perm_manager.has_permission(user, perm_type) except AttributeError: is_authorized = False return is_authorized def has_module_perms(self, user, app_label): """ Returns True if user_obj has any permissions in the given app_label. """ if not user.is_active: return False app = apps.get_app_config(app_label) for model in apps.get_models(app): try: has_perm = model.has_permission.view(user) except AttributeError: pass else: if has_perm: return True return False