From 4ae4aed2546419e430c1e59a048084686ec03941 Mon Sep 17 00:00:00 2001 From: Julien Castiaux Date: Thu, 18 Apr 2019 07:24:06 +0000 Subject: [PATCH] [FIX] web: load binary data in separate http req The `read` done by `_fetchRecord` in `basic_model.js` expicitly set a `bin_size: true` in the context. That context option tells the backend to send the size of the binary payload instead of the payload itself thus slim the response size. Frontend widgets are then responsible to fetch the actual payload in a separated http req. The `search_read` done by `_searchReadUngroupedList` didn't set the context option thus all the binary fields were sent b64 encoded along with the `search_read` response. opw-1963842 closes odoo/odoo#33014 Signed-off-by: Aaron Bohy (aab) --- addons/board/static/tests/dashboard_tests.js | 2 +- addons/web/static/src/js/views/basic/basic_model.js | 2 +- addons/web/static/tests/views/kanban_tests.js | 7 ++++++- addons/web/static/tests/views/search_view_tests.js | 8 ++++---- addons/web/static/tests/views/view_dialogs_tests.js | 4 ++-- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/addons/board/static/tests/dashboard_tests.js b/addons/board/static/tests/dashboard_tests.js index ebd8bcdcc5a..db4e76a0749 100644 --- a/addons/board/static/tests/dashboard_tests.js +++ b/addons/board/static/tests/dashboard_tests.js @@ -854,7 +854,7 @@ QUnit.test("Views should be loaded in the user's language", async function (asse 'The views should be loaded with the correct context'); } if (route === "/web/dataset/search_read") { - assert.deepEqual(args.context, {lang: 'fr_FR'}, + assert.equal(args.context.lang, 'fr_FR', 'The data should be loaded with the correct context'); } if (route === '/web/action/load') { diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js index 804e6d6d1c9..a79fabd48d6 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -4572,7 +4572,7 @@ var BasicModel = AbstractModel.extend({ route: '/web/dataset/search_read', model: list.model, fields: fieldNames, - context: list.getContext(), + context: _.extend({}, list.getContext(), {bin_size: true}), domain: list.domain || [], limit: list.limit, offset: list.loadMoreOffset + list.offset, diff --git a/addons/web/static/tests/views/kanban_tests.js b/addons/web/static/tests/views/kanban_tests.js index 8fbbab8c27b..5e2c4e0a8f6 100644 --- a/addons/web/static/tests/views/kanban_tests.js +++ b/addons/web/static/tests/views/kanban_tests.js @@ -85,7 +85,7 @@ QUnit.module('Views', { QUnit.module('KanbanView'); QUnit.test('basic ungrouped rendering', async function (assert) { - assert.expect(5); + assert.expect(6); var kanban = await createView({ View: KanbanView, @@ -97,6 +97,11 @@ QUnit.module('Views', { '' + '' + '', + mockRPC: function (route, args) { + assert.ok(args.context.bin_size, + "should not request direct binary payload"); + return this._super(route, args); + }, }); assert.hasClass(kanban.$('.o_kanban_view'), 'o_kanban_ungrouped'); diff --git a/addons/web/static/tests/views/search_view_tests.js b/addons/web/static/tests/views/search_view_tests.js index 5980ab9211b..2ea9f2f137b 100644 --- a/addons/web/static/tests/views/search_view_tests.js +++ b/addons/web/static/tests/views/search_view_tests.js @@ -725,8 +725,8 @@ QUnit.module('Search View', { await testUtils.dom.click($('.o_menu_item:contains(AAA)')); assert.verifySteps([ - "{}", - "{\"coucou_1\":1}", + "{\"bin_size\":true}", + "{\"coucou_1\":1,\"bin_size\":true}", ]); actionManager.destroy(); @@ -998,10 +998,10 @@ QUnit.module('Search View', { if (route === '/web/dataset/search_read') { if (searchRead === 1) { assert.deepEqual(args.domain, [["bar", "=", 1]]); - assert.deepEqual(args.context, {'bar': [1]}); + assert.deepEqual(args.context.bar, [1]); } else if (searchRead === 2) { assert.deepEqual(args.domain, ["|", ["bar", "=", 1], ["bar", "=", 2]]); - assert.deepEqual(args.context, { 'bar': [1, 2] }); + assert.deepEqual(args.context.bar, [1, 2]); } searchRead++; } diff --git a/addons/web/static/tests/views/view_dialogs_tests.js b/addons/web/static/tests/views/view_dialogs_tests.js index 82d77d76674..847bbd0f3be 100644 --- a/addons/web/static/tests/views/view_dialogs_tests.js +++ b/addons/web/static/tests/views/view_dialogs_tests.js @@ -160,7 +160,7 @@ QUnit.module('Views', { if (search === 0 && route === '/web/dataset/search_read') { search++; assert.deepEqual(args, { - context: {}, + context: {'bin_size': true}, // not part of the test, may change domain: [["display_name", "like", "a"], "&", ["display_name", "ilike", "piou"], ["foo", "ilike", "piou"]], fields: ["display_name", "foo"], model: "partner", @@ -169,7 +169,7 @@ QUnit.module('Views', { }, "should search with the complete domain (domain + search)"); } else if (search === 1 && route === '/web/dataset/search_read') { assert.deepEqual(args, { - context: {}, + context: {'bin_size': true}, // not part of the test, may change domain: [["display_name", "like", "a"]], fields: ["display_name", "foo"], model: "partner",