diff options
| author | Géry Debongnie <ged@odoo.com> | 2017-03-20 15:23:19 +0100 |
|---|---|---|
| committer | Aaron Bohy <aab@odoo.com> | 2017-04-11 19:44:38 +0200 |
| commit | 2106e3dd2ecd61096d7c7531c2f18b00fb30aeea (patch) | |
| tree | 1e41a2e698ba993d9d74b6fddd699adb15642001 | |
| parent | 749d10e8b55dce94828290d7e4d6b2b6f741e9bd (diff) | |
[REF] web, *: simplify our RPC system (in JS)
The RPC system was not completely satisfactory, we decided to prepare
the future and do it properly. This commit introduces the new rpc
system, which replace the previous new one. We now simply have a
method, this._rpc, which takes a dictionary of parameters. The idea is
that depending on the parameters, it is able to add correct default
value when necessary.
For situations where we don't have the this._rpc method, we can use the
rpc.query method, which takes the same arguments, but directly calls
ajax.rpc instead of triggering up some events.
79 files changed, 1379 insertions, 1234 deletions
diff --git a/addons/account/static/src/js/reconciliation/reconciliation_model.js b/addons/account/static/src/js/reconciliation/reconciliation_model.js index d0903f63abe..689e7a499ff 100644 --- a/addons/account/static/src/js/reconciliation/reconciliation_model.js +++ b/addons/account/static/src/js/reconciliation/reconciliation_model.js @@ -147,9 +147,11 @@ var StatementModel = BasicModel.extend({ autoReconciliation: function () { var self = this; var ids = _.pluck(_.filter(_.values(this.lines), {'reconciled': false}), 'id'); - return this._rpc("account.bank.statement.line", 'reconciliation_widget_auto_reconcile') - .args([ids, self.valuenow]) - .exec() + return this._rpc({ + model: 'account.bank.statement.line', + method: 'reconciliation_widget_auto_reconcile', + args: [ids, self.valuenow], + }) .then(function (result) { var reconciled_ids = _.difference(ids, result.st_lines_ids); self.valuenow += reconciled_ids.length; @@ -212,9 +214,11 @@ var StatementModel = BasicModel.extend({ * @returns {Deferred} */ changeName: function (name) { - return this._rpc("account.bank.statement", "write") - .args([this.bank_statement_id.id, {name: name}]) - .exec(); + return this._rpc({ + model: 'account.bank.statement', + method: 'write', + args: [this.bank_statement_id.id, {name: name}], + }); }, /** * change the offset for the matched lines, and fetch the new matched lines @@ -293,9 +297,11 @@ var StatementModel = BasicModel.extend({ if (!statement_ids) { return $.when(); } - var def_statement = this._rpc("account.bank.statement", 'reconciliation_widget_preprocess') - .args([statement_ids]) - .exec() + var def_statement = this._rpc({ + model: 'account.bank.statement', + method: 'reconciliation_widget_preprocess', + args: [statement_ids], + }) .then(function (statement) { self.bank_statement_id = statement_ids.length === 1 ? {id: statement_ids[0], display_name: statement.statement_name} : false; self.valuenow = 0; @@ -313,25 +319,31 @@ var StatementModel = BasicModel.extend({ }; }); }); - var def_reconcileModel = this._rpc('account.reconcile.model', 'search_read') - .exec() + var def_reconcileModel = this._rpc({ + model: 'account.reconcile.model', + method: 'search_read', + }) .then(function (reconcileModels) { - self.reconcileModels = reconcileModels.records; + self.reconcileModels = reconcileModels; }); - var def_account = this._rpc('account.account', 'search_read') - .withFields(['code']) - .exec() + var def_account = this._rpc({ + model: 'account.account', + method: 'search_read', + fields: ['code'], + }) .then(function (accounts) { - self.accounts = _.object(_.pluck(accounts.records, 'id'), _.pluck(accounts.records, 'code')); + self.accounts = _.object(_.pluck(accounts, 'id'), _.pluck(accounts, 'code')); }); return $.when(def_statement, def_reconcileModel, def_account).then(function () { _.each(self.lines, function (line) { line.reconcileModels = self.reconcileModels; }); var ids = _.pluck(self.lines, 'id'); - return self._rpc("account.bank.statement.line", 'get_data_for_reconciliation_widget') - .args([ids]) - .exec() + return self._rpc({ + model: 'account.bank.statement.line', + method: 'get_data_for_reconciliation_widget', + args: [ids], + }) .then(self._formatLine.bind(self)); }); }, @@ -482,9 +494,11 @@ var StatementModel = BasicModel.extend({ self.valuenow++; }); - return this._rpc("account.bank.statement.line", 'process_reconciliations') - .args([ids, values]) - .exec() + return this._rpc({ + model: 'account.bank.statement.line', + method: 'process_reconciliations', + args: [ids, values], + }) .then(function () { return {handles: handles}; }); @@ -546,9 +560,11 @@ var StatementModel = BasicModel.extend({ }); var args = [[prop.tax_id.id], prop.base_amount, line.st_line.currency_id]; - tax_defs.push(self._rpc("account.tax", 'json_friendly_compute_all') - .args(args) - .exec() + tax_defs.push(self._rpc({ + model: 'account.tax', + method: 'json_friendly_compute_all', + args: args, + }) .then(function (result) { var tax = result.taxes[0]; var tax_prop = self._formatQuickCreate(line, { @@ -779,10 +795,11 @@ var StatementModel = BasicModel.extend({ var filter = line.filter || ""; var offset = line.offset; var limit = 6; - var args = [line.id, line.st_line.partner_id, excluded_ids, filter, offset, limit]; - return this._rpc("account.bank.statement.line", 'get_move_lines_for_reconciliation_widget') - .args(args) - .exec() + return this._rpc({ + model: 'account.bank.statement.line', + method: 'get_move_lines_for_reconciliation_widget', + args: [line.id, line.st_line.partner_id, excluded_ids, filter, offset, limit], + }) .then(this._formatMoveLine.bind(this, handle)); }, /** @@ -835,13 +852,15 @@ var ManualModel = StatementModel.extend({ domain_account_id.push(['company_id', 'in', context.company_ids]); } - var def_account = this._rpc('account.account', 'search_read') - .withDomain(domain_account_id) - .withFields(['code']) - .exec() + var def_account = this._rpc({ + model: 'account.account', + method: 'search_read', + domain: domain_account_id, + fields: ['code'], + }) .then(function (accounts) { - self.account_ids = _.pluck(accounts.records, 'id'); - self.accounts = _.object(self.account_ids, _.pluck(accounts.records, 'code')); + self.account_ids = _.pluck(accounts, 'id'); + self.accounts = _.object(self.account_ids, _.pluck(accounts, 'code')); }); return def_account.then(function () { @@ -850,20 +869,23 @@ var ManualModel = StatementModel.extend({ case 'suppliers': var mode = context.mode === 'customers' ? 'receivable' : 'payable'; var args = ['partner', context.partner_ids || null, mode]; - return self._rpc("account.move.line", 'get_data_for_manual_reconciliation') - .args(args) - .exec() + return self._rpc({ + model: 'account.move.line', + method: 'get_data_for_manual_reconciliation', + args: args, + }) .then(function (result) { var defs = _.map(result, self._formatLine.bind(self, context.mode)); self.valuenow = 0; self.valuemax = Object.keys(self.lines).length; return $.when.apply($, defs); }); - case 'accounts': - var args = ['account', self.account_ids]; - return self._rpc("account.move.line", 'get_data_for_manual_reconciliation') - .args(args) - .exec() + case 'accounts': + return self._rpc({ + model: 'account.move.line', + method: 'get_data_for_manual_reconciliation', + args: ['account', self.account_ids], + }) .then(function (result) { var defs = _.map(result, self._formatLine.bind(self, 'accounts')); self.valuenow = 0; @@ -877,10 +899,11 @@ var ManualModel = StatementModel.extend({ if (!partner_ids && account_ids) partner_ids = []; account_ids = null; // TOFIX: REMOVE ME partner_ids = null; // TOFIX: REMOVE ME - var args = [partner_ids, account_ids]; - return self._rpc("account.move.line", 'get_data_for_manual_reconciliation_widget') - .args(args) - .exec() + return self._rpc({ + model: 'account.move.line', + method: 'get_data_for_manual_reconciliation_widget', + args: [partner_ids, account_ids], + }) .then(function (result) { var defs = _.map(result.accounts, self._formatLine.bind(self, 'accounts')); defs = defs.concat(_.map(result.customers, self._formatLine.bind(self, 'customers'))); @@ -944,9 +967,11 @@ var ManualModel = StatementModel.extend({ }); if (process_reconciliations.length) { - def = self._rpc("account.move.line", 'process_reconciliations') - .args([process_reconciliations]) - .exec(); + def = self._rpc({ + model: 'account.move.line', + method: 'process_reconciliations', + args: [process_reconciliations], + }); } return def.then(function() { @@ -973,14 +998,18 @@ var ManualModel = StatementModel.extend({ }); return $.when(defs).then(function() { if (account_ids.length) { - self._rpc("account.account", 'mark_as_reconciled') - .args([account_ids]) - .exec(); + self._rpc({ + model: 'account.account', + method: 'mark_as_reconciled', + args: [account_ids], + }); } if (partner_ids.length) { - self._rpc("res.partner", 'mark_as_reconciled') - .args([partner_ids]) - .exec(); + self._rpc({ + model: 'res.partner', + method: 'mark_as_reconciled', + args: [partner_ids], + }); } return {reconciled: reconciled, updated: _.difference(handles, reconciled)}; }); @@ -1090,9 +1119,11 @@ var ManualModel = StatementModel.extend({ var offset = line.offset; var limit = 6; var args = [line.account_id.id, line.partner_id, excluded_ids, filter, offset, limit]; - return this._rpc("account.move.line", 'get_move_lines_for_manual_reconciliation') - .args(args) - .exec() + return this._rpc({ + model: 'account.move.line', + method: 'get_move_lines_for_manual_reconciliation', + args: args, + }) .then(this._formatMoveLine.bind(this, handle)); }, }); diff --git a/addons/barcodes/static/src/js/barcode_parser.js b/addons/barcodes/static/src/js/barcode_parser.js index d615e2e89fe..9dd73bf060e 100644 --- a/addons/barcodes/static/src/js/barcode_parser.js +++ b/addons/barcodes/static/src/js/barcode_parser.js @@ -19,9 +19,11 @@ var BarcodeParser = Class.extend({ load: function(){ var self = this; var id = this.nomenclature_id[0]; - rpc.query({model: 'barcode.nomenclature', method: 'read'}) - .args([[id], ['name','rule_ids','upc_ean_conv']]) - .exec({type: "ajax"}) + rpc.query({ + model: 'barcode.nomenclature', + method: 'read', + args: [[id], ['name','rule_ids','upc_ean_conv']], + }) .then(function (nomenclatures){ self.nomenclature = nomenclatures[0]; @@ -29,12 +31,13 @@ var BarcodeParser = Class.extend({ [['barcode_nomenclature_id', '=', self.nomenclature.id]], ['name', 'sequence', 'type', 'encoding', 'pattern', 'alias'], ]; - return rpc - .query({model: 'barcode.rule', method: 'search_read'}) - .args(args) - .exec({type: "ajax"}); + return rpc.query({ + model: 'barcode.rule', + method: 'search_read', + args: args, + }); }).then(function(rules){ - rules = rules.records.sort(function(a, b){ return a.sequence - b.sequence; }); + rules = rules.sort(function(a, b){ return a.sequence - b.sequence; }); self.nomenclature.rules = rules; }); }, diff --git a/addons/base_import/static/src/js/base_import.js b/addons/base_import/static/src/js/base_import.js index 971462cf12f..7292d898ad5 100644 --- a/addons/base_import/static/src/js/base_import.js +++ b/addons/base_import/static/src/js/base_import.js @@ -240,9 +240,11 @@ var DataImport = Widget.extend(ControlPanelMixin, { ); }, create_model: function() { - return this._rpc('base_import.import', 'create') - .args([{res_model: this.res_model}]) - .exec(); + return this._rpc({ + model: 'base_import.import', + method: 'create', + args: [{res_model: this.res_model}], + }); }, renderButtons: function() { var self = this; diff --git a/addons/board/static/src/js/dashboard.js b/addons/board/static/src/js/dashboard.js index 4e6ab81fb66..ca5187867e3 100644 --- a/addons/board/static/src/js/dashboard.js +++ b/addons/board/static/src/js/dashboard.js @@ -56,9 +56,10 @@ var DashBoard = form_common.FormWidget.extend({ delete(action.attrs.colspan); var action_id = _.str.toNumber(action.attrs.name); if (!_.isNaN(action_id)) { - self._rpc('/web/action/load') - .params({action_id: action_id}) - .exec() + self._rpc({ + route: '/web/action/load', + params: {action_id: action_id} + }) .done(function(result) { self.on_load_action(result, column_index + '_' + action_index, action.attrs); }); @@ -174,12 +175,13 @@ var DashBoard = form_common.FormWidget.extend({ board.columns.push(actions); }); var arch = QWeb.render('DashBoard.xml', board); - this._rpc('/web/view/add_custom') - .params({ - view_id: this.view.fields_view.view_id, - arch: arch - }) - .exec(); + this._rpc({ + route: '/web/view/add_custom', + params: { + view_id: this.view.fields_view.view_id, + arch: arch + } + }); }, on_load_action: function(result, index, action_attrs) { var self = this, @@ -421,15 +423,16 @@ FavoriteMenu.include({ c.dashboard_merge_domains_contexts = false; var name = self.$add_dashboard_input.val(); - return self._rpc('/board/add_to_dashboard') - .params({ - action_id: self.action_id || false, - context_to_save: c, - domain: domain, - view_mode: self.view_manager.active_view.type, - name: name, + return self._rpc({ + route: '/board/add_to_dashboard', + params: { + action_id: self.action_id || false, + context_to_save: c, + domain: domain, + view_mode: self.view_manager.active_view.type, + name: name, + }, }) - .exec() .then(function (r) { if (r) { self.do_notify(_.str.sprintf(_t("'%s' added to dashboard"), name), ''); diff --git a/addons/calendar/static/src/js/base_calendar.js b/addons/calendar/static/src/js/base_calendar.js index d0ed1eade7e..8bd25659c2d 100644 --- a/addons/calendar/static/src/js/base_calendar.js +++ b/addons/calendar/static/src/js/base_calendar.js @@ -22,11 +22,12 @@ var CalendarNotification = Notification.extend({ 'click .link2event': function() { var self = this; - this._rpc("/web/action/load") - .params({ - action_id: "calendar.action_calendar_event_notify", + this._rpc({ + route: '/web/action/load', + params: { + action_id: 'calendar.action_calendar_event_notify', + }, }) - .exec() .then(function(r) { r.res_id = self.eid; return self.do_action(r); @@ -39,8 +40,7 @@ var CalendarNotification = Notification.extend({ 'click .link2showed': function() { this.destroy(true); - this._rpc("/calendar/notify_ack") - .exec(); + this._rpc({route: '/calendar/notify_ack'}); }, }); }, diff --git a/addons/crm/static/src/js/sales_team_dashboard.js b/addons/crm/static/src/js/sales_team_dashboard.js index aa2339f2a6e..e994f3b0b8a 100644 --- a/addons/crm/static/src/js/sales_team_dashboard.js +++ b/addons/crm/static/src/js/sales_team_dashboard.js @@ -5,8 +5,7 @@ var SalesTeamDashboard = require('sales_team.dashboard'); SalesTeamDashboard.Model.include({ _fetchDashboardData: function() { - return this._rpc('crm.lead', 'retrieve_sales_dashboard') - .exec(); + return this._rpc({model: 'crm.lead', method: 'retrieve_sales_dashboard'}); }, }); diff --git a/addons/google_calendar/static/src/js/google_calendar.js b/addons/google_calendar/static/src/js/google_calendar.js index bbe0f14d098..240b5568c0b 100644 --- a/addons/google_calendar/static/src/js/google_calendar.js +++ b/addons/google_calendar/static/src/js/google_calendar.js @@ -56,12 +56,13 @@ CalendarRenderer.include({ var text = _.str.sprintf(confirm_text1 + "\n" + confirm_text2 + "\n\n" + confirm_text3, o.info.new_name, o.info.old_name); Dialog.confirm(self, text, { confirm_callback: function() { - self._rpc('/google_calendar/remove_references') - .params({ - model: self.state.model, - local_context: context, + self._rpc({ + route: '/google_calendar/remove_references', + params: { + model: self.state.model, + local_context: context, + }, }) - .exec() .done(function(o) { if (o.status === "OK") { Dialog.alert(self, _t("All events have been disconnected from your previous account. You can now restart the synchronization"), { diff --git a/addons/google_drive/static/src/js/gdrive.js b/addons/google_drive/static/src/js/gdrive.js index 204d6824bad..b7d2542bb7a 100644 --- a/addons/google_drive/static/src/js/gdrive.js +++ b/addons/google_drive/static/src/js/gdrive.js @@ -59,9 +59,11 @@ Sidebar.include({ var self = this; var domain = [['id', '=', doc_item.config_id]]; var fields = ['google_drive_resource_id', 'google_drive_client_id']; - this._rpc('google.drive.config', 'search_read') - .args([domain, fields]) - .exec() + this._rpc({ + model: 'google.drive.config', + method: 'search_read', + args: [domain, fields], + }) .then(function (configs) { var ds = new data.DataSet(self, 'google.drive.config'); ds.call('get_google_drive_url', [doc_item.config_id, doc_item.res_id,configs[0].google_drive_resource_id, self.dataset.context]).done(function (url) { diff --git a/addons/hr_attendance/static/src/js/greeting_message.js b/addons/hr_attendance/static/src/js/greeting_message.js index ac27511c3b8..f60fea5a060 100644 --- a/addons/hr_attendance/static/src/js/greeting_message.js +++ b/addons/hr_attendance/static/src/js/greeting_message.js @@ -131,9 +131,11 @@ var GreetingMessage = Widget.extend(BarcodeHandlerMixin, { if (this.return_to_main_menu) { // in case of multiple scans in the greeting message view, delete the timer, a new one will be created. clearTimeout(this.return_to_main_menu); } - this._rpc('hr.employee', 'attendance_scan') - .args([barcode, ]) - .exec() + this._rpc({ + model: 'hr.employee', + method: 'attendance_scan', + args: [barcode, ], + }) .then(function (result) { if (result.action) { self.do_action(result.action); diff --git a/addons/hr_attendance/static/src/js/kiosk_confirm.js b/addons/hr_attendance/static/src/js/kiosk_confirm.js index f8b8581322b..b489102fe68 100644 --- a/addons/hr_attendance/static/src/js/kiosk_confirm.js +++ b/addons/hr_attendance/static/src/js/kiosk_confirm.js @@ -12,9 +12,11 @@ var KioskConfirm = Widget.extend({ "click .o_hr_attendance_sign_in_out_icon": function () { var self = this; this.$('.o_hr_attendance_sign_in_out_icon').attr("disabled", "disabled"); - this._rpc('hr.employee', 'attendance_manual') - .args([[this.employee_id], this.next_action]) - .exec() + this._rpc({ + model: 'hr.employee', + method: 'attendance_manual', + args: [[this.employee_id], this.next_action], + }) .then(function(result) { if (result.action) { self.do_action(result.action); @@ -38,9 +40,11 @@ var KioskConfirm = Widget.extend({ 'click .o_hr_attendance_pin_pad_button_ok': function() { var self = this; this.$('.o_hr_attendance_pin_pad_button_ok').attr("disabled", "disabled"); - this._rpc('hr.employee', 'attendance_manual') - .args([[this.employee_id], this.next_action, this.$('.o_hr_attendance_PINbox').val()]) - .exec() + this._rpc({ + model: 'hr.employee', + method: 'attendance_manual', + args: [[this.employee_id], this.next_action, this.$('.o_hr_attendance_PINbox').val()], + }) .then(function(result) { if (result.action) { self.do_action(result.action); diff --git a/addons/hr_attendance/static/src/js/kiosk_mode.js b/addons/hr_attendance/static/src/js/kiosk_mode.js index e8b21dd05ac..e633c4d53e1 100644 --- a/addons/hr_attendance/static/src/js/kiosk_mode.js +++ b/addons/hr_attendance/static/src/js/kiosk_mode.js @@ -23,9 +23,11 @@ var KioskMode = Widget.extend(BarcodeHandlerMixin, { start: function () { var self = this; self.session = Session; - this._rpc('res.company', 'search_read') - .args([[['id', '=', self.session.company_id]], ['name']]) - .exec() + this._rpc({ + model: 'res.company', + method: 'search_read', + args: [[['id', '=', self.session.company_id]], ['name']], + }) .then(function (companies){ self.company_name = companies[0].name; self.company_image_url = self.session.url('/web/image', {model: 'res.company', id: self.session.company_id, field: 'logo',}); @@ -37,9 +39,11 @@ var KioskMode = Widget.extend(BarcodeHandlerMixin, { on_barcode_scanned: function(barcode) { var self = this; - this._rpc('hr.employee', 'attendance_scan') - .args([barcode, ]) - .exec() + this._rpc({ + model: 'hr.employee', + method: 'attendance_scan', + args: [barcode, ], + }) .then(function (result) { if (result.action) { self.do_action(result.action); diff --git a/addons/hr_attendance/static/src/js/my_attendances.js b/addons/hr_attendance/static/src/js/my_attendances.js index 1dbcacd8975..083fa94220e 100644 --- a/addons/hr_attendance/static/src/js/my_attendances.js +++ b/addons/hr_attendance/static/src/js/my_attendances.js @@ -19,9 +19,11 @@ var MyAttendances = Widget.extend({ start: function () { var self = this; - this._rpc('hr.employee', 'search_read') - .args([[['user_id', '=', self.session.uid]], ['attendance_state', 'name']]) - .exec() + this._rpc({ + model: 'hr.employee', + method: 'search_read', + args: [[['user_id', '=', self.session.uid]], ['attendance_state', 'name']], + }) .then(function (res) { if (_.isEmpty(res) ) { self.$('.o_hr_attendance_employee').append(_t("Error : Could not find employee linked to user")); @@ -36,9 +38,11 @@ var MyAttendances = Widget.extend({ update_attendance: function () { var self = this; - this._rpc('hr.employee', 'attendance_manual') - .args([[self.employee.id], 'hr_attendance.hr_attendance_action_my_attendances']) - .exec() + this._rpc({ + model: 'hr.employee', + method: 'attendance_manual', + args: [[self.employee.id], 'hr_attendance.hr_attendance_action_my_attendances'], + }) .then(function(result) { if (result.action) { self.do_action(result.action); diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js index 5d6235e094f..03d250a4d21 100644 --- a/addons/hr_timesheet_sheet/static/src/js/timesheet.js +++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js @@ -57,9 +57,11 @@ var WeeklyTimesheet = form_common.FormWidget.extend(form_common.ReinitializeWidg var commands = this.field_manager.get_field_value("timesheet_ids"); var self = this; - this._rpc(this.view.model, "resolve_2many_commands") - .args(["timesheet_ids", commands, []]) - .exec() + this._rpc({ + model: this.view.model, + method: 'resolve_2many_commands', + args: ['timesheet_ids', commands, []], + }) .done(function(result) { self.set({sheets: result}); self.querying = false; @@ -111,10 +113,12 @@ var WeeklyTimesheet = form_common.FormWidget.extend(form_common.ReinitializeWidg var default_get; var self = this; return this.render_drop.add( - this._rpc("account.analytic.line", "default_get") - .args([['account_id','general_account_id','journal_id','date','name','user_id','product_id','product_uom_id','amount','unit_amount','project_id']]) - .withContext({'user_id': self.get('user_id')} ) - .exec() + this._rpc({ + model: 'account.analytic.line', + method: 'default_get', + args: [['account_id','general_account_id','journal_id','date','name','user_id','product_id','product_uom_id','amount','unit_amount','project_id']], + context: {'user_id': self.get('user_id')}, + }) .then(function(result) { default_get = result; // calculating dates @@ -163,10 +167,12 @@ var WeeklyTimesheet = form_common.FormWidget.extend(form_common.ReinitializeWidg }).value(); // we need the name_get of the projects - this._rpc("project.project", "name_get") - .args([_.pluck(projects, "project")]) - .exec() - .then(function(result) { + this._rpc({ + model: 'project.project', + method: 'name_get', + args: [_.pluck(projects, 'project')], + }) + .then(function (result) { project_names = {}; _.each(result, function(el) { project_names[el[0]] = el[1]; diff --git a/addons/mail/static/src/js/activity.js b/addons/mail/static/src/js/activity.js index a61aea9a982..2ee334551aa 100644 --- a/addons/mail/static/src/js/activity.js +++ b/addons/mail/static/src/js/activity.js @@ -52,18 +52,22 @@ var AbstractActivityField = AbstractField.extend({ // private _markActivityDone: function (id) { - return this._rpc('mail.activity', 'action_done') - .args([[id]]) - .exec(); + return this._rpc({ + model: 'mail.activity', + method: 'action_done', + args: [[id]], + }); }, _readActivities: function () { var self = this; var missing_ids = _.difference(this.value.res_ids, _.pluck(this.activities, 'id')); var fetch_def; if (missing_ids.length) { - fetch_def = this._rpc('mail.activity', 'read') - .args([missing_ids]) - .exec(); + fetch_def = this._rpc({ + model: 'mail.activity', + method: 'read', + args: [missing_ids], + }); } return $.when(fetch_def).then(function (results) { // filter out activities that are no longer linked to this record @@ -168,9 +172,11 @@ var Activity = AbstractActivityField.extend({ _onUnlinkActivity: function (event) { event.preventDefault(); var activity_id = $(event.currentTarget).data('activity-id'); - return this._rpc('mail.activity', 'unlink') - .args([[activity_id]]) - .exec() + return this._rpc({ + model: 'mail.activity', + method: 'unlink', + args: [[activity_id]], + }) .then(this._reload.bind(this, {activity: true})); }, _onMarkActivityDone: function (event) { diff --git a/addons/mail/static/src/js/chat_manager.js b/addons/mail/static/src/js/chat_manager.js index 9c60851cc22..3181f940e6e 100644 --- a/addons/mail/static/src/js/chat_manager.js +++ b/addons/mail/static/src/js/chat_manager.js @@ -611,9 +611,13 @@ var ChatManager = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { bus.on('notification', null, on_notification); this.channel_seen = _.throttle(function (channel) { - return self._rpc('mail.channel', 'channel_seen') - .args([[channel.id]]) - .exec({options: {shadow: true}}); + return self._rpc({ + model: 'mail.channel', + method: 'channel_seen', + args: [[channel.id]], + }, { + shadow: true + }); }, 3000); }, @@ -676,10 +680,12 @@ var ChatManager = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { domain = [['id', '<', min_message_id]].concat(domain); } - return this._rpc('mail.message', 'message_fetch') - .args([domain]) - .kwargs({limit: LIMIT, context: session.user_context}) - .exec() + return this._rpc({ + model: 'mail.message', + method: 'message_fetch', + args: [domain], + kwargs: {limit: LIMIT, context: session.user_context}, + }) .then(function (msgs) { if (!cache.all_history_loaded) { cache.all_history_loaded = msgs.length < LIMIT; @@ -704,10 +710,12 @@ var ChatManager = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { if (options.force_fetch || _.difference(ids.slice(0, LIMIT), loaded_msg_ids).length) { var ids_to_load = _.difference(ids, loaded_msg_ids).slice(0, LIMIT); - return this._rpc('mail.message', 'message_format') - .args([ids_to_load]) - .kwargs({context: session.user_context}) - .exec() + return this._rpc({ + model: 'mail.message', + method: 'message_format', + args: [ids_to_load], + context: session.user_context, + }) .then(function (msgs) { var processed_msgs = []; _.each(msgs, function (msg) { @@ -743,15 +751,17 @@ var ChatManager = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { } if ('channel_id' in options) { // post a message in a channel or execute a command - return this._rpc('mail.channel', data.command ? 'execute_command' : 'message_post') - .args([options.channel_id]) - .kwargs(_.extend(msg, { - message_type: 'comment', - content_subtype: 'html', - subtype: 'mail.mt_comment', - command: data.command, - })) - .exec(); + return this._rpc({ + model: 'mail.channel', + method: data.command ? 'execute_command' : 'message_post', + args: [options.channel_id], + kwargs: _.extend(msg, { + message_type: 'comment', + content_subtype: 'html', + subtype: 'mail.mt_comment', + command: data.command, + }), + }); } if ('model' in options && 'res_id' in options) { // post a message in a chatter @@ -763,14 +773,18 @@ var ChatManager = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { subtype_id: data.subtype_id, }); - return this._rpc(options.model, 'message_post') - .args([options.res_id]) - .kwargs(msg) - .exec() + return this._rpc({ + model: options.model, + method: 'message_post', + args: [options.res_id], + kwargs: msg, + }) .then(function (msg_id) { - return self._rpc('mail.message', 'message_format') - .args([msg_id]) - .exec() + return self._rpc({ + model: 'mail.message', + method: 'message_format', + args: [msg_id], + }) .then(function (msgs) { msgs[0].model = options.model; msgs[0].res_id = options.res_id; @@ -812,24 +826,30 @@ var ChatManager = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { // get messages for a chatter, when it doesn't know the ids (use // case is when using the full composer) var domain = [['model', '=', options.model], ['res_id', '=', options.res_id]]; - this._rpc('mail.message', 'message_fetch') - .args([domain]) - .kwargs({limit: 30}) - .exec() + this._rpc({ + model: 'mail.message', + method: 'message_fetch', + args: [domain], + kwargs: {limit: 30}, + }) .then(function (msgs) { return _.map(msgs, add_message); }); } }, toggle_star_status: function (message_id) { - return this._rpc('mail.message', 'toggle_message_starred') - .args([[message_id]]) - .exec(); + return this._rpc({ + model: 'mail.message', + method: 'toggle_message_starred', + args: [[message_id]], + }); }, unstar_all: function () { - return this._rpc('mail.message', 'unstar_all') - .args([[]]) - .exec(); + return this._rpc({ + model: 'mail.message', + method: 'unstar_all', + args: [[]] + }); }, mark_as_read: function (message_ids) { var ids = _.filter(message_ids, function (id) { @@ -838,25 +858,31 @@ var ChatManager = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { return !message || message.is_needaction; }); if (ids.length) { - return this._rpc('mail.message', 'set_message_done') - .args([ids]) - .exec(); + return this._rpc({ + model: 'mail.message', + method: 'set_message_done', + args: [ids], + }); } else { return $.when(); } }, mark_all_as_read: function (channel, domain) { if ((channel.id === "channel_inbox" && needaction_counter) || (channel && channel.needaction_counter)) { - return this._rpc('mail.message', 'mark_all_as_read') - .kwargs({channel_ids: channel.id !== "channel_inbox" ? [channel.id] : [], domain: domain}) - .exec(); + return this._rpc({ + model: 'mail.message', + method: 'mark_all_as_read', + kwargs: {channel_ids: channel.id !== "channel_inbox" ? [channel.id] : [], domain: domain}, + }); } return $.when(); }, undo_mark_as_read: function (message_ids, channel) { - return this._rpc('mail.message', 'mark_as_unread') - .args([message_ids, [channel.id]]) - .exec(); + return this._rpc({ + model: 'mail.message', + method: 'mark_as_unread', + args: [message_ids, [channel.id]], + }); }, mark_channel_as_seen: function (channel) { if (channel.unread_counter > 0 && channel.type !== 'static') { @@ -886,9 +912,13 @@ var ChatManager = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { return mention_partner_suggestions; } if (!channel.members_deferred) { - channel.members_deferred = this._rpc('mail.channel', "channel_fetch_listeners") - .args([channel.uuid]) - .exec({options: {shadow: true}}) + channel.members_deferred = this._rpc({ + model: 'mail.channel', + method: 'channel_fetch_listeners', + args: [channel.uuid], + }, { + shadow: true + }) .then(function (members) { var suggestions = []; _.each(mention_partner_suggestions, function (partners) { @@ -949,9 +979,13 @@ var ChatManager = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { }, detach_channel: function (channel) { - return this._rpc('mail.channel', "channel_minimize") - .args([channel.uuid, true]) - .exec({options: {shadow: true}}); + return this._rpc({ + model: 'mail.channel', + method: 'channel_minimize', + args: [channel.uuid, true], + }, { + shadow: true, + }); }, remove_chatter_messages: function (model) { messages = _.reject(messages, function (message) { @@ -963,9 +997,11 @@ var ChatManager = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { var method = type === "dm" ? "channel_get" : "channel_create"; var args = type === "dm" ? [[name]] : [name, type]; - return this._rpc('mail.channel', method) - .args(args) - .exec() + return this._rpc({ + model: 'mail.channel', + method: method, + args: args, + }) .then(add_channel); }, join_channel: function (channel_id, options) { @@ -978,9 +1014,11 @@ var ChatManager = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { // channel already joined channel_defs[channel_id] = $.when(channel); } else { - channel_defs[channel_id] = this._rpc('mail.channel', 'channel_join_and_get_info') - .args([[channel_id]]) - .exec() + channel_defs[channel_id] = this._rpc({ + model: 'mail.channel', + method: 'channel_join_and_get_info', + args: [[channel_id]], + }) .then(function (result) { return add_channel(result, options); }); @@ -988,9 +1026,11 @@ var ChatManager = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { return channel_defs[channel_id]; }, open_and_detach_dm: function (partner_id) { - return this._rpc('mail.channel', 'channel_get_and_minimize') - .args([[partner_id]]) - .exec() + return this._rpc({ + model: 'mail.channel', + method: 'channel_get_and_minimize', + args: [[partner_id]], + }) .then(add_channel); }, open_channel: function (channel) { @@ -999,20 +1039,26 @@ var ChatManager = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { unsubscribe: function (channel) { if (_.contains(['public', 'private'], channel.type)) { - return this._rpc('mail.channel', 'action_unfollow') - .args([[channel.id]]) - .exec(); + return this._rpc({ + model: 'mail.channel', + method: 'action_unfollow', + args: [[channel.id]], + }); } else { - return this._rpc('mail.channel', 'channel_pin') - .args([channel.uuid, false]) - .exec(); + return this._rpc({ + model: 'mail.channel', + method: 'channel_pin', + args: [channel.uuid, false], + }); } }, close_chat_session: function (channel_id) { var channel = this.get_channel(channel_id); - this._rpc('mail.channel', "channel_fold") - .kwargs({uuid : channel.uuid, state : "closed"}) - .exec({options: {shadow: true}}); + this._rpc({ + model: 'mail.channel', + method: 'channel_fold', + kwargs: {uuid : channel.uuid, state : 'closed'}, + }, {shadow: true}); }, fold_channel: function (channel_id, folded) { var args = { @@ -1021,9 +1067,11 @@ var ChatManager = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { if (_.isBoolean(folded)) { args.state = folded ? 'folded' : 'open'; } - return this._rpc('mail.channel', "channel_fold") - .kwargs(args) - .exec({options: {shadow: true}}); + return this._rpc({ + model: 'mail.channel', + method: 'channel_fold', + kwargs: args, + }, {shadow: true}); }, /** * Special redirection handling for given model and id @@ -1046,9 +1094,11 @@ var ChatManager = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { }; if (res_model === "res.partner") { var domain = [["partner_id", "=", res_id]]; - this._rpc('res.users', "search") - .args([domain]) - .exec() + this._rpc({ + model: 'res.users', + method: 'search', + args: [domain], + }) .then(function (user_ids) { if (user_ids.length && user_ids[0] !== session.uid && dm_redirection_callback) { self.create_channel(res_id, 'dm').then(dm_redirection_callback); @@ -1057,9 +1107,11 @@ var ChatManager = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { } }); } else { - this._rpc(res_model, 'get_formview_id') - .args([[res_id], session.user_context]) - .exec() + this._rpc({ + model: res_model, + method: 'get_formview_id', + args: [[res_id], session.user_context], + }) .then(function (view_id) { redirect_to_document(res_model, res_id, view_id); }); @@ -1083,9 +1135,13 @@ var ChatManager = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { if (!channels_preview_def) { if (missing_channels.length) { var missing_channel_ids = _.pluck(missing_channels, 'id'); - channels_preview_def = this._rpc('mail.channel', 'channel_fetch_preview') - .args([missing_channel_ids]) - .exec({options: {shadow: true}}); + channels_preview_def = this._rpc({ + model: 'mail.channel', + method: 'channel_fetch_preview', + args: [missing_channel_ids], + }, { + shadow: true, + }); } else { channels_preview_def = $.when(); } @@ -1120,9 +1176,13 @@ var ChatManager = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, { }); if (!values.length) { // extend the research to all users - def = this._rpc('res.partner', 'im_search') - .args([search_val, limit || 20]) - .exec({options: {shadow: true}}); + def = this._rpc({ + model: 'res.partner', + method: 'im_search', + args: [search_val, limit || 20], + }, { + shadow: true, + }); } else { def = $.when(values); } diff --git a/addons/mail/static/src/js/chatter.js b/addons/mail/static/src/js/chatter.js index 41733fbbe89..bff296bf8fa 100644 --- a/addons/mail/static/src/js/chatter.js +++ b/addons/mail/static/src/js/chatter.js @@ -243,9 +243,7 @@ var Chatter = Widget.extend(chat_mixin, { this.suggested_partners_def = $.Deferred(); var method = 'message_get_suggested_recipients'; var args = [[this.context.default_res_id], this.context]; - this._rpc(this.record.model, method) - .args(args) - .exec() + this._rpc({model: this.record.model, method: method, args: args}) .then(function (result) { if (!self.suggested_partners_def) { return; // widget has been reset (e.g. we just switched to another record) diff --git a/addons/mail/static/src/js/chatter_composer.js b/addons/mail/static/src/js/chatter_composer.js index 8f64622e209..340c82c349f 100644 --- a/addons/mail/static/src/js/chatter_composer.js +++ b/addons/mail/static/src/js/chatter_composer.js @@ -124,10 +124,11 @@ var ChatterComposer = composer.BasicComposer.extend({ // have unknown names -> call message_get_partner_info_from_emails to try to find partner_id var def; if (names_to_find.length > 0) { - var args = [[this.context.default_res_id], names_to_find]; - def = this._rpc(this.model, 'message_partner_info_from_emails') - .args(args) - .exec(); + def = this._rpc({ + model: this.model, + method: 'message_partner_info_from_emails', + args: [[this.context.default_res_id], names_to_find], + }); } // for unknown names + incomplete partners -> open popup - cancel = remove from recipients @@ -172,10 +173,11 @@ var ChatterComposer = composer.BasicComposer.extend({ var new_names_to_find = _.difference(names_to_find, names_to_remove); var def; if (new_names_to_find.length > 0) { - var args = [[self.context.default_res_id], new_names_to_find, true]; - self._rpc(self.model, 'message_partner_info_from_emails') - .args(args) - .exec(); + self._rpc({ + model: self.model, + method: 'message_partner_info_from_emails', + args: [[self.context.default_res_id], new_names_to_find, true], + }); } $.when(def).pipe(function (result) { result = result || []; diff --git a/addons/mail/static/src/js/client_action.js b/addons/mail/static/src/js/client_action.js index 28acb02828d..b64f7e3490b 100644 --- a/addons/mail/static/src/js/client_action.js +++ b/addons/mail/static/src/js/client_action.js @@ -69,10 +69,12 @@ var PartnerInviteDialog = Dialog.extend({ var self = this; var data = this.$input.select2('data'); if(data.length >= 1){ - return this._rpc('mail.channel', 'channel_invite') - .args([this.channel_id]) - .kwargs({partner_ids: _.pluck(data, 'id')}) - .exec() + return this._rpc({ + model: 'mail.channel', + method: 'channel_invite', + args: [this.channel_id], + kwargs: {partner_ids: _.pluck(data, 'id')}, + }) .then(function(){ var names = _.escape(_.pluck(data, 'text').join(', ')); var notification = _.str.sprintf(_t('You added <b>%s</b> to the conversation.'), names); @@ -381,9 +383,11 @@ var ChatAction = Widget.extend(ControlPanelMixin, { }, do_search_channel: function(search_val){ - return this._rpc('mail.channel', 'channel_search_to_join') - .args([search_val]) - .exec() + return this._rpc({ + model: 'mail.channel', + method: 'channel_search_to_join', + args: [search_val] + }) .then(function(result){ var values = []; _.each(result, function(channel){ diff --git a/addons/mail/static/src/js/composer.js b/addons/mail/static/src/js/composer.js index 0471f6e8a5b..88053c22447 100644 --- a/addons/mail/static/src/js/composer.js +++ b/addons/mail/static/src/js/composer.js @@ -666,9 +666,7 @@ var BasicComposer = Widget.extend(chat_mixin, { var def = $.Deferred(); clearTimeout(this.mention_fetch_timer); this.mention_fetch_timer = setTimeout(function () { - return self._rpc(model, method) - .kwargs(kwargs) - .exec() + return self._rpc({model: model, method: method, kwargs: kwargs}) .then(function (results) { def.resolve(results); }); diff --git a/addons/mail/static/src/js/followers.js b/addons/mail/static/src/js/followers.js index 7c4529b203e..f0fc21dab26 100644 --- a/addons/mail/static/src/js/followers.js +++ b/addons/mail/static/src/js/followers.js @@ -195,9 +195,10 @@ var Followers = AbstractField.extend({ var missing_ids = _.difference(this.value.res_ids, _.pluck(this.followers, 'id')); var def; if (missing_ids.length) { - def = this._rpc('/mail/read_followers') - .params({ follower_ids: missing_ids, res_model: this.model }) - .exec(); + def = this._rpc({ + route: '/mail/read_followers', + params: { follower_ids: missing_ids, res_model: this.model } + }); } return $.when(def).then(function (results) { if (results) { @@ -220,10 +221,12 @@ var Followers = AbstractField.extend({ partner_ids: [this.partnerID], context: {}, // FIXME }; - this._rpc(this.model, 'message_subscribe') - .args([[this.res_id]]) - .kwargs(kwargs) - .exec() + this._rpc({ + model: this.model, + method: 'message_subscribe', + args: [[this.res_id]], + kwargs: kwargs, + }) .then(this._reload.bind(this)); }, /** @@ -243,9 +246,11 @@ var Followers = AbstractField.extend({ ids.channel_ids, {}, // FIXME ]; - self._rpc(self.model, 'message_unsubscribe') - .args(args) - .exec() + self._rpc({ + model: self.model, + method: 'message_unsubscribe', + args: args + }) .then(self._reload.bind(self)); def.resolve(); }, @@ -287,10 +292,12 @@ var Followers = AbstractField.extend({ var kwargs = _.extend({}, ids); kwargs.subtype_ids = checklist; kwargs.context = {}; // FIXME - this._rpc(this.model, 'message_subscribe') - .args([[this.res_id]]) - .kwargs(kwargs) - .exec() + this._rpc({ + model: this.model, + method: 'message_subscribe', + args: [[this.res_id]], + kwargs: kwargs, + }) .then(this._reload.bind(this)); } }, @@ -308,9 +315,10 @@ var Followers = AbstractField.extend({ var self = this; var $currentTarget = $(event.currentTarget); var follower_id = $currentTarget.data('follower-id'); // id of model mail_follower - return this._rpc('/mail/read_subscription_data') - .params({res_model: this.model, follower_id: follower_id}) - .exec() + return this._rpc({ + route: '/mail/read_subscription_data', + params: {res_model: this.model, follower_id: follower_id}, + }) .then(function (data) { var res_id = $currentTarget.data('oe-id'); // id of model res_partner or mail_channel var is_channel = $currentTarget.data('oe-model') === 'mail.channel'; diff --git a/addons/point_of_sale/static/src/js/devices.js b/addons/point_of_sale/static/src/js/devices.js index 6ca9b66e364..0317ad5e16d 100644 --- a/addons/point_of_sale/static/src/js/devices.js +++ b/addons/point_of_sale/static/src/js/devices.js @@ -439,10 +439,12 @@ var ProxyDevice = core.Class.extend(mixins.PropertiesMixin,{ send_printing_job(); }, - print_sale_details: function() { + print_sale_details: function() { var self = this; - rpc.query({model: 'report.point_of_sale.report_saledetails', method: 'get_sale_details'}) - .exec({type: "ajax"}) + rpc.query({ + model: 'report.point_of_sale.report_saledetails', + method: 'get_sale_details', + }) .then(function(result){ var env = { company: self.pos.company, diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js index 939c1adc094..87ce0480022 100644 --- a/addons/point_of_sale/static/src/js/models.js +++ b/addons/point_of_sale/static/src/js/models.js @@ -499,18 +499,17 @@ exports.PosModel = Backbone.Model.extend({ if( model.model ){ var method = model.ids ? 'read' : 'search_read'; var args = model.ids ? [ids, fields] : [domain, fields]; - var query = rpc - .query({model: model.model, method: method}) - .args(args) - .withContext(context); + var params = { + model: model.model, + method: method, + args: args, + context: context, + }; if (method === 'search_read') { - query = query.orderBy(order); + params.orderBy = order; } - query.exec({type: "ajax"}).then(function(result){ + rpc.query(params).then(function(result){ try{ // catching exceptions in model.loaded(...) - if (method === 'search_read') { - result = result.records; - } $.when(model.loaded(self,result,tmp)) .then(function(){ load_model(index + 1); }, function(err){ loaded.reject(err); }); @@ -551,11 +550,16 @@ exports.PosModel = Backbone.Model.extend({ var def = new $.Deferred(); var fields = _.find(this.models,function(model){ return model.model === 'res.partner'; }).fields; var domain = [['customer','=',true],['write_date','>',this.db.get_partner_write_date()]]; - rpc.query({model: 'res.partner', method: 'search_read'}) - .args([domain, fields]) - .exec({type: "ajax", options: {timeout:3000, shadow: true}}) + rpc.query({ + model: 'res.partner', + method: 'search_read', + args: [domain, fields], + }, { + timeout: 3000, + shadow: true, + }) .then(function(partners){ - if (self.db.add_partners(partners.records)) { // check if the partners we got were real updates + if (self.db.add_partners(partners)) { // check if the partners we got were real updates def.resolve(); } else { def.reject(); @@ -888,10 +892,14 @@ exports.PosModel = Backbone.Model.extend({ order.to_invoice = options.to_invoice || false; return order; })]; - var rpcOptions = {timeout: timeout, shadow: !options.to_invoice}; - return rpc.query({model: 'pos.order', method: 'create_from_ui'}) - .args(args) - .exec({type: "ajax", options: rpcOptions}) + return rpc.query({ + model: 'pos.order', + method: 'create_from_ui', + args: args, + }, { + timeout: timeout, + shadow: !options.to_invoice + }) .then(function (server_ids) { _.each(order_ids_to_sync, function (order_id) { self.db.remove_order(order_id); diff --git a/addons/point_of_sale/static/src/js/screens.js b/addons/point_of_sale/static/src/js/screens.js index 6186eab9717..7929a25048f 100644 --- a/addons/point_of_sale/static/src/js/screens.js +++ b/addons/point_of_sale/static/src/js/screens.js @@ -1209,9 +1209,11 @@ var ClientListScreenWidget = ScreenWidget.extend({ fields.id = partner.id || false; fields.country_id = fields.country_id || false; - rpc.query({model: 'res.partner', method: 'create_from_ui'}) - .args([fields]) - .exec({type: "ajax"}) + rpc.query({ + model: 'res.partner', + method: 'create_from_ui', + args: [fields], + }) .then(function(partner_id){ self.saved_client_details(partner_id); },function(err,event){ diff --git a/addons/pos_cache/static/src/js/pos_cache.js b/addons/pos_cache/static/src/js/pos_cache.js index 6598ab9a8c2..705bd1e66fb 100644 --- a/addons/pos_cache/static/src/js/pos_cache.js +++ b/addons/pos_cache/static/src/js/pos_cache.js @@ -31,9 +31,11 @@ models.PosModel = models.PosModel.extend({ } return posmodel_super.load_server_data.apply(this, arguments).then(function () { - var records = rpc.query({model: 'pos.config', method: 'get_products_from_cache'}) - .args([self.pos_session.config_id[0], product_fields, product_domain]) - .exec({type: "ajax"}); + var records = rpc.query({ + model: 'pos.config', + method: 'get_products_from_cache', + args: [self.pos_session.config_id[0], product_fields, product_domain], + }); self.chrome.loading_message(_t('Loading') + ' product.product', 1); return records.then(function (product) { self.db.add_products(product); diff --git a/addons/pos_mercury/static/src/js/pos_mercury.js b/addons/pos_mercury/static/src/js/pos_mercury.js index 10007b92851..85e18cb4979 100644 --- a/addons/pos_mercury/static/src/js/pos_mercury.js +++ b/addons/pos_mercury/static/src/js/pos_mercury.js @@ -388,9 +388,13 @@ PaymentScreenWidget.include({ }); } - rpc.query({model: 'pos_mercury.mercury_transaction', method: 'do_payment'}) - .args([transaction]) - .exec({type: "ajax", options: {timeout: self.server_timeout_in_ms}}) + rpc.query({ + model: 'pos_mercury.mercury_transaction', + method: 'do_payment', + args: [transaction], + }, { + timeout: self.server_timeout_in_ms, + }) .then(function (data) { // if not receiving a response from Mercury, we should retry if (data === "timeout") { @@ -546,9 +550,13 @@ PaymentScreenWidget.include({ }); } - rpc.query({model: 'pos_mercury.mercury_transaction', method: rpc_method}) - .args([request_data]) - .exec({type: "ajax", options: {timeout: self.server_timeout_in_ms}}) + rpc.query({ + model: 'pos_mercury.mercury_transaction', + method: rpc_method, + args: [request_data], + }, { + timeout: self.server_timeout_in_ms + }) .then(function (data) { if (data === "timeout") { self.retry_mercury_transaction(def, null, retry_nr, true, self.do_reversal, [line, is_voidsale, def, retry_nr + 1]); diff --git a/addons/pos_restaurant/static/src/js/floors.js b/addons/pos_restaurant/static/src/js/floors.js index beabc66d898..c8b8379751c 100644 --- a/addons/pos_restaurant/static/src/js/floors.js +++ b/addons/pos_restaurant/static/src/js/floors.js @@ -247,14 +247,18 @@ var TableWidget = PosBaseWidget.extend({ // and the id ... serializable_table.id = this.table.id; - rpc.query({model: 'restaurant.table', method: 'create_from_ui'}) - .args([serializable_table]) - .exec({type: "ajax"}) + rpc.query({ + model: 'restaurant.table', + method: 'create_from_ui', + args: [serializable_table], + }) .then(function (table_id){ - rpc.query({model: 'restaurant.table', method: 'search_read'}) - .args([[['id', '=', table_id]], fields]) - .withLimit(1) - .exec({type: "ajax"}) + rpc.query({ + model: 'restaurant.table', + method: 'search_read', + args: [[['id', '=', table_id]], fields], + limit: 1, + }) .then(function (table){ for (var field in table) { self.table[field] = table[field]; @@ -275,9 +279,11 @@ var TableWidget = PosBaseWidget.extend({ // available on the database for the orders that depend on it. trash: function(){ var self = this; - rpc.query({model: 'restaurant.table', method: 'create_from_ui'}) - .args([{'active':false,'id':this.table.id}]) - .exec({type: "ajax"}) + rpc.query({ + model: 'restaurant.table', + method: 'create_from_ui', + args: [{'active':false,'id':this.table.id}], + }) .then(function (table_id){ // Removing all references from the table and the table_widget in in the UI ... for (var i = 0; i < self.pos.floors.length; i++) { @@ -413,9 +419,11 @@ var FloorScreenWidget = screens.ScreenWidget.extend({ set_background_color: function(background) { var self = this; this.floor.background_color = background; - rpc.query({model: 'restaurant.floor', method: 'write'}) - .args([[this.floor.id], {'background_color': background}]) - .exec({type: "ajax"}) + rpc.query({ + model: 'restaurant.floor', + method: 'write', + args: [[this.floor.id], {'background_color': background}], + }) .fail(function (err, event){ self.gui.show_popup('error',{ 'title':_t('Changes could not be saved'), diff --git a/addons/project/static/src/js/project.js b/addons/project/static/src/js/project.js index c1f82292593..5da3151aa68 100644 --- a/addons/project/static/src/js/project.js +++ b/addons/project/static/src/js/project.js @@ -39,10 +39,12 @@ KanbanRecord.include({ ev.preventDefault(); var domain = [['res_model', '=', 'project.task'], ['res_id', '=', this.id], ['mimetype', 'ilike', 'image']]; - this._rpc('ir.attachment', 'search_read') - .withDomain(domain) - .withFields(['id', 'name']) - .exec() + this._rpc({ + model: 'ir.attachment', + method: 'search_read', + domain: domain, + fields: ['id', 'name'], + }) .then(open_cover_images_dialog); } else { this._super.apply(this, arguments, ev); diff --git a/addons/report/static/src/js/qwebactionmanager.js b/addons/report/static/src/js/qwebactionmanager.js index ded094cb26e..3f477bf7d16 100644 --- a/addons/report/static/src/js/qwebactionmanager.js +++ b/addons/report/static/src/js/qwebactionmanager.js @@ -89,7 +89,7 @@ ActionManager.include({ } else if (action.report_type === 'qweb-pdf') { framework.blockUI(); // Before doing anything, we check the state of wkhtmltopdf on the server. - (wkhtmltopdf_state = wkhtmltopdf_state || this._rpc('/report/check_wkhtmltopdf').exec()).then(function (state) { + (wkhtmltopdf_state = wkhtmltopdf_state || this._rpc({route: '/report/check_wkhtmltopdf'})).then(function (state) { // Display a notification to the user according to wkhtmltopdf's state. if (WKHTMLTOPDF_MESSAGES[state]) { self.do_notify(_t('Report'), WKHTMLTOPDF_MESSAGES[state], true); diff --git a/addons/sale/static/src/js/sale.js b/addons/sale/static/src/js/sale.js index c9818e0f4e8..289d26ecae3 100644 --- a/addons/sale/static/src/js/sale.js +++ b/addons/sale/static/src/js/sale.js @@ -31,9 +31,11 @@ KanbanRecord.include({ if (isNaN(value)) { self.do_warn(_t("Wrong value entered!"), _t("Only Integer Value should be valid.")); } else { - self._rpc('crm.team', 'write') - .args([[self.id], { 'invoiced_target': value }]) - .exec() + self._rpc({ + model: 'crm.team', + method: 'write', + args: [[self.id], { 'invoiced_target': value }], + }) .done(function() { self.trigger_up('kanban_record_update', {id: self.id}); }); diff --git a/addons/sales_team/static/src/js/sales_team_dashboard.js b/addons/sales_team/static/src/js/sales_team_dashboard.js index 449e568fa68..ea60d918259 100644 --- a/addons/sales_team/static/src/js/sales_team_dashboard.js +++ b/addons/sales_team/static/src/js/sales_team_dashboard.js @@ -198,9 +198,11 @@ var SalesTeamDashboardController = KanbanController.extend({ if(isNaN(targetValue)) { this.do_warn(_t("Wrong value entered!"), _t("Only Integer Value should be valid.")); } else { - this._rpc('crm.lead', 'modify_target_sales_dashboard') - .args([targetName, parseInt(targetValue)]) - .exec() + this._rpc({ + model: 'crm.lead', + method: 'modify_target_sales_dashboard', + args: [targetName, parseInt(targetValue)], + }) .then(this.reload.bind(this)); } }, diff --git a/addons/web/static/src/js/apps.js b/addons/web/static/src/js/apps.js index 8e9818f67d6..fcf21852d2c 100644 --- a/addons/web/static/src/js/apps.js +++ b/addons/web/static/src/js/apps.js @@ -40,8 +40,7 @@ var Apps = Widget.extend({ if (apps_client) { return check_client_available(apps_client); } else { - return this._rpc('ir.module.module', 'get_apps_server') - .exec() + return this._rpc({model: 'ir.module.module', method: 'get_apps_server'}) .then(function(u) { var link = $(_.str.sprintf('<a href="%s"></a>', u))[0]; var host = _.str.sprintf('%s//%s', link.protocol, link.host); @@ -90,9 +89,7 @@ var Apps = Widget.extend({ }); }, 'Model': function(m) { - return this._rpc(m.model, m.method) - .args(m.args) - .exec() + return this._rpc({model: m.model, method: m.method, args: m.args}) .then(function(r) { var w = self.$ifr[0].contentWindow; w.postMessage({id: m.id, result: r}, client.origin); diff --git a/addons/web/static/src/js/chrome/action_manager.js b/addons/web/static/src/js/chrome/action_manager.js index fdfc33f74f5..9221561f2d9 100644 --- a/addons/web/static/src/js/chrome/action_manager.js +++ b/addons/web/static/src/js/chrome/action_manager.js @@ -559,9 +559,10 @@ var ActionManager = Widget.extend({ if (warm) { this.null_action(); } - action_loaded = this._rpc('/web/session/get_session_action') - .params({key: state.sa}) - .exec() + action_loaded = this._rpc({ + route: '/web/session/get_session_action', + params: {key: state.sa}, + }) .then(function(action) { if (action) { return self.do_action(action); @@ -835,12 +836,13 @@ var ActionManager = Widget.extend({ }, ir_actions_server: function (action, options) { var self = this; - return this._rpc('/web/action/run') - .params({ - action_id: action.id, - context: action.context || {} + return this._rpc({ + route: '/web/action/run', + params: { + action_id: action.id, + context: action.context || {} + }, }) - .exec() .then(function (action) { return self.do_action(action, options); }); diff --git a/addons/web/static/src/js/chrome/search_inputs.js b/addons/web/static/src/js/chrome/search_inputs.js index aa02f9fe950..2a265ff0fdd 100644 --- a/addons/web/static/src/js/chrome/search_inputs.js +++ b/addons/web/static/src/js/chrome/search_inputs.js @@ -427,14 +427,16 @@ var ManyToOneField = CharField.extend({ args = []; } } - return this._rpc(this.attrs.relation, 'name_search') - .kwargs({ - name: needle, - args: args, - limit: 8, - context: context + return this._rpc({ + model: this.attrs.relation, + method: 'name_search', + kwargs: { + name: needle, + args: args, + limit: 8, + context: context + }, }) - .exec() .then(function (results) { if (_.isEmpty(results)) { return null; } return _(results).map(function (result) { @@ -459,10 +461,12 @@ var ManyToOneField = CharField.extend({ } var context = pyeval.eval('contexts', [this.searchview.dataset.get_context()]); - return this._rpc(this.attrs.relation, 'name_get') - .args([value]) - .withContext(context) - .exec() + return this._rpc({ + model: this.attrs.relation, + method: 'name_get', + args: [value], + context: context, + }) .then(function (names) { if (_(names).isEmpty()) { return null; } return facet_from(self, names[0]); diff --git a/addons/web/static/src/js/chrome/sidebar.js b/addons/web/static/src/js/chrome/sidebar.js index 41e45b6e148..3cd17334e9e 100644 --- a/addons/web/static/src/js/chrome/sidebar.js +++ b/addons/web/static/src/js/chrome/sidebar.js @@ -148,13 +148,14 @@ var Sidebar = Widget.extend({ new Context( sidebar_eval_context, active_ids_context)); - self._rpc("/web/action/load") - .params({ - action_id: item.action.id, - context: new Context( - dataset.get_context(), active_ids_context).eval() + self._rpc({ + route: '/web/action/load', + params: { + action_id: item.action.id, + context: new Context( + dataset.get_context(), active_ids_context).eval() + }, }) - .exec() .done(function(result) { result.context = new Context( result.context || {}, active_ids_context) diff --git a/addons/web/static/src/js/chrome/user_menu.js b/addons/web/static/src/js/chrome/user_menu.js index 21ecac479b1..5e1691c6640 100644 --- a/addons/web/static/src/js/chrome/user_menu.js +++ b/addons/web/static/src/js/chrome/user_menu.js @@ -59,8 +59,7 @@ var UserMenu = Widget.extend({ var self = this; this.trigger_up('clear_uncommitted_changes', { callback: function () { - self._rpc('/web/session/account') - .exec() + self._rpc({route: '/web/session/account'}) .then(function (url) { framework.redirect(url); }) @@ -93,11 +92,12 @@ var UserMenu = Widget.extend({ var session = this.getSession(); this.trigger_up('clear_uncommitted_changes', { callback: function () { - self._rpc("/web/action/load") - .params({ - action_id: "base.action_res_users_my", + self._rpc({ + route: "/web/action/load", + params: { + action_id: "base.action_res_users_my", + }, }) - .exec() .done(function (result) { result.res_id = session.uid; self.do_action(result); diff --git a/addons/web/static/src/js/chrome/web_client.js b/addons/web/static/src/js/chrome/web_client.js index 48666e2bd16..800277cfae8 100644 --- a/addons/web/static/src/js/chrome/web_client.js +++ b/addons/web/static/src/js/chrome/web_client.js @@ -65,13 +65,16 @@ return AbstractWebClient.extend({ logo_edit: function(ev) { var self = this; ev.preventDefault(); - this._rpc("res.users", "read") - .args([[session.uid], ["company_id"]]) - .exec() + this._rpc({ + model: 'res.users', + method: 'read', + args: [[session.uid], ['company_id']], + }) .then(function(data) { - self._rpc("/web/action/load") - .params({ action_id: "base.action_res_company_form" }) - .exec() + self._rpc({ + route: '/web/action/load', + params: { action_id: 'base.action_res_company_form' }, + }) .done(function(result) { result.res_id = data[0].company_id[0]; result.target = "new"; @@ -99,9 +102,11 @@ return AbstractWebClient.extend({ var state = $.bbq.getState(true); if (_.isEmpty(state) || state.action === "login") { self.menu.is_bound.done(function() { - self._rpc("res.users", "read") - .args([[session.uid], ["action_id"]]) - .exec() + self._rpc({ + model: 'res.users', + method: 'read', + args: [[session.uid], ['action_id']], + }) .done(function(result) { var data = result[0]; if(data.action_id) { diff --git a/addons/web/static/src/js/core/mixins.js b/addons/web/static/src/js/core/mixins.js index 71ce5e28f7f..8a5038557c2 100644 --- a/addons/web/static/src/js/core/mixins.js +++ b/addons/web/static/src/js/core/mixins.js @@ -453,13 +453,9 @@ var ServicesMixin = { * @param {string} method if a model is given, this argument is a method * @returns {RPCBuilder} */ - _rpc: function (arg1, method) { - return rpc.query({ - method: method, - model: method && arg1, - parent: this, - route: !method && arg1, - }); + _rpc: function (params, options) { + var query = rpc.buildQuery(params); + return this.call('ajax', 'rpc', query.route, query.params, options); }, loadFieldView: function (dataset, view_id, view_type, options) { return this.loadViews(dataset.model, dataset.get_context(), [[view_id, view_type]], options).then(function (result) { diff --git a/addons/web/static/src/js/core/rpc.js b/addons/web/static/src/js/core/rpc.js index bb1b6740048..573041301e8 100644 --- a/addons/web/static/src/js/core/rpc.js +++ b/addons/web/static/src/js/core/rpc.js @@ -2,199 +2,88 @@ odoo.define('web.rpc', function (require) { "use strict"; var ajax = require('web.ajax'); -var Class = require('web.Class'); -var BaseRPCBuilder = Class.extend({ +return { /** - * @param {Widget} parent the rpc will go through this widget - * @param {Object} params - * @param {string} [params.model] - * @param {string} [params.method] - * @param {string} [params.route] - */ - init: function (parent, params) { - this.parent = parent; - this._route = params.route; - if (!this._route) { - this._route = '/web/dataset/call_kw/' + params.model + '/' + params.method; + * Perform a RPC. Please note that this is not the preferred way to do a + * rpc if you are in the context of a widget. In that case, you should use + * the this._rpc method. + * + * @param {Object} params @see buildQuery for a description + * @param {Object} options + * @returns {Deferred<any>} + */ + query: function (params, options) { + var query = this.buildQuery(params); + return ajax.rpc(query.route, query.params, options); + }, + /** + * @param {Object} options + * @param {any[]} [options.args] + * @param {Object} [options.context] + * @param {any[]} [options.domain] + * @param {string[]} [options.fields] + * @param {string[]} [options.groupBy] + * @param {Object} [options.kwargs] + * @param {integer|false} [options.limit] + * @param {string} [options.method] + * @param {string} [options.model] + * @param {integer} [options.offset] + * @param {string[]} [options.orderBy] + * @param {Object} [options.params] + * @param {string} [options.route] + * @returns {Object} with 2 keys: route and params + */ + buildQuery: function (options) { + var route; + var params = options.params || {}; + if (options.route) { + route = options.route; + } else if (options.model && options.method) { + route = '/web/dataset/call_kw/' + options.model + '/' + options.method; } - this._model = params.model; - this._method = params.method; - }, - - //-------------------------------------------------------------------------- - // Public - //-------------------------------------------------------------------------- - - /** - * @param {Array} args - * @returns {BaseRPCBuilder} - */ - args: function (args) { - if (!(args instanceof Array)) { - throw new Error("Arguments should be an array"); + if (options.method) { + params.args = options.args || []; + params.model = options.model; + params.method = options.method; + params.kwargs = options.kwargs || {}; + params.kwargs.context = options.context || params.kwargs.context; } - this._args = args; - return this; - }, - /** - * @param {Object} [params] - * @param {string} [params.type=event] if type=event, the rpc will be done - * by triggering an event. It will work if the parent is in a component - * tree with a component with a ServiceProvider somewhere up. If - * type=ajax, then it will instead perform directly an ajax call. This is - * discouraged, if possible. - * @param {Object} [params.options] options that will be sent to the low - * level ajax call. Typically, shadow=true. - * @return {Deferred<*>} - */ - exec: function (params) { - var route = this._getRoute(); - var options = (params && params.options) ? params.options : {}; - var type = (params && params.type) ? params.type : 'event'; - if (type === 'event') { - return this.parent.call('ajax', 'rpc', route, this._getParams(), options); - } else if (type === 'ajax') { - return ajax.rpc(route, this._getParams(), options); + if (options.method === 'read_group') { + params.kwargs.groupby = options.groupBy || params.kwargs.groupby || []; + params.kwargs.domain = options.domain || params.kwargs.domain || []; + params.kwargs.fields = options.fields || params.kwargs.fields || []; + params.kwargs.lazy = options.lazy || params.kwargs.lazy; + var orderBy = options.orderBy || params.orderBy; + params.kwargs.orderby = orderBy ? this._serializeSort(orderBy) : false; } - }, - /** - * @param {Object} kwargs - * @returns {BaseRPCBuilder} - */ - kwargs: function (kwargs) { - this._kwargs = kwargs; - return this; - }, - /** - * @param {Object} params - * @returns {BaseRPCBuilder} - */ - params: function (params) { - this._params = params; - return this; - }, - /** - * @param {Object} context - * @returns {BaseRPCBuilder} - */ - withContext: function (context) { - this._context = context; - return this; - }, - //-------------------------------------------------------------------------- - // Private - //-------------------------------------------------------------------------- - - /** - * @private - * @returns {Object} - */ - _getParams: function () { - var kwargs = _.extend({}, this._kwargs); - if (this._context) { - kwargs.context = this._context; + if (options.method === 'search_read') { + // call the model method + params.args = [ + options.domain || [], + options.fields || false, + options.offset || 0, + options.limit || false, + this._serializeSort(options.orderBy || params.orderBy || []), + ]; } - var params = { - method: this._method, - model: this._model, - args: this._args || (this._method ? [] : undefined), - kwargs: this._method ? kwargs : undefined, - }; - return _.defaults(params, this._params); - }, - /** - * @private - * @returns {string} - */ - _getRoute: function () { - return this._route; - }, -}); -var SearchRPCBuilder = BaseRPCBuilder.extend({ - init: function () { - this._super.apply(this, arguments); - this._route = '/web/dataset/search_read'; - this._orderBy = false; - this._domain = []; - this._fields = false; - }, - - //-------------------------------------------------------------------------- - // Public - //-------------------------------------------------------------------------- - - /** - * @param {Object[]} orderBy - * @returns {BaseRPCBuilder} - */ - orderBy: function (orderBy) { - // todo: serialize properly this - this._orderBy = this._serializeSort(orderBy); - return this; - }, - /** - * @param {Object} context - * @returns {BaseRPCBuilder} - */ - withContext: function (context) { - this._context = context; - return this; - }, - /** - * @param {Object} domain - * @returns {BaseRPCBuilder} - */ - withDomain: function (domain) { - this._domain = domain; - return this; - }, - /** - * @param {string[]} fields - * @returns {BaseRPCBuilder} - */ - withFields: function (fields) { - this._fields = fields; - return this; - }, - /** - * @param {Object} limit - * @returns {BaseRPCBuilder} - */ - withLimit: function (limit) { - this._limit = limit; - return this; - }, - /** - * @param {Object} offset - * @returns {BaseRPCBuilder} - */ - withOffset: function (offset) { - this._offset = offset; - return this; - }, - - //-------------------------------------------------------------------------- - // Private - //-------------------------------------------------------------------------- + if (options.route === '/web/dataset/search_read') { + // specifically call the controller + params.model = options.model || params.model; + params.domain = options.domain || params.domain || []; + params.fields = options.fields || params.fields || false; + params.limit = options.limit || params.limit; + params.offset = options.offset || params.offset ; + params.sort = this._serializeSort(options.orderBy || params.orderBy || []); + params.context = options.context || params.context || {}; + } - /** - * @override - * @private - * @returns {Object} - */ - _getParams: function () { return { - context: this._context || {}, - domain: this._domain, - fields: this._fields, - limit: this._limit, - model: this._model, - offset: this._offset, - sort: this._orderBy + route: route, + params: JSON.parse(JSON.stringify(params)), }; }, /** @@ -212,85 +101,6 @@ var SearchRPCBuilder = BaseRPCBuilder.extend({ return order.name + (order.asc !== false ? ' ASC' : ' DESC'); }).join(', '); }, -}); - -var ReadGroupRPCBuilder = SearchRPCBuilder.extend({ - init: function () { - this._super.apply(this, arguments); - this._route = '/web/dataset/call_kw/' + this._model + '/read_group'; - }, - - //-------------------------------------------------------------------------- - // Public - //-------------------------------------------------------------------------- - - /** - * We need to make sure that arguments are properly set. - * @override - * @returns {Deferred<*>} - */ - exec: function () { - if (!this._groupBy) { - throw new Error("read_group must have a group_by argument"); - } - return this._super.apply(this, arguments); - }, - /** - * @param {string[]} groupBy - * @returns {BaseRPCBuilder} - */ - groupBy: function (groupBy) { - // todo: serialize properly this - this._groupBy = groupBy; - return this; - }, - /** - * @param {boolean} lazy - * @returns {BaseRPCBuilder} - */ - lazy: function (lazy) { - // todo: serialize properly this - this._lazy = lazy; - return this; - }, - - //-------------------------------------------------------------------------- - // Private - //-------------------------------------------------------------------------- - - /** - * @override - * @private - * @returns {Object} - */ - _getParams: function () { - var kwargs = _.defaults({}, this._kwargs, { - context: this._context || {}, - domain: this._domain || [], - fields: this._fields, - groupby: this._groupBy, - lazy: !!this._lazy, - orderby: this._orderBy, - }); - return { - args: this._args || [], - kwargs: kwargs, - method: 'read_group', - model: this._model, - }; - }, -}); - -return { - builders: { - default: BaseRPCBuilder, - search_read: SearchRPCBuilder, - read_group: ReadGroupRPCBuilder, - }, - query: function (params) { - var Builder = this.builders[params.method] || this.builders.default; - return new Builder(params.parent, params); - }, }; }); diff --git a/addons/web/static/src/js/core/session.js b/addons/web/static/src/js/core/session.js index 6cc5529e34f..0bd9dc19ad4 100644 --- a/addons/web/static/src/js/core/session.js +++ b/addons/web/static/src/js/core/session.js @@ -99,9 +99,10 @@ var Session = core.Class.extend(mixins.EventDispatcherMixin, { } return $.when( deferred, - self.rpc('/web/webclient/bootstrap_translations', {mods: self.module_list}).then(function (trans) { - _t.database.set_bundle(trans); - }) + self.rpc('/web/webclient/bootstrap_translations', {mods: self.module_list}) + .then(function (trans) { + _t.database.set_bundle(trans); + }) ); }); }, diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js index 923e8400b1e..ef463338338 100644 --- a/addons/web/static/src/js/fields/relational_fields.js +++ b/addons/web/static/src/js/fields/relational_fields.js @@ -197,10 +197,12 @@ var FieldMany2One = AbstractField.extend({ var self = this; var slowCreate = this._searchCreatePopup.bind(this, "form", false, this._createContext(name)); if (this.nodeOptions.quick_create) { - this._rpc(this.field.relation, "name_create") - .args([name]) - .kwargs({context: this.record.getContext({fieldName: this.name})}) - .exec() + this._rpc({ + model: this.field.relation, + method: 'name_create', + args: [name], + context: this.record.getContext({fieldName: this.name}) + }) .then(function (result) { if (self.mode === "edit") { self.reinitialize({id: result[0], display_name: result[1]}); @@ -267,15 +269,16 @@ var FieldMany2One = AbstractField.extend({ domain.push(['id', 'not in', blacklisted_ids]); } - this._rpc(this.field.relation, "name_search") - .kwargs({ + this._rpc({ + model: this.field.relation, + method: "name_search", + kwargs: { name: search_val, args: domain, operator: "ilike", limit: this.limit + 1, context: context, - }) - .exec() + }}) .then(function (result) { // possible selections for the m2o var values = _.map(result, function (x) { @@ -294,16 +297,18 @@ var FieldMany2One = AbstractField.extend({ values.push({ label: _t("Search More..."), action: function () { - self._rpc(self.field.relation, "name_search") - .kwargs({ - name: search_val, - args: domain, - operator: "ilike", - limit: 160, - context: context, - }) - .exec() - .then(self._searchCreatePopup.bind(self, "search")); + self._rpc({ + model: self.field.relation, + method: 'name_search', + kwargs: { + name: search_val, + args: domain, + operator: "ilike", + limit: 160, + context: context, + }, + }) + .then(self._searchCreatePopup.bind(self, "search")); }, classname: 'o_m2o_dropdown_option', }); @@ -385,10 +390,12 @@ var FieldMany2One = AbstractField.extend({ if (this.mode === 'readonly' && !this.nodeOptions.no_open) { event.preventDefault(); event.stopPropagation(); - this._rpc(this.field.relation, 'get_formview_action') - .args([[this.value.res_id]]) - .withContext(this.record.getContext({fieldName: this.name})) - .exec() + this._rpc({ + model: this.field.relation, + method: 'get_formview_action', + args: [[this.value.res_id]], + context: this.record.getContext({fieldName: this.name}), + }) .then(function (action) { self.trigger_up('do_action', {action: action}); }); @@ -404,10 +411,12 @@ var FieldMany2One = AbstractField.extend({ } var self = this; var context = this.record.getContext({fieldName: this.name}); - this._rpc(this.field.relation, 'get_formview_id') - .args([[this.value.res_id]]) - .withContext(context) - .exec() + this._rpc({ + model: this.field.relation, + method: 'get_formview_id', + args: [[this.value.res_id]], + context: context, + }) .then(function (view_id) { new dialogs.FormViewDialog(self, { res_model: self.field.relation, diff --git a/addons/web/static/src/js/fields/upgrade_fields.js b/addons/web/static/src/js/fields/upgrade_fields.js index a4246983dd1..66d6d2b2903 100644 --- a/addons/web/static/src/js/fields/upgrade_fields.js +++ b/addons/web/static/src/js/fields/upgrade_fields.js @@ -36,10 +36,11 @@ var AbstractFieldUpgrade = { * @returns {Deferred} */ _confirmUpgrade: function () { - var args = [[["share", "=", false]]]; - return this._rpc('res.users', 'search_count') - .args(args) - .exec() + return this._rpc({ + model: 'res.users', + method: 'search_count', + args: [[["share", "=", false]]], + }) .then(function (data) { framework.redirect("https://www.odoo.com/odoo-enterprise/upgrade?num_users=" + data); }); diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js index deb14b8bf83..e3455658d50 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -194,10 +194,12 @@ var BasicModel = AbstractModel.extend({ deleteRecords: function (recordIds, modelName, parentID) { var self = this; var records = _.map(recordIds, function (id) { return self.localData[id]; }); - return this._rpc(modelName, 'unlink') - .args([_.pluck(records, 'res_id')]) - .withContext(session.user_context) // todo: combine with view context - .exec() + return this._rpc({ + model: modelName, + method: 'unlink', + args: [_.pluck(records, 'res_id')], + context: session.user_context, // todo: combine with view context + }) .then(function () { _.each(records, function (record) { record.res_ids.splice(record.offset, 1)[0]; @@ -230,10 +232,12 @@ var BasicModel = AbstractModel.extend({ duplicateRecord: function (recordID) { var self = this; var record = this.localData[recordID]; - return this._rpc(record.model, 'copy') - .args([record.data.id]) - .withContext(this._getContext(record)) - .exec() + return this._rpc({ + model: record.model, + method: 'copy', + args: [record.data.id], + context: this._getContext(record), + }) .then(function (res_id) { var index = record.res_ids.indexOf(record.res_id); record.res_ids.splice(index + 1, 0, res_id); @@ -439,10 +443,12 @@ var BasicModel = AbstractModel.extend({ var self = this; var fields_key = _.without(params.fieldNames, '__last_update'); - return this._rpc(modelName, 'default_get') - .args([fields_key]) - .withContext(params.context) - .exec() + return this._rpc({ + model: modelName, + method: 'default_get', + args: [fields_key], + context: params.context, + }) .then(function (result) { // fill default values for missing fields for (var i = 0; i < params.fieldNames.length; i++) { @@ -813,11 +819,12 @@ var BasicModel = AbstractModel.extend({ // in the case of a write, only perform the RPC if there are changes to save if (method === 'create' || Object.keys(changes).length) { var args = method === 'write' ? [[record.data.id], changes] : [changes]; - return self._rpc(record.model, method) - .args(args) - .withContext(session.user_context) // todo: combine with view context - .exec() - .then(function (id) { + return self._rpc({ + model: record.model, + method: method, + args: args, + context: session.user_context // todo: combine with view context + }).then(function (id) { if (method === 'create') { record.res_id = id; // create returns an id, write returns a boolean record.data.id = id; @@ -911,9 +918,11 @@ var BasicModel = AbstractModel.extend({ var resIDs = _.map(recordIDs, function (recordID) { return self.localData[recordID].res_id; }); - return this._rpc(parent.model, 'write') - .args([resIDs, { active: value }]) - .exec() + return this._rpc({ + model: parent.model, + method: 'write', + args: [resIDs, { active: value }], + }) .then(this.reload.bind(this, parentID)); }, @@ -969,10 +978,12 @@ var BasicModel = AbstractModel.extend({ var def; if (rel_data.display_name === undefined) { var field = record.fields[fieldName]; - def = this._rpc(field.relation, 'name_get') - .args([data.id]) - .withContext(record.context) - .exec() + def = this._rpc({ + model: field.relation, + method: 'name_get', + args: [data.id], + context: record.context, + }) .then(function (result) { rel_data.display_name = result[0][1]; }); @@ -1022,9 +1033,11 @@ var BasicModel = AbstractModel.extend({ fields = fields[0]; } return this.mutex.exec(function () { - return self._rpc(record.model, 'onchange') - .args([idList, currentData, fields, onchange_spec, context]) - .exec() + return self._rpc({ + model: record.model, + method: 'onchange', + args: [idList, currentData, fields, onchange_spec, context], + }) .then(function (result) { if (result.warning) { self.trigger_up('warning', { @@ -1176,9 +1189,11 @@ var BasicModel = AbstractModel.extend({ // _changes so this is a very specific case) // this could be optimized by registering the fetched records in the list's _cache // so that if a record is removed and then re-added, it won't be fetched twice - var def = this._rpc(list.model, 'read') - .args([_.pluck(data, 'id'), list.fieldNames]) - .exec() + var def = this._rpc({ + model: list.model, + method: 'read', + args: [_.pluck(data, 'id'), list.fieldNames] + }) .then(function (records) { _.each(records, function (record) { list_records[record.id].data = record; @@ -1262,10 +1277,12 @@ var BasicModel = AbstractModel.extend({ _fetchMany2OneGroup: function (group) { var ids = _.uniq(_.pluck(group, 'res_id')); - return this._rpc(group[0].model, 'name_get') - .args([ids]) - .withContext(group[0].context) - .exec() + return this._rpc({ + model: group[0].model, + method: 'name_get', + args: [ids], + context: group[0].context + }) .then(function (name_gets) { _.each(group, function (record) { var nameGet = _.find(name_gets, function (n) { return n[0] === record.res_id;}); @@ -1286,10 +1303,12 @@ var BasicModel = AbstractModel.extend({ model = many2oneRecord.model; return many2oneRecord.res_id; }); - return this._rpc(model, 'name_get') - .args([ids]) - .withContext(list.context) - .exec() + return this._rpc({ + model: model, + method: 'name_get', + args: [ids], + context: list.context, + }) .then(function (name_gets) { for (var i = 0; i < name_gets.length; i++) { records[i].data.display_name = name_gets[i][1]; @@ -1307,10 +1326,12 @@ var BasicModel = AbstractModel.extend({ _fetchRecord: function (record, fieldNames) { var self = this; fieldNames = fieldNames || _.uniq(record.fieldNames.concat(['display_name'])); - return this._rpc(record.model, 'read') - .args([[record.res_id], fieldNames]) - // .withContext({ bin_size: true }) // FIXME: when editing a subrecord in the partner form view, it tries to write the bin_size on the image field - .exec() + return this._rpc({ + model: record.model, + method: 'read', + args: [[record.res_id], fieldNames], + // context: {bin_size: true} // FIXME: when editing a subrecord in the partner form view, it tries to write the bin_size on the image field + }) .then(function (result) { result = result[0]; record.data = _.extend({}, record.data, result); @@ -1436,25 +1457,29 @@ var BasicModel = AbstractModel.extend({ } var self = this; - return this._rpc(field.relation, 'search_read') - .withFields(["id"].concat(fieldsToRead || [])) - .withContext(context) - .withDomain(domain) - .exec() - .then(function (result) { - var ids = _.pluck(result.records, 'id'); - return self._rpc(field.relation, 'name_get') - .args([ids]) - .withContext(context) - .exec() + return this._rpc({ + model: field.relation, + method: 'search_read', + fields: ["id"].concat(fieldsToRead || []), + context: context, + domain: domain, + }) + .then(function (records) { + var ids = _.pluck(records, 'id'); + return self._rpc({ + model: field.relation, + method: 'name_get', + args: [ids], + context: context, + }) .then(function (name_gets) { - _.each(result.records, function (rec) { + _.each(records, function (rec) { var name_get = _.find(name_gets, function (n) { return n[0] === rec.id; }); rec.display_name = name_get[1]; }); - return result.records; + return records; }); }); }, @@ -1488,10 +1513,12 @@ var BasicModel = AbstractModel.extend({ return $.when(); } - return this._rpc(field.relation, "name_search") - .args(["", domain]) - .withContext(context) - .exec(); + return this._rpc({ + model: field.relation, + method: 'name_search', + args: ["", domain], + context: context + }); }, /** * Fetches all the m2o records associated to the given fieldName. If the @@ -1550,10 +1577,12 @@ var BasicModel = AbstractModel.extend({ var def = $.Deferred(); - this._rpc(domainModel, "search_count") - .args([Domain.prototype.stringToArray(domainValue)]) - .withContext(context) - .exec() + this._rpc({ + model: domainModel, + method: 'search_count', + args: [Domain.prototype.stringToArray(domainValue)], + context: context + }) .then(_.identity, function (error, e) { e.preventDefault(); // prevent traceback (the search_count might be intended to break) return false; @@ -1670,10 +1699,12 @@ var BasicModel = AbstractModel.extend({ } // step 2: fetch data from server - return this._rpc(field.relation, 'read') - .args([ids, _.keys(fieldInfo.relatedFields)]) - .withContext({}) // FIXME - .exec() + return this._rpc({ + model: field.relation, + method: 'read', + args: [ids, _.keys(fieldInfo.relatedFields)], + context: {}, // FIXME + }) .then(function (results) { // step 3: assign values to correct datapoints var dataPoints = _.map(results, function (result) { @@ -2038,10 +2069,12 @@ var BasicModel = AbstractModel.extend({ if (options.always_reload) { if (record.fields[name].type === 'many2one' && record.data[name]) { var element = self.localData[record.data[name]]; - defs.push(self._rpc(field.relation, 'name_get') - .args([element.data.id]) - .withContext(self._getContext(record, {fieldName: name})) - .exec() + defs.push(self._rpc({ + model: field.relation, + method: 'name_get', + args: [element.data.id], + context: self._getContext(record, {fieldName: name}), + }) .then(function (result) { element.data.display_name = result[0][1]; })); @@ -2066,13 +2099,15 @@ var BasicModel = AbstractModel.extend({ _readGroup: function (list) { var self = this; var fields = _.uniq(list.fieldNames.concat(list.groupedBy)); - return this._rpc(list.model, 'read_group') - .withFields(fields) - .withDomain(list.domain) - .withContext(list.context) - .groupBy(list.groupedBy) - .lazy(true) - .exec() + return this._rpc({ + model: list.model, + method: 'read_group', + fields: fields, + domain: list.domain, + context: list.context, + groupBy: list.groupedBy, + lazy: true, + }) .then(function (groups) { var rawGroupBy = list.groupedBy[0].split(':')[0]; var previousGroups = _.map(list.data, function (groupID) { @@ -2158,10 +2193,12 @@ var BasicModel = AbstractModel.extend({ } } if (missingIds.length) { - def = this._rpc(list.model, 'read') - .args([missingIds, list.fieldNames]) - .withContext({}) // FIXME - .exec(); + def = this._rpc({ + model: list.model, + method: 'read', + args: [missingIds, list.fieldNames], + context: {} // FIXME + }); } else { def = $.when(); } @@ -2219,33 +2256,35 @@ var BasicModel = AbstractModel.extend({ */ _searchReadUngroupedList: function (list) { var self = this; - return this._rpc(list.model, 'search_read') - .withFields(list.fieldNames) - .withDomain(list.domain || []) - .withLimit(list.limit) - .withOffset(list.offset) - .orderBy(list.orderedBy) - .exec() - .then(function (result) { - list.count = result.length; - var data = _.map(result.records, function (record) { - var dataPoint = self._makeDataPoint({ - data: record, - fields: list.fields, - fieldNames: list.fieldNames, - fieldsInfo: list.fieldsInfo, - modelName: list.model, - parentID: list.id, - }); - - // add many2one records - self._parseServerData(list.fieldNames, dataPoint.fields, dataPoint.data); - return dataPoint.id; + return this._rpc({ + route: '/web/dataset/search_read', + model: list.model, + fields: list.fieldNames, + domain: list.domain || [], + limit: list.limit, + offset: list.offset, + orderBy: list.orderedBy, + }) + .then(function (result) { + list.count = result.length; + var data = _.map(result.records, function (record) { + var dataPoint = self._makeDataPoint({ + data: record, + fields: list.fields, + fieldNames: list.fieldNames, + fieldsInfo: list.fieldsInfo, + modelName: list.model, + parentID: list.id, }); - list.data = data; - list.res_ids = _.pluck(result.records, 'id'); - return list; + + // add many2one records + self._parseServerData(list.fieldNames, dataPoint.fields, dataPoint.data); + return dataPoint.id; }); + list.data = data; + list.res_ids = _.pluck(result.records, 'id'); + return list; + }); }, /** * Change the offset of a record. Note that this does not reload the data. diff --git a/addons/web/static/src/js/views/calendar/calendar_controller.js b/addons/web/static/src/js/views/calendar/calendar_controller.js index 4e0ace6926b..0efb196ebcf 100644 --- a/addons/web/static/src/js/views/calendar/calendar_controller.js +++ b/addons/web/static/src/js/views/calendar/calendar_controller.js @@ -103,9 +103,11 @@ var CalendarController = AbstractController.extend({ _updateRecord: function (record) { // Cannot modify actual name yet var data = _.omit(this.model.calendarEventToRecord(record), 'name'); - this._rpc(this.model.modelName, 'write') - .args([record.id, data]) - .exec() + this._rpc({ + model: this.model.modelName, + method: 'write', + args: [record.id, data], + }) .then(this.reload.bind(this)); }, @@ -231,9 +233,11 @@ var CalendarController = AbstractController.extend({ click: function () { Dialog.confirm(this, _t("Are you sure you want to delete this record ?"), { confirm_callback: function () { - self._rpc(self.modelName, 'unlink') - .args([id]) - .exec() + self._rpc({ + model: self.modelName, + method: 'unlink', + args: [id], + }) .then(function () { self.dialog.destroy(); self.reload(); diff --git a/addons/web/static/src/js/views/calendar/calendar_model.js b/addons/web/static/src/js/views/calendar/calendar_model.js index 07327616097..34723e63995 100644 --- a/addons/web/static/src/js/views/calendar/calendar_model.js +++ b/addons/web/static/src/js/views/calendar/calendar_model.js @@ -127,10 +127,12 @@ return AbstractModel.extend({ * @returns */ deleteRecords: function (ids, model) { - return this._rpc(model, 'unlink') - .args([ids]) - .withContext(session.user_context) // todo: combine with view context - .exec(); + return this._rpc({ + model: model, + method: 'unlink', + args: [ids], + context: session.user_context, // todo: combine with view context + }); }, /** * @override @@ -168,8 +170,8 @@ return AbstractModel.extend({ if (!this.preload_def) { this.preload_def = $.Deferred(); $.when( - this._rpc(this.modelName, 'check_access_rights').args(["write", false]).exec(), - this._rpc(this.modelName, 'check_access_rights').args(["create", false]).exec()) + this._rpc({model: this.modelName, method: 'check_access_rights', args: ["write", false]}), + this._rpc({model: this.modelName, method: 'check_access_rights', args: ["create", false]})) .then(function (write, create) { self.write_right = write; self.create_right = create; @@ -364,13 +366,15 @@ return AbstractModel.extend({ var defs = _.map(this.data.filters, this._loadFilter.bind(this)); return $.when.apply($, defs).then(function () { - return self._rpc(self.modelName, 'search_read') - .withContext(self.data.context) - .withFields(self.fieldNames) - .withDomain(self.data.domain.concat(self._getRangeDomain()).concat(self._getFilterDomain())) - .exec() + return self._rpc({ + model: self.modelName, + method: 'search_read', + context: self.data.context, + fields: self.fieldNames, + domain: self.data.domain.concat(self._getRangeDomain()).concat(self._getFilterDomain()) + }) .then(function (events) { - self.data.data = _.map(events.records, self._recordToCalendarEvent.bind(self)); + self.data.data = _.map(events, self._recordToCalendarEvent.bind(self)); return $.when( self._loadColors(self.data, self.data.data), self._loadRecordsToFilters(self.data, self.data.data) @@ -404,12 +408,14 @@ return AbstractModel.extend({ } var field = this.fields[filter.fieldName]; - return this._rpc(filter.write_model, 'search_read') - .withDomain([["user_id", "=", session.uid]]) - .withFields([filter.write_field]) - .exec() + return this._rpc({ + model: filter.write_model, + method: 'search_read', + domain: [["user_id", "=", session.uid]], + fields: [filter.write_field], + }) .then(function (res) { - var records = _.map(res.records, function (record) { + var records = _.map(res, function (record) { var _value = record[filter.write_field]; var value = _.isArray(_value) ? _value[0] : _value; var f = _.find(filter.filters, function (f) {return f.value === value;}); @@ -511,9 +517,11 @@ return AbstractModel.extend({ var defs = []; _.each(to_read, function (ids, model) { - defs.push(self._rpc(model, 'name_get') - .args([_.uniq(ids)]) - .exec() + defs.push(self._rpc({ + model: model, + method: 'name_get', + args: [_.uniq(ids)], + }) .then(function (res) { to_read[model] = _.object(res); })); diff --git a/addons/web/static/src/js/views/calendar/calendar_quick_create.js b/addons/web/static/src/js/views/calendar/calendar_quick_create.js index 008f2d74e04..8bf2bc8235a 100644 --- a/addons/web/static/src/js/views/calendar/calendar_quick_create.js +++ b/addons/web/static/src/js/views/calendar/calendar_quick_create.js @@ -122,10 +122,12 @@ var QuickCreate = Dialog.extend({ */ _quickCreate: function (data, options) { var self = this; - return this._rpc(this.modelName, 'create') - .args([$.extend({}, this.data_template, data)]) - .withContext(_.pick(options, 'context')) - .exec() + return this._rpc({ + model: this.modelName, + method: 'create', + args: [$.extend({}, this.data_template, data)], + context: _.pick(options, 'context'), + }) .then(function (id) { self.trigger('added', id); self.$input.val(""); diff --git a/addons/web/static/src/js/views/calendar/calendar_renderer.js b/addons/web/static/src/js/views/calendar/calendar_renderer.js index 9095e5c13f7..7a38a0d4348 100644 --- a/addons/web/static/src/js/views/calendar/calendar_renderer.js +++ b/addons/web/static/src/js/views/calendar/calendar_renderer.js @@ -92,9 +92,11 @@ var SidebarFilter = Widget.extend(FieldManagerMixin, { var self = this; event.stopPropagation(); var value = event.data.changes[this.write_field].id; - this._rpc(this.write_model, 'create') - .args([{'user_id': session.uid,'partner_id': value,}]) - .exec() + this._rpc({ + model: this.write_model, + method: 'create', + args: [{'user_id': session.uid,'partner_id': value,}], + }) .then(function () { self.trigger_up('changeFilter', { 'fieldName': self.fieldName, @@ -119,9 +121,11 @@ var SidebarFilter = Widget.extend(FieldManagerMixin, { var $filter = $(e.currentTarget).closest('.o_calendar_filter_item'); Dialog.confirm(this, _t("Do you really want to delete this filter from favorites ?"), { confirm_callback: function () { - self._rpc(self.write_model, 'unlink') - .args([[$filter.data('id')]]) - .exec() + self._rpc({ + model: self.write_model, + method: 'unlink', + args: [[$filter.data('id')]], + }) .then(function () { self.trigger_up('changeFilter', { 'fieldName': self.fieldName, diff --git a/addons/web/static/src/js/views/graph/graph_model.js b/addons/web/static/src/js/views/graph/graph_model.js index 7bf9757a255..c14c698331d 100644 --- a/addons/web/static/src/js/views/graph/graph_model.js +++ b/addons/web/static/src/js/views/graph/graph_model.js @@ -130,13 +130,15 @@ return AbstractModel.extend({ if (this.chart.measure !== '__count__') { fields = fields.concat(this.chart.measure); } - return this._rpc(this.modelName, 'read_group') - .withContext(this.chart.context) - .withDomain(this.chart.domain) - .withFields(fields) - .groupBy(this.chart.groupedBy) - .lazy(false) - .exec() + return this._rpc({ + model: this.modelName, + method: 'read_group', + context: this.chart.context, + domain: this.chart.domain, + fields: fields, + groupBy: this.chart.groupedBy, + lazy: false, + }) .then(this._processData.bind(this)); }, /** diff --git a/addons/web/static/src/js/views/kanban/kanban_controller.js b/addons/web/static/src/js/views/kanban/kanban_controller.js index c74f06d1de1..5d48fde2cca 100644 --- a/addons/web/static/src/js/views/kanban/kanban_controller.js +++ b/addons/web/static/src/js/views/kanban/kanban_controller.js @@ -308,10 +308,12 @@ var KanbanController = BasicController.extend({ var context = columnState.getContext(); context['default_' + state.groupedBy[0]] = columnState.res_id; - this._rpc(state.model, "name_create") - .args([name]) - .withContext(context) - .exec() + this._rpc({ + model: state.model, + method: 'name_create', + args: [name], + context: context, + }) .then(add_record) .fail(function (error, event) { event.preventDefault(); diff --git a/addons/web/static/src/js/views/kanban/kanban_model.js b/addons/web/static/src/js/views/kanban/kanban_model.js index 394ff80b234..ff8b357a6ac 100644 --- a/addons/web/static/src/js/views/kanban/kanban_model.js +++ b/addons/web/static/src/js/views/kanban/kanban_model.js @@ -53,10 +53,12 @@ var KanbanModel = BasicModel.extend({ if (!groupByField || groupByField.type !== 'many2one') { return $.Deferred().reject(); // only supported when grouped on m2o } - return this._rpc(groupByField.relation, 'name_create') - .args([name]) - .withContext(parent.context) // todo: combine with view context - .exec() + return this._rpc({ + model: groupByField.relation, + method: 'name_create', + args: [name], + context: parent.context, // todo: combine with view context + }) .then(function (result) { var newGroup = self._makeDataPoint({ modelName: parent.model, @@ -154,9 +156,10 @@ var KanbanModel = BasicModel.extend({ } var self = this; var data = this.localData[parentID]; - return this._rpc('/web/dataset/resequence') - .params({model: modelName, ids: resIDs}) - .exec() + return this._rpc({ + route: '/web/dataset/resequence', + params: {model: modelName, ids: resIDs}, + }) .then(function () { data.data = _.sortBy(data.data, function (d) { return _.indexOf(resIDs, self.localData[d].res_id); diff --git a/addons/web/static/src/js/views/pivot/pivot_model.js b/addons/web/static/src/js/views/pivot/pivot_model.js index f1998e01e1a..969a4d5ee82 100644 --- a/addons/web/static/src/js/views/pivot/pivot_model.js +++ b/addons/web/static/src/js/views/pivot/pivot_model.js @@ -82,13 +82,15 @@ var PivotModel = AbstractModel.extend({ } return $.when.apply(null, groupbys.map(function (groupBy) { - return self._rpc(self.modelName, 'read_group') - .withContext(self.data.context) - .withDomain(header.domain.length ? header.domain : self.data.domain) - .withFields(_.map(fields, function (field) { return field.split(':')[0]; })) - .groupBy(groupBy) - .lazy(false) - .exec(); + return self._rpc({ + model: self.modelName, + method: 'read_group', + context: self.data.context, + domain: header.domain.length ? header.domain : self.data.domain, + fields: _.map(fields, function (field) { return field.split(':')[0]; }), + groupBy: groupBy, + lazy: false, + }); })).then(function () { var data = Array.prototype.slice.call(arguments); var datapt, attrs, j, l, row, col, cell_value, groupBys; @@ -513,13 +515,15 @@ var PivotModel = AbstractModel.extend({ } return $.when.apply(null, groupBys.map(function (groupBy) { - return self._rpc(self.modelName, 'read_group') - .withContext(self.data.context) - .withDomain(self.data.domain) - .withFields(_.map(fields, function (field) { return field.split(':')[0]; })) - .groupBy(groupBy) - .lazy(false) - .exec(); + return self._rpc({ + model: self.modelName, + method: 'read_group', + context: self.data.context, + domain: self.data.domain, + fields: _.map(fields, function (field) { return field.split(':')[0]; }), + groupBy: groupBy, + lazy: false, + }); })).then(function () { var data = Array.prototype.slice.call(arguments); if (data[0][0].__count === 0) { diff --git a/addons/web/static/src/js/widgets/change_password.js b/addons/web/static/src/js/widgets/change_password.js index c1c9c4dddea..b71ae4aaf4b 100644 --- a/addons/web/static/src/js/widgets/change_password.js +++ b/addons/web/static/src/js/widgets/change_password.js @@ -31,11 +31,12 @@ var ChangePassword = Widget.extend({ self.$el.parents('.modal').modal('hide'); }); $button.eq(0).click(function () { - self._rpc('/web/session/change_password') - .params({ - fields: $('form[name=change_password_form]').serializeArray() + self._rpc({ + route: '/web/session/change_password', + params: { + fields: $('form[name=change_password_form]').serializeArray() + } }) - .exec() .done(function (result) { if (result.error) { self._display_error(result); diff --git a/addons/web/static/src/js/widgets/data_export.js b/addons/web/static/src/js/widgets/data_export.js index dbe4c4d3d3c..f8c622bf5e8 100644 --- a/addons/web/static/src/js/widgets/data_export.js +++ b/addons/web/static/src/js/widgets/data_export.js @@ -218,18 +218,19 @@ var DataExport = Dialog.extend({ this.$fields_list = this.$('.o_fields_list'); this.$import_compat_radios = this.$('.o_import_compat input'); - waitFor.push(this._rpc('/web/export/formats').exec().then(do_setup_export_formats)); + waitFor.push(this._rpc({route: '/web/export/formats'}).then(do_setup_export_formats)); var got_fields = new $.Deferred(); this.$import_compat_radios.change(function(e) { self.$('.o_field_tree_structure').remove(); - self._rpc("/web/export/get_fields") - .params({ - model: self.dataset.model, - import_compat: !!$(e.target).val(), + self._rpc({ + route: '/web/export/get_fields', + params: { + model: self.dataset.model, + import_compat: !!$(e.target).val(), + }, }) - .exec() .done(function (records) { var compatible_fields = _.map(records, function (record) {return record.id}); self.$fields_list @@ -299,12 +300,13 @@ var DataExport = Dialog.extend({ self.$fields_list.empty(); var export_id = self.$('.o_exported_lists_select option:selected').val(); if(export_id) { - self._rpc('/web/export/namelist') - .params({ - model: self.dataset.model, - export_id: parseInt(export_id, 10), + self._rpc({ + route: '/web/export/namelist', + params: { + model: self.dataset.model, + export_id: parseInt(export_id, 10), + }, }) - .exec() .then(do_load_export_field); } }); @@ -347,16 +349,17 @@ var DataExport = Dialog.extend({ if(!record.loaded) { var self = this; - this._rpc("/web/export/get_fields") - .params({ - model: model, - prefix: prefix, - parent_name: name, - import_compat: !!this.$import_compat_radios.filter(':checked').val(), - parent_field_type : record['field_type'], - exclude: exclude_fields + this._rpc({ + route: '/web/export/get_fields', + params: { + model: model, + prefix: prefix, + parent_name: name, + import_compat: !!this.$import_compat_radios.filter(':checked').val(), + parent_field_type : record['field_type'], + exclude: exclude_fields + }, }) - .exec() .done(function(results) { record.loaded = true; self.on_show_data(results, record.id); diff --git a/addons/web/static/src/js/widgets/debug_manager.js b/addons/web/static/src/js/widgets/debug_manager.js index 697572257f8..fba49f71ade 100644 --- a/addons/web/static/src/js/widgets/debug_manager.js +++ b/addons/web/static/src/js/widgets/debug_manager.js @@ -63,13 +63,17 @@ var DebugManager = Widget.extend({ // whether the current user is an administrator this._is_admin = session.is_system; return $.when( - this._rpc('res.users', 'check_access_rights') - .kwargs({operation: 'write', raise_exception: false}) - .exec(), + this._rpc({ + model: 'res.users', + method: 'check_access_rights', + kwargs: {operation: 'write', raise_exception: false}, + }), session.user_has_group('base.group_no_one'), - this._rpc('ir.model.data', 'xmlid_to_res_id') - .kwargs({xmlid: 'base.group_no_one'}) - .exec(), + this._rpc({ + model: 'ir.model.data', + method: 'xmlid_to_res_id', + kwargs: {xmlid: 'base.group_no_one'}, + }), this._super() ).then(function (can_write_user, has_group_no_one, group_no_one_id) { this._features_group = can_write_user && group_no_one_id; @@ -165,11 +169,13 @@ var DebugManager = Widget.extend({ title: _t('Select a view'), disable_multiple_selection: true, on_selected: function (element_ids) { - self._rpc('ir.ui.view', 'search_read') - .withDomain([['id', '=', element_ids[0]]]) - .withFields(['name', 'model', 'type']) - .withLimit(1) - .exec() + self._rpc({ + model: 'ir.ui.view', + method: 'search_read', + domain: [['id', '=', element_ids[0]]], + fields: ['name', 'model', 'type'], + limit: 1, + }) .then(function (view) { self.do_action({ type: 'ir.actions.act_window', @@ -228,11 +234,13 @@ DebugManager.include({ get_view_fields: function () { var self = this; var model = this._action.res_model; - this._rpc(model, 'fields_get') - .kwargs({ - attributes: ['string', 'searchable', 'required', 'readonly', 'type', 'store', 'sortable', 'relation', 'help'] + this._rpc({ + model: model, + method: 'fields_get', + kwargs: { + attributes: ['string', 'searchable', 'required', 'readonly', 'type', 'store', 'sortable', 'relation', 'help'] + }, }) - .exec() .done(function (fields) { new Dialog(self, { title: _.str.sprintf(_t("Fields of %s"), model), @@ -266,9 +274,11 @@ DebugManager.include({ }); }, translate: function() { - this._rpc("ir.translation", 'get_technical_translations') - .args([this._action.res_model]) - .exec() + this._rpc({ + model: 'ir.translation', + method: 'get_technical_translations', + args: [this._action.res_model], + }) .then(this.do_action); } }); @@ -283,9 +293,11 @@ DebugManager.include({ this._can_edit_views = false; return $.when( this._super(), - this._rpc('ir.ui.view', 'check_access_rights') - .kwargs({operation: 'write', raise_exception: false}) - .exec() + this._rpc({ + model: 'ir.ui.view', + method: 'check_access_rights', + kwargs: {operation: 'write', raise_exception: false}, + }) .then(function (ar) { this._can_edit_views = ar; }.bind(this)) diff --git a/addons/web/static/src/js/widgets/model_field_selector.js b/addons/web/static/src/js/widgets/model_field_selector.js index 41433253499..ebe190b5b44 100644 --- a/addons/web/static/src/js/widgets/model_field_selector.js +++ b/addons/web/static/src/js/widgets/model_field_selector.js @@ -317,11 +317,14 @@ var ModelFieldSelector = Widget.extend({ _getModelFieldsFromCache: function (model, filters) { var def = modelFieldsCache.cacheDefs[model]; if (!def) { - def = modelFieldsCache.cacheDefs[model] = this._rpc(model, "fields_get") - .args([ - false, - ["store", "searchable", "type", "string", "relation", "selection", "related"]]) - .exec() + def = modelFieldsCache.cacheDefs[model] = this._rpc({ + model: model, + method: 'fields_get', + args: [ + false, + ["store", "searchable", "type", "string", "relation", "selection", "related"] + ] + }) .then((function (fields) { modelFieldsCache.cache[model] = sortFields(fields); }).bind(this)); diff --git a/addons/web/static/src/js/widgets/switch_company_menu.js b/addons/web/static/src/js/widgets/switch_company_menu.js index 1f5f0733938..8bea91a5a97 100644 --- a/addons/web/static/src/js/widgets/switch_company_menu.js +++ b/addons/web/static/src/js/widgets/switch_company_menu.js @@ -18,9 +18,11 @@ var SwitchCompanyMenu = Widget.extend({ this.$el.on('click', '.dropdown-menu li a[data-menu]', _.debounce(function(ev) { ev.preventDefault(); var company_id = $(ev.currentTarget).data('company-id'); - self._rpc('res.users', 'write') - .args([[session.uid], {'company_id': company_id}]) - .exec() + self._rpc({ + model: 'res.users', + method: 'write', + args: [[session.uid], {'company_id': company_id}], + }) .then(function() { location.reload(); }); diff --git a/addons/web/static/test/core/rpc_tests.js b/addons/web/static/test/core/rpc_tests.js index 053cace7ce6..bafe008089b 100644 --- a/addons/web/static/test/core/rpc_tests.js +++ b/addons/web/static/test/core/rpc_tests.js @@ -2,254 +2,215 @@ odoo.define('web.rpc_tests', function (require) { "use strict"; var rpc = require('web.rpc'); -var testUtils = require('web.test_utils'); -var Widget = require('web.Widget'); - -function createQuery (params) { - var widget = new Widget(); - - if (params.mockRPC) { - testUtils.intercept(widget, 'call_service', function (event) { - if (event.data.service === 'ajax') { - params.mockRPC(event.data.args[0], JSON.parse(JSON.stringify(event.data.args[1]))); - } - }); - - } - - return rpc.query({ - method: params.method, - model: params.model, - route: params.route, - parent: widget, - }); -} QUnit.module('core', {}, function () { QUnit.module('RPC Builder'); QUnit.test('basic rpc (route)', function (assert) { - assert.expect(3); - var query = createQuery({ + assert.expect(1); + + var query = rpc.buildQuery({ route: '/my/route', - mockRPC: function (route, params) { - assert.strictEqual(route, '/my/route', - "should call the proper route"); - assert.notOk('args' in params, - "rpc on routes should not have any args by default"); - assert.notOk('kwargs' in params, - "rpc on routes should not have any kwargs by default"); - }, }); - query.exec(); + assert.strictEqual(query.route, '/my/route', "should have the proper route"); }); QUnit.test('rpc on route with parameters', function (assert) { assert.expect(1); - var query = createQuery({ + + var query = rpc.buildQuery({ route: '/my/route', - mockRPC: function (route, params) { - assert.deepEqual(params, {hey: 'there', model: 'test'}, - "should transfer the proper parameters"); - }, + params: {hey: 'there', model: 'test'}, }); - query.params({hey: 'there', model: 'test'}).exec(); + + assert.deepEqual(query.params, {hey: 'there', model: 'test'}, + "should transfer the proper parameters"); }); QUnit.test('basic rpc, with no context', function (assert) { assert.expect(1); - var query = createQuery({ + + var query = rpc.buildQuery({ model: 'partner', method: 'test', - mockRPC: function (route, params) { - assert.notOk('context' in params.kwargs, - "does not automatically add a context"); - } + kwargs: {}, }); - query.kwargs({}).exec(); + assert.notOk(query.params.kwargs.context, + "does not automatically add a context"); }); QUnit.test('basic rpc, with context', function (assert) { assert.expect(1); - var query = createQuery({ + + var query = rpc.buildQuery({ model: 'partner', method: 'test', - mockRPC: function (route, args) { - assert.deepEqual(args.kwargs.context, {a: 1}, - "properly transfer the context"); - } + context: {a: 1}, }); - query.withContext({a: 1}).exec(); + + assert.deepEqual(query.params.kwargs.context, {a: 1}, + "properly transfer the context"); }); QUnit.test('basic rpc, with context, part 2', function (assert) { assert.expect(1); - var query = createQuery({ + + var query = rpc.buildQuery({ model: 'partner', method: 'test', - mockRPC: function (route, args) { - assert.deepEqual(args.kwargs.context, {a: 1}, - "properly transfer the context"); - } + kwargs: {context: {a: 1}}, }); - query.kwargs({context: {a: 1}}).exec(); + + assert.deepEqual(query.params.kwargs.context, {a: 1}, + "properly transfer the context"); + }); QUnit.test('basic rpc (method of model)', function (assert) { assert.expect(3); - var query = createQuery({ + + var query = rpc.buildQuery({ model: 'partner', method: 'test', - mockRPC: function (route, args) { - assert.strictEqual(route, '/web/dataset/call_kw/partner/test', - "should call the proper route"); - assert.strictEqual(args.model, 'partner', - "should correctly specify the model"); - assert.strictEqual(args.method, 'test', - "should correctly specify the method"); - } + kwargs: {context: {a: 1}}, }); - query.exec(); + + assert.strictEqual(query.route, '/web/dataset/call_kw/partner/test', + "should call the proper route"); + assert.strictEqual(query.params.model, 'partner', + "should correctly specify the model"); + assert.strictEqual(query.params.method, 'test', + "should correctly specify the method"); }); QUnit.test('rpc with args and kwargs', function (assert) { assert.expect(4); - var query = createQuery({ + var query = rpc.buildQuery({ model: 'partner', method: 'test', - mockRPC: function (route, args) { - assert.strictEqual(route, '/web/dataset/call_kw/partner/test', - "should call the proper route"); - assert.strictEqual(args.args[0], 'arg1', - "should call with correct args"); - assert.strictEqual(args.args[1], 2, - "should call with correct args"); - assert.strictEqual(args.kwargs.k, 78, - "should call with correct kargs"); - } + args: ['arg1', 2], + kwargs: {k: 78}, }); - query - .args(['arg1', 2]) - .kwargs({k: 78}) - .exec(); + + assert.strictEqual(query.route, '/web/dataset/call_kw/partner/test', + "should call the proper route"); + assert.strictEqual(query.params.args[0], 'arg1', + "should call with correct args"); + assert.strictEqual(query.params.args[1], 2, + "should call with correct args"); + assert.strictEqual(query.params.kwargs.k, 78, + "should call with correct kargs"); }); - QUnit.test('rpc with context', function (assert) { + QUnit.test('search_read controller', function (assert) { assert.expect(1); - var query = createQuery({ + var query = rpc.buildQuery({ + route: '/web/dataset/search_read', model: 'partner', - method: 'test', - mockRPC: function (route, args) { - assert.deepEqual(args.kwargs.context, { a: 'hello' }, - "should have correct context"); - }, + domain: ['a', '=', 1], + fields: ['name'], + limit: 32, + offset: 2, + orderBy: [{name: 'yop', asc: true}, {name: 'aa', asc: false}], }); - query - .withContext({a: 'hello'}) - .exec(); + assert.deepEqual(query.params, { + context: {}, + domain: ['a', '=', 1], + fields: ['name'], + limit: 32, + offset: 2, + model: 'partner', + sort: 'yop ASC, aa DESC', + }, "should have correct args"); }); - QUnit.test('search_read', function (assert) { + QUnit.test('search_read method', function (assert) { assert.expect(1); - var query = createQuery({ + var query = rpc.buildQuery({ model: 'partner', method: 'search_read', - mockRPC: function (route, args) { - assert.deepEqual(args, { - context: {}, - domain: ['a', '=', 1], - fields: ['name'], - limit: 32, - offset: 2, - model: 'partner', - sort: 'yop ASC, aa DESC', - }, "should have correct args"); - }, + domain: ['a', '=', 1], + fields: ['name'], + limit: 32, + offset: 2, + orderBy: [{name: 'yop', asc: true}, {name: 'aa', asc: false}], }); - query - .withDomain(['a', '=', 1]) - .withFields(['name']) - .withLimit(32) - .withOffset(2) - .orderBy([{name: 'yop', asc: true}, {name: 'aa', asc: false}]) - .exec(); + assert.deepEqual(query.params, { + args: [['a', '=', 1], ['name'], 2, 32, 'yop ASC, aa DESC'], + kwargs: {}, + method: 'search_read', + model: 'partner' + }, "should have correct args"); }); QUnit.test('read_group', function (assert) { assert.expect(2); - var query = createQuery({ + + var query = rpc.buildQuery({ model: 'partner', method: 'read_group', - mockRPC: function (route, args) { - assert.deepEqual(args, { - args: [], - kwargs: { - context: {abc: 'def'}, - domain: ['a', '=', 1], - fields: ['name'], - groupby: ['product_id'], - lazy: true, - orderby: false, - }, - method: 'read_group', - model: 'partner', - }, "should have correct args"); - assert.equal(route, '/web/dataset/call_kw/partner/read_group', - "should call correct route"); - }, + domain: ['a', '=', 1], + fields: ['name'], + groupBy: ['product_id'], + context: {abc: 'def'}, + lazy: true, }); - query - .withDomain(['a', '=', 1]) - .withFields(['name']) - .groupBy(['product_id']) - .withContext({abc: 'def'}) - .lazy(true) - .exec(); + + assert.deepEqual(query.params, { + args: [], + kwargs: { + context: {abc: 'def'}, + domain: ['a', '=', 1], + fields: ['name'], + groupby: ['product_id'], + lazy: true, + orderby: false, + }, + method: 'read_group', + model: 'partner', + }, "should have correct args"); + assert.equal(query.route, '/web/dataset/call_kw/partner/read_group', + "should call correct route"); }); QUnit.test('read_group with kwargs', function (assert) { - assert.expect(2); - var query = createQuery({ + assert.expect(1); + + var query = rpc.buildQuery({ model: 'partner', method: 'read_group', - mockRPC: function (route, args) { - assert.deepEqual(args, { - args: [], - kwargs: { - context: {abc: 'def'}, - domain: ['a', '=', 1], - fields: ['name'], - groupby: ['product_id'], - lazy: true, - orderby: false, - }, - method: 'read_group', - model: 'partner', - }, "should have correct args"); - assert.equal(route, '/web/dataset/call_kw/partner/read_group', - "should call correct route"); - }, + domain: ['a', '=', 1], + fields: ['name'], + groupBy: ['product_id'], + lazy: true, + kwargs: {context: {abc: 'def'}} }); - query - .withDomain(['a', '=', 1]) - .withFields(['name']) - .groupBy(['product_id']) - .kwargs({context: {abc: 'def'}}) - .lazy(true) - .exec(); + + assert.deepEqual(query.params, { + args: [], + kwargs: { + context: {abc: 'def'}, + domain: ['a', '=', 1], + fields: ['name'], + groupby: ['product_id'], + lazy: true, + orderby: false, + }, + method: 'read_group', + model: 'partner', + }, "should have correct args"); }); QUnit.test('search_read with no domain, nor fields', function (assert) { assert.expect(2); - createQuery({ + var query = rpc.buildQuery({ model: 'partner', - method: 'search_read', - mockRPC: function (route, args) { - assert.deepEqual(args.domain, [], "should have [] as default domain"); - assert.strictEqual(args.fields, false, "should have false as default fields"); - }, - }).exec(); + route: '/web/dataset/search_read', + }); + + assert.deepEqual(query.params.domain, [], "should have [] as default domain"); + assert.strictEqual(query.params.fields, false, "should have false as default fields"); }); }); diff --git a/addons/web/static/test/fields/relational_fields_tests.js b/addons/web/static/test/fields/relational_fields_tests.js index 93104bbd516..38287c2503d 100644 --- a/addons/web/static/test/fields/relational_fields_tests.js +++ b/addons/web/static/test/fields/relational_fields_tests.js @@ -2531,9 +2531,9 @@ QUnit.module('relational_fields', { '<field name="timmy" invisible="1"/>' + '</form>', mockRPC: function (route, args) { - if (route === '/web/dataset/search_read') { + if (args.method === 'search_read') { count++; - nb_fields_fetched = args.fields.length; + nb_fields_fetched = args.args[1].length; } return this._super.apply(this, arguments); }, @@ -2687,7 +2687,7 @@ QUnit.module('relational_fields', { '<field name="foo"/>' + '</form>', mockRPC: function (route, args) { - if (route === '/web/dataset/search_read') { + if (args.method === 'search_read') { rpcCount++; } return this._super.apply(this, arguments); diff --git a/addons/web/static/test/helpers/mock_server.js b/addons/web/static/test/helpers/mock_server.js index 247562dbb96..77107acfdaa 100644 --- a/addons/web/static/test/helpers/mock_server.js +++ b/addons/web/static/test/helpers/mock_server.js @@ -649,7 +649,7 @@ var MockServer = Class.extend({ return this._getRecords(model, args[0]).length; }, /** - * Simulate a 'search_read' operation + * Simulate a 'search_read' operation on a model * * @private * @param {Object} args @@ -661,7 +661,33 @@ var MockServer = Class.extend({ * @param {string[]} [args.sort] * @returns {Object} */ - _mockSearchRead: function (args) { + _mockSearchRead: function (model, args, kwargs) { + var result = this._mockSearchReadController({ + model: model, + domain: args[0], + fields: args[1], + offset: args[2], + limit: args[3], + sort: args[4], + context: kwargs.context, + }); + return result.records; + }, + /** + * Simulate a 'search_read' operation, from the controller point of view + * + * @private + * @private + * @param {Object} args + * @param {Array} args.domain + * @param {string} args.model + * @param {Array} [args.fields] defaults to the list of all fields + * @param {integer} [args.limit] + * @param {integer} [args.offset=0] + * @param {string[]} [args.sort] + * @returns {Object} + */ + _mockSearchReadController: function (args) { var self = this; var records = this._getRecords(args.model, args.domain); var fields = args.fields || _.keys(this.data[args.model].fields); @@ -765,7 +791,7 @@ var MockServer = Class.extend({ return $.when(this._mockLoadAction(args)); case '/web/dataset/search_read': - return $.when(this._mockSearchRead(args)); + return $.when(this._mockSearchReadController(args)); } if (route.indexOf('/web/image/') === 0) { return $.when(); @@ -804,6 +830,9 @@ var MockServer = Class.extend({ case 'search_count': return $.when(this._mockSearchCount(args.model, args.args)); + case 'search_read': + return $.when(this._mockSearchRead(args.model, args.args, args.kwargs)); + case 'unlink': return $.when(this._mockUnlink(args.model, args.args)); diff --git a/addons/web/static/test/helpers/test_utils.js b/addons/web/static/test/helpers/test_utils.js index 3d274996ebd..257a3f41a29 100644 --- a/addons/web/static/test/helpers/test_utils.js +++ b/addons/web/static/test/helpers/test_utils.js @@ -424,7 +424,7 @@ function removeSrcAttribute($el, widget) { if (src[0] !== '#') { $(this).attr('src', '#test:' + $(this).attr('src')); if (widget) { - widget._rpc(src).exec(); + widget._rpc({route: src}); } } }); diff --git a/addons/web_diagram/static/src/js/diagram_controller.js b/addons/web_diagram/static/src/js/diagram_controller.js index e9ded7bb1ff..65a3eb157d5 100644 --- a/addons/web_diagram/static/src/js/diagram_controller.js +++ b/addons/web_diagram/static/src/js/diagram_controller.js @@ -172,9 +172,11 @@ var DiagramController = AbstractController.extend({ Dialog.confirm(this, (_t("Are you sure you want to remove this transition?")), { confirm_callback: function () { var state = self.model.get(); - self._rpc(state.connector_model, 'unlink') - .args([event.data.id]) - .exec() + self._rpc({ + model: state.connector_model, + method: 'unlink', + args: [event.data.id], + }) .then(self.reload.bind(self)); }, }); @@ -191,9 +193,11 @@ var DiagramController = AbstractController.extend({ Dialog.confirm(this, (msg), { confirm_callback: function () { var state = self.model.get(); - self._rpc(state.node_model, 'unlink') - .args([event.data.id]) - .exec() + self._rpc({ + model: state.node_model, + method: 'unlink', + args: [event.data.id], + }) .then(self.reload.bind(self)); }, }); diff --git a/addons/web_diagram/static/src/js/diagram_model.js b/addons/web_diagram/static/src/js/diagram_model.js index 4e84c162a79..8ebd5724337 100644 --- a/addons/web_diagram/static/src/js/diagram_model.js +++ b/addons/web_diagram/static/src/js/diagram_model.js @@ -62,23 +62,24 @@ var DiagramModel = AbstractModel.extend({ */ _fetchDiagramInfo: function () { var self = this; - return this._rpc('/web_diagram/diagram/get_diagram_info') - .params({ - id: this.res_id, - model: this.modelName, - node: this.node_model, - connector: this.connector_model, - src_node: this.connectors.attrs.source, - des_node: this.connectors.attrs.destination, - label: this.connectors.attrs.label || false, - bgcolor: this.nodes.attrs.bgcolor, - shape: this.nodes.attrs.shape, - visible_nodes: this.visible_nodes, - invisible_nodes: this.invisible_nodes, - node_fields_string: this.node_fields_string, - connector_fields_string: this.connector_fields_string, + return this._rpc({ + route: '/web_diagram/diagram/get_diagram_info', + params: { + id: this.res_id, + model: this.modelName, + node: this.node_model, + connector: this.connector_model, + src_node: this.connectors.attrs.source, + des_node: this.connectors.attrs.destination, + label: this.connectors.attrs.label || false, + bgcolor: this.nodes.attrs.bgcolor, + shape: this.nodes.attrs.shape, + visible_nodes: this.visible_nodes, + invisible_nodes: this.invisible_nodes, + node_fields_string: this.node_fields_string, + connector_fields_string: this.connector_fields_string, + }, }) - .exec() .then(function (data) { self.datanodes = data.nodes; self.edges = data.conn; diff --git a/addons/web_planner/static/src/js/web_planner_backend.js b/addons/web_planner/static/src/js/web_planner_backend.js index 8245eef9182..f05f34b1477 100644 --- a/addons/web_planner/static/src/js/web_planner_backend.js +++ b/addons/web_planner/static/src/js/web_planner_backend.js @@ -13,10 +13,12 @@ var PlannerLauncher = planner.PlannerLauncher.extend({ }, _fetch_planner_data: function () { var planner_by_menu = this.planner_by_menu = {}; - return this._rpc('web.planner', 'search_read') - .exec() - .then(function (res) { - _.each(res.records, function (planner) { + return this._rpc({ + model: 'web.planner', + method: 'search_read', + }) + .then(function (records) { + _.each(records, function (planner) { planner.data = $.parseJSON(planner.data) || {}; planner_by_menu[planner.menu_id[0]] = planner; }); diff --git a/addons/web_planner/static/src/js/web_planner_common.js b/addons/web_planner/static/src/js/web_planner_common.js index 64f13232de7..0e611c89655 100644 --- a/addons/web_planner/static/src/js/web_planner_common.js +++ b/addons/web_planner/static/src/js/web_planner_common.js @@ -67,10 +67,12 @@ var PlannerDialog = Dialog.extend({ * Fetch the planner's rendered template */ willStart: function() { - var def = rpc.query({model: 'web.planner', method: 'render'}) - .args([this.planner.view_id[0], this.planner.planner_application]) - .withContext(session.user_context) - .exec({type: "ajax"}) + var def = rpc.query({ + model: 'web.planner', + method: 'render', + args: [this.planner.view_id[0], this.planner.planner_application], + context: session.user_context, + }) .then((function (template) { this.$template = $(template); }).bind(this)); @@ -352,9 +354,11 @@ var PlannerDialog = Dialog.extend({ this._save_planner_data(); }, _save_planner_data: function() { - return rpc.query({model: 'web.planner', method: 'write'}) - .args([this.planner.id, {'data': JSON.stringify(this.planner.data), 'progress': this.planner.progress}]) - .exec({type: "ajax"}); + return rpc.query({ + model: 'web.planner', + method: 'write', + args: [this.planner.id, {'data': JSON.stringify(this.planner.data), 'progress': this.planner.progress}], + }); }, show_enterprise: function () { var buttons = [{ @@ -362,9 +366,11 @@ var PlannerDialog = Dialog.extend({ classes: 'btn-primary', close: true, click: function () { - rpc.query({model: "res.users", method: "search_count"}) - .args([[["share", "=", false]]]) - .exec({type: "ajax"}) + rpc.query({ + model: "res.users", + method: "search_count", + args: [[["share", "=", false]]], + }) .then(function (data) { window.location = "https://www.odoo.com/odoo-enterprise/upgrade?utm_medium=community_upgrade&num_users=" + data; }); diff --git a/addons/web_settings_dashboard/static/src/js/dashboard.js b/addons/web_settings_dashboard/static/src/js/dashboard.js index e94ff9bc976..ef049b2acfd 100644 --- a/addons/web_settings_dashboard/static/src/js/dashboard.js +++ b/addons/web_settings_dashboard/static/src/js/dashboard.js @@ -25,8 +25,7 @@ var Dashboard = Widget.extend({ load: function(dashboards){ var self = this; var loading_done = new $.Deferred(); - this._rpc("/web_settings_dashboard/data") - .exec() + this._rpc({route: '/web_settings_dashboard/data'}) .then(function (data) { // Load each dashboard var all_dashboards_defs = []; @@ -90,9 +89,11 @@ var DashboardInvitations = Widget.extend({ $target.prop('disabled', true); $target.find('i.fa-cog').removeClass('hidden'); // Try to create user accountst - this._rpc("res.users", "web_dashboard_create_users") - .args([user_emails]) - .exec() + this._rpc({ + model: 'res.users', + method: 'web_dashboard_create_users', + args: [user_emails], + }) .then(function() { self.reload(); }) @@ -167,10 +168,12 @@ var DashboardPlanner = Widget.extend({ willStart: function () { var self = this; - return this._rpc('web.planner', 'search_read') - .exec() + return this._rpc({ + model: 'web.planner', + method: 'search_read', + }) .then(function(res) { - self.planners = res.records; + self.planners = res; _.each(self.planners, function(planner) { self.planner_by_menu[planner.menu_id[0]] = planner; self.planner_by_menu[planner.menu_id[0]].data = $.parseJSON(planner.data) || {}; diff --git a/addons/web_tour/static/src/js/debug_manager.js b/addons/web_tour/static/src/js/debug_manager.js index 3a4726a4b1f..68aab63946b 100644 --- a/addons/web_tour/static/src/js/debug_manager.js +++ b/addons/web_tour/static/src/js/debug_manager.js @@ -19,9 +19,11 @@ DebugManager.include({ consume_tours: function () { var active_tours = get_active_tours(); if (active_tours.length > 0) { // tours might have been consumed meanwhile - this._rpc('web_tour.tour', 'consume') - .args([active_tours]) - .exec() + this._rpc({ + model: 'web_tour.tour', + method: 'consume', + args: [active_tours], + }) .then(function () { window.location.reload(); }); diff --git a/addons/web_tour/static/src/js/tour_manager.js b/addons/web_tour/static/src/js/tour_manager.js index 8ab70b29818..36850d9159a 100644 --- a/addons/web_tour/static/src/js/tour_manager.js +++ b/addons/web_tour/static/src/js/tour_manager.js @@ -451,9 +451,11 @@ return core.Class.extend(mixins.EventDispatcherMixin, ServicesMixin, { this._log = []; } else { var self = this; - this._rpc('web_tour.tour', 'consume') - .args([[tour_name]]) - .exec() + this._rpc({ + model: 'web_tour.tour', + method: 'consume', + args: [[tour_name]], + }) .then(function () { self.consumed_tours.push(tour_name); }); diff --git a/addons/web_tour/static/src/js/tour_service.js b/addons/web_tour/static/src/js/tour_service.js index a89655e6416..23bafde1c4d 100644 --- a/addons/web_tour/static/src/js/tour_service.js +++ b/addons/web_tour/static/src/js/tour_service.js @@ -29,8 +29,10 @@ return session.is_bound.then(function () { // tours being only available for the admin. For the backend, the list of consumed is directly // in the page source. if (session.is_frontend && session.is_superuser) { - var def = rpc.query({model: 'web_tour.tour', method: 'get_consumed_tours'}) - .exec({type: "ajax"}); + var def = rpc.query({ + model: 'web_tour.tour', + method: 'get_consumed_tours', + }); defs.push(def); } return $.when.apply($, defs).then(function (consumed_tours) { diff --git a/addons/website/static/src/js/web_planner_website.js b/addons/website/static/src/js/web_planner_website.js index ccf84c803d0..59adfef92a0 100644 --- a/addons/website/static/src/js/web_planner_website.js +++ b/addons/website/static/src/js/web_planner_website.js @@ -12,11 +12,12 @@ var qweb = core.qweb; var WebsitePlannerLauncher = planner.PlannerLauncher.extend({ _fetch_planner_data: function () { - return rpc.query({model: 'web.planner', method: 'search_read'}) - .args([[['planner_application', '=', 'planner_website']]]) - .exec({type: "ajax"}) + return rpc.query({ + model: 'web.planner', + method: 'search_read', + args: [[['planner_application', '=', 'planner_website']]], + }) .then((function (planner) { - planner = planner.records; if (!planner.length) return; planner[0].data = $.parseJSON(planner[0].data) || {}; diff --git a/addons/website/static/src/js/website.backendDashboard.js b/addons/website/static/src/js/website.backendDashboard.js index 04870c6de1f..9c6416da4ac 100644 --- a/addons/website/static/src/js/website.backendDashboard.js +++ b/addons/website/static/src/js/website.backendDashboard.js @@ -103,9 +103,11 @@ var Dashboard = Widget.extend(ControlPanelMixin, { } var self = this; - this._rpc('ir.config_parameter', 'set_param') - .args(['google_management_client_id', ga_client_id]) - .exec() + this._rpc({ + model: 'ir.config_parameter', + method: 'set_param', + args: ['google_management_client_id', ga_client_id], + }) .then(function(){ self.on_date_range_button('week'); }); diff --git a/addons/website/static/src/js/website.seo.js b/addons/website/static/src/js/website.seo.js index 11072cac74e..fc3ec4c4e29 100644 --- a/addons/website/static/src/js/website.seo.js +++ b/addons/website/static/src/js/website.seo.js @@ -490,9 +490,11 @@ var Configurator = Dialog.extend({ def.resolve(null); } else { var fields = ['website_meta_title', 'website_meta_description', 'website_meta_keywords']; - this._rpc(obj.model, 'read') - .args([[obj.id], fields, base.get_context()]) - .exec() + this._rpc({ + model: obj.model, + method: 'read', + args: [[obj.id], fields, base.get_context()], + }) .then(function (data) { if (data.length) { var meta = data[0]; @@ -512,9 +514,11 @@ var Configurator = Dialog.extend({ if (!obj) { return $.Deferred().reject(); } else { - return this._rpc(obj.model, 'write') - .args([[obj.id], data, base.get_context()]) - .exec(); + return this._rpc({ + model: obj.model, + method: 'write', + args: [[obj.id], data, base.get_context()], + }); } }, titleChanged: function () { diff --git a/addons/website/static/src/js/website.snippets.editor.js b/addons/website/static/src/js/website.snippets.editor.js index 426c63e1d2e..40be63e3b9d 100644 --- a/addons/website/static/src/js/website.snippets.editor.js +++ b/addons/website/static/src/js/website.snippets.editor.js @@ -62,9 +62,11 @@ options.registry.company_data = options.Class.extend({ if (proto.__link_deferred === undefined) { proto.__link_deferred = $.Deferred(); return ajax.jsonRpc("/web/session/get_session_info", "call").then(function (session) { - return rpc.query({model: "res.users", method: "read"}) - .args([session.uid, ["company_id"]]) - .exec({type: "ajax"}) + return rpc.query({ + model: 'res.users', + method: 'read', + args: [session.uid, ['company_id']], + }) .then(function (res) { proto.__link_deferred.resolve( "/web#action=base.action_res_company_form&view_type=form&id=" + (res && res[0] && res[0].company_id[0] || 1) diff --git a/addons/website_blog/static/src/js/website_blog.editor.js b/addons/website_blog/static/src/js/website_blog.editor.js index 1e39dcd5a5f..a3e8113a0eb 100644 --- a/addons/website_blog/static/src/js/website_blog.editor.js +++ b/addons/website_blog/static/src/js/website_blog.editor.js @@ -11,9 +11,11 @@ var _t = core._t; contentMenu.TopBar.include({ new_blog_post: function () { - rpc.query({model: 'blog.blog', method: 'name_search'}) - .withContext(base.get_context()) - .exec({type: "ajax"}) + rpc.query({ + model: 'blog.blog', + method: 'name_search', + context: base.get_context(), + }) .then(function (blog_ids) { if (blog_ids.length === 1) { document.location = '/blog/' + blog_ids[0][0] + '/post/new'; diff --git a/addons/website_crm_partner_assign/static/src/js/crm_partner_assign.js b/addons/website_crm_partner_assign/static/src/js/crm_partner_assign.js index 0d3611ef87a..0a5a7a3452e 100644 --- a/addons/website_crm_partner_assign/static/src/js/crm_partner_assign.js +++ b/addons/website_crm_partner_assign/static/src/js/crm_partner_assign.js @@ -21,12 +21,14 @@ $('.interested_partner_assign_confirm').on('click',function(e){ var $btn = $(this); if ($('.interested_partner_assign_form .comment_interested').val() && $('.interested_partner_assign_form .contacted_interested').prop('checked')){ $btn.prop('disabled', true); - rpc.query({model: 'crm.lead', method: "partner_interested"}) - .args([ - [parseInt($('.interested_partner_assign_form .assign_lead_id').val())], - $('.interested_partner_assign_form .comment_interested').val() - ]) - .exec({type: "ajax"}) + rpc.query({ + model: 'crm.lead', + method: "partner_interested", + args: [ + [parseInt($('.interested_partner_assign_form .assign_lead_id').val())], + $('.interested_partner_assign_form .comment_interested').val() + ], + }) .then(function(){ window.location.href = '/my/leads'; }) @@ -43,14 +45,16 @@ $('.interested_partner_assign_confirm').on('click',function(e){ $('.desinterested_partner_assign_confirm').on('click',function(){ var $btn = $(this); $btn.prop('disabled', true); - rpc.query({model: 'crm.lead', method: "partner_desinterested"}) - .args([ - [parseInt($('.desinterested_partner_assign_form .assign_lead_id').val())], - $('.desinterested_partner_assign_form .comment_desinterested').val(), - $('.desinterested_partner_assign_form .contacted_desinterested').prop('checked'), - $('.desinterested_partner_assign_form .customer_mark_spam').prop('checked'), - ]) - .exec({type: "ajax"}) + rpc.query({ + model: 'crm.lead', + method: 'partner_desinterested', + args: [ + [parseInt($('.desinterested_partner_assign_form .assign_lead_id').val())], + $('.desinterested_partner_assign_form .comment_desinterested').val(), + $('.desinterested_partner_assign_form .contacted_desinterested').prop('checked'), + $('.desinterested_partner_assign_form .customer_mark_spam').prop('checked'), + ], + }) .then(function(){ window.location.href = '/my/leads'; }).always(function() { @@ -62,12 +66,14 @@ $('.desinterested_partner_assign_confirm').on('click',function(){ opp_stage_buttons.on('click',function(e){ var $btn = $(this); $btn.prop('disabled', true); - rpc.query('crm.lead', "write") - .args([[parseInt(e.currentTarget.getAttribute('opp'))],{ - stage_id: parseInt(e.currentTarget.getAttribute('data')), - },]) - .withContext({website_partner_assign:1}) - .exec({type: "ajax"}) + rpc.query({ + model: 'crm.lead', + method: 'write', + args: [[parseInt(e.currentTarget.getAttribute('opp'))],{ + stage_id: parseInt(e.currentTarget.getAttribute('data')), + },], + context: {website_partner_assign:1}, + }) .fail(function() { $btn.prop('disabled', false); }) @@ -85,20 +91,22 @@ $('.edit_contact_form .country_id').on('change', function(){ $('.edit_contact_confirm').on('click',function(){ var $btn = $(this); $btn.prop('disabled', true); - rpc.query({model: 'crm.lead', method: "write"}) - .args([[parseInt($('.edit_contact_form .opportunity_id').val())],{ - partner_name: $('.edit_contact_form .partner_name').val(), - phone: $('.edit_contact_form .phone').val(), - mobile: $('.edit_contact_form .mobile').val(), - email_from: $('.edit_contact_form .email_from').val(), - street: $('.edit_contact_form .street').val(), - street2: $('.edit_contact_form .street2').val(), - city: $('.edit_contact_form .city').val(), - zip: $('.edit_contact_form .zip').val(), - state_id: parseInt($('.edit_contact_form .state_id').find(":selected").attr('value')), - country_id: parseInt($('.edit_contact_form .country_id').find(":selected").attr('value')), - }]) - .exec({type: "ajax"}) + rpc.query({ + model: 'crm.lead', + method: "write", + args: [[parseInt($('.edit_contact_form .opportunity_id').val())],{ + partner_name: $('.edit_contact_form .partner_name').val(), + phone: $('.edit_contact_form .phone').val(), + mobile: $('.edit_contact_form .mobile').val(), + email_from: $('.edit_contact_form .email_from').val(), + street: $('.edit_contact_form .street').val(), + street2: $('.edit_contact_form .street2').val(), + city: $('.edit_contact_form .city').val(), + zip: $('.edit_contact_form .zip').val(), + state_id: parseInt($('.edit_contact_form .state_id').find(":selected").attr('value')), + country_id: parseInt($('.edit_contact_form .country_id').find(":selected").attr('value')), + }], + }) .fail(function() { $btn.prop('disabled', false); }) @@ -111,13 +119,15 @@ $('.edit_contact_confirm').on('click',function(){ $('.new_opp_confirm').on('click',function(e){ var $btn = $(this); $btn.prop('disabled', true); - rpc.query({model: 'crm.lead', method: "create_opp_portal"}) - .args([{ - contact_name: $('.new_opp_form .contact_name').val(), - title: $('.new_opp_form .title').val(), - description: $('.new_opp_form .description').val(), - }]) - .exec({type: "ajax"}) + rpc.query({ + model: 'crm.lead', + method: 'create_opp_portal', + args: [{ + contact_name: $('.new_opp_form .contact_name').val(), + title: $('.new_opp_form .title').val(), + description: $('.new_opp_form .description').val(), + }], + }) .done(function(response){ if (response.errors) { $('#new-opp-dialog .alert').remove(); @@ -138,17 +148,19 @@ $('.new_opp_confirm').on('click',function(e){ $('.edit_opp_confirm').on('click',function(){ var $btn = $(this); $btn.prop('disabled', true); - rpc.query({model: 'crm.lead', method: "update_lead_portal"}) - .args([[parseInt($('.edit_opp_form .opportunity_id').val())],{ - date_deadline: $('.edit_opp_form .date_deadline').val(), - planned_revenue: parseFloat($('.edit_opp_form .planned_revenue').val()), - probability: parseFloat($('.edit_opp_form .probability').val()), - activity_type_id: parseInt($('.edit_opp_form .next_activity').find(":selected").attr('data')), - activity_summary: $('.edit_opp_form .activity_summary').val(), - activity_date_deadline: $('.edit_opp_form .activity_date_deadline').val(), - priority: $('input[name="PriorityRadioOptions"]:checked').val(), - }]) - .exec({type: "ajax"}) + rpc.query({ + model: 'crm.lead', + method: 'update_lead_portal', + args: [[parseInt($('.edit_opp_form .opportunity_id').val())],{ + date_deadline: $('.edit_opp_form .date_deadline').val(), + planned_revenue: parseFloat($('.edit_opp_form .planned_revenue').val()), + probability: parseFloat($('.edit_opp_form .probability').val()), + activity_type_id: parseInt($('.edit_opp_form .next_activity').find(":selected").attr('data')), + activity_summary: $('.edit_opp_form .activity_summary').val(), + activity_date_deadline: $('.edit_opp_form .activity_date_deadline').val(), + priority: $('input[name="PriorityRadioOptions"]:checked').val(), + }], + }) .fail(function() { $btn.prop('disabled', false); }) diff --git a/addons/website_links/static/src/js/website_links.js b/addons/website_links/static/src/js/website_links.js index e7e12589843..5d310fcdb86 100644 --- a/addons/website_links/static/src/js/website_links.js +++ b/addons/website_links/static/src/js/website_links.js @@ -49,8 +49,10 @@ if(!$('.o_website_links_create_tracked_url').length) { }); }, fetch_objects: function() { - return rpc.query({model: this.obj, method: 'search_read'}) - .exec({type: "ajax"}) + return rpc.query({ + model: this.obj, + method: 'search_read', + }) .then(function(result) { return _.map(result, function(val) { return {id: val.id, text:val.name}; @@ -70,9 +72,11 @@ if(!$('.o_website_links_create_tracked_url').length) { create_object: function(name) { var self = this; - return rpc.query({model: this.obj, method: 'create'}) - .args([{name:name}]) - .exec({type: "ajax"}) + return rpc.query({ + model: this.obj, + method: 'create', + args: [{name:name}], + }) .then(function(record) { self.element.attr('value', record); self.objects.push({'id': record, 'text': name}); diff --git a/addons/website_links/static/src/js/website_links_charts.js b/addons/website_links/static/src/js/website_links_charts.js index a0033f0148e..193c29d3a76 100644 --- a/addons/website_links/static/src/js/website_links_charts.js +++ b/addons/website_links/static/src/js/website_links_charts.js @@ -133,39 +133,49 @@ if(!$('.o_website_links_chart').length) { var links_domain = ['link_id', '=', parseInt(link_id)]; var total_clicks = function() { - return rpc.query({model: 'link.tracker.click', method: 'search_count'}) - .args([[links_domain]]) - .exec({type: "ajax"}); + return rpc.query({ + model: 'link.tracker.click', + method: 'search_count', + args: [[links_domain]], + }); }; var clicks_by_day = function() { - return rpc.query({model: 'link.tracker.click', method: 'read_group'}) - .args([[links_domain], ['create_date']]) - .kwargs({'groupby':'create_date:day'}) - .exec({type: "ajax"}); + return rpc.query({ + model: 'link.tracker.click', + method: 'read_group', + args: [[links_domain], ['create_date']], + kwargs: {groupby:'create_date:day'}, + }); }; var clicks_by_country = function() { - return rpc.query({model: 'link.tracker.click', method: 'read_group'}) - .args([[links_domain], ['country_id']]) - .kwargs({'groupby':'country_id'}) - .exec({type: "ajax"}); + return rpc.query({ + model: 'link.tracker.click', + method: 'read_group', + args: [[links_domain], ['country_id']], + kwargs: {groupby:'country_id'}, + }); }; var last_week_clicks_by_country = function() { var interval = moment().subtract(7, 'days').format("YYYY-MM-DD"); - return rpc.query({model: 'link.tracker.click', method: 'read_group'}) - .args([[links_domain, ['create_date', '>', interval]], ['country_id']]) - .kwargs({'groupby':'country_id'}) - .exec({type: "ajax"}); + return rpc.query({ + model: 'link.tracker.click', + method: 'read_group', + args: [[links_domain, ['create_date', '>', interval]], ['country_id']], + kwargs: {groupby:'country_id'}, + }); }; var last_month_clicks_by_country = function() { var interval = moment().subtract(30, 'days').format("YYYY-MM-DD"); - return rpc.query({model: 'link.tracker.click', method: 'read_group'}) - .args([[links_domain, ['create_date', '>', interval]], ['country_id']]) - .kwargs({'groupby':'country_id'}) - .exec({type: "ajax"}); + return rpc.query({ + model: 'link.tracker.click', + method: 'read_group', + args: [[links_domain, ['create_date', '>', interval]], ['country_id']], + kwargs: {groupby: 'country_id'}, + }); }; $.when(total_clicks(), diff --git a/addons/website_mail_channel/static/src/js/website_mail_channel.editor.js b/addons/website_mail_channel/static/src/js/website_mail_channel.editor.js index c15f30c223b..9419cde664c 100644 --- a/addons/website_mail_channel/static/src/js/website_mail_channel.editor.js +++ b/addons/website_mail_channel/static/src/js/website_mail_channel.editor.js @@ -18,10 +18,12 @@ options.registry.subscribe = options.Class.extend({ window_title: _t("Add a Subscribe Button"), select: _t("Discussion List"), init: function (field) { - return rpc.query({model: 'mail.channel', method: 'name_search'}) - .args(['', [['public','=','public']]]) - .withContext(base.get_context()) - .exec({type: "ajax"}); + return rpc.query({ + model: 'mail.channel', + method: 'name_search', + args: ['', [['public','=','public']]], + context: base.get_context(), + }); }, }).then(function (mail_channel_id) { self.$target.attr("data-id", mail_channel_id); diff --git a/addons/website_mass_mailing/static/src/js/website_mass_mailing.editor.js b/addons/website_mass_mailing/static/src/js/website_mass_mailing.editor.js index 2189a59c746..c9848361d42 100644 --- a/addons/website_mass_mailing/static/src/js/website_mass_mailing.editor.js +++ b/addons/website_mass_mailing/static/src/js/website_mass_mailing.editor.js @@ -21,10 +21,12 @@ var mass_mailing_common = options.Class.extend({ 'window_title': this.popup_title, 'select': _t("Newsletter"), 'init': function (field) { - return rpc.query({model: 'mail.mass_mailing.list', method: 'name_search'}) - .args(['', []]) - .withContext(base.get_context()) - .exec({type: "ajax"}); + return rpc.query({ + model: 'mail.mass_mailing.list', + method: 'name_search', + args: ['', []], + context: base.get_context(), + }); }, }); def.then(function (mailing_list_id) { diff --git a/addons/website_sale/static/src/js/website_sale.editor.js b/addons/website_sale/static/src/js/website_sale.editor.js index 3bacdd80d5b..7ed905d49c9 100644 --- a/addons/website_sale/static/src/js/website_sale.editor.js +++ b/addons/website_sale/static/src/js/website_sale.editor.js @@ -44,8 +44,10 @@ options.registry.website_sale = options.Class.extend({ if (size_y >= 4) $select = $select.add($size.find('tr:eq(3) td:lt('+size_x+')')); $select.addClass("selected"); - rpc.query({model: 'product.style', method: 'search_read'}) - .exec({type: "ajax"}) + rpc.query({ + model: 'product.style', + method: 'search_read', + }) .then(function (data) { var $ul = self.$el.find('ul[name="style"]'); for (var k in data) { diff --git a/addons/website_sale_wishlist/static/src/js/website_sale_wishlist.js b/addons/website_sale_wishlist/static/src/js/website_sale_wishlist.js index 5d6de94656d..1d120a89954 100644 --- a/addons/website_sale_wishlist/static/src/js/website_sale_wishlist.js +++ b/addons/website_sale_wishlist/static/src/js/website_sale_wishlist.js @@ -82,9 +82,11 @@ var ProductWishlist = Widget.extend({ var wish = tr.data('wish-id'); var product = tr.data('product-id'); - rpc.query({model: 'product.wishlist', method: 'write'}) - .args([[wish], { active: false }, base.get_context()]) - .exec({type: "ajax"}) + rpc.query({ + model: 'product.wishlist', + method: 'write', + args: [[wish], { active: false }, base.get_context()], + }) .then(function(){ $(tr).hide(); }); |
