# HG changeset patch # User casties # Date 1383656325 -3600 # Node ID afc96bc56817032e2a271352d4251ce348d79dc2 # Parent a328c112e372a864eff4dacb4352c28c914e5408 also show multiple projects with the same number (including none) in the tree. diff -r a328c112e372 -r afc96bc56817 HashTree.py --- 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): diff -r a328c112e372 -r afc96bc56817 MPIWGProjects.py --- 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))]