X-Git-Url: http://git.ithinksw.org/philo.git/blobdiff_plain/872b260781ffcc72f81549bc92bde8ca4eb2155e..ee56a2ca0d6c5d08ee42a9452de4353e8f2643ba:/templatetags/nodes.py diff --git a/templatetags/nodes.py b/templatetags/nodes.py index 6cee439..744be4d 100644 --- a/templatetags/nodes.py +++ b/templatetags/nodes.py @@ -3,6 +3,7 @@ from django.conf import settings from django.contrib.sites.models import Site from django.core.urlresolvers import reverse, NoReverseMatch from django.template.defaulttags import kwarg_re +from django.utils.encoding import smart_str from philo.exceptions import ViewCanNotProvideSubpath @@ -24,34 +25,38 @@ class NodeURLNode(template.Node): if self.node: node = self.node.resolve(context) else: - node = context['node'] + node = context.get('node', None) - if self.with_obj is not None: - try: - view_name, args, kwargs = node.view.get_reverse_params(self.with_obj.resolve(context)) - except ViewCanNotProvideSubpath: - return settings.TEMPLATE_STRING_IF_INVALID - elif self.view_name is not None: - view_name = self.view_name - args = [arg.resolve(context) for arg in self.args] - kwargs = dict([(smart_str(k, 'ascii'), v.resolve(context)) for k, v in self.kwargs.items()]) - else: - return node.get_absolute_url() - - if not node.view.accepts_subpath: + if not node: return settings.TEMPLATE_STRING_IF_INVALID - url = '' - try: - subpath = reverse(view_name, urlconf=node.view, args=args, kwargs=kwargs) - except NoReverseMatch: - if self.as_var is None: - raise + if self.with_obj is None and self.view_name is None: + url = node.get_absolute_url() else: - if subpath[0] == '/': - subpath = subpath[1:] + if not node.view.accepts_subpath: + return settings.TEMPLATE_STRING_IF_INVALID + + if self.with_obj is not None: + try: + view_name, args, kwargs = node.view.get_reverse_params(self.with_obj.resolve(context)) + except ViewCanNotProvideSubpath: + return settings.TEMPLATE_STRING_IF_INVALID + else: # self.view_name is not None + view_name = self.view_name + args = [arg.resolve(context) for arg in self.args] + kwargs = dict([(smart_str(k, 'ascii'), v.resolve(context)) for k, v in self.kwargs.items()]) - url = node.get_absolute_url() + subpath + url = '' + try: + subpath = reverse(view_name, urlconf=node.view, args=args, kwargs=kwargs) + except NoReverseMatch: + if self.as_var is None: + raise + else: + if subpath[0] == '/': + subpath = subpath[1:] + + url = node.get_absolute_url() + subpath if self.as_var: context[self.as_var] = url @@ -107,4 +112,84 @@ def do_node_url(parser, token): args.append(parser.compile_filter(value)) return NodeURLNode(view_name=view_name, args=args, kwargs=kwargs, node=node, as_var=as_var) - return NodeURLNode(node=node, as_var=as_var) \ No newline at end of file + return NodeURLNode(node=node, as_var=as_var) + + +class NavigationNode(template.Node): + def __init__(self, node=None, as_var=None): + self.as_var = as_var + self.node = node + + def render(self, context): + if 'request' not in context: + return settings.TEMPLATE_STRING_IF_INVALID + + if self.node: + node = self.node.resolve(context) + else: + node = context.get('node', None) + + if not node: + return settings.TEMPLATE_STRING_IF_INVALID + + try: + nav_root = node.attributes['navigation_root'] + except KeyError: + if settings.TEMPLATE_DEBUG: + raise + return settings.TEMPLATE_STRING_IF_INVALID + + # Should I get its override and check for a max depth override there? + navigation = nav_root.get_navigation() + + if self.as_var: + context[self.as_var] = navigation + return '' + + return self.compile(navigation, context['request'].path, nav_root.get_absolute_url(), nav_root.get_level(), nav_root.get_level() + 3) + + def compile(self, navigation, active_path, root_url, current_depth, max_depth): + compiled = "" + for item in navigation: + if item['url'] in active_path and (item['url'] != root_url or root_url == active_path): + compiled += "
  • " + else: + compiled += "
  • " + + if item['url']: + compiled += "" % item['url'] + + compiled += item['title'] + + if item['url']: + compiled += "" + + if 'children' in item and current_depth < max_depth: + compiled += "" % self.compile(item['children'], active_path, root_url, current_depth + 1, max_depth) + + compiled += "
  • " + return compiled + + +@register.tag(name='navigation') +def do_navigation(parser, token): + """ + {% navigation [for ] [as ] %} + """ + bits = token.split_contents() + tag = bits[0] + bits = bits[1:] + node = None + as_var = None + + if len(bits) >= 2 and bits[-2] == 'as': + as_var = bits[-1] + bits = bits[:-2] + + if len(bits) >= 2 and bits[-2] == 'for': + node = parser.compile_filter(bits[-1]) + bits = bits[-2] + + if bits: + raise template.TemplateSyntaxError('`%s` template tag expects the syntax {%% %s [for ] [as ] %}' % (tag, tag)) + return NavigationNode(node, as_var)