From 8aba4cd406709453ea4c63b8087a240de6ce00b2 Mon Sep 17 00:00:00 2001 From: Aaron Bohy Date: Tue, 19 Nov 2019 12:21:32 +0000 Subject: [FIX] web: handle m2o whose comodel name field is an m2o This is a weird situation, but the python handles it. Let's assume a many2one field F1 on model M1 with comodel M2, and on M2 the name field (which is the _rec_name) being itself a many2one, and the following scenario: - create a new record for M1 - for field F1, select 'Create and Edit': it opens a form view for M2 in a dialog - type something in F2 input, and click 'Quick create' - save the dialog Before this rev., the value of F1 was [object Object]. Now, the new value is properly displayed. OPW 2091106 closes odoo/odoo#40549 X-original-commit: 5a04ea848abf50b1fb1f9893d1fcd98013bc025d Signed-off-by: Aaron Bohy (aab) --- addons/web/static/src/js/fields/field_utils.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'addons/web/static/src') diff --git a/addons/web/static/src/js/fields/field_utils.js b/addons/web/static/src/js/fields/field_utils.js index f653ded7181..f8546f90e55 100644 --- a/addons/web/static/src/js/fields/field_utils.js +++ b/addons/web/static/src/js/fields/field_utils.js @@ -252,7 +252,7 @@ function formatInteger(value, field, options) { * return an empty string. Note that it accepts two types of input parameters: * an array, in that case we assume that the many2one value is of the form * [id, nameget], and we return the nameget, or it can be an object, and in that - * case, we assume that it is a record from a BasicModel. + * case, we assume that it is a record datapoint from a BasicModel. * * @param {Array|Object|false} value * @param {Object} [field] @@ -262,7 +262,18 @@ function formatInteger(value, field, options) { * @returns {string} */ function formatMany2one(value, field, options) { - value = value && (_.isArray(value) ? value[1] : value.data.display_name) || ''; + if (!value) { + value = ''; + } else if (_.isArray(value)) { + // value is a pair [id, nameget] + value = value[1]; + } else { + // value is a datapoint, so we read its display_name field, which + // may in turn be a datapoint (if the name field is a many2one) + while (value.data) { + value = value.data.display_name || ''; + } + } if (options && options.escape) { value = _.escape(value); } -- cgit v1.2.3