summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--addons/web/static/src/js/core/rpc.js44
-rw-r--r--addons/web/static/tests/core/rpc_tests.js70
-rw-r--r--addons/web/static/tests/fields/relational_fields_tests.js4
-rw-r--r--addons/web/static/tests/helpers/mock_server.js12
4 files changed, 97 insertions, 33 deletions
diff --git a/addons/web/static/src/js/core/rpc.js b/addons/web/static/src/js/core/rpc.js
index ef47e1883ea..6ad91c0e4f9 100644
--- a/addons/web/static/src/js/core/rpc.js
+++ b/addons/web/static/src/js/core/rpc.js
@@ -46,38 +46,44 @@ return {
params.args = options.args || [];
params.model = options.model;
params.method = options.method;
- params.kwargs = options.kwargs || {};
- params.kwargs.context = options.context || params.kwargs.context;
+ params.kwargs = _.extend(params.kwargs || {}, options.kwargs);
+ params.kwargs.context = options.context || params.context || params.kwargs.context;
}
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 = 'lazy' in options ? options.lazy : params.kwargs.lazy;
- var orderBy = options.orderBy || params.orderBy;
- params.kwargs.orderby = orderBy ? this._serializeSort(orderBy) : false;
+ params.kwargs.domain = options.domain || params.domain || params.kwargs.domain || [];
+ params.kwargs.fields = options.fields || params.fields || params.kwargs.fields || [];
+ 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.args = [
- options.domain || [],
- options.fields || false,
- options.offset || 0,
- options.limit || false,
- this._serializeSort(options.orderBy || params.orderBy || []),
- ];
+ 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 || false;
+ params.domain = options.domain || params.domain;
+ params.fields = options.fields || params.fields;
params.limit = options.limit || params.limit;
- params.offset = options.offset || params.offset ;
- params.sort = this._serializeSort(options.orderBy || params.orderBy || []);
+ 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 || {};
}
diff --git a/addons/web/static/tests/core/rpc_tests.js b/addons/web/static/tests/core/rpc_tests.js
index c19f1007417..3b7fc006b02 100644
--- a/addons/web/static/tests/core/rpc_tests.js
+++ b/addons/web/static/tests/core/rpc_tests.js
@@ -137,6 +137,33 @@ QUnit.module('core', {}, function () {
orderBy: [{name: 'yop', asc: true}, {name: 'aa', asc: false}],
});
assert.deepEqual(query.params, {
+ args: [],
+ kwargs: {
+ domain: ['a', '=', 1],
+ fields: ['name'],
+ offset: 2,
+ limit: 32,
+ order: 'yop ASC, aa DESC'
+ },
+ method: 'search_read',
+ model: 'partner'
+ }, "should have correct kwargs");
+ });
+
+ QUnit.test('search_read with args', function (assert) {
+ assert.expect(1);
+ var query = rpc.buildQuery({
+ model: 'partner',
+ method: 'search_read',
+ args: [
+ ['a', '=', 1],
+ ['name'],
+ 2,
+ 32,
+ 'yop ASC, aa DESC',
+ ]
+ });
+ assert.deepEqual(query.params, {
args: [['a', '=', 1], ['name'], 2, 32, 'yop ASC, aa DESC'],
kwargs: {},
method: 'search_read',
@@ -165,7 +192,6 @@ QUnit.module('core', {}, function () {
fields: ['name'],
groupby: ['product_id'],
lazy: true,
- orderby: false,
},
method: 'read_group',
model: 'partner',
@@ -195,23 +221,55 @@ QUnit.module('core', {}, function () {
fields: ['name'],
groupby: ['product_id'],
lazy: false,
- orderby: false,
},
method: 'read_group',
model: 'partner',
}, "should have correct args");
});
+ QUnit.test('read_group with no domain, nor fields', function (assert) {
+ assert.expect(7);
+ var query = rpc.buildQuery({
+ model: 'partner',
+ method: 'read_group',
+ });
+
+ assert.deepEqual(query.params.kwargs.domain, [], "should have [] as default domain");
+ assert.deepEqual(query.params.kwargs.fields, [], "should have false as default fields");
+ assert.deepEqual(query.params.kwargs.groupby, [], "should have false as default groupby");
+ assert.deepEqual(query.params.kwargs.offset, undefined, "should not enforce a default value for offst");
+ assert.deepEqual(query.params.kwargs.limit, undefined, "should not enforce a default value for limit");
+ assert.deepEqual(query.params.kwargs.orderby, undefined, "should not enforce a default value for orderby");
+ assert.deepEqual(query.params.kwargs.lazy, undefined, "should not enforce a default value for lazy");
+ });
+
QUnit.test('search_read with no domain, nor fields', function (assert) {
- assert.expect(2);
+ assert.expect(5);
+ var query = rpc.buildQuery({
+ model: 'partner',
+ method: 'search_read',
+ });
+
+ assert.deepEqual(query.params.kwargs.domain, undefined, "should not enforce a default value for domain");
+ assert.deepEqual(query.params.kwargs.fields, undefined, "should not enforce a default value for fields");
+ assert.deepEqual(query.params.kwargs.offset, undefined, "should not enforce a default value for offset");
+ assert.deepEqual(query.params.kwargs.limit, undefined, "should not enforce a default value for limit");
+ assert.deepEqual(query.params.kwargs.order, undefined, "should not enforce a default value for orderby");
+ });
+
+ QUnit.test('search_read controller with no domain, nor fields', function (assert) {
+ assert.expect(5);
var query = rpc.buildQuery({
model: 'partner',
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");
+ assert.deepEqual(query.params.domain, undefined, "should not enforce a default value for domain");
+ assert.deepEqual(query.params.fields, undefined, "should not enforce a default value for fields");
+ assert.deepEqual(query.params.offset, undefined, "should not enforce a default value for groupby");
+ assert.deepEqual(query.params.limit, undefined, "should not enforce a default value for limit");
+ assert.deepEqual(query.params.sort, undefined, "should not enforce a default value for order");
});
});
-}); \ No newline at end of file
+});
diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js
index 37c1f7aeac6..4a1d7b5bdbb 100644
--- a/addons/web/static/tests/fields/relational_fields_tests.js
+++ b/addons/web/static/tests/fields/relational_fields_tests.js
@@ -3361,7 +3361,7 @@ QUnit.module('relational_fields', {
mockRPC: function (route, args) {
if (args.method === 'search_read') {
count++;
- nb_fields_fetched = args.args[1].length;
+ nb_fields_fetched = args.kwargs.fields.length;
}
return this._super.apply(this, arguments);
},
@@ -3394,7 +3394,7 @@ QUnit.module('relational_fields', {
'</form>',
mockRPC: function (route, args) {
if (args.method === 'search_read') {
- assert.deepEqual(args.args[0], ['|', ['id', '=', 4], ['user_id', '=', 17]],
+ assert.deepEqual(args.kwargs.domain, ['|', ['id', '=', 4], ['user_id', '=', 17]],
"search_read should sent the correct domain");
}
return this._super.apply(this, arguments);
diff --git a/addons/web/static/tests/helpers/mock_server.js b/addons/web/static/tests/helpers/mock_server.js
index 72a75c3320d..f7faf2efb8f 100644
--- a/addons/web/static/tests/helpers/mock_server.js
+++ b/addons/web/static/tests/helpers/mock_server.js
@@ -718,11 +718,11 @@ var MockServer = Class.extend({
_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],
+ domain: kwargs.domain || args[0],
+ fields: kwargs.fields || args[1],
+ offset: kwargs.offset || args[2],
+ limit: kwargs.limit || args[3],
+ order: kwargs.order || args[4],
context: kwargs.context,
});
return result.records;
@@ -743,7 +743,7 @@ var MockServer = Class.extend({
*/
_mockSearchReadController: function (args) {
var self = this;
- var records = this._getRecords(args.model, args.domain);
+ var records = this._getRecords(args.model, args.domain || []);
var fields = args.fields || _.keys(this.data[args.model].fields);
var nbRecords = records.length;
var offset = args.offset || 0;