From da187a638e415ee344fc33e4cf2a0c7d9ddcdfe8 Mon Sep 17 00:00:00 2001
From: Alexandre Boeglin <alex@nexedi.com>
Date: Fri, 29 Feb 2008 16:06:59 +0000
Subject: [PATCH] * add edit_order parameter and logic to _edit() (see
 changelog of r19605) * _v_accessor_created_object is no longer useful

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@19606 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5Type/Accessor/AcquiredProperty.py |  1 -
 product/ERP5Type/Accessor/ContentProperty.py  |  1 -
 product/ERP5Type/Base.py                      | 70 ++++++++-----------
 3 files changed, 29 insertions(+), 43 deletions(-)

diff --git a/product/ERP5Type/Accessor/AcquiredProperty.py b/product/ERP5Type/Accessor/AcquiredProperty.py
index d22d3728b2..61e1b0ba07 100644
--- a/product/ERP5Type/Accessor/AcquiredProperty.py
+++ b/product/ERP5Type/Accessor/AcquiredProperty.py
@@ -161,7 +161,6 @@ class Setter(Method):
       if o is None:
         o = instance.newContent(id=self._storage_id,
             portal_type=self._portal_type[0])
-        instance._v_accessor_created_object = 1
       if self._reindex:
         warnings.warn("The reindexing accessors are deprecated.\n"
                       "Please use Alias.Reindex instead.",
diff --git a/product/ERP5Type/Accessor/ContentProperty.py b/product/ERP5Type/Accessor/ContentProperty.py
index d768dbcc34..4a08a9b952 100644
--- a/product/ERP5Type/Accessor/ContentProperty.py
+++ b/product/ERP5Type/Accessor/ContentProperty.py
@@ -227,7 +227,6 @@ class Setter(Method):
         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:
           warnings.warn("The reindexing accessors are deprecated.\n"
                         "Please use Alias.Reindex instead.",
diff --git a/product/ERP5Type/Base.py b/product/ERP5Type/Base.py
index 5a141b5fad..4d110fbd3f 100644
--- a/product/ERP5Type/Base.py
+++ b/product/ERP5Type/Base.py
@@ -1465,7 +1465,7 @@ class Base( CopyContainer,
   # Object attributes update method
   security.declarePrivate( '_edit' )
   def _edit(self, REQUEST=None, force_update=0, reindex_object=0, 
-            keep_existing=0, activate_kw=None, **kw):
+            keep_existing=0, activate_kw=None, edit_order=[], **kw):
     """
       Generic edit Method for all ERP5 object
       The purpose of this method is to update attributed, eventually do
@@ -1483,46 +1483,34 @@ class Base( CopyContainer,
     """
     modified_property_dict = self._v_modified_property_dict = {}
 
-    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
-        if not force_update:
-          try:
-            old_value = self.getProperty(key, evaluate=0)
-          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
-          # XXX If iteraction workflow script is triggered by edit and calls
-          # edit itself, this is useless as the dict will be overwritten
-          # If the keep_existing flag is set to 1, we do not update properties which are defined
-          if not keep_existing or not self.hasProperty(key):
-            modified_property_dict[key] = old_value
-            my_modified_property_list.append(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
+    key_list = kw.keys()
+    ordered_key_list = [k for k in key_list if k not in edit_order]
+    for k in edit_order:
+      if k in key_list:
+        ordered_key_list.append(k)
+
+    for key in ordered_key_list:
+      # We only change if the value is different
+      # This may be very long...
+      old_value = None
+      if not force_update:
+        try:
+          old_value = self.getProperty(key, evaluate=0)
+        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
+        # XXX If iteraction workflow script is triggered by edit and calls
+        # edit itself, this is useless as the dict will be overwritten
+        # If the keep_existing flag is set to 1, we do not update properties which are defined
+        if not keep_existing or not self.hasProperty(key):
+          modified_property_dict[key] = old_value
+          if key != 'id':
+            self._setProperty(key, kw[key])
+          else:
+            self.setId(kw['id'], reindex=reindex_object)
 
     if reindex_object:
       # We do not want to reindex the object if nothing is changed
-- 
2.30.9