[REF] web: view service: do not nest related fields

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 <ged@odoo.com>
This commit is contained in:
Aaron Bohy
2022-05-02 19:47:07 +02:00
parent 65d2fa48b7
commit 7210d3f39b
3 changed files with 15 additions and 13 deletions
@@ -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 },
+12 -1
View File
@@ -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`,
+2 -12
View File
@@ -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) {