From 4212f84da83257419d6d98038220ce1dc322fb04 Mon Sep 17 00:00:00 2001 From: Nicolas Lempereur Date: Wed, 20 Jan 2021 12:19:03 +0000 Subject: [FIX] web: nested x2many with no widget and onchanges MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Let's assume the following situation: in a form view, there is a one2many field A displayed as a list (non editable). In the list, there is another one2many field B displayed with no widget (it basically displays "X records"). In A's form view, B is also displayed, but this time as a list. There is an onchange on the main form view that adds a line in A, (and simply sets B to [[5]], i.e. 'No record'). Before this commit, if the user opened the newly added sub record in A, and clicked on 'Add a line' of B, it crashed. The cause of the crash was that the wrong viewType was used to create the new (default) record in B: it used the original viewType, which was undefined (B is displayed with no widget in A's list). With this commit, we use the viewType of B that is used to edit it, in this case 'list'. In the slighlty different scenario where B is displayed with widget many2many_tags in A's list, there were no crash, but wrong fieldNames were sent to the 'default_get' RPC. As a consequence, default values for fields in B's list were potentially not loaded. opw-2422806 closes #64793 closes odoo/odoo#65157 Signed-off-by: Géry Debongnie (ged) Signed-off-by: Aaron Bohy (aab) Co-authored-by: Aaron Bohy --- addons/web/static/src/js/views/basic/basic_model.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'addons/web/static/src/js/views/basic/basic_model.js') 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 ca21cb6824d..d4d640d2739 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -1431,7 +1431,7 @@ var BasicModel = AbstractModel.extend({ fieldsInfo: list.fieldsInfo, parentID: list.id, position: position, - viewType: list.viewType, + viewType: options.viewType || list.viewType, allowWarning: options && options.allowWarning }; @@ -2003,6 +2003,7 @@ var BasicModel = AbstractModel.extend({ context: command.context, position: command.position }, options || {}); + createOptions.viewType = fieldInfo.mode; def = this._addX2ManyDefaultRecord(list, createOptions).then(function (ids) { _.each(ids, function(id){ @@ -4029,7 +4030,7 @@ var BasicModel = AbstractModel.extend({ // Hence preventing their value to crash when getting back to the originating view var parentRecord = params.parentID && this.localData[params.parentID].type === 'list' ? this.localData[params.parentID] : null; - if (parentRecord) { + if (parentRecord && parentRecord.viewType in parentRecord.fieldsInfo) { var originView = parentRecord.viewType; fieldNames = _.union(fieldNames, Object.keys(parentRecord.fieldsInfo[originView])); fieldsInfo[targetView] = _.defaults({}, fieldsInfo[targetView], parentRecord.fieldsInfo[originView]); -- cgit v1.2.3