From 8bcb17b67415e4e28fbb1fc6b5feae767f0b8b1e Mon Sep 17 00:00:00 2001 From: Priyanka Kakadiya Date: Wed, 10 Apr 2019 09:44:41 +0000 Subject: [FIX] web: grouped Kanban: traceback on click during reload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Have a grouped Kanban view with an x2many field. Interact with the searchview, and then click anywhere. The fetch of the x2many relational data is batched for the whole view a single RPC for all groups) since e10fd346. If the click occurs before all search_read are done (i.e. before the fetch of relational data is started), there is a crash. This is due to a call to get({raw: true}) to obtain the current model's state, which is currently being reloaded and in an intermediate state. Ideally, this shouldn't happen, but with the sync API of get, we can't change that easily. So at most, we can ensure that it doesn't crash. Moreover, sensitive functions requesting the state for the data can do that in the mutex to ensure that the state isn't currently being reloaded. Related to Issue: 1937149 closes odoo/odoo#32587 Signed-off-by: Géry Debongnie (ged) Co-authored-by: Mohammed Shekha Co-authored-by: Aaron Bohy --- addons/web/static/src/js/views/basic/basic_model.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'addons/web/static/src') diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js index 0314eed5a2f..95003e2226f 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -563,9 +563,16 @@ var BasicModel = AbstractModel.extend({ } } else if (field.type === 'one2many' || field.type === 'many2many') { if (options.raw) { - relDataPoint = this.localData[data[fieldName]]; - relDataPoint = this._applyX2ManyOperations(relDataPoint); - data[fieldName] = relDataPoint.res_ids; + if (typeof data[fieldName] === 'string') { + relDataPoint = this.localData[data[fieldName]]; + relDataPoint = this._applyX2ManyOperations(relDataPoint); + data[fieldName] = relDataPoint.res_ids; + } else { + // no datapoint has been created yet (because the loading of relational + // data has been batched, and hasn't started yet), so the value is still + // the list of ids in the relation + data[fieldName] = data[fieldName] || []; + } } else { data[fieldName] = this.get(data[fieldName]) || []; } -- cgit v1.2.3