correct roles_* decorator signature expectations

Having multiple RoleNeed objects in a Permission does not require
all to be satisfied in order to .can(), but will return True if
any are present.  This makes the previous roles_required logic more
elegant for roles_accepted.  roles_required decorator needs to check
all permissions individually and return only if all permissions exist
This commit is contained in:
David Ignacio
2012-06-22 00:15:43 -05:00
parent e67cbee1d5
commit 24cd4938a5
3 changed files with 26 additions and 11 deletions
+10 -11
View File
@@ -93,7 +93,7 @@ def roles_required(*roles):
:param args: The required roles.
"""
perm = Permission(*[RoleNeed(role) for role in roles])
perms = [Permission(RoleNeed(role)) for role in roles]
def wrapper(fn):
@wraps(fn)
@@ -102,12 +102,12 @@ def roles_required(*roles):
login_view = app.security.login_manager.login_view
return redirect(login_url(login_view, request.url))
if perm.can():
return fn(*args, **kwargs)
app.logger.debug('Identity does not provide the '
'roles: %s' % [r for r in roles])
return redirect(request.referrer or '/')
for perm in perms:
if not perm.can():
app.logger.debug('Identity does not provide the '
'roles: %s' % [r for r in roles])
return redirect(request.referrer or '/')
return fn(*args, **kwargs)
return decorated_view
return wrapper
@@ -126,7 +126,7 @@ def roles_accepted(*roles):
:param args: The possible roles.
"""
perms = [Permission(RoleNeed(role)) for role in roles]
perm = Permission(*[RoleNeed(role) for role in roles])
def wrapper(fn):
@wraps(fn)
@@ -135,9 +135,8 @@ def roles_accepted(*roles):
login_view = app.security.login_manager.login_view
return redirect(login_url(login_view, request.url))
for perm in perms:
if perm.can():
return fn(*args, **kwargs)
if perm.can():
return fn(*args, **kwargs)
r1 = [r for r in roles]
r2 = [r.name for r in current_user.roles]