From ec1c5d78ddf603ff5a5667fefccbda9eab885c16 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Sat, 17 Dec 2011 19:44:23 -0400 Subject: [PATCH] Add template tag to hangle acl in navigation --- apps/acls/templatetags/__init__.py | 0 apps/acls/templatetags/acl_tags.py | 54 ++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 apps/acls/templatetags/__init__.py create mode 100644 apps/acls/templatetags/acl_tags.py diff --git a/apps/acls/templatetags/__init__.py b/apps/acls/templatetags/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/apps/acls/templatetags/acl_tags.py b/apps/acls/templatetags/acl_tags.py new file mode 100644 index 0000000000..3467a7aa49 --- /dev/null +++ b/apps/acls/templatetags/acl_tags.py @@ -0,0 +1,54 @@ +from django.core.exceptions import PermissionDenied +from django.template import (TemplateSyntaxError, Library, + Node, Variable, VariableDoesNotExist) + +from acls.models import AccessEntry + +register = Library() + + +class CheckAccessNode(Node): + def __init__(self, permission_list=None, requester=None, obj=None, *args, **kwargs): + self.requester = requester + self.permission_list = permission_list + self.obj = obj + + def render(self, context): + permission_list = Variable(self.permission_list).resolve(context) + try: + # Check access_object, useful for document_page views + obj = Variable('access_object').resolve(context) + except VariableDoesNotExist: + try: + obj = Variable(self.obj).resolve(context) + except VariableDoesNotExist: + context[u'access'] = True + return u'' + + requester = Variable(self.requester).resolve(context) + + if not permission_list or not obj: + # There is no permissions list to check against which means + # this link is available for all + context[u'access'] = True + return u'' + + try: + AccessEntry.objects.check_accesses(permission_list, requester, obj) + except PermissionDenied: + context[u'access'] = False + return u'' + else: + context[u'access'] = True + return u'' + + +@register.tag +def check_access(parser, token): + try: + # Splitting by None == splitting by spaces. + tag_name, args = token.contents.split(None, 1) + except ValueError: + raise TemplateSyntaxError(u'%r tag requires arguments' % token.contents.split()[0]) + + return CheckAccessNode(*args.split())