Amélioration du parcours et de la sélection dans les arbres de thésaurus
authorymh <ymh.work@gmail.com>
Tue, 30 Jul 2013 23:00:03 +0200
changeset 83 4cdef872c351
parent 82 8a67acd1f3aa
child 84 e643f31ed046
Amélioration du parcours et de la sélection dans les arbres de thésaurus - Les nodes feuilles ne sont plus sélectionnable - Si une node a trop d'enfant on autorise son ouverture si elle a des enfants node non feuiile (si il n'y en a pas trop) correct bug #17657
src/core/models/term.py
src/jocondelab/static/jocondelab/js/jocondelab.js
src/jocondelab/views.py
--- a/src/core/models/term.py	Tue Jul 30 18:39:12 2013 +0200
+++ b/src/core/models/term.py	Tue Jul 30 23:00:03 2013 +0200
@@ -108,6 +108,10 @@
     parent = TreeForeignKey('self', null=True, blank=True, related_name='children')
     
     @property
+    def children_with_descendants(self):
+        return self.children.extra(where=['(rght-lft) > 1'])
+    
+    @property
     def alternative_labels_str(self):
         return " | ".join([l.label for l in self.alternative_labels.all() if l.label != self.label])
     
--- a/src/jocondelab/static/jocondelab/js/jocondelab.js	Tue Jul 30 18:39:12 2013 +0200
+++ b/src/jocondelab/static/jocondelab/js/jocondelab.js	Tue Jul 30 23:00:03 2013 +0200
@@ -329,7 +329,15 @@
                         select_limit: 1,
                         initially_select: $('#thesaurus_tree').val()?['node-term-'+$('#thesaurus_tree').val()]:[]
                     },
-                    plugins : [ "themes", "json_data", "ui"]
+                    types : {
+                        types: {
+                            "leaf" : {
+                                'hover_node' : false,
+                                'select_node': function () {return false;}
+                            }
+                        }
+                    },
+                    plugins : [ "themes", "json_data", "ui", "types"]
                 });
         },
         close: function( event, ui ) {
--- a/src/jocondelab/views.py	Tue Jul 30 18:39:12 2013 +0200
+++ b/src/jocondelab/views.py	Tue Jul 30 23:00:03 2013 +0200
@@ -318,9 +318,9 @@
         'data' : {
            'title': node.label if node.is_leaf_node() else "%s (%d)"%(node.label, node.get_descendant_count()),
            'attr' : {'id': 'node-term-a-%d' % node.id, 'class': 'term-tree-node'},
-           'icon' : 'folder',
+           'icon' : 'folder'
           },
-          'attr' : { "id" : 'node-term-%d' % node.id },
+          'attr' : { "id" : 'node-term-%d' % node.id, 'rel': 'leaf' if node.is_leaf_node() else 'default'},
           'metadata': {'term_tree_node': {'id': node.id, 'node_id':'node-term-%d' % node.id,'label': node.label, 'children_count': children_count, 'descendants': node.get_descendant_count()}},                      
         }
         
@@ -331,7 +331,10 @@
             res['children'] = [ self.get_node_data(c,children_counts.get(c.id,0),selected_node_ancestors) for c in children]
         elif not node.is_leaf_node() and children_count <= settings.JOCONDE_TERM_TREE_MAX_CHILDREN:
             res['state'] = 'closed'
-        
+        elif not node.is_leaf_node():
+            children_with_descendants_count = node.children_with_descendants.count() 
+            if children_with_descendants_count > 0 and  children_with_descendants_count <= settings.JOCONDE_TERM_TREE_MAX_CHILDREN:
+                res['state'] = 'closed'
         return res
     
     def get(self, request, thes_id):
@@ -342,7 +345,10 @@
             nodes = Term.objects.root_nodes().filter(thesaurus__id=thes_id)  # @UndefinedVariable                            
         else:
             initial_node = Term.objects.get(id=initial_node_id)  # @UndefinedVariable
-            nodes = initial_node.get_children()            
+            if initial_node.get_children().count() <= settings.JOCONDE_TERM_TREE_MAX_CHILDREN:
+                nodes = initial_node.get_children()
+            else:
+                nodes = Term.objects.filter(id__in=initial_node.children_with_descendants)  # @UndefinedVariable
         
         if len(nodes) > settings.JOCONDE_TERM_TREE_MAX_ROOT_NODE:
             return HttpResponseForbidden(u"Too many nodes")