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();
});