diff -r 5fc21bf2684f -r d4bd28d5fca8 server/sources/native.py --- a/server/sources/native.py Mon Jul 06 14:34:41 2015 +0200 +++ b/server/sources/native.py Mon Jul 27 10:51:29 2015 +0200 @@ -563,7 +563,16 @@ return results @contextmanager - def _storage_handler(self, entity, event): + def _fixup_cw(self, cnx, entity): + _cw = entity._cw + entity._cw = cnx + try: + yield + finally: + entity._cw = _cw + + @contextmanager + def _storage_handler(self, cnx, entity, event): # 1/ memorize values as they are before the storage is called. # For instance, the BFSStorage will replace the `data` # binary value with a Binary containing the destination path @@ -578,14 +587,15 @@ etype = entities[0].__regid__ for attr, storage in self._storages.get(etype, {}).items(): for entity in entities: - if event == 'deleted': - storage.entity_deleted(entity, attr) - else: - edited = entity.cw_edited - if attr in edited: - handler = getattr(storage, 'entity_%s' % event) - to_restore = handler(entity, attr) - restore_values.append((entity, attr, to_restore)) + with self._fixup_cw(cnx, entity): + if event == 'deleted': + storage.entity_deleted(entity, attr) + else: + edited = entity.cw_edited + if attr in edited: + handler = getattr(storage, 'entity_%s' % event) + to_restore = handler(entity, attr) + restore_values.append((entity, attr, to_restore)) try: yield # 2/ execute the source's instructions finally: @@ -595,7 +605,7 @@ def add_entity(self, cnx, entity): """add a new entity to the source""" - with self._storage_handler(entity, 'added'): + with self._storage_handler(cnx, entity, 'added'): attrs = self.preprocess_entity(entity) sql = self.sqlgen.insert(SQL_PREFIX + entity.cw_etype, attrs) self.doexec(cnx, sql, attrs) @@ -605,7 +615,7 @@ def update_entity(self, cnx, entity): """replace an entity in the source""" - with self._storage_handler(entity, 'updated'): + with self._storage_handler(cnx, entity, 'updated'): attrs = self.preprocess_entity(entity) if cnx.ertype_supports_undo(entity.cw_etype): changes = self._save_attrs(cnx, entity, attrs) @@ -618,7 +628,7 @@ def delete_entity(self, cnx, entity): """delete an entity from the source""" - with self._storage_handler(entity, 'deleted'): + with self._storage_handler(cnx, entity, 'deleted'): if cnx.ertype_supports_undo(entity.cw_etype): attrs = [SQL_PREFIX + r.type for r in entity.e_schema.subject_relations()