[FIX] web : allow setting iso format date as default

Steps to reproduce:
	1- Install Sales module
	2- Activate developer mode
	3- Navigate to any storable product
	4- Click on 'Replenish'
	5- Click on 'developer bug' and Choose 'Set Defaults'
	6- Choose 'Scheduled Date' from the 'Default' dropdown menu and Save

Current behavior before PR:
When trying to set a default value for scheduled date in 'Replenish' for a product it will display an error for 'Invalid type' this is happening because when converting the string value to a datetime value it does not handle iso format date and this is the format that gets passed from the UI.

Desired behavior after PR is merged:
It is handled now from the UI side that the format that is been sent is the server valid format of datetime.

opw-3692472

closes odoo/odoo#154209

X-original-commit: 6dc46639935fdc175b2d094b58ef4e66c68466b0
Signed-off-by: Luca Vitali (luvi) <luvi@odoo.com>
Signed-off-by: Youssef Bashandy (yoba) <yoba@odoo.com>
This commit is contained in:
Youssef Bashandy
2024-02-15 18:21:34 +00:00
parent 963d203dce
commit 3e4b005f30
2 changed files with 84 additions and 1 deletions
+8 -1
View File
@@ -11,6 +11,7 @@ import { formatMany2one } from "@web/views/fields/formatters";
import { FormViewDialog } from "@web/views/view_dialogs/form_view_dialog";
import { Component, onWillStart, useState, xml } from "@odoo/owl";
import {serializeDate, serializeDateTime} from "../core/l10n/dates";
const debugRegistry = registry.category("debug");
@@ -321,9 +322,15 @@ class SetDefaultDialog extends Component {
if (!this.state.fieldToSet) {
return;
}
const fieldToSet = this.defaultFields.find((field) => {
let fieldToSet = this.defaultFields.find((field) => {
return field.name === this.state.fieldToSet;
}).value;
if(fieldToSet.constructor.name.toLowerCase() === "date"){
fieldToSet = serializeDate(fieldToSet);
} else if (fieldToSet.constructor.name.toLowerCase() === "datetime"){
fieldToSet = serializeDateTime(fieldToSet);
}
await this.orm.call("ir.default", "set", [
this.props.record.resModel,
this.state.fieldToSet,
@@ -808,4 +808,80 @@ QUnit.module("DebugMenu", (hooks) => {
]
);
});
QUnit.test("set defaults: setting default value for datetime field", async (assert) => {
assert.expect(7);
prepareRegistriesWithCleanup();
patchWithCleanup(odoo, {
debug: true,
});
registry.category("services").add("user", makeFakeUserService());
registry.category("debug").category("form").add("setDefaults", setDefaults);
const serverData = getActionManagerServerData();
serverData.actions[1234] = {
id: 1234,
xml_id: "action_1234",
name: "Partners",
res_model: "partner",
res_id: 1,
type: "ir.actions.act_window",
views: [[18, "form"]],
};
serverData.models.partner.fields.datetime = {string: 'Datetime', type: 'datetime'}
serverData.models.partner.fields.reference = {string: 'Reference', type: 'reference', selection: [["pony", "Pony"]]}
serverData.views["partner,18,form"] = `
<form>
<field name="datetime"/>
<field name="reference"/>
<field name="m2o"/>
</form>`;
serverData.models["ir.ui.view"] = {
fields: {},
records: [{ id: 18 }],
};
serverData.models.pony.records = [{
id: 1,
name: "Test"
}];
serverData.models.partner.records = [{
id: 1,
display_name: "p1",
datetime: "2024-01-24 16:46:16",
reference: 'pony,1',
m2o: 1
}];
const mockRPC = async (route, args) => {
if (args.method === "check_access_rights") {
return Promise.resolve(true);
}
if (args.method === "set" && args.model === "ir.default") {
arg_steps.push(args.args)
return true;
}
};
const webClient = await createWebClient({serverData, mockRPC});
let arg_steps = [];
for (const field_name of ['datetime', 'reference', 'm2o']) {
await doAction(webClient, 1234);
await click(target.querySelector(".o_debug_manager button"));
await click(target.querySelector(".o_debug_manager .dropdown-item"));
assert.containsOnce(target, ".modal");
const select = target.querySelector(".modal #formview_default_fields");
select.value = field_name;
select.dispatchEvent(new Event("change"));
await nextTick();
await click(target.querySelectorAll(".modal .modal-footer button")[1]);
assert.containsNone(target, ".modal");
}
assert.deepEqual(arg_steps, [
["partner", "datetime", "2024-01-24 16:46:16", true, true, false],
["partner", "reference", {"displayName": "Test", "resId": 1, "resModel": "pony"}, true, true, false],
["partner", "m2o", 1, true, true, false],
]);
});
});