From ebd538a1942c532bcf1c9deeab3c25efe23b6893 Mon Sep 17 00:00:00 2001 From: Jorge Pinna Puissant Date: Thu, 24 Aug 2023 14:34:47 +0200 Subject: [PATCH] [IMP] web, *: optimize save record from webclient This commit, adds a new python method (`web_save`) to save a record, and optionally read-it again in one rpc call. This optimizes the current behavior that is to save a record in one rpc, and read-it in a second rpc. web_save, will receive the list of IDs of the records to save (if this list is empty it will create the records, if not, it will write on the existing records), the list of changed fields, and the unity specification as optional argument to read the created/modified records (if the specification is not set, the function will return a list of IDs of the created/modified records). closes odoo/odoo#133021 Task-id: 3453184 Related: odoo/enterprise#46559 Signed-off-by: Aaron Bohy (aab) --- .../static/tests/account_move_form_tests.js | 2 +- .../static/tests/basic/barcode_tests.js | 2 +- ...kanban_progress_bar_mrr_sum_field_tests.js | 2 +- .../mass_mailing_favourite_filter_tests.js | 2 +- .../project_subtask_kanban_list_tests.js | 3 +- .../tests/inventory_report_list_tests.js | 6 +- .../question_page_one2many_field_tests.js | 4 +- addons/web/models/models.py | 7 + addons/web/static/src/core/orm_service.js | 24 +- .../src/model/relational_model/datapoint.js | 4 + .../relational_model/dynamic_record_list.js | 1 + .../src/model/relational_model/record.js | 72 +++-- .../relational_model/relational_model.js | 24 +- .../src/model/relational_model/static_list.js | 1 + .../src/model/relational_model/utils.js | 16 + .../web/static/tests/helpers/mock_server.js | 12 + .../fields/many2one_barcode_field_tests.js | 5 +- .../view_dialog/select_create_dialog_tests.js | 8 +- .../views/calendar/calendar_view_tests.js | 8 +- .../views/fields/ace_editor_field_tests.js | 7 +- .../fields/boolean_favorite_field_tests.js | 60 ++-- .../fields/boolean_toggle_field_tests.js | 10 +- .../tests/views/fields/char_field_tests.js | 2 +- .../tests/views/fields/date_field_tests.js | 2 +- .../views/fields/daterange_field_tests.js | 2 +- .../views/fields/datetime_field_tests.js | 2 +- .../tests/views/fields/domain_field_tests.js | 4 +- .../views/fields/float_factor_field_tests.js | 2 +- .../views/fields/float_time_field_tests.js | 4 +- .../views/fields/float_toggle_field_tests.js | 2 +- .../tests/views/fields/html_field_tests.js | 2 +- .../tests/views/fields/image_field_tests.js | 2 +- .../fields/many2many_binary_field_tests.js | 16 +- .../many2many_checkboxes_field_tests.js | 26 +- .../views/fields/many2many_field_tests.js | 63 ++-- .../many2many_tags_avatar_field_tests.js | 6 +- .../fields/many2many_tags_field_tests.js | 31 +- .../fields/many2one_barcode_field_tests.js | 9 +- .../views/fields/many2one_field_tests.js | 92 +++--- .../views/fields/one2many_field_tests.js | 151 ++++----- .../views/fields/pdf_viewer_field_tests.js | 4 +- .../views/fields/percentage_field_tests.js | 2 +- .../views/fields/priority_field_tests.js | 14 +- .../views/fields/progress_bar_field_tests.js | 14 +- .../views/fields/properties_field_tests.js | 6 +- .../tests/views/fields/radio_field_tests.js | 2 +- .../views/fields/reference_field_tests.js | 36 +-- .../views/fields/selection_field_tests.js | 2 +- .../fields/state_selection_field_tests.js | 12 +- .../views/fields/statusbar_field_tests.js | 6 +- .../tests/views/form/form_view_tests.js | 287 ++++++++---------- .../tests/views/kanban/kanban_view_tests.js | 191 +++++------- .../web/static/tests/views/list_view_tests.js | 113 ++++--- addons/web/static/tests/views/record_tests.js | 3 +- .../view_dialogs/form_view_dialog_tests.js | 4 +- .../select_create_dialog_tests.js | 8 +- .../views/widgets/attach_document_tests.js | 10 +- .../tests/views/widgets/week_days_tests.js | 2 +- .../tests/webclient/actions/target_tests.js | 5 +- .../webclient/actions/window_action_tests.js | 6 +- .../settings_form_view_tests.js | 31 +- .../static/tests/html_field_tests.js | 4 +- odoo/addons/test_new_api/tests/__init__.py | 1 + .../test_new_api/tests/test_web_save.py | 38 +++ 64 files changed, 783 insertions(+), 716 deletions(-) create mode 100644 odoo/addons/test_new_api/tests/test_web_save.py diff --git a/addons/account/static/tests/account_move_form_tests.js b/addons/account/static/tests/account_move_form_tests.js index d50601008ee..661a4427af5 100644 --- a/addons/account/static/tests/account_move_form_tests.js +++ b/addons/account/static/tests/account_move_form_tests.js @@ -32,7 +32,7 @@ QUnit.module("Views", {}, function () { account_move: accountMoveService, }, async mockRPC(route) { - if (route === "/web/dataset/call_kw/account.move/write") { + if (route === "/web/dataset/call_kw/account.move/web_save") { assert.step("tab saved"); def.resolve(); } diff --git a/addons/barcodes/static/tests/basic/barcode_tests.js b/addons/barcodes/static/tests/basic/barcode_tests.js index f9af853d6b0..7ad8301d40a 100644 --- a/addons/barcodes/static/tests/basic/barcode_tests.js +++ b/addons/barcodes/static/tests/basic/barcode_tests.js @@ -141,7 +141,7 @@ QUnit.module("Barcodes", (hooks) => { serverData, arch: '
', mockRPC: function (route, args) { - if (args.method === "write") { + if (args.method === "web_save") { assert.step("save"); } }, diff --git a/addons/crm/static/tests/crm_kanban_progress_bar_mrr_sum_field_tests.js b/addons/crm/static/tests/crm_kanban_progress_bar_mrr_sum_field_tests.js index efd30279759..e599798804e 100644 --- a/addons/crm/static/tests/crm_kanban_progress_bar_mrr_sum_field_tests.js +++ b/addons/crm/static/tests/crm_kanban_progress_bar_mrr_sum_field_tests.js @@ -209,7 +209,7 @@ QUnit.module('Crm Kanban Progressbar', { `, async mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { await def; } } diff --git a/addons/mass_mailing/static/tests/mass_mailing_favourite_filter_tests.js b/addons/mass_mailing/static/tests/mass_mailing_favourite_filter_tests.js index 41f76ebc971..0080735e077 100644 --- a/addons/mass_mailing/static/tests/mass_mailing_favourite_filter_tests.js +++ b/addons/mass_mailing/static/tests/mass_mailing_favourite_filter_tests.js @@ -194,7 +194,7 @@ QUnit.module('favorite filter widget', (hooks) => { mockRPC: function (route, args) { if (args.method === 'unlink' && args.model === 'mailing.filter') { assert.deepEqual(args.args[0], [1], "should pass correct filter ID for deletion"); - } else if (args.method === 'write' && args.model === 'mailing.mailing') { + } else if (args.method === 'web_save' && args.model === 'mailing.mailing') { assert.strictEqual(args.args[1].mailing_filter_id, false, "filter id should be"); assert.strictEqual(args.args[1].mailing_domain, diff --git a/addons/project/static/tests/project_subtask_kanban_list_tests.js b/addons/project/static/tests/project_subtask_kanban_list_tests.js index 11d2b1e259f..8f478ea7ab3 100644 --- a/addons/project/static/tests/project_subtask_kanban_list_tests.js +++ b/addons/project/static/tests/project_subtask_kanban_list_tests.js @@ -109,8 +109,7 @@ QUnit.module('Subtask Kanban List tests', { assert.containsOnce(subtaskEl, ".o_field_widget.o_field_project_task_state_selection.subtask_state_widget_col .fa-check-circle.text-success", "The state of the subtask should be Done"); assert.verifySteps([ "project.task/search_read", - "project.task/write", - "project.task/web_read", + "project.task/web_save", "project.task/search_read", "project.task/web_read", // read the parent task to recompute the subtask count ]); diff --git a/addons/stock/static/tests/inventory_report_list_tests.js b/addons/stock/static/tests/inventory_report_list_tests.js index 6aa23fbdfc0..b945ae501cc 100644 --- a/addons/stock/static/tests/inventory_report_list_tests.js +++ b/addons/stock/static/tests/inventory_report_list_tests.js @@ -19,9 +19,9 @@ const arch = const setup_date = DateTime.fromISO('2022-01-03T08:03:44+00:00').toSQL(); function mockRPC(route, { args }) { - if (route === '/web/dataset/call_kw/person/create') { + if (route === '/web/dataset/call_kw/person/web_save' && args[0].length === 0) { // simulate 'stock.quant' create function which can return existing record - const [values] = args[0]; + const values = args[1]; values.create_date = DateTime.now().toSQL(); values.write_date = values.create_date; var name = values.name; @@ -32,7 +32,7 @@ function mockRPC(route, { args }) { d.age = age; d.job = job; d.write_date = values.write_date; - return Promise.resolve([d.id]); + return Promise.resolve([{ id: d.id, name: d.name, age: d.age, job: d.job, create_date: d.create_date, write_date: d.write_date }]); } } } diff --git a/addons/survey/static/tests/components/question_page_one2many_field_tests.js b/addons/survey/static/tests/components/question_page_one2many_field_tests.js index 5c2a4579b3b..b78c6182727 100644 --- a/addons/survey/static/tests/components/question_page_one2many_field_tests.js +++ b/addons/survey/static/tests/components/question_page_one2many_field_tests.js @@ -158,7 +158,7 @@ QUnit.module("QuestionPageOneToManyField", (hooks) => { `, mockRPC(route, args) { - if (args.method === "write" && args.model === "survey") { + if (args.method === "web_save" && args.model === "survey") { assert.step("save parent form"); } }, @@ -196,7 +196,7 @@ QUnit.module("QuestionPageOneToManyField", (hooks) => { `, mockRPC(route, args) { - if (args.method === "write" && args.model === "survey") { + if (args.method === "web_save" && args.model === "survey") { assert.step("save parent form"); throw makeServerError({ description: "This isn't right!", diff --git a/addons/web/models/models.py b/addons/web/models/models.py index 77cc2f56977..5d19f8a8595 100644 --- a/addons/web/models/models.py +++ b/addons/web/models/models.py @@ -66,6 +66,13 @@ class Base(models.AbstractModel): 'records': records, } + def web_save(self, vals, specification: Dict[str, Dict]) -> List[Dict]: + if self: + self.write(vals) + else: + self = self.create(vals) + return self.with_context(bin_size=True).web_read(specification) + def web_read(self, specification: Dict[str, Dict]) -> List[Dict]: fields_to_read = list(specification) or ['id'] diff --git a/addons/web/static/src/core/orm_service.js b/addons/web/static/src/core/orm_service.js index d7591193a62..f0703180f1f 100644 --- a/addons/web/static/src/core/orm_service.js +++ b/addons/web/static/src/core/orm_service.js @@ -84,7 +84,14 @@ function validateArray(name, array) { } } -export const UPDATE_METHODS = ["unlink", "create", "write", "action_archive", "action_unarchive"]; +export const UPDATE_METHODS = [ + "unlink", + "create", + "write", + "web_save", + "action_archive", + "action_unarchive", +]; export class ORM { constructor(rpc, user) { @@ -292,6 +299,21 @@ export class ORM { validateObject("data", data); return this.call(model, "write", [ids, data], kwargs); } + + /** + * @param {string} model + * @param {number[]} ids + * @param {any} data + * @param {any} [kwargs={}] + * @param {Object} [kwargs.specification] + * @param {Object} [kwargs.context] + * @returns {Promise} + */ + webSave(model, ids, data, kwargs = {}) { + validatePrimitiveList("ids", "number", ids); + validateObject("data", data); + return this.call(model, "web_save", [ids, data], kwargs); + } } /** diff --git a/addons/web/static/src/model/relational_model/datapoint.js b/addons/web/static/src/model/relational_model/datapoint.js index 35d03d4110f..c082dde2630 100644 --- a/addons/web/static/src/model/relational_model/datapoint.js +++ b/addons/web/static/src/model/relational_model/datapoint.js @@ -79,6 +79,10 @@ export class DataPoint extends Reactive { return this.config.context; } + get currentCompanyId() { + return this.config.currentCompanyId; + } + // ------------------------------------------------------------------------- // Public // ------------------------------------------------------------------------- diff --git a/addons/web/static/src/model/relational_model/dynamic_record_list.js b/addons/web/static/src/model/relational_model/dynamic_record_list.js index f0f86b1a9e1..10605723c92 100644 --- a/addons/web/static/src/model/relational_model/dynamic_record_list.js +++ b/addons/web/static/src/model/relational_model/dynamic_record_list.js @@ -124,6 +124,7 @@ export class DynamicRecordList extends DynamicList { resId: data.id || false, resIds: data.id ? [data.id] : [], isMonoRecord: true, + currentCompanyId: this.currentCompanyId, mode, }, data, diff --git a/addons/web/static/src/model/relational_model/record.js b/addons/web/static/src/model/relational_model/record.js index 66503949143..1dc49f33d22 100644 --- a/addons/web/static/src/model/relational_model/record.js +++ b/addons/web/static/src/model/relational_model/record.js @@ -10,7 +10,13 @@ import { x2ManyCommands } from "@web/core/orm_service"; import { pick } from "@web/core/utils/objects"; import { escape } from "@web/core/utils/strings"; import { DataPoint } from "./datapoint"; -import { getFieldContext, parseServerValue } from "./utils"; +import { + FetchRecordError, + getBasicEvalContext, + getFieldContext, + getFieldsSpec, + parseServerValue, +} from "./utils"; export class Record extends DataPoint { static type = "Record"; @@ -439,6 +445,7 @@ export class Record extends DataPoint { resIds: data.map((r) => r.id), orderBy: defaultOrderBy || [], limit: limit || Number.MAX_SAFE_INTEGER, + currentCompanyId: this.currentCompanyId, context: {}, // will be set afterwards, see "_updateContext" in "_setEvalContext" }; const options = { @@ -838,39 +845,56 @@ export class Record extends DataPoint { if (canProceed === false) { return false; } - const kwargs = { context: this.context }; - let resId = this.resId; + let fieldSpec = {}; + if (!noReload) { + fieldSpec = getFieldsSpec( + this.activeFields, + this.fields, + getBasicEvalContext(this.config) + ); + } + const kwargs = { + context: this.context, + specification: fieldSpec, + }; + let records = []; try { - if (creation) { - [resId] = await this.model.orm.create(this.resModel, [changes], kwargs); - } else { - await this.model.orm.write(this.resModel, [resId], changes, kwargs); - } + records = await this.model.orm.webSave( + this.resModel, + this.resId ? [this.resId] : [], + changes, + kwargs + ); } catch (e) { if (onError) { return onError(e, { discard: () => this._discard() }); } if (!this.isInEdition) { - const nextConfig = {}; - if (creation) { - nextConfig.resId = resId; - } - await this._load(nextConfig); + await this._load({}); } throw e; } + if (creation && records.length) { + const resId = records[0].id; + const resIds = this.resIds.concat([resId]); + this.model._updateConfig(this.config, { resId, resIds }, { noReload: true }); + } if (!noReload) { - const nextConfig = {}; - if (creation) { - nextConfig.resId = resId; - nextConfig.resIds = this.resIds.concat([resId]); + if (!records.length) { + throw new FetchRecordError(records.map((r) => r.id)); } - await this._load(nextConfig); + this.model._applyProperties(records, this.config); + if (this.resId) { + this.model._updateSimilarRecords(this, records[0]); + } + if (this.config.isRoot) { + this.model.hooks.onWillLoadRoot(this.config); + } + this._setData(records[0]); } else { - this.model._updateConfig(this.config, { resId }, { noReload: true }); this._values = { ...this._values, ...this._changes }; if ("id" in this.activeFields) { - this._values.id = resId; + this._values.id = records[0].id; } this._changes = {}; this.data = { ...this._values }; @@ -887,13 +911,7 @@ export class Record extends DataPoint { * be uselessly re-rendered if we replace it by a brand new object. */ _setEvalContext() { - const evalContext = { - ...this.context, - active_id: this.resId || false, - active_ids: this.resId ? [this.resId] : [], - active_model: this.resModel, - current_company_id: this.model.company.currentCompany.id, - }; + const evalContext = getBasicEvalContext(this.config); const dataContext = this._computeDataContext(); Object.assign(this.evalContext, evalContext, dataContext.withoutVirtualIds); Object.assign(this.evalContextWithVirtualIds, evalContext, dataContext.withVirtualIds); diff --git a/addons/web/static/src/model/relational_model/relational_model.js b/addons/web/static/src/model/relational_model/relational_model.js index 4f352d9ca1b..2d40175faa8 100644 --- a/addons/web/static/src/model/relational_model/relational_model.js +++ b/addons/web/static/src/model/relational_model/relational_model.js @@ -20,6 +20,8 @@ import { createPropertyActiveField, extractInfoFromGroupData, isRelational, + FetchRecordError, + getBasicEvalContext, } from "./utils"; /** @@ -44,6 +46,7 @@ import { * @property {Object} activeFields * @property {object} context * @property {boolean} isMonoRecord + * @property {number} currentCompanyId * @property {boolean} isRoot * @property {Array} [domain] * @property {Array} [groupBy] @@ -86,12 +89,6 @@ const DEFAULT_HOOKS = { onRecordChanged: () => {}, }; -export class FetchRecordError extends Error { - constructor(resIds) { - super(`Can't fetch record(s) ${resIds}. They might have been deleted.`); - } -} - export function fetchRecordErrorHandler(env, error, originalError) { if (originalError instanceof FetchRecordError) { env.services.notification.add(originalError.message, { sticky: true, type: "danger" }); @@ -119,7 +116,6 @@ export class RelationalModel extends Model { */ setup(params, { action, company, dialog, notification, rpc, user }) { this.action = action; - this.company = company; this.dialog = dialog; this.notification = notification; this.rpc = rpc; @@ -133,6 +129,7 @@ export class RelationalModel extends Model { /** @type {Config} */ this.config = { isMonoRecord: false, + currentCompanyId: company.currentCompany.id, ...params.config, isRoot: true, }; @@ -257,6 +254,9 @@ export class RelationalModel extends Model { if (currentConfig.isMonoRecord) { config.resId = "resId" in params ? params.resId : config.resId; config.resIds = "resIds" in params ? params.resIds : config.resIds; + if (!config.resIds) { + config.resIds = config.resId ? [config.resId] : []; + } if (!config.resId && config.mode !== "edit") { config.mode = "edit"; } @@ -308,13 +308,7 @@ export class RelationalModel extends Model { this.hooks.onWillLoadRoot(config); } if (config.isMonoRecord) { - const evalContext = { - ...config.context, - active_id: config.resId, - active_ids: [config.resId], - active_model: config.resModel, - current_company_id: this.company.currentCompany.id, - }; + const evalContext = getBasicEvalContext(config); if (!config.resId) { return this._loadNewRecord(config, { evalContext }); } @@ -348,7 +342,7 @@ export class RelationalModel extends Model { ...config, context: { ...config.context, - current_company_id: this.company.currentCompany.id, + current_company_id: config.currentCompanyId, }, }); } diff --git a/addons/web/static/src/model/relational_model/static_list.js b/addons/web/static/src/model/relational_model/static_list.js index e7fb22a5bb6..2ec44adac01 100644 --- a/addons/web/static/src/model/relational_model/static_list.js +++ b/addons/web/static/src/model/relational_model/static_list.js @@ -675,6 +675,7 @@ export class StaticList extends DataPoint { resIds: resId ? [resId] : [], mode: params.mode || "readonly", isMonoRecord: true, + currentCompanyId: this.currentCompanyId, }; const { CREATE, UPDATE } = x2ManyCommands; const options = { diff --git a/addons/web/static/src/model/relational_model/utils.js b/addons/web/static/src/model/relational_model/utils.js index 7367f028dbe..db14c579185 100644 --- a/addons/web/static/src/model/relational_model/utils.js +++ b/addons/web/static/src/model/relational_model/utils.js @@ -48,6 +48,12 @@ export function makeActiveField({ const AGGREGATABLE_FIELD_TYPES = ["float", "integer", "monetary"]; // types that can be aggregated in grouped views +export class FetchRecordError extends Error { + constructor(resIds) { + super(`Can't fetch record(s) ${resIds}. They might have been deleted.`); + } +} + export function addFieldDependencies(activeFields, fields, fieldDependencies = []) { for (const field of fieldDependencies) { if (!("readonly" in field)) { @@ -274,6 +280,16 @@ export function getFieldContext( }; } +export function getBasicEvalContext(config) { + return { + ...config.context, + active_id: config.resId || false, + active_ids: config.resId ? [config.resId] : [], + active_model: config.resModel, + current_company_id: config.currentCompanyId, + }; +} + export function getFieldsSpec( activeFields, fields, diff --git a/addons/web/static/tests/helpers/mock_server.js b/addons/web/static/tests/helpers/mock_server.js index 92053606f5f..35af3221c95 100644 --- a/addons/web/static/tests/helpers/mock_server.js +++ b/addons/web/static/tests/helpers/mock_server.js @@ -627,6 +627,8 @@ export class MockServer { return this.mockUnlink(args.model, args.args); case "web_read": return this.mockWebRead(args.model, args.args, args.kwargs); + case "web_save": + return this.mockWebSave(args.model, args.args, args.kwargs); case "read_group": return this.mockReadGroup(args.model, args.kwargs); case "web_read_group": @@ -1905,6 +1907,16 @@ export class MockServer { return this.mockRead(modelName, [records.map((r) => r.id), fieldNames]); } + mockWebSave(modelName, args, kwargs) { + const ids = args[0]; + if (ids.length === 0) { + args[0] = this.mockCreate(modelName, args[1], kwargs); + } else { + this.mockWrite(modelName, args); + } + return this.mockWebRead(modelName, args, kwargs); + } + mockWebRead(modelName, args, kwargs) { const ids = args[0]; let fieldNames = Object.keys(kwargs.specification); diff --git a/addons/web/static/tests/mobile/views/fields/many2one_barcode_field_tests.js b/addons/web/static/tests/mobile/views/fields/many2one_barcode_field_tests.js index cf3a33f879e..74df529c586 100644 --- a/addons/web/static/tests/mobile/views/fields/many2one_barcode_field_tests.js +++ b/addons/web/static/tests/mobile/views/fields/many2one_barcode_field_tests.js @@ -10,7 +10,6 @@ import * as BarcodeScanner from "@web/webclient/barcode/barcode_scanner"; let serverData; let target; -const CREATE = "create"; const NAME_SEARCH = "name_search"; const PRODUCT_PRODUCT = "product.product"; const SALE_ORDER_LINE = "sale_order_line"; @@ -123,8 +122,8 @@ QUnit.module("Fields", (hooks) => { `, async mockRPC(route, args, performRPC) { - if (args.method === CREATE && args.model === SALE_ORDER_LINE) { - const selectedId = args.args[0][0][PRODUCT_FIELD_NAME]; + if (args.method === "web_save" && args.model === SALE_ORDER_LINE) { + const selectedId = args.args[1][PRODUCT_FIELD_NAME]; assert.equal( selectedId, selectedRecordTest.id, diff --git a/addons/web/static/tests/mobile/views/view_dialog/select_create_dialog_tests.js b/addons/web/static/tests/mobile/views/view_dialog/select_create_dialog_tests.js index 75738b12600..2bbccee76a2 100644 --- a/addons/web/static/tests/mobile/views/view_dialog/select_create_dialog_tests.js +++ b/addons/web/static/tests/mobile/views/view_dialog/select_create_dialog_tests.js @@ -76,8 +76,8 @@ QUnit.module("ViewDialogs", (hooks) => { `, async mockRPC(route, args) { - if (args.method === "create" && args.model === "sale_order_line") { - const { product_id: selectedId } = args.args[0][0]; + if (args.method === "web_save" && args.model === "sale_order_line") { + const { product_id: selectedId } = args.args[1]; assert.strictEqual(selectedId, false, `there should be no product selected`); } }, @@ -132,8 +132,8 @@ QUnit.module("ViewDialogs", (hooks) => { `, async mockRPC(route, args) { - if (args.method === "create" && args.model === "sale_order_line") { - const { product_id: selectedId } = args.args[0][0]; + if (args.method === "web_save" && args.model === "sale_order_line") { + const { product_id: selectedId } = args.args[1]; assert.strictEqual(selectedId, 111, `the product should be selected`); } if (args.method === "some_action") { diff --git a/addons/web/static/tests/views/calendar/calendar_view_tests.js b/addons/web/static/tests/views/calendar/calendar_view_tests.js index 55c85799f1d..a6e4178811a 100644 --- a/addons/web/static/tests/views/calendar/calendar_view_tests.js +++ b/addons/web/static/tests/views/calendar/calendar_view_tests.js @@ -791,7 +791,7 @@ QUnit.module("Views", ({ beforeEach }) => { `, mockRPC(route, { args, method }) { - if (method === "write") { + if (method === "web_save" && args[0].length !== 0) { assert.deepEqual( args[1], { name: "event 4 modified" }, @@ -1528,7 +1528,7 @@ QUnit.module("Views", ({ beforeEach }) => { `, mockRPC(route, { args, kwargs, method }) { - if (method === "create") { + if (method === "web_save") { assert.deepEqual( kwargs.context, { @@ -1730,7 +1730,7 @@ QUnit.module("Views", ({ beforeEach }) => { `, mockRPC(route, { args, kwargs, method }) { - if (method === "create") { + if (method === "web_save") { assert.deepEqual( kwargs.context, { @@ -4223,7 +4223,7 @@ QUnit.module("Views", ({ beforeEach }) => { `, mockRPC(route, { args, method }) { - if (method === "write") { + if (method === "web_save") { assert.deepEqual( args[1], { name: "event 4 modified" }, diff --git a/addons/web/static/tests/views/fields/ace_editor_field_tests.js b/addons/web/static/tests/views/fields/ace_editor_field_tests.js index 57ff6d1f131..4ea665b7aa8 100644 --- a/addons/web/static/tests/views/fields/ace_editor_field_tests.js +++ b/addons/web/static/tests/views/fields/ace_editor_field_tests.js @@ -107,6 +107,7 @@ QUnit.module("Fields", (hooks) => { }); QUnit.test("AceEditorField on html fields works", async function (assert) { + assert.expect(8); serverData.models.partner.fields.htmlField = { string: "HTML Field", type: "html", @@ -129,7 +130,7 @@ QUnit.module("Fields", (hooks) => { mockRPC(route, args) { if (args.method) { assert.step(args.method); - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual(args.args[1], { foo: "DEF" }); } if (args.method === "onchange") { @@ -154,7 +155,7 @@ QUnit.module("Fields", (hooks) => { await editInput(target, ".o_field_widget[name=foo] textarea", "DEF"); await clickSave(target); - assert.verifySteps(["get_views", "web_read", "write", "web_read"]); + assert.verifySteps(["get_views", "web_read", "web_save"]); }); QUnit.test("AceEditorField doesn't crash when editing", async (assert) => { @@ -259,6 +260,6 @@ QUnit.module("Fields", (hooks) => { await triggerEvents(textArea, null, ["blur"]); assert.verifySteps(['onchange: [[1],{"foo":"a"},["foo"],{"display_name":{},"foo":{}}]']); await click(target, ".o_form_button_save"); - assert.verifySteps(['write: [[1],{"foo":"a"}]', "web_read: [[1]]"]); + assert.verifySteps(['web_save: [[1],{"foo":"a"}]']); }); }); diff --git a/addons/web/static/tests/views/fields/boolean_favorite_field_tests.js b/addons/web/static/tests/views/fields/boolean_favorite_field_tests.js index 2876e0fad0a..29261ab5d36 100644 --- a/addons/web/static/tests/views/fields/boolean_favorite_field_tests.js +++ b/addons/web/static/tests/views/fields/boolean_favorite_field_tests.js @@ -90,7 +90,7 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, args) { - if (args.method === "write" && args.model === "partner") { + if (args.method === "web_save" && args.model === "partner") { assert.step("save"); assert.deepEqual(args.args, [[1], { bar: false }]); } @@ -114,12 +114,14 @@ QUnit.module("Fields", (hooks) => { assert.verifySteps(["save"]); }); - QUnit.test("FavoriteField does not save if autosave option is set to false", async function (assert) { - await makeView({ - type: "kanban", - resModel: "partner", - serverData, - arch: ` + QUnit.test( + "FavoriteField does not save if autosave option is set to false", + async function (assert) { + await makeView({ + type: "kanban", + resModel: "partner", + serverData, + arch: ` @@ -129,29 +131,31 @@ QUnit.module("Fields", (hooks) => { `, - mockRPC(route, args) { - if (args.method === "write" && args.model === "partner") { - assert.step("save"); - } - }, - domain: [["id", "=", 1]], - }); + mockRPC(route, args) { + if (args.method === "web_save" && args.model === "partner") { + assert.step("save"); + } + }, + domain: [["id", "=", 1]], + }); - // click on favorite - await click(target, ".o_field_widget .o_favorite"); - assert.containsNone( - target, - ".o_kanban_record .o_field_widget .o_favorite > a i.fa.fa-star", - "should not be favorite" - ); - assert.strictEqual( - target.querySelector(".o_kanban_record .o_field_widget .o_favorite > a").textContent, - " Add to Favorites", - 'the label should say "Add to Favorites"' - ); + // click on favorite + await click(target, ".o_field_widget .o_favorite"); + assert.containsNone( + target, + ".o_kanban_record .o_field_widget .o_favorite > a i.fa.fa-star", + "should not be favorite" + ); + assert.strictEqual( + target.querySelector(".o_kanban_record .o_field_widget .o_favorite > a") + .textContent, + " Add to Favorites", + 'the label should say "Add to Favorites"' + ); - assert.verifySteps([]); - }); + assert.verifySteps([]); + } + ); QUnit.test("FavoriteField in form view", async function (assert) { await makeView({ diff --git a/addons/web/static/tests/views/fields/boolean_toggle_field_tests.js b/addons/web/static/tests/views/fields/boolean_toggle_field_tests.js index 9c8eed49acd..4861069d25d 100644 --- a/addons/web/static/tests/views/fields/boolean_toggle_field_tests.js +++ b/addons/web/static/tests/views/fields/boolean_toggle_field_tests.js @@ -249,13 +249,13 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(_route, { method }) { - if (method === "write") { - assert.step("write"); + if (method === "web_save") { + assert.step("web_save"); } }, }); await click(target, ".o_field_widget[name='bar'] input"); - assert.verifySteps(["write"]); + assert.verifySteps(["web_save"]); }); QUnit.test("BooleanToggleField - autosave option set to false", async function (assert) { @@ -269,8 +269,8 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(_route, { method }) { - if (method === "write") { - assert.step("write"); + if (method === "web_save") { + assert.step("web_save"); } }, }); diff --git a/addons/web/static/tests/views/fields/char_field_tests.js b/addons/web/static/tests/views/fields/char_field_tests.js index 50ea58ec8eb..46601d33cb4 100644 --- a/addons/web/static/tests/views/fields/char_field_tests.js +++ b/addons/web/static/tests/views/fields/char_field_tests.js @@ -190,7 +190,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, { args, method }) { - if (method === "write") { + if (method === "web_save") { assert.strictEqual(args[1].foo, false, "the foo value should be false"); } }, diff --git a/addons/web/static/tests/views/fields/date_field_tests.js b/addons/web/static/tests/views/fields/date_field_tests.js index 25a8cc63127..bc542af3572 100644 --- a/addons/web/static/tests/views/fields/date_field_tests.js +++ b/addons/web/static/tests/views/fields/date_field_tests.js @@ -223,7 +223,7 @@ QUnit.module("Fields", (hooks) => { serverData, arch: '
', mockRPC(route, { args }) { - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { assert.strictEqual( args[1].date, "2017-02-22", 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 bfc1081e786..d675f8292f1 100644 --- a/addons/web/static/tests/views/fields/daterange_field_tests.js +++ b/addons/web/static/tests/views/fields/daterange_field_tests.js @@ -374,7 +374,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual(args.args[1], { datetime: "2017-02-08 06:00:00" }); } }, diff --git a/addons/web/static/tests/views/fields/datetime_field_tests.js b/addons/web/static/tests/views/fields/datetime_field_tests.js index ecfcaa61aa1..599548b2526 100644 --- a/addons/web/static/tests/views/fields/datetime_field_tests.js +++ b/addons/web/static/tests/views/fields/datetime_field_tests.js @@ -364,7 +364,7 @@ QUnit.module("Fields", (hooks) => { serverData, arch: '
', mockRPC(route, { args }) { - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { assert.strictEqual( args[1].datetime, false, diff --git a/addons/web/static/tests/views/fields/domain_field_tests.js b/addons/web/static/tests/views/fields/domain_field_tests.js index 17ad261db5a..37605738101 100644 --- a/addons/web/static/tests/views/fields/domain_field_tests.js +++ b/addons/web/static/tests/views/fields/domain_field_tests.js @@ -738,7 +738,7 @@ QUnit.module("Fields", (hooks) => { const webClient = await createWebClient({ serverData, mockRPC(route, { method, args }) { - if (method === "write") { + if (method === "web_save") { assert.strictEqual(args[1].foo, rawDomain); } if (route === "/web/domain/validate") { @@ -827,7 +827,7 @@ QUnit.module("Fields", (hooks) => { // Save await clickSave(target); - assert.verifySteps(["write", "web_read", "search_count"]); + assert.verifySteps(["web_save", "search_count"]); assert.strictEqual(target.querySelector(".o_domain_debug_input").value, rawDomain); }); diff --git a/addons/web/static/tests/views/fields/float_factor_field_tests.js b/addons/web/static/tests/views/fields/float_factor_field_tests.js index 3e0ec00ac5e..7901c9caf96 100644 --- a/addons/web/static/tests/views/fields/float_factor_field_tests.js +++ b/addons/web/static/tests/views/fields/float_factor_field_tests.js @@ -39,7 +39,7 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, { args }) { - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { // 2.3 / 0.5 = 4.6 assert.strictEqual(args[1].qux, 4.6, "the correct float value should be saved"); } diff --git a/addons/web/static/tests/views/fields/float_time_field_tests.js b/addons/web/static/tests/views/fields/float_time_field_tests.js index 544736dc327..ddd08d2d2cd 100644 --- a/addons/web/static/tests/views/fields/float_time_field_tests.js +++ b/addons/web/static/tests/views/fields/float_time_field_tests.js @@ -39,7 +39,7 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, args) { - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { // 48 / 60 = 0.8 assert.strictEqual( args.args[1].qux, @@ -89,7 +89,7 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, args) { - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { assert.strictEqual( args.args[1].qux, 9.5, diff --git a/addons/web/static/tests/views/fields/float_toggle_field_tests.js b/addons/web/static/tests/views/fields/float_toggle_field_tests.js index 76925189200..0bb86798b4e 100644 --- a/addons/web/static/tests/views/fields/float_toggle_field_tests.js +++ b/addons/web/static/tests/views/fields/float_toggle_field_tests.js @@ -35,7 +35,7 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, { args }) { - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { // 1.000 / 0.125 = 8 assert.step(args[1].float_field.toString()); } diff --git a/addons/web/static/tests/views/fields/html_field_tests.js b/addons/web/static/tests/views/fields/html_field_tests.js index 99f767b9880..ef273e0c95c 100644 --- a/addons/web/static/tests/views/fields/html_field_tests.js +++ b/addons/web/static/tests/views/fields/html_field_tests.js @@ -317,7 +317,7 @@ QUnit.module("Fields", ({ beforeEach }) => { `, resId: 1, mockRPC(route, { args, method }) { - if (method === "write") { + if (method === "web_save") { assert.strictEqual(args[1].txt, false, "the txt value should be false"); } }, diff --git a/addons/web/static/tests/views/fields/image_field_tests.js b/addons/web/static/tests/views/fields/image_field_tests.js index 6dc40129633..ce433431de4 100644 --- a/addons/web/static/tests/views/fields/image_field_tests.js +++ b/addons/web/static/tests/views/fields/image_field_tests.js @@ -313,7 +313,7 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(_route, { method, args }) { - if (method === "write") { + if (method === "web_save") { args[1].write_date = lastUpdates[index]; args[1].document = "4 kb"; index++; diff --git a/addons/web/static/tests/views/fields/many2many_binary_field_tests.js b/addons/web/static/tests/views/fields/many2many_binary_field_tests.js index e08aec64c71..5c8193847bb 100644 --- a/addons/web/static/tests/views/fields/many2many_binary_field_tests.js +++ b/addons/web/static/tests/views/fields/many2many_binary_field_tests.js @@ -51,7 +51,7 @@ QUnit.module("Fields", (hooks) => { QUnit.module("Many2ManyBinaryField"); QUnit.test("widget many2many_binary", async function (assert) { - assert.expect(22); + assert.expect(21); const fakeHTTPService = { start() { @@ -106,6 +106,17 @@ QUnit.module("Fields", (hooks) => { }, }); } + if (args.method === "web_save" && args.model === "turtle") { + assert.deepEqual(args.kwargs.specification, { + display_name: {}, + picture_ids: { + fields: { + mimetype: {}, + name: {}, + }, + }, + }); + } if (args.method === "web_read" && args.model === "ir.attachment") { assert.deepEqual(args.kwargs.specification, { mimetype: {}, @@ -193,8 +204,7 @@ QUnit.module("Fields", (hooks) => { ); assert.verifySteps([ "/web/dataset/call_kw/ir.attachment/web_read", - "/web/dataset/call_kw/turtle/write", - "/web/dataset/call_kw/turtle/web_read", + "/web/dataset/call_kw/turtle/web_save", ]); }); diff --git a/addons/web/static/tests/views/fields/many2many_checkboxes_field_tests.js b/addons/web/static/tests/views/fields/many2many_checkboxes_field_tests.js index 92d8fafb82a..8b7508d2e7e 100644 --- a/addons/web/static/tests/views/fields/many2many_checkboxes_field_tests.js +++ b/addons/web/static/tests/views/fields/many2many_checkboxes_field_tests.js @@ -63,8 +63,8 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, args) { - if (args.method === "write") { - assert.step("write"); + if (args.method === "web_save") { + assert.step("web_save"); assert.deepEqual(args.args[1].timmy, commands.shift()); } }, @@ -91,7 +91,7 @@ QUnit.module("Fields", (hooks) => { assert.notOk(checkboxes[0].checked); assert.ok(checkboxes[1].checked); - assert.verifySteps(["write", "write"]); + assert.verifySteps(["web_save", "web_save"]); }); QUnit.test("Many2ManyCheckBoxesField (readonly)", async function (assert) { @@ -175,7 +175,7 @@ QUnit.module("Fields", (hooks) => { ); assert.containsOnce(target, "div.o_field_widget div.form-check input:checked"); - assert.verifySteps(["get_views", "web_read", "name_search", "write", "web_read"]); + assert.verifySteps(["get_views", "web_read", "name_search", "web_save"]); }); QUnit.test( @@ -272,7 +272,7 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, { args, method }) { - if (method === "write") { + if (method === "web_save") { const expectedIds = records.map((r) => r.id); expectedIds.pop(); assert.deepEqual(args[1].timmy, [[6, false, expectedIds]]); @@ -327,11 +327,11 @@ QUnit.module("Fields", (hooks) => { `, async mockRPC(route, { args, method }) { - if (method === "write") { + if (method === "web_save") { const expectedIds = records.map((r) => r.id); expectedIds.shift(); assert.deepEqual(args[1].timmy, [[6, false, expectedIds]]); - assert.step("write"); + assert.step("web_save"); } if (method === "name_search") { assert.step("name_search"); @@ -356,7 +356,7 @@ QUnit.module("Fields", (hooks) => { assert.notOk( target.querySelector(".o_field_widget[name='timmy'] input[type='checkbox']").checked ); - assert.verifySteps(["name_search", "write"]); + assert.verifySteps(["name_search", "web_save"]); }); QUnit.test("Many2ManyCheckBoxesField in a one2many", async function (assert) { @@ -379,7 +379,7 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual(args.args[1], { p: [[1, 1, { timmy: [[6, false, [15, 12]]] }]], }); @@ -418,9 +418,9 @@ QUnit.module("Fields", (hooks) => { `, mockRPC: function (route, args) { - if (args.method === "create") { + if (args.method === "web_save") { assert.deepEqual( - args.args[0][0].timmy, + args.args[1].timmy, [[6, false, [12]]], "correct values should have been sent to create" ); @@ -541,7 +541,7 @@ QUnit.module("Fields", (hooks) => { assert.verifySteps(["get_views", "web_read", "name_search"]); // save await clickSave(target); - assert.verifySteps(["onchange", "write", "web_read"]); + assert.verifySteps(["onchange", "web_save"]); }); QUnit.test("Many2ManyCheckBoxesField in a notebook tab", async function (assert) { @@ -586,6 +586,6 @@ QUnit.module("Fields", (hooks) => { assert.containsOnce(target, "div.o_field_widget[name=int_field]"); // save await clickSave(target); - assert.verifySteps(["get_views", "web_read", "name_search", "write", "web_read"]); + assert.verifySteps(["get_views", "web_read", "name_search", "web_save"]); }); }); diff --git a/addons/web/static/tests/views/fields/many2many_field_tests.js b/addons/web/static/tests/views/fields/many2many_field_tests.js index cda2b30876f..f2182d867ac 100644 --- a/addons/web/static/tests/views/fields/many2many_field_tests.js +++ b/addons/web/static/tests/views/fields/many2many_field_tests.js @@ -258,21 +258,30 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (route === "/web/dataset/call_kw/partner_type/write") { + if ( + route === "/web/dataset/call_kw/partner_type/web_save" && + args.args[0].length !== 0 + ) { assert.strictEqual( args.args[1].display_name, "new name", "should write 'new_name'" ); } - if (route === "/web/dataset/call_kw/partner_type/create") { + if ( + route === "/web/dataset/call_kw/partner_type/web_save" && + args.args[0].length === 0 + ) { assert.strictEqual( - args.args[0][0].display_name, + args.args[1].display_name, "A new type", "should create 'A new type'" ); } - if (route === "/web/dataset/call_kw/partner/write") { + if ( + route === "/web/dataset/call_kw/partner/web_save" && + args.args[0].length !== 0 + ) { const commands = args.args[1].timmy; // get the created type's id const createdType = serverData.models.partner_type.records.find((record) => { @@ -620,7 +629,7 @@ QUnit.module("Fields", (hooks) => { }); QUnit.test( - "many2many list (non editable): create a new record and click on action button", + "many2many list (non editable): create a new record and click on action button 1", async function (assert) { serverData.views = { "partner_type,false,list": '', @@ -647,8 +656,8 @@ QUnit.module("Fields", (hooks) => { resId: 1, mockRPC: async (route, args) => { assert.step(args.method); - if (args.method === "create") { - assert.deepEqual(args.args[0][0], { display_name: "Hello" }); + if (args.method === "web_save") { + assert.deepEqual(args.args[1], { display_name: "Hello" }); } }, }); @@ -674,12 +683,12 @@ QUnit.module("Fields", (hooks) => { await click(modal, ".o_statusbar_buttons [name='myaction']"); assert.strictEqual(modal.querySelector("[name='display_name'] input").value, "Hello"); - assert.verifySteps(["create", "web_read", "action: myaction"]); + assert.verifySteps(["web_save", "action: myaction"]); } ); QUnit.test( - "many2many list (non editable): create a new record and click on action button", + "many2many list (non editable): create a new record and click on action button 2", async function (assert) { serverData.views = { "partner_type,false,list": '', @@ -706,8 +715,8 @@ QUnit.module("Fields", (hooks) => { resId: 1, mockRPC: async (route, args) => { assert.step(args.method); - if (args.method === "create") { - assert.deepEqual(args.args[0][0], { display_name: "Hello" }); + if (args.method === "web_save" && args.args[0].length === 0) { + assert.deepEqual(args.args[1], { display_name: "Hello" }); } }, }); @@ -752,14 +761,7 @@ QUnit.module("Fields", (hooks) => { ["Hello (edited)"] ); - assert.verifySteps([ - "create", - "web_read", - "action: myaction", - "write", - "web_read", - "web_read", - ]); + assert.verifySteps(["web_save", "action: myaction", "web_save", "web_read"]); } ); @@ -948,8 +950,7 @@ QUnit.module("Fields", (hooks) => { "get_views", // list view in dialog "web_search_read", // list view in dialog "web_read", // relational field (updated) - "write", // save main record - "web_read", // main record + "web_save", // save main record ]); }); @@ -1055,10 +1056,16 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, args) { - if (route === "/web/dataset/call_kw/partner/create") { - assert.deepEqual(args.args[0][0], { timmy: [[6, false, [12]]] }); + if ( + route === "/web/dataset/call_kw/partner/web_save" && + args.args[0].length === 0 + ) { + assert.deepEqual(args.args[1], { timmy: [[6, false, [12]]] }); } - if (route === "/web/dataset/call_kw/partner/write") { + if ( + route === "/web/dataset/call_kw/partner/web_save" && + args.args[0].length !== 0 + ) { assert.deepEqual(args.args[1], { timmy: [[3, 12]] }); } }, @@ -1581,7 +1588,7 @@ QUnit.module("Fields", (hooks) => { await click(target.querySelector(".modal-body input[type=checkbox]")); await click(target.querySelector(".modal .modal-footer .btn-primary")); - assert.verifySteps(["write", "web_read"]); + assert.verifySteps(["web_save"]); // there is nothing left to save -> should not do a 'write' RPC await clickSave(target); @@ -1649,7 +1656,7 @@ QUnit.module("Fields", (hooks) => { QUnit.test("onchange with 40+ commands for a many2many", async function (assert) { // this test ensures that the basic_model correctly handles more LINK_TO // commands than the limit of the dataPoint (40 for x2many kanban) - assert.expect(21); + assert.expect(20); // create a lot of partner_types that will be linked by the onchange const commands = []; @@ -1685,7 +1692,7 @@ QUnit.module("Fields", (hooks) => { resId: 1, mockRPC(route, args) { assert.step(args.method); - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual( args.args[1].timmy, commands.map((c) => [c[0], c[1]]), @@ -1761,7 +1768,7 @@ QUnit.module("Fields", (hooks) => { "there should be 40 records displayed on page 1" ); - assert.verifySteps(["write", "web_read", "web_read"]); + assert.verifySteps(["web_save", "web_read"]); }); QUnit.test("default_get, onchange, onchange on m2m", async function (assert) { diff --git a/addons/web/static/tests/views/fields/many2many_tags_avatar_field_tests.js b/addons/web/static/tests/views/fields/many2many_tags_avatar_field_tests.js index fb0c7e2de03..7c8fa638a5b 100644 --- a/addons/web/static/tests/views/fields/many2many_tags_avatar_field_tests.js +++ b/addons/web/static/tests/views/fields/many2many_tags_avatar_field_tests.js @@ -476,8 +476,8 @@ QUnit.module("Fields", (hooks) => { `, async mockRPC(route, { method, args }) { - if (method === "write") { - assert.step(`write: ${args[1].partner_ids[0][2]}`); + if (method === "web_save") { + assert.step(`web_save: ${args[1].partner_ids[0][2]}`); } }, }); @@ -485,7 +485,7 @@ QUnit.module("Fields", (hooks) => { // add and directly remove an item await click(target, ".o_popover .o-autocomplete--dropdown-item:first-child"); await click(target, ".o_popover .o_tag .o_delete"); - assert.verifySteps(["write: 1", "write: "]); + assert.verifySteps(["web_save: 1", "web_save: "]); } ); diff --git a/addons/web/static/tests/views/fields/many2many_tags_field_tests.js b/addons/web/static/tests/views/fields/many2many_tags_field_tests.js index bcb913c074e..e08d0f0274d 100644 --- a/addons/web/static/tests/views/fields/many2many_tags_field_tests.js +++ b/addons/web/static/tests/views/fields/many2many_tags_field_tests.js @@ -198,7 +198,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC: (route, { args, method, model, kwargs }) => { - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { var commands = args[1].timmy; assert.strictEqual(commands.length, 1, "should have generated one command"); assert.strictEqual( @@ -208,7 +208,7 @@ QUnit.module("Fields", (hooks) => { ); assert.deepEqual(commands[0][2], [12, 13], "new value should be [12, 13]"); } - if (method === "web_read" && model === "partner_type") { + if ((method === "web_read" || method === "web_save") && model === "partner_type") { assert.deepEqual( kwargs.specification, { display_name: {}, color: {} }, @@ -585,8 +585,8 @@ QUnit.module("Fields", (hooks) => { serverData, arch: '
', mockRPC: (route, { args }) => { - if (route === "/web/dataset/call_kw/partner/create") { - const commands = args[0][0].timmy; + if (route === "/web/dataset/call_kw/partner/web_save") { + const commands = args[1].timmy; assert.strictEqual(commands.length, 1, "should have generated one command"); assert.strictEqual( commands[0][0], @@ -639,7 +639,7 @@ QUnit.module("Fields", (hooks) => { `, mockRPC: (route, { args, method }) => { - if (method === "write") { + if (method === "web_save") { assert.step(JSON.stringify(args[1])); } }, @@ -1570,8 +1570,8 @@ QUnit.module("Fields", (hooks) => { if (args.method === "name_create") { throw makeServerError({ type: "ValidationError" }); } - if (args.method === "create") { - assert.deepEqual(args.args[0][0], { + if (args.method === "web_save") { + assert.deepEqual(args.args[1], { color: 8, name: "new partner", }); @@ -1770,16 +1770,13 @@ QUnit.module("Fields", (hooks) => { if (args.method === "web_read") { await def; } - } + }, }); patchWithCleanup(form.env.services.notification, { add: () => assert.step("notification"), }); - assert.verifySteps([ - "get_views", - "onchange", - ]); + assert.verifySteps(["get_views", "onchange"]); assert.containsNone(target, ".o_tag"); @@ -1788,10 +1785,7 @@ QUnit.module("Fields", (hooks) => { await clickOpenedDropdownItem(target, "timmy", "gold"); assert.containsNone(target, ".o_tag"); - assert.verifySteps([ - "name_search", - "web_read", - ]); + assert.verifySteps(["name_search", "web_read"]); await clickSave(target); assert.doesNotHaveClass(target, "[name='timmy']", "o_field_invalid"); @@ -1801,10 +1795,7 @@ QUnit.module("Fields", (hooks) => { def.resolve(); await nextTick(); - assert.verifySteps([ - "create", - "web_read", - ]); + assert.verifySteps(["web_save"]); }); QUnit.test("Many2ManyTagsField with option 'no_quick_create' set to true", async (assert) => { diff --git a/addons/web/static/tests/views/fields/many2one_barcode_field_tests.js b/addons/web/static/tests/views/fields/many2one_barcode_field_tests.js index c373d3551de..e3b3296b387 100644 --- a/addons/web/static/tests/views/fields/many2one_barcode_field_tests.js +++ b/addons/web/static/tests/views/fields/many2one_barcode_field_tests.js @@ -10,7 +10,6 @@ import * as BarcodeScanner from "@web/webclient/barcode/barcode_scanner"; let serverData; let target; -const CREATE = "create"; const NAME_SEARCH = "name_search"; const PRODUCT_PRODUCT = "product.product"; const SALE_ORDER_LINE = "sale_order_line"; @@ -133,8 +132,8 @@ QUnit.module("Fields", (hooks) => { `, async mockRPC(route, args, performRPC) { - if (args.method === CREATE && args.model === SALE_ORDER_LINE) { - const selectedId = args.args[0][0][PRODUCT_FIELD_NAME]; + if (args.method === "web_save" && args.model === SALE_ORDER_LINE) { + const selectedId = args.args[1][PRODUCT_FIELD_NAME]; assert.equal( selectedId, selectedRecordTest.id, @@ -172,8 +171,8 @@ QUnit.module("Fields", (hooks) => { `, async mockRPC(route, args, performRPC) { - if (args.method === CREATE && args.model === SALE_ORDER_LINE) { - const selectedId = args.args[0][0][PRODUCT_FIELD_NAME]; + if (args.method === "web_save" && args.model === SALE_ORDER_LINE) { + const selectedId = args.args[1][PRODUCT_FIELD_NAME]; assert.equal( selectedId, selectedRecordTest.id, diff --git a/addons/web/static/tests/views/fields/many2one_field_tests.js b/addons/web/static/tests/views/fields/many2one_field_tests.js index b8d6ed0d7f0..9392047b15a 100644 --- a/addons/web/static/tests/views/fields/many2one_field_tests.js +++ b/addons/web/static/tests/views/fields/many2one_field_tests.js @@ -317,7 +317,7 @@ QUnit.module("Fields", (hooks) => { assert.deepEqual(args[0], [4], "should call get_formview_id with correct id"); return Promise.resolve(false); } - if (method === "write") { + if (method === "web_save") { throw new Error("should not call write"); } }, @@ -385,8 +385,8 @@ QUnit.module("Fields", (hooks) => { if (method === "get_formview_id") { return Promise.resolve(false); } - if (method === "write") { - assert.step("write"); + if (method === "web_save") { + assert.step("web_save"); } }, }); @@ -402,7 +402,7 @@ QUnit.module("Fields", (hooks) => { // save and close modal await clickSave(target.querySelectorAll(".modal")[1]); - assert.verifySteps(["write"]); + assert.verifySteps(["web_save"]); // save form await clickSave(target); assert.verifySteps([]); @@ -682,7 +682,7 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, args) { - if (args.method === "create" || args.method === "write") { + if (args.method === "web_save") { assert.step(`${args.method}: ${JSON.stringify(args.args)}`); } }, @@ -696,14 +696,14 @@ QUnit.module("Fields", (hooks) => { await selectDropdownItem(target, "trululu", "Create and edit..."); await clickSave(target.querySelector(".modal")); - assert.verifySteps([`create: [[{"name":"yy"}]]`]); + assert.verifySteps([`web_save: [[],{"name":"yy"}]`]); assert.strictEqual( target.querySelector(".o_field_widget[name=trululu] input").value, "yy" ); await click(target); - assert.verifySteps([`write: [[1],{"trululu":5}]`]); + assert.verifySteps([`web_save: [[1],{"trululu":5}]`]); assert.strictEqual( target.querySelector(".o_data_cell[name=trululu]").textContent, "yy" @@ -827,7 +827,7 @@ QUnit.module("Fields", (hooks) => { "get_formview_id", "get_views", "web_read", - "write", + "web_save", "read", "onchange", ]); @@ -907,7 +907,7 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, { method, args }) { - if (method === "write") { + if (method === "web_save") { assert.step(method); assert.deepEqual(args[1], { trululu: false }); } @@ -924,7 +924,7 @@ QUnit.module("Fields", (hooks) => { await click(target, ".o_list_view"); assert.strictEqual(target.querySelector(".o_data_row").textContent, ""); - assert.verifySteps(["write"]); + assert.verifySteps(["web_save"]); }); QUnit.test("focus tracking on a many2one in a list", async function (assert) { @@ -1117,7 +1117,7 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, { args }) { - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { assert.strictEqual(args[1].trululu, 20, "should write the correct id"); } }, @@ -1372,7 +1372,7 @@ QUnit.module("Fields", (hooks) => { assert.step(method); return Object.keys(namegets).map((id) => [parseInt(id), namegets[id]]); } - if (method === "write") { + if (method === "web_save") { assert.step(method); assert.deepEqual(args[1], { trululu: 2, @@ -1411,7 +1411,7 @@ QUnit.module("Fields", (hooks) => { ); await clickSave(target); - assert.verifySteps(["write", "web_read"]); + assert.verifySteps(["web_save"]); }); QUnit.test("many2one search with trailing and leading spaces", async function (assert) { @@ -1603,10 +1603,10 @@ QUnit.module("Fields", (hooks) => { assert.step("name_create"); await def; } - if (method === "create") { - assert.step("create"); + if (method === "web_save") { + assert.step("web_save"); assert.strictEqual( - args[0][0].trululu, + args[1].trululu, newRecordId, "should create with the correct m2o id" ); @@ -1626,7 +1626,7 @@ QUnit.module("Fields", (hooks) => { def.resolve(); await nextTick(); - assert.verifySteps(["create"]); + assert.verifySteps(["web_save"]); }); QUnit.test( @@ -1675,9 +1675,9 @@ QUnit.module("Fields", (hooks) => { assert.step("name_create"); await def; } - if (method === "create") { - assert.step("create"); - const [values] = args[0]; + if (method === "web_save") { + assert.step("web_save"); + const values = args[1]; assert.strictEqual(values.trululu, newRecordId); } }, @@ -1706,7 +1706,7 @@ QUnit.module("Fields", (hooks) => { def.resolve(); await nextTick(); - assert.verifySteps(["create"]); + assert.verifySteps(["web_save"]); assert.containsN(target, ".o_data_row", 4); assert.strictEqual(target.querySelector(".o_data_row .o_data_cell").textContent, "b"); }); @@ -1736,10 +1736,10 @@ QUnit.module("Fields", (hooks) => { assert.step("name_create"); await def; } - if (method === "create") { - assert.step("create"); + if (method === "web_save") { + assert.step("web_save"); assert.strictEqual( - args[0][0].p[0][2].trululu, + args[1].p[0][2].trululu, newRecordId, "should create with the correct m2o id" ); @@ -1762,7 +1762,7 @@ QUnit.module("Fields", (hooks) => { await def.resolve(); await nextTick(); - assert.verifySteps(["create"]); + assert.verifySteps(["web_save"]); assert.strictEqual( target.querySelector(".o_data_row .o_data_cell").textContent, "b", @@ -1836,8 +1836,8 @@ QUnit.module("Fields", (hooks) => { if (method === "name_create") { await def; } - if (method === "create") { - assert.deepEqual(args[0][0].p[0][2].trululu, newRecordId); + if (method === "web_save") { + assert.deepEqual(args[1].p[0][2].trululu, newRecordId); } }, }); @@ -2419,12 +2419,12 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, { args, method }) { - if (method === "create") { + if (method === "web_save") { assert.deepEqual( - args[0][0], + args[1], { int_field: 1, - timmy: [[0, args[0][0].timmy[0][1], { display_name: "new value" }]], + timmy: [[0, args[1].timmy[0][1], { display_name: "new value" }]], }, "should send the correct values to create" ); @@ -2477,9 +2477,9 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, { args, method }) { - if (method === "create") { + if (method === "web_save") { assert.deepEqual( - args[0][0].turtles, + args[1].turtles, [ [4, 2], [4, 3], @@ -2647,8 +2647,8 @@ QUnit.module("Fields", (hooks) => { if (route === "/web/dataset/call_kw/partner_type/get_formview_id") { return false; } - if (route === "/web/dataset/call_kw/partner_type/write") { - assert.step("partner_type write"); + if (route === "/web/dataset/call_kw/partner_type/web_save") { + assert.step("partner_type web_save"); } }, }); @@ -2676,7 +2676,7 @@ QUnit.module("Fields", (hooks) => { await clickSave(target.querySelectorAll(".modal")[1]); await clickSave(target); - assert.verifySteps(["onchange sequence", "partner_type write"]); + assert.verifySteps(["onchange sequence", "partner_type web_save"]); }); QUnit.test("autocompletion in a many2one, in form view with a domain", async function (assert) { @@ -2932,8 +2932,8 @@ QUnit.module("Fields", (hooks) => { if (method === "name_create") { throw makeServerError({ type: "ValidationError" }); } - if (method === "create") { - assert.deepEqual(args[0][0], { name: "xyz" }); + if (method === "web_save") { + assert.deepEqual(args[1], { name: "xyz" }); } }, }); @@ -2984,7 +2984,7 @@ QUnit.module("Fields", (hooks) => { }); QUnit.test( - "failing quick create on a many2one inside a one2many because ValidationError", + "failing quick create on a many2one inside a one2many because ValidationError", async function (assert) { assert.expect(4); @@ -3005,8 +3005,8 @@ QUnit.module("Fields", (hooks) => { if (method === "name_create") { throw makeServerError({ type: "ValidationError" }); } - if (method === "create") { - assert.deepEqual(args[0][0], { name: "xyz" }); + if (method === "web_save") { + assert.deepEqual(args[1], { name: "xyz" }); } }, }); @@ -3590,8 +3590,7 @@ QUnit.module("Fields", (hooks) => { "web_search_read", // to display results in the dialog "name_search", "onchange", - "write", - "web_read", + "web_save", ]); } ); @@ -3640,8 +3639,7 @@ QUnit.module("Fields", (hooks) => { "web_search_read", // to display results in the dialog "name_search", "onchange", - "write", - "web_read", + "web_save", ]); } ); @@ -4394,8 +4392,8 @@ QUnit.module("Fields", (hooks) => { if (method === "get_formview_id") { return 98; } - if (method === "write") { - assert.step("write"); + if (method === "web_save") { + assert.step("web_save"); } }, }); @@ -4416,7 +4414,7 @@ QUnit.module("Fields", (hooks) => { target.querySelector(".o_field_widget[name=foo] input").value, "some value" ); - assert.verifySteps(["write"]); + assert.verifySteps(["web_save"]); }); QUnit.test("create and edit, save and then discard", async function (assert) { diff --git a/addons/web/static/tests/views/fields/one2many_field_tests.js b/addons/web/static/tests/views/fields/one2many_field_tests.js index fb9d47146a3..db497559ef9 100644 --- a/addons/web/static/tests/views/fields/one2many_field_tests.js +++ b/addons/web/static/tests/views/fields/one2many_field_tests.js @@ -535,7 +535,7 @@ QUnit.module("Fields", (hooks) => { `, async mockRPC(route, args) { - if (args.method === "create") { + if (args.method === "web_save") { await def; } }, @@ -632,7 +632,7 @@ QUnit.module("Fields", (hooks) => { await clickSave(target.querySelector(".modal")); await clickSave(target); - assert.verifySteps(["write", "web_read"]); + assert.verifySteps(["web_save"]); }); QUnit.test("one2many list editable with cell readonly modifier", async function (assert) { @@ -656,7 +656,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { assert.deepEqual( args.args[1].p[0][2], { foo: "ff", qux: 99, turtles: [] }, @@ -732,8 +732,8 @@ QUnit.module("Fields", (hooks) => { await def; assert.step("onchange"); } - if (args.method === "write") { - assert.step("write"); + if (args.method === "web_save") { + assert.step("web_save"); assert.deepEqual(args.args[1].p, [ [1, 1, { int_field: 9 }], [1, 2, { int_field: 10, qux: 99 }], @@ -748,7 +748,7 @@ QUnit.module("Fields", (hooks) => { // resolve the onchange promise def.resolve(); await nextTick(); - assert.verifySteps(["onchange", "write"]); + assert.verifySteps(["onchange", "web_save"]); } ); @@ -1122,7 +1122,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { const expectedResultTurtles = [ [1, 1, { turtle_foo: "hop", partner_ids: [[4, 2]] }], ]; @@ -1191,7 +1191,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { const expectedResultTurtles = [ [1, 1, { turtle_foo: "hop", partner_ids: [[4, 2]] }], [ @@ -1259,7 +1259,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { var expectedResultTurtles = [ [ 1, @@ -2546,7 +2546,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { assert.step(args.method); assert.deepEqual(args.args[1].p, [ [1, 2, { int_field: 0 }], @@ -2584,7 +2584,7 @@ QUnit.module("Fields", (hooks) => { await clickSave(target); - assert.verifySteps(["write"]); + assert.verifySteps(["web_save"]); assert.deepEqual(getNodesTextContent(target.querySelectorAll(".o_data_cell.o_list_char")), [ "blip", "My little Foo Value", @@ -2734,8 +2734,8 @@ QUnit.module("Fields", (hooks) => { readIDs = args.args[0]; checkRead = false; } - if (args.method === "write") { - assert.step("write"); + if (args.method === "web_save") { + assert.step("web_save"); saveCount++; const commands = args.args[1].p; switch (saveCount) { @@ -2896,7 +2896,7 @@ QUnit.module("Fields", (hooks) => { // save await clickSave(target); - assert.verifySteps(["write", "write", "write"]); + assert.verifySteps(["web_save", "web_save", "web_save"]); }); QUnit.test( @@ -3729,7 +3729,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { const commands = args.args[1].p; assert.deepEqual(commands, [[3, 1]], "should send a command 3 (unlink)"); } @@ -3770,7 +3770,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { const commands = args.args[1].p; assert.deepEqual(commands, [[2, 1]]); } @@ -3823,7 +3823,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { const commands = args.args[1].p; assert.deepEqual(commands, [ [ @@ -4120,7 +4120,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC: function (route, args) { - if (args.method === "write") { + if (args.method === "web_save") { nbWrite++; assert.deepEqual(args.args[1], { p: [ @@ -4185,7 +4185,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { // Would be nice to assert this way, but we don't control the virtual ids index // assert.deepEqual(args.args[1].p, [ // [0, "virtual_2", { foo: "gemuse" }], @@ -4361,7 +4361,7 @@ QUnit.module("Fields", (hooks) => { await clickSave(target); assert.containsNone(target, "tr.o_data_row"); - assert.verifySteps(["get_views", "web_read", "onchange", "onchange", "write", "web_read"]); + assert.verifySteps(["get_views", "web_read", "onchange", "onchange", "web_save"]); }); QUnit.test("discard O2M field with close button", async function (assert) { @@ -4816,7 +4816,7 @@ QUnit.module("Fields", (hooks) => { "9" ); - assert.verifySteps(["get_views", "web_read", "onchange", "onchange", "write", "web_read"]); + assert.verifySteps(["get_views", "web_read", "onchange", "onchange", "web_save"]); }); QUnit.test("editable o2m, pressing ESC discard current changes", async function (assert) { @@ -5118,7 +5118,7 @@ QUnit.module("Fields", (hooks) => { await click(getPickerCell("1").at(0)); await clickSave(target); - assert.verifySteps(["get_views", "web_read", "onchange", "write", "web_read"]); + assert.verifySteps(["get_views", "web_read", "onchange", "web_save"]); }); QUnit.test("one2many and onchange only write modified field", async function (assert) { @@ -5162,7 +5162,7 @@ QUnit.module("Fields", (hooks) => { `, mockRPC: function (method, args) { - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual( args.args[1].turtles, [ @@ -5494,7 +5494,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual(args.args[1].p, [ [ 0, @@ -5936,10 +5936,10 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (route === "/web/dataset/call_kw/turtle/create") { + if (route === "/web/dataset/call_kw/turtle/web_save") { assert.ok(args.args, "should write on the turtle record"); } - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { assert.strictEqual(args.args[0][0], 1, "should write on the partner record 1"); assert.deepEqual( args.args[1].turtles, @@ -6037,7 +6037,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (route === "/web/dataset/call_kw/turtle/write") { + if (route === "/web/dataset/call_kw/turtle/web_save") { assert.strictEqual(args.args[0].length, 1, "should write on the turtle record"); assert.deepEqual( args.args[1], @@ -6045,7 +6045,7 @@ QUnit.module("Fields", (hooks) => { "should write only the product_id on the turtle record" ); } - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { assert.strictEqual(args.args[0][0], 1, "should write on the partner record 1"); assert.strictEqual( args.args[1].turtles[0][0], @@ -6301,10 +6301,10 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, args) { - if (args.method === "create") { - const virtualID = args.args[0][0].turtles[0][1]; + if (args.method === "web_save") { + const virtualID = args.args[1].turtles[0][1]; assert.deepEqual( - args.args[0][0].turtles, + args.args[1].turtles, [[0, virtualID, { turtle_foo: "cat" }]], "should send proper commands" ); @@ -6478,7 +6478,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual( args.args[1].turtles, [ @@ -6872,7 +6872,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual(args.args[1].turtles, [ [ 1, @@ -6926,7 +6926,7 @@ QUnit.module("Fields", (hooks) => { if (route === "/web/dataset/call_kw/partner/get_formview_id") { return Promise.resolve(false); } - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual( args.args[1].timmy, [[6, false, [12]]], @@ -7330,7 +7330,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { assert.step(args.method); assert.strictEqual(args.args[1].p.length, 1); const command = args.args[1].p[0]; @@ -7424,7 +7424,7 @@ QUnit.module("Fields", (hooks) => { // click all buttons await click(target, btn1Disabled); - assert.verifySteps(["write", "button_disabled_partner_4"]); + assert.verifySteps(["web_save", "button_disabled_partner_4"]); await click(target, btn1Warn); await click(target, btn2Disabled); await click(target, btn2Warn); @@ -7504,7 +7504,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { const commands = args.args[1].turtles; assert.deepEqual(commands, [ [0, commands[0][1], { turtle_foo: "default foo turtle" }], @@ -7551,7 +7551,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { const commands = args.args[1].turtles; assert.deepEqual(commands, [ [0, commands[0][1], { turtle_foo: "default foo turtle" }], @@ -8133,7 +8133,7 @@ QUnit.module("Fields", (hooks) => { }); QUnit.test("editable list: contexts are correctly sent", async function (assert) { - assert.expect(5); + assert.expect(4); serverData.models.partner.records[0].timmy = [12]; @@ -8166,7 +8166,7 @@ QUnit.module("Fields", (hooks) => { ); assert.deepEqual(args.kwargs.specification.timmy.context, { key2: "hello" }); } - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual( args.kwargs.context, { @@ -8174,8 +8174,9 @@ QUnit.module("Fields", (hooks) => { someKey: "some value", uid: 7, }, - "write context" + "read partner context" ); + assert.deepEqual(args.kwargs.specification.timmy.context, { key2: "hello" }); } }, resId: 1, @@ -8406,7 +8407,7 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual(args.args[1].p[0][2], { p: [[1, 1, { display_name: "new name" }]], }); @@ -8534,7 +8535,7 @@ QUnit.module("Fields", (hooks) => { }); QUnit.test("editing tabbed one2many (editable=bottom)", async function (assert) { - assert.expect(11); + assert.expect(10); serverData.models.partner.records[0].turtles = []; for (let i = 0; i < 42; i++) { @@ -8560,7 +8561,7 @@ QUnit.module("Fields", (hooks) => { resId: 1, mockRPC(route, args) { assert.step(args.method); - if (args.method === "write") { + if (args.method === "web_save") { assert.strictEqual( args.args[1].turtles[0][0], 0, @@ -8578,7 +8579,7 @@ QUnit.module("Fields", (hooks) => { await clickSave(target); assert.containsN(target, "tr.o_data_row", 40); - assert.verifySteps(["get_views", "web_read", "onchange", "write", "web_read"]); + assert.verifySteps(["get_views", "web_read", "onchange", "web_save"]); }); QUnit.test("editing tabbed one2many (editable=bottom), again...", async function (assert) { @@ -8612,7 +8613,7 @@ QUnit.module("Fields", (hooks) => { }); QUnit.test("editing tabbed one2many (editable=top)", async function (assert) { - assert.expect(14); + assert.expect(13); serverData.models.partner.records[0].turtles = []; serverData.models.turtle.fields.turtle_foo.default = "default foo"; @@ -8639,7 +8640,7 @@ QUnit.module("Fields", (hooks) => { resId: 1, mockRPC(route, args) { assert.step(args.method); - if (args.method === "write") { + if (args.method === "web_save") { assert.strictEqual(args.args[1].turtles[0][0], 0); assert.deepEqual(args.args[1].turtles[0][2], { turtle_foo: "rainbow dash" }); } @@ -8657,7 +8658,7 @@ QUnit.module("Fields", (hooks) => { await clickSave(target); assert.containsN(target, "tr.o_data_row", 40); - assert.verifySteps(["get_views", "web_read", "web_read", "onchange", "write", "web_read"]); + assert.verifySteps(["get_views", "web_read", "web_read", "onchange", "web_save"]); }); QUnit.test( @@ -8897,14 +8898,14 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, args) { - if (args.method === "create") { + if (args.method === "web_save") { assert.strictEqual( - args.args[0][0].p[0][0], + args.args[1].p[0][0], 0, "should send a command 0 (CREATE) for p" ); assert.deepEqual( - args.args[0][0].p[0][2], + args.args[1].p[0][2], { turtles: [[4, 1]] }, "should send the correct values" ); @@ -8978,7 +8979,7 @@ QUnit.module("Fields", (hooks) => { throw makeServerError({ type: "ValidationError" }); } } - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual( args.args[1].turtles[0], [1, 2, { turtle_foo: "foo" }], @@ -9008,7 +9009,7 @@ QUnit.module("Fields", (hooks) => { }); QUnit.test("propagate context to sub views without default_* keys", async function (assert) { - assert.expect(7); + assert.expect(6); await makeView({ type: "form", @@ -9138,8 +9139,8 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, args) { - if (args.method === "create") { - const commands = args.args[0][0].p; + if (args.method === "web_save") { + const commands = args.args[1].p; assert.deepEqual(commands, [ [ 0, @@ -10595,8 +10596,7 @@ QUnit.module("Fields", (hooks) => { "onchange", // main record "onchange", // line 1 "onchange", // line 2 - "create", - "web_read", // main record + "web_save", ]); } ); @@ -10620,7 +10620,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { args.args[1].p[0][2].datetime = "2018-04-05 12:00:00"; } }, @@ -13033,8 +13033,8 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (args.method === "write") { - assert.step("write"); // should not happen + if (args.method === "web_save") { + assert.step("web_save"); // should not happen } }, }); @@ -13051,7 +13051,7 @@ QUnit.module("Fields", (hooks) => { assert.containsNone(target, ".o_kanban_record:not(.o_kanban_ghost)"); await clickSave(target); - assert.verifySteps(["write"]); + assert.verifySteps(["web_save"]); }); QUnit.test("toggle boolean in o2m with the formView in edition", async function (assert) { @@ -13082,7 +13082,7 @@ QUnit.module("Fields", (hooks) => { assert.verifySteps(["get_views partner", "web_read partner"]); await click(target, ".o_boolean_toggle"); - assert.verifySteps(["onchange partner", "write turtle", "web_read turtle"]); + assert.verifySteps(["onchange partner", "web_save turtle"]); }); QUnit.test("create a new record with an x2m invisible", async function (assert) { @@ -13132,11 +13132,9 @@ QUnit.module("Fields", (hooks) => { }, }; } - if (args.method === "create") { - const commands = args.args[0][0].p; + if (args.method === "web_save") { + const commands = args.args[1].p; assert.deepEqual(commands, [[0, commands[0][1], { int_field: 4, trululu: 1 }]]); - } - if (args.method === "web_read") { assert.deepEqual(args.kwargs.specification, { display_name: {}, p: {}, @@ -13149,7 +13147,7 @@ QUnit.module("Fields", (hooks) => { assert.verifySteps(["get_views", "onchange"]); await click(target, ".o_form_button_save"); - assert.verifySteps(["create", "web_read"]); + assert.verifySteps(["web_save"]); }); QUnit.test("edit a record with an x2m invisible", async function (assert) { @@ -13176,10 +13174,15 @@ QUnit.module("Fields", (hooks) => { turtles: {}, }); } - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual(args.args[1], { foo: "plop", }); + assert.deepEqual(args.kwargs.specification, { + display_name: {}, + foo: {}, + turtles: {}, + }); } }, resId: 1, @@ -13190,7 +13193,7 @@ QUnit.module("Fields", (hooks) => { await editInput(target, "[name='foo'] input", "plop"); await clickSave(target); - assert.verifySteps(["write partner", "web_read partner"]); + assert.verifySteps(["web_save partner"]); }); QUnit.test("can't select a record in a one2many", async function (assert) { @@ -13682,7 +13685,7 @@ QUnit.module("Fields", (hooks) => { await click(target.querySelector(".modal .o_form_button_save")); assert.strictEqual(target.querySelector(".o_data_row").textContent, "changed5"); await click(target, ".o_form_button_save"); - assert.verifySteps(["create: partner", "web_read: partner"]); + assert.verifySteps(["web_save: partner"]); assert.strictEqual(target.querySelector(".o_data_row").textContent, "changed5"); }); @@ -13768,8 +13771,8 @@ QUnit.module("Fields", (hooks) => { }; const mockRPC = async (route, args) => { - if (args.method === "write") { - assert.step("write"); + if (args.method === "web_save") { + assert.step("web_save"); assert.deepEqual(args.args[1], { p: [[0, args.args[1].p[0][1], { display_name: "a name" }]], }); @@ -13792,7 +13795,7 @@ QUnit.module("Fields", (hooks) => { await nextTick(); doAction(webClient, 2); await nextTick(); - assert.verifySteps(["write"]); + assert.verifySteps(["web_save"]); def.resolve(); await nextTick(); @@ -13979,7 +13982,7 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual(args.args[1], { int_field: 16, p: [ diff --git a/addons/web/static/tests/views/fields/pdf_viewer_field_tests.js b/addons/web/static/tests/views/fields/pdf_viewer_field_tests.js index 1359744f33d..28d66b9f45e 100644 --- a/addons/web/static/tests/views/fields/pdf_viewer_field_tests.js +++ b/addons/web/static/tests/views/fields/pdf_viewer_field_tests.js @@ -83,8 +83,8 @@ QUnit.module("Fields", (hooks) => { serverData, arch: '
', async mockRPC(_route, { method, args }) { - if (method === "create") { - assert.deepEqual(args[0], [{ document: btoa("test") }]); + if (method === "web_save") { + assert.deepEqual(args[1], { document: btoa("test") }); } }, }); diff --git a/addons/web/static/tests/views/fields/percentage_field_tests.js b/addons/web/static/tests/views/fields/percentage_field_tests.js index 427ec0ec82d..3713eb05235 100644 --- a/addons/web/static/tests/views/fields/percentage_field_tests.js +++ b/addons/web/static/tests/views/fields/percentage_field_tests.js @@ -41,7 +41,7 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, { args, method }) { - if (method === "write") { + if (method === "web_save") { assert.strictEqual( args[1].float_field, 0.24, diff --git a/addons/web/static/tests/views/fields/priority_field_tests.js b/addons/web/static/tests/views/fields/priority_field_tests.js index 0f8f9ddc9a5..9ecfbdd4a6b 100644 --- a/addons/web/static/tests/views/fields/priority_field_tests.js +++ b/addons/web/static/tests/views/fields/priority_field_tests.js @@ -333,14 +333,14 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, args) { - if (args.method === "write") { - assert.step(`write ${JSON.stringify(args.args)}`); + if (args.method === "web_save") { + assert.step(`web_save ${JSON.stringify(args.args)}`); } }, }); assert.containsNone(target, ".o_kanban_record .fa-star"); await click(target.querySelector(".o_priority a.o_priority_star.fa-star-o"), null, true); - assert.verifySteps(['write [[1],{"selection":"1"}]']); + assert.verifySteps(['web_save [[1],{"selection":"1"}]']); assert.containsOnce(target, ".o_kanban_record .fa-star"); await click( @@ -349,7 +349,7 @@ QUnit.module("Fields", (hooks) => { ); await click(target, ".o_kanban_quick_create .o_kanban_add"); await click(target.querySelector(".o_priority a.o_priority_star.fa-star-o"), null, true); - assert.verifySteps(['write [[6],{"selection":"1"}]']); + assert.verifySteps(['web_save [[6],{"selection":"1"}]']); assert.containsN(target, ".o_kanban_record .fa-star", 2); }); @@ -636,8 +636,8 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(_route, { method }) { - if (method === "write") { - assert.step("write"); + if (method === "web_save") { + assert.step("web_save"); } }, }); @@ -646,7 +646,7 @@ QUnit.module("Fields", (hooks) => { ".o_field_widget .o_priority a.o_priority_star.fa-star-o" ); await click(stars[stars.length - 1]); - assert.verifySteps(["write"]); + assert.verifySteps(["web_save"]); }); QUnit.test("PriorityField - prevent auto save with autosave option", async function (assert) { diff --git a/addons/web/static/tests/views/fields/progress_bar_field_tests.js b/addons/web/static/tests/views/fields/progress_bar_field_tests.js index 1fa812e55f3..4341ff75b0c 100644 --- a/addons/web/static/tests/views/fields/progress_bar_field_tests.js +++ b/addons/web/static/tests/views/fields/progress_bar_field_tests.js @@ -84,7 +84,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, { method, args }) { - if (method === "write") { + if (method === "web_save") { assert.deepEqual( args[1], { int_field: 999, float_field: 5, display_name: "new name" }, @@ -126,7 +126,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, { method, args }) { - if (method === "write") { + if (method === "web_save") { assert.strictEqual( args[1].int_field, 69, @@ -178,7 +178,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, { method, args }) { - if (method === "write") { + if (method === "web_save") { assert.strictEqual( args[1].int_field, 69, @@ -225,7 +225,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, { method, args }) { - if (method === "write") { + if (method === "web_save") { assert.strictEqual( args[1].float_field, 69, @@ -319,7 +319,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, { method, args }) { - if (method === "write") { + if (method === "web_save") { assert.strictEqual(args[1].int_field, 69, "New value of progress bar saved"); } }, @@ -378,7 +378,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(route, { method, args }) { - if (method === "write") { + if (method === "web_save") { throw new Error("Not supposed to write"); } }, @@ -462,7 +462,7 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC: function (route, { method, args }) { - if (method === "write") { + if (method === "web_save") { assert.strictEqual( args[1].int_field, 1037, diff --git a/addons/web/static/tests/views/fields/properties_field_tests.js b/addons/web/static/tests/views/fields/properties_field_tests.js index d34304d4e46..0337bd4f155 100644 --- a/addons/web/static/tests/views/fields/properties_field_tests.js +++ b/addons/web/static/tests/views/fields/properties_field_tests.js @@ -1296,7 +1296,7 @@ QUnit.module("Fields", (hooks) => { if (method === "check_access_rights") { return true; } - if (method === "write") { + if (method === "web_save") { assert.deepEqual(args[1].properties, [ { name: "property_1", @@ -1345,7 +1345,7 @@ QUnit.module("Fields", (hooks) => { // save assert.verifySteps([]); await clickSave(target); - assert.verifySteps(["write", "web_read"]); + assert.verifySteps(["web_save"]); }); /** @@ -1875,7 +1875,7 @@ QUnit.module("Fields", (hooks) => { // We open the property popover await click(target, ".o_property_field:first-child .o_field_property_open_popover"); - assert.containsOnce(target,".o_field_property_definition"); + assert.containsOnce(target, ".o_field_property_definition"); // Trying to delete the property should have closed its definition popover // We click on delete button diff --git a/addons/web/static/tests/views/fields/radio_field_tests.js b/addons/web/static/tests/views/fields/radio_field_tests.js index 33d5e8ea087..be897d49936 100644 --- a/addons/web/static/tests/views/fields/radio_field_tests.js +++ b/addons/web/static/tests/views/fields/radio_field_tests.js @@ -315,7 +315,7 @@ QUnit.module("Fields", (hooks) => { serverData, arch: '
', mockRPC: function (route, { args, method, model }) { - if (model === "partner" && method === "write") { + if (model === "partner" && method === "web_save") { assert.strictEqual(args[1].selection, "1", "should write correct value"); } }, diff --git a/addons/web/static/tests/views/fields/reference_field_tests.js b/addons/web/static/tests/views/fields/reference_field_tests.js index 84088e15258..978d2affd78 100644 --- a/addons/web/static/tests/views/fields/reference_field_tests.js +++ b/addons/web/static/tests/views/fields/reference_field_tests.js @@ -252,8 +252,7 @@ QUnit.module("Fields", (hooks) => { "name_search", // for the select "name_search", // for the spawned many2one "name_create", - "create", - "web_read", + "web_save", ], "The name_create method should have been called" ); @@ -437,7 +436,7 @@ QUnit.module("Fields", (hooks) => { "the name_search should be done on the newly set model" ); } - if (method === "write") { + if (method === "web_save") { assert.strictEqual(model, "partner", "should write on the current model"); assert.deepEqual( args, @@ -527,13 +526,11 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, { args, method }) { - if (method === "create") { - assert.deepEqual(args[0], [ - { - bar: false, - reference_char: "False,0", - }, - ]); + if (method === "web_save") { + assert.deepEqual(args[1], { + bar: false, + reference_char: "False,0", + }); } }, }); @@ -566,13 +563,11 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, { args, method }) { - if (method === "create") { - assert.deepEqual(args[0], [ - { - bar: false, - reference: "partner,4", - }, - ]); + if (method === "web_save") { + assert.deepEqual(args[1], { + bar: false, + reference: "partner,4", + }); } }, }); @@ -849,7 +844,7 @@ QUnit.module("Fields", (hooks) => { ); QUnit.test("Reference field with default value in list view", async function (assert) { - assert.expect(2); + assert.expect(1); await makeView({ type: "list", @@ -870,9 +865,8 @@ QUnit.module("Fields", (hooks) => { }, }, }; - } else if (method === "create") { - assert.strictEqual(args.length, 1); - assert.strictEqual(args[0][0].reference, "partner,2"); + } else if (method === "web_save") { + assert.strictEqual(args[1].reference, "partner,2"); } }, }); diff --git a/addons/web/static/tests/views/fields/selection_field_tests.js b/addons/web/static/tests/views/fields/selection_field_tests.js index 2acf544ac04..c0d1282be52 100644 --- a/addons/web/static/tests/views/fields/selection_field_tests.js +++ b/addons/web/static/tests/views/fields/selection_field_tests.js @@ -225,7 +225,7 @@ QUnit.module("Fields", (hooks) => { serverData, arch: '
', mockRPC(route, { args, method }) { - if (method === "write") { + if (method === "web_save") { assert.strictEqual( args[1].trululu, false, diff --git a/addons/web/static/tests/views/fields/state_selection_field_tests.js b/addons/web/static/tests/views/fields/state_selection_field_tests.js index 57f55573b58..2369254d9f3 100644 --- a/addons/web/static/tests/views/fields/state_selection_field_tests.js +++ b/addons/web/static/tests/views/fields/state_selection_field_tests.js @@ -554,8 +554,8 @@ QUnit.module("Fields", (hooks) => { `, mockRPC: (route, args, performRPC) => { - if (route === "/web/dataset/call_kw/partner/write") { - assert.step("write"); + if (route === "/web/dataset/call_kw/partner/web_save") { + assert.step("web_save"); } return performRPC(route, args); }, @@ -566,7 +566,7 @@ QUnit.module("Fields", (hooks) => { const doneItem = target.querySelectorAll(".dropdown-item")[2]; // item "done"; await click(doneItem); - assert.verifySteps(["write"]); + assert.verifySteps(["web_save"]); assert.hasClass(target.querySelector(".o_field_state_selection span"), "o_status_green"); }); @@ -587,15 +587,15 @@ QUnit.module("Fields", (hooks) => { `, resId: 1, mockRPC(_route, { method }) { - if (method === "write") { - assert.step("write"); + if (method === "web_save") { + assert.step("web_save"); } }, }); await click(target, ".o_field_widget.o_field_state_selection .o_status"); await click(target, ".dropdown-menu .dropdown-item:last-child"); - assert.verifySteps(["write"]); + assert.verifySteps(["web_save"]); } ); diff --git a/addons/web/static/tests/views/fields/statusbar_field_tests.js b/addons/web/static/tests/views/fields/statusbar_field_tests.js index 6c0562217a5..2dc24e62d61 100644 --- a/addons/web/static/tests/views/fields/statusbar_field_tests.js +++ b/addons/web/static/tests/views/fields/statusbar_field_tests.js @@ -611,8 +611,8 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(_route, { method }) { - if (method === "write") { - assert.step("write"); + if (method === "web_save") { + assert.step("web_save"); } }, }); @@ -620,7 +620,7 @@ QUnit.module("Fields", (hooks) => { ".o_statusbar_status button.btn:not(.dropdown-toggle):not(:disabled):not(.o_arrow_button_current)" ); await click(clickableButtons[clickableButtons.length - 1]); - assert.verifySteps(["write"]); + assert.verifySteps(["web_save"]); }); QUnit.test( diff --git a/addons/web/static/tests/views/form/form_view_tests.js b/addons/web/static/tests/views/form/form_view_tests.js index 2b65f13cf88..ebfab9a654c 100644 --- a/addons/web/static/tests/views/form/form_view_tests.js +++ b/addons/web/static/tests/views/form/form_view_tests.js @@ -775,9 +775,9 @@ QUnit.module("Views", (hooks) => { `, mockRPC(route, args) { - if (args.method === "create") { + if (args.method === "web_save") { assert.deepEqual( - args.args[0][0], + args.args[1], { display_name: "plop", foo: "My little Foo Value", @@ -785,14 +785,14 @@ QUnit.module("Views", (hooks) => { }, " 'int_field' and 'bar' shouldn't be present" ); - assert.step("create"); + assert.step("web_save"); } }, }); await editInput(target, "[name='display_name'] input", "plop"); await clickSave(target); - assert.verifySteps(["create"]); + assert.verifySteps(["web_save"]); }); QUnit.test("decoration-bf works on fields", async function (assert) { @@ -2464,8 +2464,8 @@ QUnit.module("Views", (hooks) => { `, mockRPC(route, args) { - if (args.method === "create") { - assert.deepEqual(args.args[0][0], { + if (args.method === "web_save") { + assert.deepEqual(args.args[1], { bar: true, int_field: 0, foo: "some value", @@ -3078,7 +3078,7 @@ QUnit.module("Views", (hooks) => { "qux input is properly formatted" ); - assert.verifySteps(["get_views", "onchange", "create", "web_read", "write", "web_read"]); + assert.verifySteps(["get_views", "onchange", "web_save", "web_save"]); }); QUnit.test("separators", async function (assert) { @@ -3478,7 +3478,7 @@ QUnit.module("Views", (hooks) => { QUnit.test("buttons in form view, new record", async function (assert) { // this test simulates a situation similar to the settings forms. - assert.expect(9); + assert.expect(8); serverData.models.partner.records = []; // such that we know the created record will be id 1 const mockedActionService = { @@ -3523,11 +3523,11 @@ QUnit.module("Views", (hooks) => { await click(target.querySelector(".o_form_statusbar button.p")); - assert.verifySteps(["create", "web_read", "execute_action", "web_read"]); + assert.verifySteps(["web_save", "execute_action", "web_read"]); }); QUnit.test("buttons in form view, new record, with field id in view", async function (assert) { - assert.expect(8); + assert.expect(7); // buttons in form view are one of the rare example of situation when we // save a record without reloading it immediately, because we only care // about its id for the next step. But at some point, if the field id @@ -3574,14 +3574,7 @@ QUnit.module("Views", (hooks) => { await click(target.querySelector(".o_form_statusbar button.p")); - assert.verifySteps([ - "get_views", - "onchange", - "create", - "web_read", - "execute_action", - "web_read", - ]); + assert.verifySteps(["get_views", "onchange", "web_save", "execute_action", "web_read"]); }); QUnit.test("buttons with data-hotkey attribute", async function (assert) { @@ -3622,8 +3615,8 @@ QUnit.module("Views", (hooks) => { serverData, arch: '
', mockRPC(route, args) { - if (args.method === "write") { - assert.ok(true, "should call the /write route"); + if (args.method === "web_save") { + assert.ok(true, "should call the web_save route"); assert.strictEqual(args.args[1].foo, "tralala"); } }, @@ -3642,7 +3635,7 @@ QUnit.module("Views", (hooks) => { serverData, arch: '
', mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { args.args[1].foo = "apple"; } }, @@ -3662,9 +3655,8 @@ QUnit.module("Views", (hooks) => { serverData, arch: '
', async mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { args.args[1].foo = "apple"; - } else if (args.method === "web_read") { // Block the 'read' call await Promise.resolve(def); } @@ -3921,7 +3913,7 @@ QUnit.module("Views", (hooks) => { resId: 1, context: { active_field: 2 }, mockRPC(route, args) { - if (args.method === "create") { + if (args.method === "web_save") { assert.strictEqual( args.kwargs.context.active_field, 2, @@ -4476,12 +4468,7 @@ QUnit.module("Views", (hooks) => { await click(document.body.querySelector(".modal-footer .btn-primary")); assert.verifySteps(["action_archive: partner", "get_views: product", "onchange: product"]); await click(target, ".modal footer .myButton"); - assert.verifySteps([ - "create: product", - "web_read: product", - "do_archive: product", - "web_read: partner", - ]); + assert.verifySteps(["web_save: product", "do_archive: product", "web_read: partner"]); assert.containsNone(target, ".modal"); assert.strictEqual(target.querySelector("[name='active'] input").value, "archived"); }); @@ -4612,8 +4599,8 @@ QUnit.module("Views", (hooks) => { arch: '
', actionMenus: {}, async mockRPC(route, args) { - if (args.method === "create") { - assert.step("create"); + if (args.method === "web_save") { + assert.step("web_save"); throw makeServerError(); } if (args.method === "copy") { @@ -4628,7 +4615,7 @@ QUnit.module("Views", (hooks) => { // Discard changes don't trigger Duplicate action await click(target, ".modal .btn-secondary"); - assert.verifySteps(["create"]); + assert.verifySteps(["web_save"]); }); QUnit.test("clicking on stat buttons in edit mode", async function (assert) { @@ -4663,7 +4650,7 @@ QUnit.module("Views", (hooks) => { `, resId: 2, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { assert.strictEqual( args.args[1].foo, "tralala", @@ -4683,7 +4670,7 @@ QUnit.module("Views", (hooks) => { assert.containsOnce(target, ".o_form_editable", "form view should be in edit mode"); assert.strictEqual(count, 2, "should have triggered a execute action"); - assert.verifySteps(["get_views", "web_read", "write", "web_read"]); + assert.verifySteps(["get_views", "web_read", "web_save"]); }); QUnit.test("clicking on stat buttons save and reload in edit mode", async function (assert) { @@ -4715,7 +4702,7 @@ QUnit.module("Views", (hooks) => { `, resId: 2, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { // simulate an override of the model... args.args[1].display_name = "GOLDORAK"; args.args[1].name = "GOLDORAK"; @@ -4763,7 +4750,7 @@ QUnit.module("Views", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { writeCount++; } }, @@ -4811,7 +4798,7 @@ QUnit.module("Views", (hooks) => { await editInput(target, ".o_field_widget[name=foo] input", "tralala"); await click(target.querySelector(".o_content button.btn-primary")); - assert.verifySteps(["get_views", "web_read", "write", "web_read", "execute_action"]); + assert.verifySteps(["get_views", "web_read", "web_save", "execute_action"]); }); QUnit.test('buttons with attr "special" in dialog close the dialog', async function (assert) { @@ -4844,10 +4831,10 @@ QUnit.module("Views", (hooks) => { if (route === "/web/dataset/call_kw/product/get_formview_id") { return false; } - if (route === "/web/dataset/call_kw/product/create") { + if (route === "/web/dataset/call_kw/product/web_save") { assert.step("create RPC"); } - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { assert.step("write RPC"); } }, @@ -5414,7 +5401,7 @@ QUnit.module("Views", (hooks) => { resIds: [1, 2], resId: 1, mockRPC(route) { - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { nbWrite++; } }, @@ -5497,7 +5484,7 @@ QUnit.module("Views", (hooks) => { await click(target.querySelector(".o_pager_next")); assert.strictEqual(target.querySelector(".o_pager_value").textContent, "2"); - assert.verifySteps(["get_views", "web_read", "write", "web_read"]); + assert.verifySteps(["get_views", "web_read", "web_save", "web_read"]); }); QUnit.test("switching to another record from an invalid one", async function (assert) { @@ -5512,8 +5499,8 @@ QUnit.module("Views", (hooks) => { resIds: [1, 2], resId: 1, mockRPC(route) { - if (route === "/web/dataset/call_kw/partner/write") { - assert.step("write"); + if (route === "/web/dataset/call_kw/partner/web_save") { + assert.step("web_save"); } }, }); @@ -5546,8 +5533,8 @@ QUnit.module("Views", (hooks) => { resIds: [1, 2], resId: 1, mockRPC(route) { - if (route === "/web/dataset/call_kw/partner/write") { - assert.step("write"); + if (route === "/web/dataset/call_kw/partner/web_save") { + assert.step("web_save"); } }, }); @@ -5614,7 +5601,7 @@ QUnit.module("Views", (hooks) => { resIds: [1, 2], resId: 1, mockRPC(route) { - if (route === "/web/dataset/call_kw/partner/write") { + if (route === "/web/dataset/call_kw/partner/web_save") { nbWrite++; } }, @@ -6514,7 +6501,7 @@ QUnit.module("Views", (hooks) => { }); QUnit.test("properly apply onchange on many2many fields", async function (assert) { - assert.expect(11); + assert.expect(10); serverData.models.partner.onchanges = { foo: function (obj) { @@ -6537,7 +6524,7 @@ QUnit.module("Views", (hooks) => { `, mockRPC(route, args) { assert.step(args.method); - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual( args.args[1].timmy, [ @@ -6572,7 +6559,7 @@ QUnit.module("Views", (hooks) => { await clickSave(target); - assert.verifySteps(["get_views", "web_read", "onchange", "write", "web_read"]); + assert.verifySteps(["get_views", "web_read", "onchange", "web_save"]); }); QUnit.test( @@ -6923,7 +6910,7 @@ QUnit.module("Views", (hooks) => { arch: `
`, resId: 2, async mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { await def; } }, @@ -7028,7 +7015,7 @@ QUnit.module("Views", (hooks) => { }, }); } - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual( args.args[1].p, [ @@ -7538,8 +7525,8 @@ QUnit.module("Views", (hooks) => {
`, mockRPC(route, args) { - if (args.method === "create") { - const command = args.args[0][0].p; + if (args.method === "web_save") { + const command = args.args[1].p; assert.deepEqual( command, [ @@ -7586,18 +7573,18 @@ QUnit.module("Views", (hooks) => {
`, mockRPC(route, args) { - if (args.method === "create") { + if (args.method === "web_save") { assert.deepEqual( - args.args[0][0].p, + args.args[1].p, [ [ 0, - args.args[0][0].p[0][1], + args.args[1].p[0][1], { p: [ [ 0, - args.args[0][0].p[0][2].p[0][1], + args.args[1].p[0][2].p[0][1], { display_name: "xtv" }, ], ], @@ -7707,7 +7694,7 @@ QUnit.module("Views", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual(args.args[1], { foo: "New foo value" }); } }, @@ -7751,11 +7738,11 @@ QUnit.module("Views", (hooks) => {
`, mockRPC(route, args) { - if (args.method === "create") { + if (args.method === "web_save") { // foo should be saved because of the "force_save" attribute // qux should be saved because it isn't readonly // int_field should not be saved as it is readonly - const commands = args.args[0][0].p; + const commands = args.args[1].p; assert.deepEqual(commands, [ [0, commands[0][1], { foo: "some value", qux: 6.5 }], ]); @@ -8301,8 +8288,8 @@ QUnit.module("Views", (hooks) => { serverData, arch: `
`, mockRPC(route, { method, args }) { - if (method === "create") { - assert.deepEqual(args[0][0].bar, false); + if (method === "web_save") { + assert.deepEqual(args[1].bar, false); } }, }); @@ -8526,8 +8513,7 @@ QUnit.module("Views", (hooks) => { assert.verifySteps([ "get_views", "onchange", - "create", - "web_read", + "web_save", `{"action_id":29,"context":{"lang":"en","uid":7,"tz":"taht","active_id":6,"active_ids":[6],"active_model":"partner","active_domain":[]}}`, "web_read", ]); @@ -8593,7 +8579,7 @@ QUnit.module("Views", (hooks) => { mockRPC(route, args) { if (route === "/web/dataset/call_kw/product/get_formview_id") { return false; - } else if (args.method === "write") { + } else if (args.method === "web_save") { assert.strictEqual(args.model, "product"); assert.strictEqual(args.args[1].product_ids[0][2].display_name, "xtv"); } @@ -9402,7 +9388,7 @@ QUnit.module("Views", (hooks) => { assert.verifySteps(["get_views", "onchange"]); assert.containsOnce(target, ".o_form_editable"); await click(target, ".o_field_translate.btn-link"); - assert.verifySteps(["create", "web_read", "get_installed", "get_field_translations"]); + assert.verifySteps(["web_save", "get_installed", "get_field_translations"]); assert.containsOnce(target, ".modal"); assert.strictEqual(target.querySelector(".modal-title").textContent, "Translate: foo"); }); @@ -9730,7 +9716,7 @@ QUnit.module("Views", (hooks) => { await click(target.querySelector(".o_statusbar_buttons button")); assert.verifySteps([]); await click(target.querySelector(".modal-footer button.btn-primary")); - assert.verifySteps(["create", "web_read", "execute_action"]); + assert.verifySteps(["web_save", "execute_action"]); } ); @@ -9808,7 +9794,7 @@ QUnit.module("Views", (hooks) => { await Promise.resolve(); assert.ok(target.querySelector(".modal-footer button.btn-primary").disabled); await nextTick(); - assert.verifySteps(["create", "web_read", "execute_action"]); + assert.verifySteps(["web_save", "execute_action"]); }); QUnit.test( @@ -9877,7 +9863,7 @@ QUnit.module("Views", (hooks) => { resId: 1, mockRPC(route, args) { assert.step(args.method); - if (args.method === "write") { + if (args.method === "web_save") { return def; } }, @@ -9892,8 +9878,7 @@ QUnit.module("Views", (hooks) => { assert.verifySteps([ "get_views", "web_read", // initial read to render the view - "write", // write on save - "web_read", // read on reload + "web_save", // write on save ]); }); @@ -9921,7 +9906,7 @@ QUnit.module("Views", (hooks) => { resId: 1, mockRPC(route, args) { assert.step(args.method); - if (args.method === "write" && args.args[1].foo === "incorrect value") { + if (args.method === "web_save" && args.args[1].foo === "incorrect value") { return Promise.reject(new Error("Odoo Server Error")); } }, @@ -9938,9 +9923,8 @@ QUnit.module("Views", (hooks) => { assert.verifySteps([ "get_views", "web_read", // initial read to render the view - "write", // write on save (it fails, does not trigger a read) - "write", // write on save (it works) - "web_read", // read on reload + "web_save", // write on save (it fails, does not trigger a read) + "web_save", // write on save (it works) ]); }); @@ -9975,8 +9959,8 @@ QUnit.module("Views", (hooks) => { mode: "readonly", resId: 1, mockRPC(route, args) { - if (args.method === "write") { - assert.step("write"); + if (args.method === "web_save") { + assert.step("web_save"); if (failFlag) { return Promise.reject(new Error("Odoo Server Error")); } @@ -10010,10 +9994,9 @@ QUnit.module("Views", (hooks) => { assert.verifySteps([ "web_read", - "write", // fails + "web_save", // fails "web_read", // must reload when saving fails - "write", // works - "web_read", // must reload when saving works + "web_save", // works ]); } ); @@ -10104,11 +10087,11 @@ QUnit.module("Views", (hooks) => { ); } } - if (args.method === "create") { + if (args.method === "web_save") { assert.deepEqual( - args.args[0][0], + args.args[1], { - p: [[0, args.args[0][0].p[0][1], { display_name: "readonly" }]], + p: [[0, args.args[1].p[0][1], { display_name: "readonly" }]], }, "should not have sent the value of the readonly field" ); @@ -10357,7 +10340,7 @@ QUnit.module("Views", (hooks) => { "web_read", // first dialog "get_formview_id", // id of second form view opened in a dialog "web_read", // second dialog - "write", // save second dialog + "web_save", // save second dialog "read", // reload the display_name (first dialog) ]); }); @@ -10851,7 +10834,7 @@ QUnit.module("Views", (hooks) => { `, resId: 1, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual(args.args[1].p[0][2], values); } }, @@ -10916,7 +10899,7 @@ QUnit.module("Views", (hooks) => { "some foo value", "foo field should have correct value" ); - assert.verifySteps(["get_views", "onchange", "create", "web_read"]); + assert.verifySteps(["get_views", "onchange", "web_save"]); }); QUnit.test("saving with invalid uncommitted changes", async function (assert) { @@ -10981,10 +10964,10 @@ QUnit.module("Views", (hooks) => { if (args.method === "onchange") { await onchangeDef; } - if (args.method === "create") { - assert.step("create"); + if (args.method === "web_save") { + assert.step("web_save"); assert.strictEqual( - args.args[0][0].p[0][2].foo, + args.args[1].p[0][2].foo, "foo value", "should have wait for the onchange to return before saving" ); @@ -11015,7 +10998,7 @@ QUnit.module("Views", (hooks) => { onchangeDef.resolve(); await nextTick(); - assert.verifySteps(["resolve", "create"]); + assert.verifySteps(["resolve", "web_save"]); } ); @@ -11058,7 +11041,7 @@ QUnit.module("Views", (hooks) => { if (args.method === "onchange") { await onchangeDef; } - if (args.method === "create") { + if (args.method === "web_save") { await createDef; } }; @@ -11150,7 +11133,7 @@ QUnit.module("Views", (hooks) => { const writeDef = makeDeferred(); const mockRPC = async (route, args) => { - if (args.method === "write") { + if (args.method === "web_save") { writeCalls += 1; await writeDef; } @@ -11573,7 +11556,7 @@ QUnit.module("Views", (hooks) => { await editInput(target, '.o_field_widget[name="name"] input', "Test Company"); await clickSave(target); - assert.verifySteps(["get_views", "onchange", "create", "reload company", "web_read"]); + assert.verifySteps(["get_views", "onchange", "web_save", "reload company"]); } ); @@ -11619,7 +11602,7 @@ QUnit.module("Views", (hooks) => { await editInput(target, '.o_field_widget[name="name"] input', "Test Company2"); await clickSave(target); - assert.verifySteps(["get_views", "web_read", "write", "reload company", "web_read"]); + assert.verifySteps(["get_views", "web_read", "web_save", "reload company"]); } ); @@ -11733,7 +11716,7 @@ QUnit.module("Views", (hooks) => { }; const mockRPC = (route, args) => { - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual(args.args, [[1], { name: "aaa" }]); } }; @@ -11809,7 +11792,7 @@ QUnit.module("Views", (hooks) => { }; const mockRPC = (route, args) => { - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual(args.args, [[1], { name: "aaa" }]); } }; @@ -11887,8 +11870,8 @@ QUnit.module("Views", (hooks) => { const webClient = await createWebClient({ serverData, mockRPC(route, { method }) { - if (method === "write") { - assert.step("write"); + if (method === "web_save") { + assert.step("web_save"); throw makeServerError(); } }, @@ -11898,7 +11881,7 @@ QUnit.module("Views", (hooks) => { await editInput(target, ".o_field_widget[name='name'] input", "aaa"); await click(target.querySelector(".breadcrumb-item.o_back_button")); - assert.verifySteps(["write"]); + assert.verifySteps(["web_save"]); await nextTick(); assert.containsOnce(target, ".o_error_dialog"); }); @@ -11949,7 +11932,7 @@ QUnit.module("Views", (hooks) => { }; const mockRPC = (route, args) => { - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual(args.args, [[1], { name: "aaa" }]); } }; @@ -11996,7 +11979,7 @@ QUnit.module("Views", (hooks) => { `, resId: 1, mockRPC(route, { args, method, model }) { - if (method === "write" && model === "partner") { + if (method === "web_save" && model === "partner") { assert.step("save"); // should be called assert.deepEqual(args, [[1], { display_name: "test" }]); } @@ -12031,7 +12014,7 @@ QUnit.module("Views", (hooks) => { `, resId: 1, mockRPC(route, { args, method, model }) { - if (method === "write" && model === "partner") { + if (method === "web_save" && model === "partner") { assert.step("save"); // should not be called } }, @@ -12059,7 +12042,7 @@ QUnit.module("Views", (hooks) => { `, resId: 1, mockRPC(route, { args, method, model }) { - if (method === "write" && model === "partner") { + if (method === "web_save" && model === "partner") { assert.step("save"); // should not be called } }, @@ -12121,7 +12104,7 @@ QUnit.module("Views", (hooks) => { `, resId: 1, mockRPC(route, { args, method, model }) { - if (method === "write" && model === "partner") { + if (method === "web_save" && model === "partner") { assert.step("save"); // should not be called } }, @@ -12167,7 +12150,7 @@ QUnit.module("Views", (hooks) => { }; const mockRPC = (route, args) => { - if (args.method === "write") { + if (args.method === "web_save") { assert.step("save"); } }; @@ -12222,7 +12205,7 @@ QUnit.module("Views", (hooks) => { if (method === "onchange" && model === "partner") { return def; } - if (method === "write" && model === "partner") { + if (method === "web_save" && model === "partner") { assert.deepEqual(args, [[1], { display_name: "test" }]); } }, @@ -12258,7 +12241,7 @@ QUnit.module("Views", (hooks) => { if (method === "onchange") { return def; } - if (method === "write") { + if (method === "web_save") { assert.deepEqual(args, [[1], { display_name: "test1", name: "test2" }]); } }, @@ -12282,7 +12265,7 @@ QUnit.module("Views", (hooks) => { resId: 1, mockRPC(route, { args, method }) { assert.step(method); - if (method === "write") { + if (method === "web_save") { assert.deepEqual(args, [[1], { foo: "test" }]); } }, @@ -12297,7 +12280,7 @@ QUnit.module("Views", (hooks) => { window.dispatchEvent(new Event("beforeunload")); await nextTick(); - assert.verifySteps(["get_views", "web_read", "write"]); + assert.verifySteps(["get_views", "web_read", "web_save"]); }); QUnit.test( @@ -12328,7 +12311,7 @@ QUnit.module("Views", (hooks) => { if (method === "onchange") { return def; } - if (method === "write") { + if (method === "web_save") { assert.deepEqual(args, [ [1], { display_name: "test", name: "test", foo: "test" }, @@ -12353,7 +12336,7 @@ QUnit.module("Views", (hooks) => { window.dispatchEvent(new Event("beforeunload")); await nextTick(); - assert.verifySteps(["get_views", "web_read", "onchange", "write"]); + assert.verifySteps(["get_views", "web_read", "onchange", "web_save"]); } ); @@ -12370,7 +12353,7 @@ QUnit.module("Views", (hooks) => { resId: 1, mockRPC(route, { method }) { assert.step(method); - if (method === "write") { + if (method === "web_save") { assert.notOk(true, "should not call the /write route"); } }, @@ -12438,8 +12421,8 @@ QUnit.module("Views", (hooks) => { actionMenus: {}, resId: 1, mockRPC(route, { method }) { - if (method === "write") { - assert.step("write"); + if (method === "web_save") { + assert.step("web_save"); } }, }); @@ -12452,7 +12435,7 @@ QUnit.module("Views", (hooks) => { await click(target, ".o_cp_action_menus button"); await click(target.querySelector(".o_cp_action_menus .dropdown-menu .dropdown-item")); - assert.verifySteps(["write"]); + assert.verifySteps(["web_save"]); assert.strictEqual(target.querySelector(".o_pager_counter").textContent, "2 / 2"); assert.strictEqual(target.querySelector(".o_field_widget[name='foo'] input").value, "test"); @@ -12488,8 +12471,8 @@ QUnit.module("Views", (hooks) => { actionMenus: {}, resId: 1, mockRPC(route, { method }) { - if (method === "write") { - assert.step("write"); + if (method === "web_save") { + assert.step("web_save"); throw makeServerError(); } }, @@ -12498,7 +12481,7 @@ QUnit.module("Views", (hooks) => { await editInput(target, ".o_field_widget[name='foo'] input", "test"); await click(target, ".o_cp_action_menus button"); await click(target.querySelector(".o_cp_action_menus .dropdown-menu .dropdown-item")); - assert.verifySteps(["write"]); + assert.verifySteps(["web_save"]); await nextTick(); assert.containsOnce(target, ".o_error_dialog"); }); @@ -12511,8 +12494,8 @@ QUnit.module("Views", (hooks) => { arch: `
`, resId: 1, mockRPC(route, { method }) { - if (method === "write") { - assert.step("write"); + if (method === "web_save") { + assert.step("web_save"); } }, }); @@ -12524,7 +12507,7 @@ QUnit.module("Views", (hooks) => { target, ".o_control_panel_main_buttons .d-none.d-xl-inline-flex .o_form_button_create" ); - assert.verifySteps(["write"]); + assert.verifySteps(["web_save"]); assert.strictEqual( target.querySelector(".o_field_widget[name='foo'] input").value, "My little Foo Value" @@ -12559,8 +12542,8 @@ QUnit.module("Views", (hooks) => { actionMenus: {}, resId: 1, mockRPC(route, { method }) { - if (method === "write") { - assert.step("write"); + if (method === "web_save") { + assert.step("web_save"); throw makeServerError(); } }, @@ -12568,7 +12551,7 @@ QUnit.module("Views", (hooks) => { await editInput(target, ".o_field_widget[name='foo'] input", "test"); await createRecord(); - assert.verifySteps(["write"]); + assert.verifySteps(["web_save"]); await nextTick(); assert.containsOnce(target, ".o_error_dialog"); }); @@ -12599,8 +12582,8 @@ QUnit.module("Views", (hooks) => { const webClient = await createWebClient({ serverData, mockRPC(route, { method }) { - if (method === "create") { - assert.step("create"); + if (method === "web_save") { + assert.step("web_save"); throw makeServerError({ message: "Some business message" }); } }, @@ -12616,7 +12599,7 @@ QUnit.module("Views", (hooks) => { await editInput(target, ".o_field_widget[name='foo'] input", "test"); await click(target.querySelector(".modal footer .myButton")); - assert.verifySteps(["create"]); + assert.verifySteps(["web_save"]); await nextTick(); assert.containsOnce(target, ".o_error_dialog"); assert.containsN(target, ".modal", 2); @@ -12681,14 +12664,14 @@ QUnit.module("Views", (hooks) => {
`, mockRPC(route, args) { - if (args.method === "create") { + if (args.method === "web_save") { assert.deepEqual( - args.args[0][0], + args.args[1], { p: [ [ 0, - args.args[0][0].p[0][1], + args.args[1].p[0][1], { length: 0, display_name: "readonly" }, ], ], @@ -12869,19 +12852,17 @@ QUnit.module("Views", (hooks) => { `, mockRPC(route, args) { assert.step(args.method); - if (args.method === "create") { - assert.deepEqual(args.args[0], [ - { - int_field: 0, - text: false, - }, - ]); + if (args.method === "web_save") { + assert.deepEqual(args.args[1], { + int_field: 0, + text: false, + }); } }, }); await clickSave(target); - assert.verifySteps(["get_views", "onchange", "create", "web_read"]); + assert.verifySteps(["get_views", "onchange", "web_save"]); }); QUnit.test( @@ -12930,8 +12911,8 @@ QUnit.module("Views", (hooks) => { `, mockRPC(route, args) { assert.step(args.method); - if (args.method === "create") { - assert.deepEqual(args.args[0][0].p[0][2], { int_field: 1, text: false }); + if (args.method === "web_save") { + assert.deepEqual(args.args[1].p[0][2], { int_field: 1, text: false }); } }, }); @@ -12947,7 +12928,7 @@ QUnit.module("Views", (hooks) => { target.querySelector(".o_list_renderer .o_data_row [name='int_field']").textContent, "1" ); - assert.verifySteps(["get_views", "onchange", "onchange", "create", "web_read"]); + assert.verifySteps(["get_views", "onchange", "onchange", "web_save"]); } ); @@ -13174,7 +13155,7 @@ QUnit.module("Views", (hooks) => { serverData, arch: `
`, mockRPC(route, { method }) { - if (method === "write") { + if (method === "web_save") { return Promise.reject(false); } }, @@ -13215,7 +13196,7 @@ QUnit.module("Views", (hooks) => { serverData, arch: `
`, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { assert.step(`write ${args.args[0]}`); } }, @@ -13257,8 +13238,8 @@ QUnit.module("Views", (hooks) => { serverData, arch: `
`, mockRPC(route, args) { - if (args.method === "write") { - assert.step("write"); + if (args.method === "web_save") { + assert.step("web_save"); } }, }); @@ -13548,7 +13529,7 @@ QUnit.module("Views", (hooks) => { const mockRPC = async (route, args) => { if ( - (args.method === "web_read" || args.method === "write") && + (args.method === "web_read" || args.method === "web_save") && args.args[0][0] === 1 ) { assert.step(args.method); @@ -13566,12 +13547,12 @@ QUnit.module("Views", (hooks) => { // Close ErrorDialog await click(target, ".o_dialog .btn-close"); assert.deepEqual(target.querySelectorAll("[name='p'] .o_data_row").length, 1); - assert.verifySteps(["write", "web_read"]); + assert.verifySteps(["web_save", "web_read"]); await editInput(target, "[name=foo] input", "new value"); await clickSave(target); assert.deepEqual(target.querySelectorAll("[name='p'] .o_data_row").length, 1); - assert.verifySteps(["write", "web_read"]); + assert.verifySteps(["web_save"]); } ); @@ -13637,9 +13618,9 @@ QUnit.module("Views", (hooks) => { if (args.method === "web_read") { assert.step(args.method); assert.deepEqual(args.args[0], [6]); - } else if (args.method === "create") { + } else if (args.method === "web_save") { assert.step(args.method); - assert.deepEqual(args.args[0][0], { + assert.deepEqual(args.args[1], { foo: "new value", }); } @@ -13655,7 +13636,7 @@ QUnit.module("Views", (hooks) => { // Close ErrorDialog await click(target, ".o_dialog .btn-close"); assert.strictEqual(target.querySelector("[name=foo] input").value, "new value"); - assert.verifySteps(["create", "web_read"]); + assert.verifySteps(["web_save", "web_read"]); } ); @@ -13875,7 +13856,7 @@ QUnit.module("Views", (hooks) => { await def; } - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual(args.args[1], { p: [[1, 1, { foo: "new foo" }]], }); diff --git a/addons/web/static/tests/views/kanban/kanban_view_tests.js b/addons/web/static/tests/views/kanban/kanban_view_tests.js index 6d2e93046ee..c68e63b28a7 100644 --- a/addons/web/static/tests/views/kanban/kanban_view_tests.js +++ b/addons/web/static/tests/views/kanban/kanban_view_tests.js @@ -1880,7 +1880,7 @@ QUnit.module("Views", (hooks) => { }); QUnit.test("quick create record with quick_create_view", async (assert) => { - assert.expect(20); + assert.expect(19); serverData.views["partner,some_view_ref,form"] = "
" + @@ -1902,16 +1902,14 @@ QUnit.module("Views", (hooks) => { groupBy: ["bar"], async mockRPC(route, args) { assert.step(args.method || route); - if (args.method === "create") { + if (args.method === "web_save") { assert.deepEqual( - args.args[0], - [ - { - foo: "new partner", - int_field: 4, - state: "def", - }, - ], + args.args[1], + { + foo: "new partner", + int_field: 4, + state: "def", + }, "should send the correct values" ); } @@ -1952,8 +1950,7 @@ QUnit.module("Views", (hooks) => { "web_search_read", // initial search_read (second column) "get_views", // form view in quick create "onchange", // quick create - "create", // should perform a create to create the record - "web_read", + "web_save", // should perform a web_save to create the record "web_read", // read the created record "onchange", // new quick create ]); @@ -1985,16 +1982,14 @@ QUnit.module("Views", (hooks) => { `, groupBy: ["bar"], async mockRPC(route, args) { - if (args.method === "create") { + if (args.method === "web_save") { assert.deepEqual( - args.args[0], - [ - { - foo: "new partner", - int_field: 4, - state: "def", - }, - ], + args.args[1], + { + foo: "new partner", + int_field: 4, + state: "def", + }, "should send the correct values" ); } @@ -2233,7 +2228,7 @@ QUnit.module("Views", (hooks) => { }); QUnit.test("quick create record in grouped on m2o (with quick_create_view)", async (assert) => { - assert.expect(16); + assert.expect(15); serverData.views["partner,some_view_ref,form"] = "" + @@ -2255,16 +2250,15 @@ QUnit.module("Views", (hooks) => { groupBy: ["product_id"], async mockRPC(route, { method, args, kwargs }) { assert.step(method || route); - if (method === "create") { + if (method === "web_save") { assert.deepEqual( - args[0], - [ - { - foo: "new partner", - int_field: 4, - state: "def", - }, - ], + args[1], + + { + foo: "new partner", + int_field: 4, + state: "def", + }, "should send the correct values" ); const { default_product_id, default_qux } = kwargs.context; @@ -2296,8 +2290,7 @@ QUnit.module("Views", (hooks) => { "web_search_read", // initial search_read (second column) "get_views", // form view in quick create "onchange", // quick create - "create", // should perform a create to create the record - "web_read", + "web_save", // should perform a web_save to create the record "web_read", // read the created record "onchange", // reopen the quick create automatically ]); @@ -2437,15 +2430,13 @@ QUnit.module("Views", (hooks) => { groupBy: ["category_ids"], async mockRPC(route, { method, args, kwargs }) { assert.step(method || route); - if (method === "create") { - assert.deepEqual(args[0], [ - { - foo: "new partner", - }, - ]); + if (method === "web_save") { + assert.deepEqual(args[1], { + foo: "new partner", + }); const { default_category_ids } = kwargs.context; assert.deepEqual(default_category_ids, [6]); - return [5]; + return [{ id: 5 }]; } if (method === "web_read" && args[0][0] === 5) { return [{ id: 5, foo: "new partner", category_ids: [6] }]; @@ -2478,7 +2469,7 @@ QUnit.module("Views", (hooks) => { "web_search_read", // initial search_read (second column) "get_views", // get form view "onchange", // quick create - "create", // should perform a create to create the record + "web_save", // should perform a web_save to create the record "web_read", // read the created record "onchange", // reopen the quick create automatically ]); @@ -2506,13 +2497,11 @@ QUnit.module("Views", (hooks) => { groupBy: ["category_ids"], async mockRPC(route, { method, args, kwargs }) { assert.step(method || route); - if (method === "create") { - assert.deepEqual(args[0], [ - { - category_ids: [[4, 6]], - foo: "new partner", - }, - ]); + if (method === "web_save") { + assert.deepEqual(args[1], { + category_ids: [[4, 6]], + foo: "new partner", + }); const { default_category_ids } = kwargs.context; assert.deepEqual(default_category_ids, [6]); } @@ -2552,7 +2541,7 @@ QUnit.module("Views", (hooks) => { "web_search_read", // initial search_read (second column) "get_views", // get form view "onchange", // quick create - "create", // should perform a create to create the record + "web_save", // should perform a web_save to create the record "web_read", "onchange", ]); @@ -2725,9 +2714,9 @@ QUnit.module("Views", (hooks) => { `, groupBy: ["bar"], async mockRPC(route, { method, args }) { - if (method === "create") { + if (method === "web_save") { assert.notOk( - "int_field" in args[0], + "int_field" in args[1], "readonly field shouldn't be sent in create" ); } @@ -2749,7 +2738,7 @@ QUnit.module("Views", (hooks) => { await editQuickCreateInput("foo", "new partner"); assert.verifySteps(["onchange"]); await validateRecord(); - assert.verifySteps(["create", "web_read", "onchange"]); + assert.verifySteps(["web_save", "web_read", "onchange"]); }); QUnit.test("quick create record and change state in grouped mode", async (assert) => { @@ -2957,8 +2946,8 @@ QUnit.module("Views", (hooks) => { "", groupBy: ["bar"], async mockRPC(route, args) { - if (args.method === "create") { - assert.step("create"); + if (args.method === "web_save") { + assert.step("web_save"); await prom; } }, @@ -3005,7 +2994,7 @@ QUnit.module("Views", (hooks) => { "quick create should be enabled" ); - assert.verifySteps(["create"]); + assert.verifySteps(["web_save"]); }); QUnit.test("quick create record: prevent multiple adds with Add clicked", async (assert) => { @@ -3025,8 +3014,8 @@ QUnit.module("Views", (hooks) => { "", groupBy: ["bar"], async mockRPC(route, { method }) { - if (method === "create") { - assert.step("create"); + if (method === "web_save") { + assert.step("web_save"); await prom; } }, @@ -3067,7 +3056,7 @@ QUnit.module("Views", (hooks) => { "quick create should be enabled" ); - assert.verifySteps(["create"]); + assert.verifySteps(["web_save"]); }); QUnit.test( @@ -3200,9 +3189,9 @@ QUnit.module("Views", (hooks) => { } break; } - case "create": { + case "web_save": { assert.step(method); - const values = args[0][0]; + const values = args[1]; assert.strictEqual(values.foo, "new partner"); assert.strictEqual(values.int_field, 3); break; @@ -3268,7 +3257,7 @@ QUnit.module("Views", (hooks) => { assert.verifySteps([ "onchange", // default_get "onchange", // new partner - "create", + "web_save", "onchange", // default_get ]); } @@ -3307,9 +3296,9 @@ QUnit.module("Views", (hooks) => { await prom; } } - if (args.method === "create") { - assert.step("create"); - assert.deepEqual(args.args[0][0], { + if (args.method === "web_save") { + assert.step("web_save"); + assert.deepEqual(args.args[1], { foo: "new partner", int_field: 3, }); @@ -3367,7 +3356,7 @@ QUnit.module("Views", (hooks) => { assert.verifySteps([ "onchange", // default_get "onchange", // new partner - "create", + "web_save", "onchange", // default_get ]); } @@ -3934,8 +3923,8 @@ QUnit.module("Views", (hooks) => { if (args.method === "name_create") { throw makeServerError({ message: "This is a user error" }); } - if (args.method === "create") { - assert.deepEqual(args.args[0][0], { foo: "blip" }); + if (args.method === "web_save") { + assert.deepEqual(args.args[1], { foo: "blip" }); assert.deepEqual(args.kwargs.context, { default_foo: "blip", default_name: "test", @@ -3984,8 +3973,8 @@ QUnit.module("Views", (hooks) => { if (args.method === "name_create") { throw makeServerError({ message: "This is a user error" }); } - if (args.method === "create") { - assert.deepEqual(args.args[0][0], { state: "abc" }); + if (args.method === "web_save") { + assert.deepEqual(args.args[1], { state: "abc" }); assert.deepEqual(args.kwargs.context, { default_state: "abc", default_name: "test", @@ -4283,8 +4272,8 @@ QUnit.module("Views", (hooks) => { "", groupBy: ["foo"], async mockRPC(route, { method, args, kwargs }) { - if (method === "create") { - assert.deepEqual(args[0], [{ foo: "blip" }]); + if (method === "web_save") { + assert.deepEqual(args[1], { foo: "blip" }); assert.strictEqual(kwargs.context.default_foo, "blip"); } }, @@ -4325,8 +4314,8 @@ QUnit.module("Views", (hooks) => { "", groupBy: ["bar"], async mockRPC(route, { method, args, kwargs }) { - if (method === "create") { - assert.deepEqual(args[0], [{ bar: true }]); + if (method === "web_save") { + assert.deepEqual(args[1], { bar: true }); assert.strictEqual(kwargs.context.default_bar, true); } }, @@ -4371,8 +4360,8 @@ QUnit.module("Views", (hooks) => { "", groupBy: ["state"], async mockRPC(route, { method, args, kwargs }) { - if (method === "create") { - assert.deepEqual(args[0], [{ state: "abc" }]); + if (method === "web_save") { + assert.deepEqual(args[1], { state: "abc" }); assert.strictEqual(kwargs.context.default_state, "abc"); } }, @@ -4619,10 +4608,7 @@ QUnit.module("Views", (hooks) => { // Write on the record using the priority widget to trigger a re-render in readonly await click(target, ".o_kanban_record:first-child .o_priority_star:first-child"); - assert.verifySteps([ - "/web/dataset/call_kw/partner/write", - "/web/dataset/call_kw/partner/web_read", - ]); + assert.verifySteps(["/web/dataset/call_kw/partner/web_save"]); assert.containsN( target, ".o_kanban_record:first-child .o_field_many2many_tags .o_tag", @@ -4993,7 +4979,7 @@ QUnit.module("Views", (hooks) => { assert.step("resequence"); return true; } - if (args.model === "partner" && args.method === "write") { + if (args.model === "partner" && args.method === "web_save") { assert.deepEqual(args.args[1], { state: "abc" }); } }, @@ -5443,7 +5429,7 @@ QUnit.module("Views", (hooks) => { "", groupBy: ["product_id"], async mockRPC(route, { model, method }) { - if (model === "partner" && method === "write") { + if (model === "partner" && method === "web_save") { return Promise.reject({}); } }, @@ -8683,7 +8669,7 @@ QUnit.module("Views", (hooks) => { `, async mockRPC(route, { method, args }) { - if (method === "write") { + if (method === "web_save") { assert.step(`write-color-${args[1].color}`); } }, @@ -9918,18 +9904,15 @@ QUnit.module("Views", (hooks) => { "web_search_read", "web_search_read", "web_search_read", - "write", - "web_read", + "web_save", "read_progress_bar", "/web/dataset/resequence", "read", - "write", - "web_read", + "web_save", "read_progress_bar", "/web/dataset/resequence", "read", - "write", - "web_read", + "web_save", "read_progress_bar", "/web/dataset/resequence", "read", @@ -9989,8 +9972,7 @@ QUnit.module("Views", (hooks) => { "read_progress_bar", "web_search_read", "web_search_read", - "write", - "web_read", + "web_save", "read_progress_bar", "web_read_group", "/web/dataset/resequence", @@ -10071,8 +10053,7 @@ QUnit.module("Views", (hooks) => { "read_progress_bar", "web_search_read", "web_search_read", - "write", - "web_read", + "web_save", "read_progress_bar", "/web/dataset/resequence", "read", @@ -10289,7 +10270,7 @@ QUnit.module("Views", (hooks) => { "web_search_read", "get_views", "onchange", - "create", + "web_save", "web_read", "read_progress_bar", "web_read_group", @@ -10364,13 +10345,13 @@ QUnit.module("Views", (hooks) => { "web_search_read", "get_views", "onchange", - "create", + "web_save", "web_read", "read_progress_bar", "web_read_group", "web_read_group", "onchange", - "create", + "web_save", "web_read", "read_progress_bar", "web_read_group", @@ -10953,7 +10934,7 @@ QUnit.module("Views", (hooks) => { `, async mockRPC(_route, { model, method, args }) { - if (model === "partner" && method === "write") { + if (model === "partner" && method === "web_save") { assert.step(String(args[0][0])); } }, @@ -11539,8 +11520,7 @@ QUnit.module("Views", (hooks) => { "web_search_read", "web_search_read", "web_search_read", - "write", - "web_read", + "web_save", "read_progress_bar", "/web/dataset/resequence", "read", @@ -11625,8 +11605,7 @@ QUnit.module("Views", (hooks) => { assert.deepEqual(getTooltips(1), ["1 blip", "1 Other"]); assert.deepEqual(getCardTexts(1), ["2blip", "3gnap"]); assert.verifySteps([ - "write", - "web_read", + "web_save", "read_progress_bar", "web_search_read", "/web/dataset/resequence", @@ -12482,8 +12461,7 @@ QUnit.module("Views", (hooks) => { "web_search_read", "web_search_read", "web_search_read", - "write", - "web_read", + "web_save", "read_progress_bar", "web_search_read", "web_search_read", @@ -13086,8 +13064,7 @@ QUnit.module("Views", (hooks) => { "read_progress_bar", "web_search_read", "web_search_read", - "write", - "web_read", + "web_save", "read_progress_bar", "web_read_group", ]); @@ -13176,7 +13153,7 @@ QUnit.module("Views", (hooks) => { "name_create", // should perform a name_create to create the record "get_views", // load views for form view dialog "onchange", // load of a virtual record in form view dialog - "create", // save virtual record + "web_save", // save virtual record "web_read", // read the created record to get foo value "onchange", // reopen the quick create automatically ]); @@ -13455,7 +13432,7 @@ QUnit.module("Views", (hooks) => { prom.resolve(); await nextTick(); - assert.verifySteps(["write", "web_read", "/web/dataset/resequence", "read"]); + assert.verifySteps(["web_save", "/web/dataset/resequence", "read"]); assert.deepEqual( [...target.querySelectorAll(".o_kanban_record")].map((el) => el.innerText), ["hello", "hello", "hello", "xmo"] @@ -13521,7 +13498,7 @@ QUnit.module("Views", (hooks) => { `, groupBy: ["product_id"], mockRPC: async (route, { method }) => { - if (method === "write") { + if (method === "web_save") { await def; } }, diff --git a/addons/web/static/tests/views/list_view_tests.js b/addons/web/static/tests/views/list_view_tests.js index 8c59b1dc479..b7d3706f931 100644 --- a/addons/web/static/tests/views/list_view_tests.js +++ b/addons/web/static/tests/views/list_view_tests.js @@ -1186,8 +1186,7 @@ QUnit.module("Views", (hooks) => { assert.verifySteps([ "get_views", "web_search_read", - "write", - "web_read", + "web_save", "toDo", "web_search_read", ]); @@ -1575,8 +1574,8 @@ QUnit.module("Views", (hooks) => { `, mockRPC(_, { args, method }) { assert.step(method); - if (method === "create") { - assert.deepEqual(args[0], [{ int_field: 1, foo: false }]); + if (method === "web_save") { + assert.deepEqual(args[1], { int_field: 1, foo: false }); } }, }); @@ -1588,7 +1587,7 @@ QUnit.module("Views", (hooks) => { await click(target, ".o_list_view"); assert.containsN(target, ".o_data_row", 5); assert.strictEqual(target.querySelector(".o_data_row [name='int_field']").textContent, "1"); - assert.verifySteps(["onchange", "create", "web_read"]); + assert.verifySteps(["onchange", "web_save"]); }); QUnit.test("multi_edit: edit a required field with an invalid value", async function (assert) { @@ -2405,7 +2404,7 @@ QUnit.module("Views", (hooks) => { groupBy: ["m2m"], domain: [["m2o", "=", 1]], mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual(args.args[0], [1], "should write on the correct record"); assert.deepEqual( args.args[1], @@ -2636,8 +2635,8 @@ QUnit.module("Views", (hooks) => { serverData, arch: '', mockRPC: async (route, args) => { - if (args.method === "write") { - assert.step(`write ${args.args[0]}`); + if (args.method === "web_save") { + assert.step(`web_save ${args.args[0]}`); } }, }); @@ -2649,7 +2648,7 @@ QUnit.module("Views", (hooks) => { await editInput(target, "[name='foo'] input", "YOLO"); await click(target, ".o_list_view"); - assert.verifySteps(["onWillSaveRecord 1", "write 1", "onRecordSaved 1"]); + assert.verifySteps(["onWillSaveRecord 1", "web_save 1", "onRecordSaved 1"]); } ); @@ -2678,8 +2677,8 @@ QUnit.module("Views", (hooks) => { arch: '', groupBy: ["bar"], mockRPC: async (route, args) => { - if (args.method === "write") { - assert.step(`write ${args.args[0]}`); + if (args.method === "web_save") { + assert.step(`web_save ${args.args[0]}`); } }, }); @@ -2691,7 +2690,7 @@ QUnit.module("Views", (hooks) => { await editInput(target, "[name='foo'] input", "YOLO"); await click(target, ".o_list_view"); - assert.verifySteps(["onWillSaveRecord 4", "write 4", "onRecordSaved 4"]); + assert.verifySteps(["onWillSaveRecord 4", "web_save 4", "onRecordSaved 4"]); } ); @@ -2856,7 +2855,7 @@ QUnit.module("Views", (hooks) => {
`, mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual(args.args[1], { grosminet: false }); } }, @@ -2927,8 +2926,8 @@ QUnit.module("Views", (hooks) => { `, mockRPC(route, args) { - if (args.method === "write") { - assert.step("write: " + args.args[1].bar); + if (args.method === "web_save") { + assert.step("web_save: " + args.args[1].bar); } }, }); @@ -2939,14 +2938,14 @@ QUnit.module("Views", (hooks) => { await click(target.querySelector(".o_data_row .o_boolean_toggle input")); assert.notOk(target.querySelector(".o_data_row .o_boolean_toggle input").checked); assert.containsNone(target, ".o_selected_row"); - assert.verifySteps(["write: false"]); + assert.verifySteps(["web_save: false"]); // toggle the boolean value after switching the row in edition assert.containsNone(target, ".o_selected_row"); await click(target.querySelector(".o_data_row .o_data_cell .o_field_boolean_toggle div")); assert.containsOnce(target, ".o_selected_row"); await click(target.querySelector(".o_selected_row .o_field_boolean_toggle div")); - assert.verifySteps(["write: true"]); + assert.verifySteps(["web_save: true"]); }); QUnit.test("basic operations for editable list renderer", async function (assert) { @@ -3086,7 +3085,7 @@ QUnit.module("Views", (hooks) => { serverData, arch: '', mockRPC(route, args) { - if (args.method === "write") { + if (args.method === "web_save") { assert.deepEqual( args.args, [[1], { foo: "xyz" }], @@ -8270,8 +8269,8 @@ QUnit.module("Views", (hooks) => { `, noContentHelp: "click to add a partner", mockRPC(route, args) { - if (args.method === "create") { - assert.step("create"); + if (args.method === "web_save") { + assert.step("web_save"); } }, }); @@ -8322,7 +8321,7 @@ QUnit.module("Views", (hooks) => { false, "buttons should not be disabled once the record is created" ); - assert.verifySteps(["create"]); + assert.verifySteps(["web_save"]); }); QUnit.test("list view, editable, with a button", async function (assert) { @@ -8337,8 +8336,8 @@ QUnit.module("Views", (hooks) => {