X-Git-Url: http://git.ithinksw.org/philo.git/blobdiff_plain/4b2951f95d35674984774764f5991f89c5ca7815..92e8e96c8d6814f3bd93ecd82d8da2ccb43e13c4:/contrib/shipherd/templatetags/shipherd.py diff --git a/contrib/shipherd/templatetags/shipherd.py b/contrib/shipherd/templatetags/shipherd.py index 57fb020..b05ff0f 100644 --- a/contrib/shipherd/templatetags/shipherd.py +++ b/contrib/shipherd/templatetags/shipherd.py @@ -1,4 +1,4 @@ -from django import template +from django import template, VERSION as django_version from django.conf import settings from django.utils.safestring import mark_safe from philo.contrib.shipherd.models import Navigation @@ -60,6 +60,10 @@ class LazyNavigationRecurser(object): context['item'] = item context['children'] = self.__class__(self.template_nodes, item.get_children(), context, request) + # Django 1.2.X compatibility - a lazy recurser will not be called if accessed as a template variable. + if django_version < (1,3): + context['children'] = context['children']() + # Then render the nodelist bit by bit. for node in self.template_nodes: bits.append(node.render(context)) @@ -68,10 +72,10 @@ class LazyNavigationRecurser(object): class RecurseNavigationNode(template.Node): - def __init__(self, template_nodes, instance_var, key): + def __init__(self, template_nodes, instance_var, key_var): self.template_nodes = template_nodes self.instance_var = instance_var - self.key = key + self.key_var = key_var def render(self, context): try: @@ -80,9 +84,18 @@ class RecurseNavigationNode(template.Node): return '' instance = self.instance_var.resolve(context) + key = self.key_var.resolve(context) + + # Fall back on old behavior if the key doesn't seem to be a variable. + if not key: + token = self.key_var.token + if token[0] not in ["'", '"'] and '.' not in token: + key = token + else: + return settings.TEMPLATE_STRING_IF_INVALID try: - items = instance.navigation[self.key] + items = instance.navigation[key] except: return settings.TEMPLATE_STRING_IF_INVALID @@ -135,17 +148,11 @@ def recursenavigation(parser, token): raise template.TemplateSyntaxError(_('%s tag requires two arguments: a node and a navigation section name') % bits[0]) instance_var = parser.compile_filter(bits[1]) - key = bits[2] - - template_nodes = parser.parse(('recurse', 'endrecursenavigation',)) - - token = parser.next_token() - if token.contents == 'recurse': - template_nodes.append(RecurseNavigationMarker()) - template_nodes.extend(parser.parse(('endrecursenavigation'))) - parser.delete_first_token() + key_var = parser.compile_filter(bits[2]) - return RecurseNavigationNode(template_nodes, instance_var, key) + template_nodes = parser.parse(('endrecursenavigation',)) + token = parser.delete_first_token() + return RecurseNavigationNode(template_nodes, instance_var, key_var) @register.filter @@ -167,6 +174,4 @@ def navigation_host(node, key): try: return Navigation.objects.filter(node__in=node.get_ancestors(include_self=True), key=key).order_by('-node__level')[0].node except: - if settings.TEMPLATE_DEBUG: - raise return node \ No newline at end of file