From 7e1ed51c5eba89c7312f1025ded12e9112fa3fe4 Mon Sep 17 00:00:00 2001 From: Mathieu Duckerts-Antoine Date: Thu, 23 Jun 2022 20:31:01 +0000 Subject: [PATCH] [FIX] web: domain: can follow field relations Before this commit, a domain like ``` [["partner_id.name", "ilike", "Agrolait"]] ``` would crash when being evaluated. Part-of: odoo/odoo#92475 --- addons/web/static/src/core/domain.js | 8 +++ addons/web/static/tests/core/domain_tests.js | 56 +++++++++++++++++--- 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/addons/web/static/src/core/domain.js b/addons/web/static/src/core/domain.js index af1e0f5c3a4..592bf95a70b 100644 --- a/addons/web/static/src/core/domain.js +++ b/addons/web/static/src/core/domain.js @@ -187,6 +187,14 @@ function matchCondition(record, condition) { return condition; } const [field, operator, value] = condition; + + if (typeof field === "string") { + const names = field.split("."); + if (names.length >= 2) { + return matchCondition(record[names[0]], [names.slice(1).join("."), operator, value]); + } + } + const fieldValue = typeof field === "number" ? field : record[field]; switch (operator) { case "=": diff --git a/addons/web/static/tests/core/domain_tests.js b/addons/web/static/tests/core/domain_tests.js index e7499740540..3cc6d4b0463 100644 --- a/addons/web/static/tests/core/domain_tests.js +++ b/addons/web/static/tests/core/domain_tests.js @@ -161,16 +161,37 @@ QUnit.module("domain", {}, () => { '[("name", "=", "true")]' ); assert.strictEqual(new Domain().toString(), "[]"); - assert.strictEqual(new Domain([['name', 'in', [true, false]]]).toString(), '[("name", "in", [True, False])]'); - assert.strictEqual(new Domain([['name', 'in', [null]]]).toString(), '[("name", "in", [None])]'); - assert.strictEqual(new Domain([['name', 'in', ["foo", "bar"]]]).toString(), '[("name", "in", ["foo", "bar"])]'); - assert.strictEqual(new Domain([['name', 'in', [1, 2]]]).toString(), '[("name", "in", [1, 2])]'); - assert.strictEqual(new Domain(['&', ['name', '=', 'foo'], ['type', '=', 'bar']]).toString(), '["&", ("name", "=", "foo"), ("type", "=", "bar")]'); - assert.strictEqual(new Domain(['|', ['name', '=', 'foo'], ['type', '=', 'bar']]).toString(), '["|", ("name", "=", "foo"), ("type", "=", "bar")]'); + assert.strictEqual( + new Domain([["name", "in", [true, false]]]).toString(), + '[("name", "in", [True, False])]' + ); + assert.strictEqual( + new Domain([["name", "in", [null]]]).toString(), + '[("name", "in", [None])]' + ); + assert.strictEqual( + new Domain([["name", "in", ["foo", "bar"]]]).toString(), + '[("name", "in", ["foo", "bar"])]' + ); + assert.strictEqual( + new Domain([["name", "in", [1, 2]]]).toString(), + '[("name", "in", [1, 2])]' + ); + assert.strictEqual( + new Domain(["&", ["name", "=", "foo"], ["type", "=", "bar"]]).toString(), + '["&", ("name", "=", "foo"), ("type", "=", "bar")]' + ); + assert.strictEqual( + new Domain(["|", ["name", "=", "foo"], ["type", "=", "bar"]]).toString(), + '["|", ("name", "=", "foo"), ("type", "=", "bar")]' + ); assert.strictEqual(new Domain().toString(), "[]"); // string domains are only reformatted - assert.strictEqual(new Domain('[("name","ilike","foo")]').toString(), '[("name", "ilike", "foo")]'); + assert.strictEqual( + new Domain('[("name","ilike","foo")]').toString(), + '[("name", "ilike", "foo")]' + ); }); QUnit.test("implicit &", function (assert) { @@ -310,6 +331,27 @@ QUnit.module("domain", {}, () => { assert.throws(() => new Domain(["!"]), /invalid domain .* \(missing 1 segment/); }); + QUnit.test("follow relations", function (assert) { + assert.ok( + new Domain([["partner.city", "ilike", "Bru"]]).contains({ + name: "Lucas", + partner: { + city: "Bruxelles", + }, + }) + ); + assert.ok( + new Domain([["partner.city.name", "ilike", "Bru"]]).contains({ + name: "Lucas", + partner: { + city: { + name: "Bruxelles", + }, + }, + }) + ); + }); + // --------------------------------------------------------------------------- // Normalization // ---------------------------------------------------------------------------