119 lines
5.0 KiB
JavaScript
119 lines
5.0 KiB
JavaScript
flectra.define('web.rpc', function (require) {
|
|
"use strict";
|
|
|
|
var ajax = require('web.ajax');
|
|
|
|
return {
|
|
/**
|
|
* Perform a RPC. Please note that this is not the preferred way to do a
|
|
* rpc if you are in the context of a widget. In that case, you should use
|
|
* the this._rpc method.
|
|
*
|
|
* @param {Object} params @see buildQuery for a description
|
|
* @param {Object} options
|
|
* @returns {Deferred<any>}
|
|
*/
|
|
query: function (params, options) {
|
|
var query = this.buildQuery(params);
|
|
return ajax.rpc(query.route, query.params, options);
|
|
},
|
|
/**
|
|
* @param {Object} options
|
|
* @param {any[]} [options.args]
|
|
* @param {Object} [options.context]
|
|
* @param {any[]} [options.domain]
|
|
* @param {string[]} [options.fields]
|
|
* @param {string[]} [options.groupBy]
|
|
* @param {Object} [options.kwargs]
|
|
* @param {integer|false} [options.limit]
|
|
* @param {string} [options.method]
|
|
* @param {string} [options.model]
|
|
* @param {integer} [options.offset]
|
|
* @param {string[]} [options.orderBy]
|
|
* @param {Object} [options.params]
|
|
* @param {string} [options.route]
|
|
* @returns {Object} with 2 keys: route and params
|
|
*/
|
|
buildQuery: function (options) {
|
|
var route;
|
|
var params = options.params || {};
|
|
if (options.route) {
|
|
route = options.route;
|
|
} else if (options.model && options.method) {
|
|
route = '/web/dataset/call_kw/' + options.model + '/' + options.method;
|
|
}
|
|
if (options.method) {
|
|
params.args = options.args || [];
|
|
params.model = options.model;
|
|
params.method = options.method;
|
|
params.kwargs = _.extend(params.kwargs || {}, options.kwargs);
|
|
params.kwargs.context = options.context || params.context || params.kwargs.context;
|
|
}
|
|
|
|
if (options.method === 'read_group') {
|
|
if (!(params.args && params.args[0] !== undefined)) {
|
|
params.kwargs.domain = options.domain || params.domain || params.kwargs.domain || [];
|
|
}
|
|
if (!(params.args && params.args[1] !== undefined)) {
|
|
params.kwargs.fields = options.fields || params.fields || params.kwargs.fields || [];
|
|
}
|
|
if (!(params.args && params.args[2] !== undefined)) {
|
|
params.kwargs.groupby = options.groupBy || params.groupBy || params.kwargs.groupby || [];
|
|
}
|
|
params.kwargs.offset = options.offset || params.offset || params.kwargs.offset;
|
|
params.kwargs.limit = options.limit || params.limit || params.kwargs.limit;
|
|
// In kwargs, we look for "orderby" rather than "orderBy" (note the absence of capital B),
|
|
// since the Python argument to the actual function is "orderby".
|
|
var orderBy = options.orderBy || params.orderBy || params.kwargs.orderby;
|
|
params.kwargs.orderby = orderBy ? this._serializeSort(orderBy) : orderBy;
|
|
params.kwargs.lazy = 'lazy' in options ? options.lazy : params.lazy;
|
|
}
|
|
|
|
if (options.method === 'search_read') {
|
|
// call the model method
|
|
params.kwargs.domain = options.domain || params.domain || params.kwargs.domain;
|
|
params.kwargs.fields = options.fields || params.fields || params.kwargs.fields;
|
|
params.kwargs.offset = options.offset || params.offset || params.kwargs.offset;
|
|
params.kwargs.limit = options.limit || params.limit || params.kwargs.limit;
|
|
// In kwargs, we look for "order" rather than "orderBy" since the Python
|
|
// argument to the actual function is "order".
|
|
var orderBy = options.orderBy || params.orderBy || params.kwargs.order;
|
|
params.kwargs.order = orderBy ? this._serializeSort(orderBy) : orderBy;
|
|
}
|
|
|
|
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;
|
|
params.limit = options.limit || params.limit;
|
|
params.offset = options.offset || params.offset;
|
|
var orderBy = options.orderBy || params.orderBy;
|
|
params.sort = orderBy ? this._serializeSort(orderBy) : orderBy;
|
|
params.context = options.context || params.context || {};
|
|
}
|
|
|
|
return {
|
|
route: route,
|
|
params: JSON.parse(JSON.stringify(params)),
|
|
};
|
|
},
|
|
/**
|
|
* Helper method, generates a string to describe a ordered by sequence for
|
|
* SQL.
|
|
*
|
|
* For example, [{name: 'foo'}, {name: 'bar', asc: false}] will
|
|
* be converted into 'foo ASC, bar DESC'
|
|
*
|
|
* @param {Object[]} orderBy list of objects {name:..., [asc: ...]}
|
|
* @returns {string}
|
|
*/
|
|
_serializeSort: function (orderBy) {
|
|
return _.map(orderBy, function (order) {
|
|
return order.name + (order.asc !== false ? ' ASC' : ' DESC');
|
|
}).join(', ');
|
|
},
|
|
};
|
|
|
|
});
|