X-Git-Url: http://git.ithinksw.org/philo.git/blobdiff_plain/26c548c5fe8c7cc7227b5f38cd27e0278442dd76..77f783071cd3c6246a90dc6aa869b4efe7610379:/contrib/shipherd/templatetags/shipherd.py?ds=inline diff --git a/contrib/shipherd/templatetags/shipherd.py b/contrib/shipherd/templatetags/shipherd.py index 019d240..317fffb 100644 --- a/contrib/shipherd/templatetags/shipherd.py +++ b/contrib/shipherd/templatetags/shipherd.py @@ -4,25 +4,41 @@ from django.utils.safestring import mark_safe from philo.contrib.shipherd.models import Navigation from philo.models import Node from mptt.templatetags.mptt_tags import RecurseTreeNode, cache_tree_children +from django.utils.translation import ugettext as _ register = template.Library() class RecurseNavigationNode(RecurseTreeNode): - def __init__(self, template_nodes, instance_var): + def __init__(self, template_nodes, instance_var, key): self.template_nodes = template_nodes self.instance_var = instance_var + self.key = key - def _render_node(self, context, node, request): + def _render_node(self, context, item, request): bits = [] context.push() - for child in node.get_children(): - context['navigation'] = child + + # loosely based on django.template.defaulttags.ForNode.render + children = item.get_children() + parentloop = context['navloop'] + loop_dict = context['navloop'] = {'parentloop':parentloop} + len_items = len(children) + for i, child in enumerate(children): + context['item'] = child + loop_dict['counter0'] = i + loop_dict['counter'] = i + 1 + loop_dict['revcounter'] = len_items - i + loop_dict['revcounter0'] = len_items - i - 1 + loop_dict['first'] = (i == 0) + loop_dict['last'] = (i == len_items - 1) bits.append(self._render_node(context, child, request)) - context['navigation'] = node + context['navloop'] = context['navloop']['parentloop'] + context['item'] = item context['children'] = mark_safe(u''.join(bits)) - context['active'] = node.is_active(request) + context['active'] = item.is_active(request) + context['active_descendants'] = item.has_active_descendants(request) rendered = self.template_nodes.render(context) context.pop() return rendered @@ -35,33 +51,45 @@ class RecurseNavigationNode(RecurseTreeNode): instance = self.instance_var.resolve(context) - if isinstance(instance, Node): - qs = Navigation.objects.closest_navigation(instance) - elif hasattr(instance, '__iter__'): - # Is this the right way to check? - qs = instance - else: + try: + items = instance.navigation[self.key] + except: return settings.TEMPLATE_STRING_IF_INVALID - roots = cache_tree_children(qs) - bits = [self._render_node(context, node, request) for node in roots] + bits = [] + + # loosely based on django.template.defaulttags.ForNode.render + # This is a repetition of the stuff that happens above. We should eliminate that somehow. + loop_dict = context['navloop'] = {'parentloop':{}} + len_items = len(items) + for i, item in enumerate(items): + loop_dict['counter0'] = i + loop_dict['counter'] = i + 1 + loop_dict['revcounter'] = len_items - i + loop_dict['revcounter0'] = len_items - i - 1 + loop_dict['first'] = (i == 0) + loop_dict['last'] = (i == len_items - 1) + bits.append(self._render_node(context, item, request)) + return ''.join(bits) @register.tag def recursenavigation(parser, token): """ - Based on django-mptt's recursetree templatetag. In addition to {{ navigation }} and {{ children }}, - sets {{ active }} in the context. + Based on django-mptt's recursetree templatetag. In addition to {{ item }} and {{ children }}, + sets {{ active }}, {{ active_descendants }}, {{ navloop.counter }}, {{ navloop.counter0 }}, + {{ navloop.revcounter }}, {{ navloop.revcounter0 }}, {{ navloop.first }}, {{ navloop.last }}, + and {{ navloop.parentloop }} in the context. Note that the tag takes one variable, which is a Node instance. Usage: