Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
dj-kaos / models / decorators.py
Size: Mime:
from dj_kaos_utils.perms import get_permission_name
from django.core.exceptions import ImproperlyConfigured
from rules import Predicate


def action(function=None, *,
           permissions=(),
           include=lambda x: True,
           exclude=lambda x: False):
    def decorator(func):
        func.permissions = permissions

        def check_permissions(user, obj):
            for perm in permissions:
                if isinstance(perm, str):
                    if not (user.has_perm(perm) or user.has_perm(get_permission_name(obj._meta, perm))):
                        return False
                elif isinstance(perm, Predicate):
                    if not perm.test(user, obj):
                        return False
                else:
                    raise ImproperlyConfigured(f"Invalid permission {perm} passed in {function} @action decorator.")
            return True

        func.check_permissions = check_permissions

        func.include = include
        func.exclude = exclude

        return func

    if function is None:
        return decorator
    else:
        return decorator(function)


__all__ = (
    'action',
)