[FIX] web: usable *_activity widget in many2many subview

Example of steps:
	- Install `web_studio`
	- add a `many2many` field from res.partner
	- create a record
	- add a line by selecting a partner

In this case `_parseServerValue` will crash

https://github.com/odoo/odoo/blob/29d55e44035b6e6c6aba6fa4a114d555a766b7c7/addons/web/static/src/legacy/js/views/abstract_model.js#L101-L111

Because `field.selection` is undefined
this code is getting field from this line

https://github.com/odoo/odoo/blob/d3ef5891e8e92636dd61b8f2b7186ad139e8b42a/addons/mail/static/src/web/fields/kanban_activity/kanban_activity.js#L14
Instead of specifying `selection: []` in the fieldDependencies
this pr fixes this issue generally and prevents these kind
of fixes https://github.com/odoo/odoo/pull/125052

opw-3671417

closes odoo/odoo#150445

X-original-commit: 139e107a58ff4be4f03a57df07806355cb7d6236
Signed-off-by: Lucas Perais (lpe) <lpe@odoo.com>
This commit is contained in:
Achraf
2024-01-23 07:07:53 +00:00
committed by Lucas Perais
parent 32c6377563
commit c096cccb4d
2 changed files with 59 additions and 1 deletions
@@ -65,13 +65,17 @@ export function addFieldDependencies(activeFields, fields, fieldDependencies = [
activeFields[field.name] = makeActiveField(field);
}
if (!fields[field.name]) {
fields[field.name] = omit(field, [
const newField = omit(field, [
"context",
"invisible",
"required",
"readonly",
"onChange",
]);
fields[field.name] = newField;
if (newField.type === "selection" && !Array.isArray(newField.selection)) {
newField.selection = [];
}
}
}
}
@@ -765,6 +765,60 @@ QUnit.module("Views", (hooks) => {
assert.containsOnce(target, ".modal .o_form_view .o_field_widget[name=p]");
});
QUnit.test(
"form with o2m having a selection field with fieldDependencies",
async function (assert) {
class MyField extends CharField {}
fieldRegistry.add("my_widget", {
component: MyField,
fieldDependencies: [{ name: "selection", type: "selection" }],
});
serverData.models.partner.fields.o2m = { type: "one2many", relation: "partner_type" };
serverData.models.partner.records[1].o2m = [];
serverData.views = {
"partner_type,false,form": `<form><field name="display_name" /></form>`,
};
serverData.models.partner_type.fields.selection = {
type: "selection",
selection: [
["a", "A"],
["b", "B"],
],
};
serverData.models.partner_type.records = [
{
id: 1,
display_name: "first partner_type",
selection: false,
},
];
serverData.models.partner.records[1].o2m = [1];
await makeView({
type: "form",
resModel: "partner",
serverData,
arch: `
<form>
<field name="o2m">
<tree>
<field name="display_name" widget="my_widget"/>
</tree>
</field>
</form>`,
resId: 2,
});
assert.containsOnce(target, ".o_field_widget[name=o2m] .o_data_row");
await click(
target.querySelector(".o_field_widget[name=o2m] .o_field_x2many_list_row_add a")
);
assert.containsOnce(target, ".modal .o_form_view .o_field_widget[name=display_name]");
}
);
QUnit.test("fieldDependencies are readonly by default", async function (assert) {
class MyField extends CharField {}
fieldRegistry.add("my_widget", {