from django import template from django.utils.encoding import smart_str register = template.Library() class NavNode(template.Node): def __init__(self, item=None, var_name=None): self.item = item self.var_name = var_name or 'nav' def render(self, context): # If the nav variable is already set (to a non-empty value), don't do # anything. if context.get(self.var_name): return '' # If self.item was blank, just set the nav variable to the context # (useful to put the nav in a higher context stack) if not self.item: context[self.var_name] = {} return '' item = self.item.resolve(context) item = item and smart_str(item) if not item: return '' value = True for part in reversed(item.split('.')): new_item = {} new_item[part] = value value = new_item # The nav variable could have been set (as an empty dict) on a higher # context stack. Try getting it from the context, otherwise set it to # the current context stack. nav = context.get(self.var_name) if not isinstance(nav, dict): nav = {} context[self.var_name] = nav nav.update(new_item) return '' def __repr__(self): return "