From e55c11eedd4bad81c29675a1c036126957b965de Mon Sep 17 00:00:00 2001 From: Yoshinori Okuji <yo@nexedi.com> Date: Mon, 13 Oct 2008 19:04:40 +0000 Subject: [PATCH] _setProperty must return modified objects from a setter. _edit must take this into account, otherwise content property setters do not reindex correct objects. git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@24163 20353a03-c40f-0410-a6d1-a30d3c3de9de --- product/ERP5Type/Base.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/product/ERP5Type/Base.py b/product/ERP5Type/Base.py index e3a380a8a5..c90b39d406 100644 --- a/product/ERP5Type/Base.py +++ b/product/ERP5Type/Base.py @@ -1405,13 +1405,11 @@ class Base( CopyContainer, # rather than through implicit aquisition if getattr(aq_self, accessor_name, None) is not None: method = getattr(self, accessor_name) - method(value, **kw) - return + return method(value, **kw) public_accessor_name = 'set' + UpperCase(key) if getattr(aq_self, public_accessor_name, None) is not None: method = getattr(self, public_accessor_name) - method(value, **kw) - return + return method(value, **kw) # Try to get a portal_type property (Implementation Dependent) aq_key = self._aq_key() if not Base.aq_portal_type.has_key(aq_key): @@ -1419,12 +1417,10 @@ class Base( CopyContainer, if getattr(Base.aq_portal_type[aq_key], accessor_name, None) is not None: method = getattr(self, accessor_name) # LOG("Base.py", 0, "method = %s, name = %s" %(method, accessor_name)) - method(value, **kw) - return + return method(value, **kw) if getattr(Base.aq_portal_type[aq_key], public_accessor_name, None) is not None: method = getattr(self, public_accessor_name) - method(value, **kw) - return + return method(value, **kw) # Finaly use standard PropertyManager #LOG("Changing attr: ",0, key) # If we are here, this means we do not use a property that @@ -1440,6 +1436,7 @@ class Base( CopyContainer, #except: # # This should be removed if we want strict property checking # setattr(self, key, value) + return (self,) def _setPropValue(self, key, value, **kw): self._wrapperCheck(value) @@ -1562,6 +1559,7 @@ class Base( CopyContainer, hasProperty is False will be updated. """ modified_property_dict = self._v_modified_property_dict = {} + modified_object_set = set() key_list = kw.keys() unordered_key_list = [k for k in key_list if k not in edit_order] @@ -1609,7 +1607,12 @@ class Base( CopyContainer, guarded_getattr(self, accessor_name) modified_property_dict[key] = old_value if key != 'id': - self._setProperty(key, kw[key]) + modified_object_list = self._setProperty(key, kw[key]) + # BBB: if the setter does not return anything, assume + # that self has been modified. + if modified_object_list is None: + modified_object_list = (self,) + modified_object_set.update(modified_object_list) else: self.setId(kw['id'], reindex=reindex_object) else: @@ -1622,9 +1625,8 @@ class Base( CopyContainer, setChangedPropertyList(ordered_key_list) if reindex_object: - # We do not want to reindex the object if nothing is changed - if (modified_property_dict != {}): - self.reindexObject(activate_kw=activate_kw) + for o in modified_object_set: + o.reindexObject(activate_kw=activate_kw) security.declareProtected( Permissions.ModifyPortalContent, 'setId' ) def setId(self, id, reindex = 1): -- 2.30.9