From 2b7670e6d709cd311c630c99cb9da7d3d6ae90f4 Mon Sep 17 00:00:00 2001 From: Aaron Bohy Date: Thu, 26 Nov 2020 11:16:53 +0000 Subject: [FIX] web: BasicModel: nested x2many and unknown fields MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Consider the following situation: - have a form view with an x2many field displayed as a list - the x2many field has a form view that contains an x2many field, which isn't in the list - for that x2many field, we can also open a form view to see/edit the related records. As the x2many field isn't in the list, when we open a subrecord, we modify the fieldsInfo to add the information about the x2many field we didn't know before. Doing so automatically applies raw changes that we might have stored earlier (from onchanges) for that field, because we couldn't apply them before knowing the type of that field. Before this commit, the function that applies the raw changes was called recursively on the dataPoint and all its children (thus on the x2many list datapoint), which produced a crash as this function is designed to work on dataPoints of type record. Actually, calling it on sub datapoints is useless, as it properly works recursively, and applies raw changes on x2many fields itself when necessary. This commit ensures that we don't call this function on list datapoints anymore. Closes #62334 OPW 2389991 closes odoo/odoo#62399 Signed-off-by: Géry Debongnie (ged) --- addons/web/static/src/js/views/basic/basic_model.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'addons/web/static/src/js/views/basic') 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 649dd3bb1c6..4a3a1930cb1 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -231,7 +231,7 @@ var BasicModel = AbstractModel.extend({ * @returns {Promise} resolved when the fieldInfo have been set on the given * datapoint and all its children, and all rawChanges have been applied */ - addFieldsInfo: function (dataPointID, viewInfo) { + addFieldsInfo: async function (dataPointID, viewInfo) { var dataPoint = this.localData[dataPointID]; dataPoint.fields = _.extend({}, dataPoint.fields, viewInfo.fields); // complete the given fieldInfo with the fields of the main view, so @@ -245,7 +245,9 @@ var BasicModel = AbstractModel.extend({ // so we might have stored changes for them (e.g. coming from onchange // RPCs), that we haven't been able to process earlier (because those // fields were unknown at that time). So we now try to process them. - return this.applyRawChanges(dataPointID, viewInfo.viewType).then(() => { + if (dataPoint.type === 'record') { + await this.applyRawChanges(dataPointID, viewInfo.viewType); + } const proms = []; const fieldInfo = dataPoint.fieldsInfo[viewInfo.viewType]; // recursively apply the new field info on sub datapoints @@ -278,8 +280,6 @@ var BasicModel = AbstractModel.extend({ }); } return Promise.all(proms); - }); - }, /** * Onchange RPCs may return values for fields that are not in the current -- cgit v1.2.3