[FIX] disgusting hack to skip around race condition

When clicking on an action button, form view first saves then executes
the action. In doing so, it causes the o2m field to call
ListView#reload_content twice without waiting for the reloading to
end, generating a race condition in ListView.List#render_dataset.

As a result, the read_slice callback fills the list twice (once for
each #reload_content call), resulting in everything being duplicated.

Clear the content of the records collection before adding stuff.

note: collections should dedup on ids.

lp bug: https://launchpad.net/bugs/877965 fixed

bzr revid: xmo@openerp.com-20111025085112-q38q8m0k2mopwadg
This commit is contained in:
Xavier Morel 2011-10-25 10:51:12 +02:00
parent c68d851407
commit b6a0874f4c
1 changed files with 9 additions and 2 deletions

View File

@ -1206,6 +1206,10 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L
var options = { offset: page * limit, limit: limit };
//TODO xmo: investigate why we need to put the setTimeout
setTimeout(function() {dataset.read_slice(fields, options , function (records) {
// FIXME: ignominious hacks, parents (aka form view) should not send two ListView#reload_content concurrently
if (self.records.length) {
self.records.reset(null, {silent: true});
}
if (!self.datagroup.openable) {
view.configure_pager(dataset);
} else {
@ -1546,7 +1550,8 @@ var Collection = openerp.web.Class.extend(/** @lends Collection# */{
* @param {Array} [records]
* @returns this
*/
reset: function (records) {
reset: function (records, options) {
options = options || {};
_(this._proxies).each(function (proxy) {
proxy.reset();
});
@ -1557,7 +1562,9 @@ var Collection = openerp.web.Class.extend(/** @lends Collection# */{
if (records) {
this.add(records);
}
this.trigger('reset', this);
if (!options.silent) {
this.trigger('reset', this);
}
return this;
},
/**