[Checkins] SVN: Products.GenericSetup/trunk/Products/GenericSetup/ Merge r88103 from 1.4 branch

Wichert Akkerman wichert at wiggy.net
Tue Jul 8 06:59:09 EDT 2008


Log message for revision 88104:
  Merge r88103 from 1.4 branch

Changed:
  U   Products.GenericSetup/trunk/Products/GenericSetup/CHANGES.txt
  U   Products.GenericSetup/trunk/Products/GenericSetup/tests/test_utils.py
  U   Products.GenericSetup/trunk/Products/GenericSetup/utils.py

-=-
Modified: Products.GenericSetup/trunk/Products/GenericSetup/CHANGES.txt
===================================================================
--- Products.GenericSetup/trunk/Products/GenericSetup/CHANGES.txt	2008-07-08 10:56:06 UTC (rev 88103)
+++ Products.GenericSetup/trunk/Products/GenericSetup/CHANGES.txt	2008-07-08 10:59:08 UTC (rev 88104)
@@ -4,6 +4,11 @@
 GenericSetup 1.5.0 (unreleased)
 -------------------------------
 
+- Update PropertyManagerHelpers to make it possible to remove elements from a
+  property by adding a remove="True" attribute to the element. This can
+  also be used to reorder elements since new elements are always added
+  at the end of the list.
+
 - Made PropertyManagerHelpers class work for non-PropertyManager objects
 
   o Derived classes can supply a '_PROPERTIES' scehma, which is then used

Modified: Products.GenericSetup/trunk/Products/GenericSetup/tests/test_utils.py
===================================================================
--- Products.GenericSetup/trunk/Products/GenericSetup/tests/test_utils.py	2008-07-08 10:56:06 UTC (rev 88103)
+++ Products.GenericSetup/trunk/Products/GenericSetup/tests/test_utils.py	2008-07-08 10:59:08 UTC (rev 88104)
@@ -143,6 +143,15 @@
  </property>
 </dummy>
 """
+_REMOVE_ELEMENT_IMPORT = """\
+<?xml version="1.0"?>
+<dummy>
+ <property name="lines1" purge="False">
+   <element value="Foo" remove="True" />
+   <element value="Bar" />
+  </property>
+</dummy>
+"""
 
 _NORMAL_MARKER_EXPORT = """\
 <?xml version="1.0"?>
@@ -430,7 +439,16 @@
         self.assertEquals(obj.getProperty('lines2'), ('Foo', 'Bar'))
         self.assertEquals(obj.getProperty('lines3'), ('Gee', 'Foo', 'Bar'))
 
+    def test_initProperties_remove_elements(self):
+        node = parseString(_REMOVE_ELEMENT_IMPORT).documentElement
+        self.helpers.environ._should_purge = False # extension profile
+        obj = self.helpers.context
+        obj._properties = ()
+        obj.manage_addProperty('lines1', ('Foo', 'Gee'), 'lines')
+        self.helpers._initProperties(node)
 
+        self.assertEquals(obj.lines1, ('Gee', 'Bar'))
+
 class PropertyManagerHelpersNonPMContextTests(PropertyManagerHelpersTests):
 
     def _makeOne(self, context=None, environ=None):
@@ -513,6 +531,7 @@
         obj.foo_float_nodel = 3.1415
         obj.foo_boolean_nodel = True
 
+
 class MarkerInterfaceHelpersTests(unittest.TestCase):
 
     def _getTargetClass(self):

Modified: Products.GenericSetup/trunk/Products/GenericSetup/utils.py
===================================================================
--- Products.GenericSetup/trunk/Products/GenericSetup/utils.py	2008-07-08 10:56:06 UTC (rev 88103)
+++ Products.GenericSetup/trunk/Products/GenericSetup/utils.py	2008-07-08 10:59:08 UTC (rev 88104)
@@ -758,14 +758,23 @@
             if not 'w' in prop_map.get('mode', 'wd'):
                 raise BadRequest('%s cannot be changed' % prop_id)
 
-            elements = []
+            new_elements = []
+            remove_elements = []
             for sub in child.childNodes:
                 if sub.nodeName == 'element':
-                    value = sub.getAttribute('value')
-                    elements.append(value.encode(self._encoding))
+                    value = sub.getAttribute('value').encode(self._encoding)
+                    if self._convertToBoolean(sub.getAttribute('remove')
+                                          or 'False'):
+                        remove_elements.append(value)
+                        if value in new_elements:
+                            new_elements.remove(value)
+                    else:
+                        new_elements.append(value)
+                        if value in remove_elements:
+                            remove_elements.remove(value)
 
-            if elements or prop_map.get('type') == 'multiple selection':
-                prop_value = tuple(elements) or ()
+            if new_elements or prop_map.get('type') == 'multiple selection':
+                prop_value = tuple(new_elements) or ()
             elif prop_map.get('type') == 'boolean':
                 prop_value = self._convertToBoolean(self._getNodeText(child))
             else:
@@ -779,7 +788,8 @@
                 prop = obj.getProperty(prop_id)
                 if isinstance(prop, (tuple, list)):
                     prop_value = (tuple([p for p in prop
-                                         if p not in prop_value]) +
+                                         if p not in prop_value and 
+                                            p not in remove_elements]) +
                                   tuple(prop_value))
 
             obj._updateProperty(prop_id, prop_value)



More information about the Checkins mailing list