changeset 228:afc96bc56817

also show multiple projects with the same number (including none) in the tree.
author casties
date Tue, 05 Nov 2013 13:58:45 +0100
parents a328c112e372
children d4216a848547
files HashTree.py MPIWGProjects.py
diffstat 2 files changed, 44 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/HashTree.py	Wed Oct 30 17:44:42 2013 +0100
+++ b/HashTree.py	Tue Nov 05 13:58:45 2013 +0100
@@ -13,6 +13,39 @@
         self.value = value
         self.children = children
 
+    def setValue(self, val, append=True):
+        """set or append to the value"""
+        if (self.value is not None) or append:
+            if isinstance(self.value, list):
+                # old value is list
+                self.value.append(val)
+            elif self.value is not None:
+                # old value is scalar
+                self.value = [self.value, val]
+            else:
+                # old value is None
+                self.value = val
+                
+        else:
+            self.value = val
+
+
+    def getValue(self, onlyFirst=True, asList=False):
+        """get the (first) value"""
+        if isinstance(self.value, list):
+            if onlyFirst and not asList:
+                return self.value[0]
+            else:
+                return self.value
+        else:
+            if asList:
+                if self.value is None:
+                    return []
+                else:
+                    return [self.value]
+            else:
+                return self.value
+
 
     def getNode(self, key):
         """return node under key"""
@@ -44,13 +77,13 @@
             if self.value is None:
                 return []
             else:
-                return [self.value]
+                return self.getValue(asList=True)
             
         else:
             if self.value is None:
                 sub = []
             else:
-                sub = [self.value]
+                sub = self.getValue(asList=True)
                 
             for k in sorted(self.children.keys()):
                 sub.extend(self.children.get(k).getSubtreeAsListDepthFirst())
@@ -65,7 +98,7 @@
         while len(q) > 0:
             node = q.pop(0)
             if node.value is not None:
-                sub.append(node.value)
+                sub.extend(node.getValue(asList=True))
                 
             if node.children is not None:
                 clist = sorted(node.children.values(), key=lambda x:x.key)
@@ -147,7 +180,7 @@
         return node
 
 
-    def get(self, key):
+    def get(self, key, onlyFirst=True):
         """Return value under key from the tree.
         
         key can be sequence of key string or a single string using keySeparator.
@@ -156,7 +189,7 @@
         if node is None:
             return None
         
-        return node.value
+        return node.getValue(onlyFirst=onlyFirst)
 
      
     def add(self, key, value):
@@ -166,6 +199,7 @@
         """
         keys = self._splitkey(key)
         node = self.root
+        logging.debug("hashtree.add: keys=%s value=%s"%(repr(keys), repr(value)))
         for k in keys:
             nextnode = node.getNode(k)
             if nextnode is None:
@@ -174,7 +208,7 @@
             
             node = nextnode
             
-        node.value = value
+        node.setValue(value)
 
         
     def getChildrenOf(self, key):
@@ -186,7 +220,7 @@
             # sort children by key
             childlist = sorted(node.children.items(), key=lambda x:x[0])
             # and return the values
-            return [n.value for k, n in childlist if n.value is not None]
+            return [n.getValue() for k, n in childlist if n.value is not None]
 
 
     def getAncestorsOf(self, key):
--- a/MPIWGProjects.py	Wed Oct 30 17:44:42 2013 +0100
+++ b/MPIWGProjects.py	Tue Nov 05 13:58:45 2013 +0100
@@ -1881,6 +1881,7 @@
             tree = HashTree(keySeparator='.', keyFn=getInt)
             for p in self.objectValues(spec='MPIWGProject'):
                 # add all projects
+                logging.debug("add to project tree: %s, %s"%(repr(p.getNumber()),p))
                 tree.add(p.getNumber(), p)
                 
             self._v_projectTree = tree
@@ -1906,6 +1907,8 @@
             return []
 
         pl = node.getSubtreeAsList(depthFirst=depthFirst)
+        #logging.debug("getProjectsAsList: tree=%s"%node.getSubtreeAsText())
+        #logging.debug("getProjectsAsList: node=(%s,%s) pl=%s"%(node.key,node.value,repr(pl)))
         #logging.debug("getProjectsAsList: node=(%s,%s) pl=%s"%(node.key,node.value,[p.getNumber() for p in pl]))
         # return filtered list
         return [p for p in pl if (p.checkActive(active) and p.checkArchived(archived))]