From 7210d3f39b4f5eecd427ebb82ecf21f8ff6bede8 Mon Sep 17 00:00:00 2001 From: Aaron Bohy Date: Mon, 2 May 2022 06:39:55 +0000 Subject: [PATCH] [REF] web: view service: do not nest related fields MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A call to get_views returns an object with a "models" key, which is a mapping from model names to their fields_get. There is an entry for the main model, and an entry for each model for which there's an inline x2many view inside the form view. Before this commit, this was processed in the view service, s.t. we generated a "fields" object and we added a "relatedFields" key for x2manys fields, pointing to the fields_get of the related model. This can create a structure with cycles, which can lead to problems e.g. if we try to stringify it. This commit prevents this by no longer nesting the related fields, but rather keeping them in another structure. closes odoo/odoo#90271 Signed-off-by: Géry Debongnie --- .../src/views/helpers/standard_view_props.js | 1 + addons/web/static/src/views/view.js | 13 ++++++++++++- addons/web/static/src/views/view_service.js | 14 ++------------ 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/addons/web/static/src/views/helpers/standard_view_props.js b/addons/web/static/src/views/helpers/standard_view_props.js index 59f2c38f2f6..56a1b9abe32 100644 --- a/addons/web/static/src/views/helpers/standard_view_props.js +++ b/addons/web/static/src/views/helpers/standard_view_props.js @@ -24,6 +24,7 @@ export const standardViewProps = { context: { type: Object }, domain: { type: Array }, fields: { type: Object, elements: Object }, + relatedModels: { type: Object, elements: Object, optional: 1 }, groupBy: { type: Array, elements: String }, limit: { type: Number, optional: 1 }, orderBy: { type: Array, elements: String }, diff --git a/addons/web/static/src/views/view.js b/addons/web/static/src/views/view.js index f860389e43f..7f85bd9fc4a 100644 --- a/addons/web/static/src/views/view.js +++ b/addons/web/static/src/views/view.js @@ -95,6 +95,7 @@ const STANDARD_PROPS = [ "arch", "fields", + "relatedModels", "viewId", "actionMenus", "loadActionMenus", @@ -188,7 +189,15 @@ export class View extends Component { // prepare view description const { context, resModel, loadActionMenus, loadIrFilters } = this.props; - let { arch, fields, searchViewArch, searchViewFields, irFilters, actionMenus } = this.props; + let { + arch, + fields, + relatedModels, + searchViewArch, + searchViewFields, + irFilters, + actionMenus, + } = this.props; let loadView = !arch || (!actionMenus && loadActionMenus); let loadSearchView = @@ -220,6 +229,7 @@ export class View extends Component { } this.env.config.views = views; fields = fields || result.fields; + relatedModels = relatedModels || result.relatedModels; } if (!arch) { @@ -255,6 +265,7 @@ export class View extends Component { info: { actionMenus, mode: this.props.display.mode }, arch, fields, + relatedModels, resModel, useSampleModel: false, className: `${this.props.className} o_view_controller o_${this.env.config.viewType}_view`, diff --git a/addons/web/static/src/views/view_service.js b/addons/web/static/src/views/view_service.js index b25e26bb7f5..3f02d05dafa 100644 --- a/addons/web/static/src/views/view_service.js +++ b/addons/web/static/src/views/view_service.js @@ -81,20 +81,10 @@ export const viewService = { .then((result) => { const { models, views } = result; const modelsCopy = deepCopy(models); // for legacy views - const fields = models[resModel]; - // add relatedFields for relational fields in view - function setRelatedFields(fields, models) { - for (const field of Object.values(fields)) { - if (field.relation && !field.relatedFields) { - field.relatedFields = models[field.relation] || {}; - setRelatedFields(field.relatedFields, models); - } - } - } - setRelatedFields(models[resModel], models); const viewDescriptions = { __legacy__: generateLegacyLoadViewsResult(resModel, views, modelsCopy), - fields, + fields: models[resModel], + relatedModels: models, views: {}, }; for (const viewType in views) {