diff src/tools/memory.py @ 395:79fe50fc8edc

memory: multiples params of the same category are now merged
author Goffi <goffi@goffi.org>
date Tue, 04 Oct 2011 23:22:13 +0200
parents 20f11097d99b
children cecd22241d56
line wrap: on
line diff
--- a/src/tools/memory.py	Mon Oct 03 18:05:15 2011 +0200
+++ b/src/tools/memory.py	Tue Oct 04 23:22:13 2011 +0200
@@ -276,20 +276,38 @@
         @return: minidom.Document of the profile xml (cf warning above)
         """
         prof_xml = minidom.parseString('<params/>')
-        
+        cache = {}
+
         for type_node in self.dom.documentElement.childNodes:
             if type_node.nodeName == 'general' or type_node.nodeName == 'individual':  #we use all params, general and individual
                 for cat_node in type_node.childNodes:
                     if cat_node.nodeName == 'category':
                         category = cat_node.getAttribute('name')
-                        cat_copy = cat_node.cloneNode(True) #we make a copy for the new xml
-                        params = cat_copy.getElementsByTagName("param")
+                        if not cache.has_key(category):
+                            cache[category] = dest_cat = cat_node.cloneNode(True) #we make a copy for the new xml
+                            new_node = True
+                        else:
+                            dest_cat = cache[category]
+                            new_node = False #It's not a new node, we will merge information
+                        params = cat_node.getElementsByTagName("param")
+                        dest_params = {}
+                        for node in dest_cat.childNodes:
+                            if node.nodeName != "param":
+                                continue
+                            dest_params[node.getAttribute('name')] = node
+
                         for param_node in params:
                             name = param_node.getAttribute('name')
+                            
+                            if name not in dest_params:
+                                dest_params[name] = param_node.cloneNode(True)
+                                dest_cat.appendChild(dest_params[name])
+
                             profile_value = self.__getParam(profile, category, name, type_node.nodeName)
                             if profile_value:  #there is a value for this profile, we must change the default
-                                param_node.setAttribute('value', profile_value)
-                        prof_xml.documentElement.appendChild(cat_copy)
+                                dest_params[name].setAttribute('value', profile_value)
+                        if new_node:
+                            prof_xml.documentElement.appendChild(dest_cat)
         return prof_xml