diff --git a/addons/web/static/src/views/fields/datetime/datetime_field.js b/addons/web/static/src/views/fields/datetime/datetime_field.js index 612f42102a3..a3043f18c54 100644 --- a/addons/web/static/src/views/fields/datetime/datetime_field.js +++ b/addons/web/static/src/views/fields/datetime/datetime_field.js @@ -115,12 +115,25 @@ export class DateTimeField extends Component { } else { toUpdate[this.props.name] = this.state.value; } - // Remove values that did not change - for (const fieldName in toUpdate) { - if (areDatesEqual(toUpdate[fieldName], this.props.record.data[fieldName])) { - delete toUpdate[fieldName]; + // when startDateField and endDateField are set, and one of them has changed, we keep + // the unchanged one to make sure ORM protects both fields from being recomputed by the + // server, ORM team will handle this properly on master, then we can remove unchanged values + if (!this.startDateField || !this.endDateField) { + // If startDateField or endDateField are not set, delete unchanged fields + for (const fieldName in toUpdate) { + if (areDatesEqual(toUpdate[fieldName], this.props.record.data[fieldName])) { + delete toUpdate[fieldName]; + } + } + } else { + // If both startDateField and endDateField are set, check if they haven't changed + if (areDatesEqual(toUpdate[this.startDateField], this.props.record.data[this.startDateField]) && + areDatesEqual(toUpdate[this.endDateField], this.props.record.data[this.endDateField])) { + delete toUpdate[this.startDateField]; + delete toUpdate[this.endDateField]; } } + if (Object.keys(toUpdate).length) { this.props.record.update(toUpdate); } diff --git a/addons/web/static/tests/views/fields/daterange_field_tests.js b/addons/web/static/tests/views/fields/daterange_field_tests.js index 7b5cd4f1b59..0ccfe534856 100644 --- a/addons/web/static/tests/views/fields/daterange_field_tests.js +++ b/addons/web/static/tests/views/fields/daterange_field_tests.js @@ -376,7 +376,10 @@ QUnit.module("Fields", (hooks) => { resId: 1, mockRPC(route, args) { if (args.method === "web_save") { - assert.deepEqual(args.args[1], { datetime: "2017-02-08 06:00:00" }); + assert.deepEqual(args.args[1], { + datetime: "2017-02-08 06:00:00", + datetime_end: "2017-03-13 00:00:00", + }); } }, }); diff --git a/addons/web/static/tests/views/list_view_tests.js b/addons/web/static/tests/views/list_view_tests.js index 4990be6264d..ef5aad42df4 100644 --- a/addons/web/static/tests/views/list_view_tests.js +++ b/addons/web/static/tests/views/list_view_tests.js @@ -11509,7 +11509,7 @@ QUnit.module("Views", (hooks) => { `, mockRPC(route, args) { if (args.method === "write") { - assert.deepEqual(args.args, [[1, 2], { date_start: "2021-04-01" }]); + assert.deepEqual(args.args, [[1, 2], { date_start: "2021-04-01", date_end: "2017-01-26"}]); } }, }); @@ -11535,7 +11535,7 @@ QUnit.module("Views", (hooks) => { const changesTable = target.querySelector(".modal-body .o_modal_changes"); assert.strictEqual( changesTable.innerText.replaceAll("\n", "").replaceAll("\t", ""), - "Field:Date StartUpdate to:04/01/202101/26/2017" + "Field:Date StartUpdate to:04/01/202101/26/2017Field:Date EndUpdate to:01/26/2017" ); // Valid the confirm dialog