[REF] web, *: simplify our RPC system (in JS)
The RPC system was not completely satisfactory, we decided to prepare the future and do it properly. This commit introduces the new rpc system, which replace the previous new one. We now simply have a method, this._rpc, which takes a dictionary of parameters. The idea is that depending on the parameters, it is able to add correct default value when necessary. For situations where we don't have the this._rpc method, we can use the rpc.query method, which takes the same arguments, but directly calls ajax.rpc instead of triggering up some events.
This commit is contained in:
committed by
Aaron Bohy
parent
749d10e8b5
commit
2106e3dd2e
@@ -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));
|
||||
},
|
||||
});
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
},
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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), '');
|
||||
|
||||
@@ -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'});
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
@@ -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'});
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -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"), {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 || [];
|
||||
|
||||
@@ -69,10 +69,12 @@ var PartnerInviteDialog = Dialog.extend({
|
||||
var self = this;
|
||||
var data = this.$input.select2('data');
|
||||
if(data.length >= 1){
|
||||
return this._rpc('mail.channel', 'channel_invite')
|
||||
.args([this.channel_id])
|
||||
.kwargs({partner_ids: _.pluck(data, 'id')})
|
||||
.exec()
|
||||
return this._rpc({
|
||||
model: 'mail.channel',
|
||||
method: 'channel_invite',
|
||||
args: [this.channel_id],
|
||||
kwargs: {partner_ids: _.pluck(data, 'id')},
|
||||
})
|
||||
.then(function(){
|
||||
var names = _.escape(_.pluck(data, 'text').join(', '));
|
||||
var notification = _.str.sprintf(_t('You added <b>%s</b> to the conversation.'), names);
|
||||
@@ -381,9 +383,11 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
|
||||
},
|
||||
|
||||
do_search_channel: function(search_val){
|
||||
return this._rpc('mail.channel', 'channel_search_to_join')
|
||||
.args([search_val])
|
||||
.exec()
|
||||
return this._rpc({
|
||||
model: 'mail.channel',
|
||||
method: 'channel_search_to_join',
|
||||
args: [search_val]
|
||||
})
|
||||
.then(function(result){
|
||||
var values = [];
|
||||
_.each(result, function(channel){
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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});
|
||||
});
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
},
|
||||
|
||||
@@ -40,8 +40,7 @@ var Apps = Widget.extend({
|
||||
if (apps_client) {
|
||||
return check_client_available(apps_client);
|
||||
} else {
|
||||
return this._rpc('ir.module.module', 'get_apps_server')
|
||||
.exec()
|
||||
return this._rpc({model: 'ir.module.module', method: 'get_apps_server'})
|
||||
.then(function(u) {
|
||||
var link = $(_.str.sprintf('<a href="%s"></a>', u))[0];
|
||||
var host = _.str.sprintf('%s//%s', link.protocol, link.host);
|
||||
@@ -90,9 +89,7 @@ var Apps = Widget.extend({
|
||||
});
|
||||
},
|
||||
'Model': function(m) {
|
||||
return this._rpc(m.model, m.method)
|
||||
.args(m.args)
|
||||
.exec()
|
||||
return this._rpc({model: m.model, method: m.method, args: m.args})
|
||||
.then(function(r) {
|
||||
var w = self.$ifr[0].contentWindow;
|
||||
w.postMessage({id: m.id, result: r}, client.origin);
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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<any>}
|
||||
*/
|
||||
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);
|
||||
},
|
||||
};
|
||||
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
})
|
||||
);
|
||||
});
|
||||
},
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}));
|
||||
|
||||
@@ -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("");
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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));
|
||||
},
|
||||
/**
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
|
||||
@@ -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");
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -2531,9 +2531,9 @@ QUnit.module('relational_fields', {
|
||||
'<field name="timmy" invisible="1"/>' +
|
||||
'</form>',
|
||||
mockRPC: function (route, args) {
|
||||
if (route === '/web/dataset/search_read') {
|
||||
if (args.method === 'search_read') {
|
||||
count++;
|
||||
nb_fields_fetched = args.fields.length;
|
||||
nb_fields_fetched = args.args[1].length;
|
||||
}
|
||||
return this._super.apply(this, arguments);
|
||||
},
|
||||
@@ -2687,7 +2687,7 @@ QUnit.module('relational_fields', {
|
||||
'<field name="foo"/>' +
|
||||
'</form>',
|
||||
mockRPC: function (route, args) {
|
||||
if (route === '/web/dataset/search_read') {
|
||||
if (args.method === 'search_read') {
|
||||
rpcCount++;
|
||||
}
|
||||
return this._super.apply(this, arguments);
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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));
|
||||
},
|
||||
});
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
|
||||
@@ -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) || {};
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) || {};
|
||||
|
||||
@@ -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');
|
||||
});
|
||||
|
||||
@@ -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 () {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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);
|
||||
})
|
||||
|
||||
@@ -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});
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user