From e703d07e6880f2a1d1c27e2339fd21850fc30dc4 Mon Sep 17 00:00:00 2001 From: Nicolas Martinelli Date: Fri, 24 Nov 2017 12:43:22 +0100 Subject: [PATCH] [FIX] web: read_group RPC Example of failing request: ``` rpc.query({ model: 'link.tracker.click', method: 'read_group', args: [[links_domain, ['create_date', '>', interval]], ['country_id']], kwargs: {groupby:'country_id'}, }); ``` The RPC request built contains the following: ``` args: [[["link_id", "=", 1]], ["create_date"]] kwargs: {groupby: "create_date:day", domain: [], fields: []} ``` This will be interpreted server side as: ``` model.read_group([['link_id', '=', 1]], ['create_date'], groupby=['create_date:day'], domain=[], fields=[]) ``` 2 arguments match `domain` and `fields`, which causes a crash. opw-781300 --- addons/web/static/src/js/core/rpc.js | 12 +++++-- addons/web/static/tests/core/rpc_tests.js | 41 +++++++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/addons/web/static/src/js/core/rpc.js b/addons/web/static/src/js/core/rpc.js index 6ad91c0e4f9..53d298c9019 100644 --- a/addons/web/static/src/js/core/rpc.js +++ b/addons/web/static/src/js/core/rpc.js @@ -51,9 +51,15 @@ return { } if (options.method === 'read_group') { - 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 || []; + 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), diff --git a/addons/web/static/tests/core/rpc_tests.js b/addons/web/static/tests/core/rpc_tests.js index 3b7fc006b02..06763e38f0d 100644 --- a/addons/web/static/tests/core/rpc_tests.js +++ b/addons/web/static/tests/core/rpc_tests.js @@ -243,6 +243,47 @@ QUnit.module('core', {}, function () { assert.deepEqual(query.params.kwargs.lazy, undefined, "should not enforce a default value for lazy"); }); + QUnit.test('read_group with args and kwargs', function (assert) { + assert.expect(9); + var query = rpc.buildQuery({ + model: 'partner', + method: 'read_group', + kwargs: { + domain: ['name', '=', 'saucisse'], + fields: ['category_id'], + groupby: ['country_id'], + }, + }); + + assert.deepEqual(query.params.kwargs.domain, ['name', '=', 'saucisse'], "should have ['name', '=', 'saucisse'] category_id as default domain"); + assert.deepEqual(query.params.kwargs.fields, ['category_id'], "should have category_id as default fields"); + assert.deepEqual(query.params.kwargs.groupby, ['country_id'], "should have country_id as default groupby"); + + var query = rpc.buildQuery({ + model: 'partner', + method: 'read_group', + args: [['name', '=', 'saucisse']], + kwargs: { + fields: ['category_id'], + groupby: ['country_id'], + }, + }); + + assert.deepEqual(query.params.kwargs.domain, undefined, "should not enforce a default value for domain"); + assert.deepEqual(query.params.kwargs.fields, ['category_id'], "should have category_id as default fields"); + assert.deepEqual(query.params.kwargs.groupby, ['country_id'], "should have country_id as default groupby"); + + var query = rpc.buildQuery({ + model: 'partner', + method: 'read_group', + args: [['name', '=', 'saucisse'], ['category_id'], ['country_id']], + }); + + 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.groupby, undefined, "should not enforce a default value for groupby"); + }); + QUnit.test('search_read with no domain, nor fields', function (assert) { assert.expect(5); var query = rpc.buildQuery({