X-Git-Url: http://git.ithinksw.org/philo.git/blobdiff_plain/cec32849d48d9e36c030224e2eb9631d31ef17a2..cc6dbd55a2af538657c288a709662b9c84949854:/philo/contrib/shipherd/templatetags/shipherd.py diff --git a/philo/contrib/shipherd/templatetags/shipherd.py b/philo/contrib/shipherd/templatetags/shipherd.py index e3019e1..508eace 100644 --- a/philo/contrib/shipherd/templatetags/shipherd.py +++ b/philo/contrib/shipherd/templatetags/shipherd.py @@ -68,10 +68,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 +80,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 @@ -92,12 +101,13 @@ class RecurseNavigationNode(template.Node): @register.tag def recursenavigation(parser, token): """ - The recursenavigation templatetag takes two arguments: - - the node for which the navigation should be found - - the navigation's key. + The :ttag:`recursenavigation` templatetag takes two arguments: + + * the :class:`.Node` for which the :class:`.Navigation` should be found + * the :class:`.Navigation`'s :attr:`~.Navigation.key`. - It will then recursively loop over each item in the navigation and render the template - chunk within the block. recursenavigation sets the following variables in the context: + It will then recursively loop over each :class:`.NavigationItem` in the :class:`.Navigation` and render the template + chunk within the block. :ttag:`recursenavigation` sets the following variables in the context: ============================== ================================================ Variable Description @@ -109,25 +119,26 @@ def recursenavigation(parser, token): ``navloop.first`` True if this is the first time through the current level ``navloop.last`` True if this is the last time through the current level ``navloop.parentloop`` This is the loop one level "above" the current one - ============================== ================================================ - ``item`` The current item in the loop (a NavigationItem instance) + + ``item`` The current item in the loop (a :class:`.NavigationItem` instance) ``children`` If accessed, performs the next level of recursion. ``navloop.active`` True if the item is active for this request ``navloop.active_descendants`` True if the item has active descendants for this request ============================== ================================================ - Example: + Example:: + """ bits = token.contents.split() @@ -135,17 +146,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