diff --git a/re2o/templatetags/acl.py b/re2o/templatetags/acl.py index 6fd00e19..f32c8507 100644 --- a/re2o/templatetags/acl.py +++ b/re2o/templatetags/acl.py @@ -147,6 +147,7 @@ def get_callback(tag_name, obj=None): return acl_fct( lambda x: ( not any(not sys.modules[o].can_view(x)[0] for o in obj), + None, None ), False @@ -155,28 +156,29 @@ def get_callback(tag_name, obj=None): return acl_fct( lambda x: ( not any(not sys.modules[o].can_view(x)[0] for o in obj), + None, None ), True ) if tag_name == 'can_edit_history': return acl_fct( - lambda user: (user.has_perm('admin.change_logentry'), None), + lambda user: (user.has_perm('admin.change_logentry'), None, None), False ) if tag_name == 'cannot_edit_history': return acl_fct( - lambda user: (user.has_perm('admin.change_logentry'), None), + lambda user: (user.has_perm('admin.change_logentry'), None, None), True ) if tag_name == 'can_view_any_app': return acl_fct( - lambda x: (any(sys.modules[o].can_view(x)[0] for o in obj), None), + lambda x: (any(sys.modules[o].can_view(x)[0] for o in obj), None, None), False ) if tag_name == 'cannot_view_any_app': return acl_fct( - lambda x: (any(sys.modules[o].can_view(x)[0] for o in obj), None), + lambda x: (any(sys.modules[o].can_view(x)[0] for o in obj), None, None), True ) @@ -194,8 +196,8 @@ def acl_fct(callback, reverse): def acl_fct_reverse(user, *args, **kwargs): """The cannot_xxx checker callback""" - can, msg = callback(user, *args, **kwargs) - return not can, msg + can, msg, permissions = callback(user, *args, **kwargs) + return not can, msg, permissions return acl_fct_reverse if reverse else acl_fct_normal @@ -217,7 +219,7 @@ def acl_history_filter(parser, token): assert token.contents == 'acl_end' - return AclNode(callback, oknodes, konodes) + return AclNode(tag_name, callback, oknodes, konodes) @register.tag('can_view_any_app') @@ -254,7 +256,7 @@ def acl_app_filter(parser, token): assert token.contents == 'acl_end' - return AclNode(callback, oknodes, konodes) + return AclNode(tag_name, callback, oknodes, konodes) @register.tag('can_change') @@ -264,7 +266,7 @@ def acl_change_filter(parser, token): try: tag_content = token.split_contents() - # tag_name = tag_content[0] + tag_name = tag_content[0] model_name = tag_content[1] field_name = tag_content[2] args = tag_content[3:] @@ -291,7 +293,7 @@ def acl_change_filter(parser, token): # {% can_create_end %} assert token.contents == 'acl_end' - return AclNode(callback, oknodes, konodes, *args) + return AclNode(tag_name, callback, oknodes, konodes, *args) @register.tag('can_create') @@ -333,7 +335,7 @@ def acl_model_filter(parser, token): # {% can_create_end %} assert token.contents == 'acl_end' - return AclNode(callback, oknodes, konodes, *args) + return AclNode(tag_name, callback, oknodes, konodes, *args) @register.tag('can_edit') @@ -377,7 +379,8 @@ class AclNode(Node): """A node for the compiled ACL block when acl callback doesn't require context.""" - def __init__(self, callback, oknodes, konodes, *args): + def __init__(self, tag_name, callback, oknodes, konodes, *args): + self.tag_name = tag_name self.callback = callback self.oknodes = oknodes self.konodes = konodes @@ -388,11 +391,14 @@ class AclNode(Node): if context['user'].is_anonymous(): can = False else: - can, _ = self.callback(context['user'], *(resolved_args)) + can, _, _ = self.callback(context['user'], *(resolved_args)) if can: return self.oknodes.render(context) return self.konodes.render(context) + def __repr__(self): + return '' % self.tag_name + class AclInstanceNode(Node): """A node for the compiled ACL block when acl is based on instance""" @@ -410,7 +416,10 @@ class AclInstanceNode(Node): if context['user'].is_anonymous(): can = False else: - can, _ = callback(context['user'], *(resolved_args)) + can, _, _ = callback(context['user'], *(resolved_args)) if can: return self.oknodes.render(context) return self.konodes.render(context) + + def __repr__(self): + return '' % self.tag_name