Corrections to has_navigation and navigation_host to use the new NavigationMapper...
[philo.git] / philo / contrib / shipherd / models.py
index c8579a2..9888378 100644 (file)
@@ -21,9 +21,15 @@ class NavigationMapper(object, DictMixin):
        """
        def __init__(self, node):
                self.node = node
+               self._cache = {}
        
        def __getitem__(self, key):
-               return Navigation.objects.get_for_node(self.node, key)
+               if key not in self._cache:
+                       try:
+                               self._cache[key] = Navigation.objects.get_for_node(self.node, key)
+                       except Navigation.DoesNotExist:
+                               self._cache[key] = None
+               return self._cache[key]
 
 
 def navigation(self):
@@ -42,21 +48,21 @@ class NavigationManager(models.Manager):
                opts = Node._mptt_meta
                left = getattr(node, opts.left_attr)
                right = getattr(node, opts.right_attr)
-               tree = getattr(node, opts.tree_id_attr)
+               tree_id = getattr(node, opts.tree_id_attr)
                kwargs = {
                        "node__%s__lte" % opts.left_attr: left,
                        "node__%s__gte" % opts.right_attr: right,
                        "node__%s" % opts.tree_id_attr: tree_id
                }
-               navs = self.filter(key=key, **kwargs).order_by('-node__%s' % opts.level_attr)
+               navs = self.filter(key=key, **kwargs).select_related('node').order_by('-node__%s' % opts.level_attr)
                nav = navs[0]
-               roots = nav.roots.all()
+               roots = nav.roots.all().select_related('target_node')
                item_opts = NavigationItem._mptt_meta
                by_pk = {}
                tree_ids = []
                
                for root in roots:
-                       by_pk[root.pk] = pk
+                       by_pk[root.pk] = root
                        tree_ids.append(getattr(root, item_opts.tree_id_attr))
                        root._cached_children = []
                
@@ -65,7 +71,7 @@ class NavigationManager(models.Manager):
                        '%s__lt' % item_opts.level_attr: nav.depth,
                        '%s__gt' % item_opts.level_attr: 0
                }
-               items = NavigationItem.objects.filter(**kwargs).order_by('level', 'order')
+               items = NavigationItem.objects.filter(**kwargs).select_related('target_node').order_by('level', 'order')
                for item in items:
                        by_pk[item.pk] = item
                        item._cached_children = []