[Erp5-report] r10963 - in /erp5/trunk/products: ERP5/tests/ ERP5Type/ ERP5Type/Accessor/

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Oct 26 14:58:58 CEST 2006


Author: alex
Date: Thu Oct 26 14:58:56 2006
New Revision: 10963

URL: http://svn.erp5.org?rev=10963&view=rev
Log:
When acquired content is set locally (when edited through a web form), make
sure all properties are copied...
Unit test explains it better.

Modified:
    erp5/trunk/products/ERP5/tests/testERP5HR.py
    erp5/trunk/products/ERP5Type/Accessor/AcquiredProperty.py
    erp5/trunk/products/ERP5Type/Accessor/ContentProperty.py
    erp5/trunk/products/ERP5Type/Base.py

Modified: erp5/trunk/products/ERP5/tests/testERP5HR.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testERP5HR.py?rev=10963&r1=10962&r2=10963&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testERP5HR.py (original)
+++ erp5/trunk/products/ERP5/tests/testERP5HR.py Thu Oct 26 14:58:56 2006
@@ -706,10 +706,35 @@
     person = sequence.get('person')
     organisation = sequence.get('organisation')
     self.assertEquals(organisation.getDefaultAddressCity(),'Lille')
+    self.assertEquals(organisation.getDefaultAddressZipCode(), '59000')
     self.assertEquals(person.getDefaultAddressCity(),'Lille')
-    person.setDefaultAddressCity('La Garnache')
+    self.assertEquals(person.getDefaultAddressZipCode(), '59000')
+
+    # here, the parameters we pass to edit are the same as the one acquired
+    # from the organisation, edit shouldn't do anything
+    person.edit(
+        default_address_city='Lille',
+        default_address_zip_code='59000')
+
+    self.assertEquals(person.getDefaultAddress(),
+        organisation.getDefaultAddress())
+    self.assertEquals(person.getDefaultAddressCity(),'Lille')
+    self.assertEquals(person.getDefaultAddressZipCode(), '59000')
+
+    # here, the first parameter we pass will trigger the creation of a
+    # subobject on person, and we need to make sure that the second one gets
+    # copied (when calling edit from the interface, all displayed fields are
+    # passed to edit)
+    person.edit(
+        default_address_city='La Garnache',
+        default_address_zip_code='59000')
+
+    self.assertNotEquals(person.getDefaultAddress(),
+        organisation.getDefaultAddress())
     self.assertEquals(person.getDefaultAddressCity(),'La Garnache')
+    self.assertEquals(person.getDefaultAddressZipCode(), '59000')
     self.assertEquals(organisation.getDefaultAddressCity(),'Lille')
+    self.assertEquals(organisation.getDefaultAddressZipCode(), '59000')
 
   ##################################
   ##  Tests

Modified: erp5/trunk/products/ERP5Type/Accessor/AcquiredProperty.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Accessor/AcquiredProperty.py?rev=10963&r1=10962&r2=10963&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Accessor/AcquiredProperty.py (original)
+++ erp5/trunk/products/ERP5Type/Accessor/AcquiredProperty.py Thu Oct 26 14:58:56 2006
@@ -156,7 +156,9 @@
       assertAttributePortalType(instance, self._storage_id, self._portal_type)
       o = instance._getOb(self._storage_id, None)
       if o is None:
-        o = instance.newContent(id = self._storage_id, portal_type = self._portal_type[0])
+        o = instance.newContent(id=self._storage_id,
+            portal_type=self._portal_type[0])
+        instance._v_accessor_created_object = 1
       if self._reindex:
         o.setProperty(self._acquired_property, value, *args, **kw)
       else:

Modified: erp5/trunk/products/ERP5Type/Accessor/ContentProperty.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Accessor/ContentProperty.py?rev=10963&r1=10962&r2=10963&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Accessor/ContentProperty.py (original)
+++ erp5/trunk/products/ERP5Type/Accessor/ContentProperty.py Thu Oct 26 14:58:56 2006
@@ -220,6 +220,7 @@
         assertAttributePortalType(instance, available_id, self._portal_type)
         o = instance.newContent(id=available_id,
                                 portal_type=self._portal_type[0])
+        instance._v_accessor_created_object = 1
         if self._reindex:
           o.setProperty(self._acquired_property, *args, **kw)
         else:

Modified: erp5/trunk/products/ERP5Type/Base.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Base.py?rev=10963&r1=10962&r2=10963&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Base.py (original)
+++ erp5/trunk/products/ERP5Type/Base.py Thu Oct 26 14:58:56 2006
@@ -1018,11 +1018,15 @@
 
       Each time attributes of an object are updated, they should
       be updated through this generic edit method
+
+      Modification date is supported by edit_workflow in ERP5
+      There is no need to change it here
     """
     self._v_modified_property_dict = {}
-    my_modified_property_list = []
-    for key in kw.keys():
-      if key != 'id':
+
+    def getModifiedPropertyList(self):
+      my_modified_property_list = []
+      for key in kw.keys():
         # We only change if the value is different
         # This may be very long...
         old_value = None
@@ -1032,7 +1036,6 @@
           except TypeError:
             old_value = self.getProperty(key)
 
-
         if old_value != kw[key] or force_update:
           # We keep in a thread var the previous values
           # this can be useful for interaction workflow to implement lookups
@@ -1040,12 +1043,26 @@
           # edit itself, this is useless as the dict will be overwritten
           self._v_modified_property_dict[key] = old_value
           my_modified_property_list.append(key)
-      elif self.id != kw['id']:
-        self.setId(kw['id'], reindex=reindex_object)
-    # Modification date is supported by edit_workflow in ERP5
-    # There is no need to change it here
-    for key in my_modified_property_list:
-      self._setProperty(key, kw[key])
+      return my_modified_property_list
+
+    my_modified_property_list = getModifiedPropertyList(self)
+
+    # When we get notified by an accessor that it created an object, recheck
+    # all properties
+    while 1:
+      self._v_accessor_created_object = 0
+      for key in my_modified_property_list:
+        if key != 'id':
+          self._setProperty(key, kw[key])
+        else:
+          self.setId(kw['id'], reindex=reindex_object)
+        if self._v_accessor_created_object == 1:
+          # refresh list of modified properties, and restart the process
+          my_modified_property_list = getModifiedPropertyList(self)
+          break
+      else:
+        break
+
     if reindex_object:
       # We do not want to reindex the object if nothing is changed
       if (self._v_modified_property_dict != {}):




More information about the Erp5-report mailing list