[FIX] web: create a Record in a ListView with a context

Before this commit, in a ListView, the view context was not used when
creating a record.

This caused some problems:
- the record does not use "default_" to initialise its data
- server-side required fields that are not present in the arch and
 have a value given in the context return server errors

closes odoo/odoo#97165

Signed-off-by: Aaron Bohy (aab) <aab@odoo.com>
This commit is contained in:
FrancoisGe
2022-08-01 10:55:56 +02:00
parent 63d44ffd35
commit 11d79784f6
2 changed files with 89 additions and 0 deletions
@@ -1759,6 +1759,10 @@ export class DynamicRecordList extends DynamicList {
parentActiveFields: this.activeFields,
onRecordWillSwitchMode: this.onRecordWillSwitchMode,
defaultContext: this.defaultContext,
rawContext: {
parent: this.rawContext,
make: () => this.context,
},
...params,
});
if (this.model.useSampleModel) {
@@ -14343,4 +14343,89 @@ QUnit.module("Views", (hooks) => {
assert.strictEqual(target.querySelector(".o_data_row [name=int_field]").innerText, value);
assert.verifySteps(["create", "read"]);
});
QUnit.test("create a record with the correct context", async (assert) => {
serverData.models.foo.fields.text.required = true;
serverData.models.foo.records = [];
await makeView({
resModel: "foo",
type: "list",
arch: ` <list editable="bottom">
<field name="display_name"/>
<field name="text"/>
</list>`,
serverData,
mockRPC(route, args) {
if (args.method === "create") {
assert.step("create");
const { context } = args.kwargs;
assert.strictEqual(context.default_text, "yop");
assert.strictEqual(context.test, true);
}
},
context: {
default_text: "yop",
test: true,
},
});
await click(target.querySelector(".o_list_button_add"));
await editInput(target, "[name='display_name'] input", "blop");
assert.containsOnce(target, ".o_selected_row");
await click(target, ".o_list_view");
assert.containsNone(target, ".o_selected_row");
assert.deepEqual(
[...target.querySelectorAll(".o_data_row .o_data_cell")].map((el) => el.textContent)[
("blop", "yop")
]
);
assert.verifySteps(["create"]);
});
QUnit.test("create a record with the correct context in a group", async (assert) => {
serverData.models.foo.fields.text.required = true;
await makeView({
resModel: "foo",
type: "list",
arch: ` <list editable="bottom">
<field name="display_name"/>
<field name="text"/>
</list>`,
groupBy: ["bar"],
serverData,
mockRPC(route, args) {
if (args.method === "create") {
assert.step("create");
const { context } = args.kwargs;
assert.strictEqual(context.default_bar, true);
assert.strictEqual(context.default_text, "yop");
assert.strictEqual(context.test, true);
}
},
context: {
default_text: "yop",
test: true,
},
});
await click(target.querySelectorAll(".o_group_name")[1]);
await click(target.querySelector(".o_group_field_row_add a"));
await editInput(target, "[name='display_name'] input", "blop");
assert.containsOnce(target, ".o_selected_row");
await click(target, ".o_list_view");
assert.containsNone(target, ".o_selected_row");
assert.deepEqual(
[...target.querySelectorAll(".o_data_row .o_data_cell")].map((el) => el.textContent)[
("blop", "yop")
]
);
assert.verifySteps(["create"]);
});
});