[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:
@@ -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 },
|
||||
|
||||
@@ -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`,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user