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 %s 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('', 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] + * 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} */ - init: function (parent, params) { - this.parent = parent; - this._route = params.route; - if (!this._route) { - this._route = '/web/dataset/call_kw/' + params.model + '/' + params.method; + 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; - }, + 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 || {}; + } - //-------------------------------------------------------------------------- - // 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 - //-------------------------------------------------------------------------- - - /** - * @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', { '' + '', 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', { '' + '', 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(); });