diff --git a/addons/web/static/src/views/pivot/pivot_renderer.js b/addons/web/static/src/views/pivot/pivot_renderer.js index f472aa2352c..405fe2160dd 100644 --- a/addons/web/static/src/views/pivot/pivot_renderer.js +++ b/addons/web/static/src/views/pivot/pivot_renderer.js @@ -39,7 +39,7 @@ export class PivotRenderer extends Component { let formatType = this.model.metaData.widgets[cell.measure]; if (!formatType) { const fieldType = field.type; - formatType = fieldType === "many2one" ? "integer" : fieldType; + formatType = ["many2one", "reference"].includes(fieldType) ? "integer" : fieldType; } //If the formatter is not found on the registry, search on the legacy fieldUtils.format. //This must be removed when all the formatters will be on the registry diff --git a/addons/web/static/tests/helpers/mock_server.js b/addons/web/static/tests/helpers/mock_server.js index f7c0574fa3a..2b59cb3aa9a 100644 --- a/addons/web/static/tests/helpers/mock_server.js +++ b/addons/web/static/tests/helpers/mock_server.js @@ -1079,7 +1079,7 @@ export class MockServer { return; } if ( - fields[fieldName].type === "many2one" && + ["many2one", "reference"].includes(fields[fieldName].type) && !["count_distinct", "array_agg"].includes(func) ) { return; @@ -1103,7 +1103,8 @@ export class MockServer { } break; } - case "many2one": { + case "many2one": + case "reference": { const ids = records.map((r) => r[fieldName]); if (func === "array_agg") { group[name] = ids.map((id) => (id ? id : null)); diff --git a/addons/web/static/tests/mock_server_tests.js b/addons/web/static/tests/mock_server_tests.js index 7aa2015aa99..4d471c2ba27 100644 --- a/addons/web/static/tests/mock_server_tests.js +++ b/addons/web/static/tests/mock_server_tests.js @@ -44,6 +44,10 @@ QUnit.module("MockServer", (hooks) => { relation: "foo", inverse_fname_by_model_name: { foo: "many2many_field" }, }, + partner_ref: { + type: "reference", + selection: [["partner", "Partner"]], + }, }, records: [ { @@ -54,6 +58,7 @@ QUnit.module("MockServer", (hooks) => { name: "zzz", partner_ids: [1, 2], select: "dev", + partner_ref: "partner,1", }, { foo: 1, @@ -64,6 +69,7 @@ QUnit.module("MockServer", (hooks) => { partner_id: 2, partner_ids: [1], select: "new", + partner_ref: "partner,2" }, { foo: 17, @@ -1285,6 +1291,23 @@ QUnit.module("MockServer", (hooks) => { partner_id: 0, }, ]); + + const result4 = await server.performRPC("", { + model: "bar", + method: "read_group", + args: [[]], + kwargs: { + fields: ["partner_ref:count_distinct"], + domain: [], + groupby: [], + }, + }); + assert.deepEqual(result4, [ + { + __count: 6, + partner_ref: 2, + }, + ]); }); QUnit.test("performRPC: read_progress_bar grouped by boolean", async (assert) => { diff --git a/addons/web/static/tests/views/pivot_view_tests.js b/addons/web/static/tests/views/pivot_view_tests.js index 69e84dcbc77..a0dcea236ae 100644 --- a/addons/web/static/tests/views/pivot_view_tests.js +++ b/addons/web/static/tests/views/pivot_view_tests.js @@ -116,6 +116,15 @@ QUnit.module("Views", (hooks) => { group_operator: undefined, store: true, }, + ref: { + string: "Reference", + type: "reference", + selection: [ + ["product", "Product"], + ["customer", "Customer"], + ], + group_operator: "count_distinct", + }, }, records: [ { @@ -127,6 +136,7 @@ QUnit.module("Views", (hooks) => { customer: 1, computed_field: 19, company_type: "company", + ref: "product,37", }, { id: 2, @@ -137,6 +147,7 @@ QUnit.module("Views", (hooks) => { customer: 2, computed_field: 23, company_type: "individual", + ref: "product,41", }, { id: 3, @@ -147,6 +158,7 @@ QUnit.module("Views", (hooks) => { customer: 2, computed_field: 26, company_type: "company", + ref: "customer,1", }, { id: 4, @@ -157,6 +169,7 @@ QUnit.module("Views", (hooks) => { customer: 1, computed_field: 19, company_type: "individual", + ref: "customer,2", }, ], }, @@ -3218,6 +3231,28 @@ QUnit.module("Views", (hooks) => { ); }); + QUnit.test("pivot view with reference field as a measure", async function (assert) { + assert.expect(1); + + await makeView({ + type: "pivot", + resModel: "partner", + serverData, + arch: ` + + + + `, + }); + + + assert.strictEqual( + target.querySelector("table tbody tr").innerText.replace(/\s/g, ""), + "Total1124", + "should display ref distinct count as measure" + ); + }); + QUnit.test("m2o as measure, drilling down into data", async function (assert) { assert.expect(1);