Test number of dots in name before computing unique value from a domain
The type of value may not correspond with the single_value parameter if the domain does not apply directly to the field but to a nested field. Closes #12843
This commit is contained in:
+7
-7
@@ -2765,18 +2765,18 @@
|
||||
if ((domain instanceof Array) &&
|
||||
(domain.length == 1)) {
|
||||
let [name, operator, value, ...model] = domain[0];
|
||||
if (operator == '=' ||
|
||||
(single_value && operator == 'in' && value.length == 1)) {
|
||||
const count = name.split('.').length - 1;
|
||||
if (
|
||||
(operator == '=' ||
|
||||
(single_value && operator == 'in' && value.length == 1)) &&
|
||||
(!count ||
|
||||
((count === 1) && model.length && name.endsWith('.id')))) {
|
||||
value = operator == '=' ? value : value[0];
|
||||
var count = 0;
|
||||
if (model.length && name.endsWith('.id')) {
|
||||
count = 1;
|
||||
model = model[0];
|
||||
value = [model, value];
|
||||
}
|
||||
if ((name.split('.').length - 1) == count) {
|
||||
return [true, name, value];
|
||||
}
|
||||
return [true, name, value];
|
||||
}
|
||||
}
|
||||
return [false, null, null];
|
||||
|
||||
@@ -2814,6 +2814,7 @@
|
||||
QUnit.ok(compare(unique_value(domain), [true, 'a.id', ['model', 1]]));
|
||||
domain = [['a.b.id', '=', 1, 'model']];
|
||||
QUnit.ok(compare(unique_value(domain), [false, null, null]));
|
||||
QUnit.ok(compare(unique_value(domain, false), [false, null, null]));
|
||||
domain = [['a', 'in', [1]]];
|
||||
QUnit.ok(compare(unique_value(domain), [true, 'a', 1]));
|
||||
QUnit.ok(compare(unique_value(domain, false), [false, null, null]));
|
||||
@@ -2825,6 +2826,7 @@
|
||||
QUnit.ok(compare(unique_value(domain), [false, null, null]));
|
||||
domain = [['a.id', 'in', [1], 'model']];
|
||||
QUnit.ok(compare(unique_value(domain), [true, 'a.id', ['model', 1]]));
|
||||
QUnit.ok(compare(unique_value(domain, false), [false, null, null]));
|
||||
});
|
||||
|
||||
QUnit.test('DomainInversion evaldomain', function() {
|
||||
|
||||
@@ -426,16 +426,18 @@ def unique_value(domain, single_value=True):
|
||||
if (isinstance(domain, list)
|
||||
and len(domain) == 1):
|
||||
name, operator, value, *model = domain[0]
|
||||
if (operator == '='
|
||||
or (single_value and operator == 'in' and len(value) == 1)):
|
||||
count = name.count('.')
|
||||
if (
|
||||
(operator == '='
|
||||
or (single_value
|
||||
and operator == 'in' and len(value) == 1))
|
||||
and (not count
|
||||
or (count == 1 and model and name.endswith('.id')))):
|
||||
value = value if operator == '=' and single_value else value[0]
|
||||
count = 0
|
||||
if model and name.endswith('.id'):
|
||||
count = 1
|
||||
model = model[0]
|
||||
value = [model, value]
|
||||
if name.count('.') == count:
|
||||
return True, name, value
|
||||
return True, name, value
|
||||
return False, None, None
|
||||
|
||||
|
||||
|
||||
@@ -846,6 +846,8 @@ class DomainInversionTestCase(unittest.TestCase):
|
||||
|
||||
domain = [['a.b.id', '=', 1, 'model']]
|
||||
self.assertEqual(unique_value(domain), (False, None, None))
|
||||
self.assertEqual(
|
||||
unique_value(domain, single_value=False), (False, None, None))
|
||||
|
||||
domain = [['a', 'in', [1]]]
|
||||
self.assertEqual(unique_value(domain), (True, 'a', 1))
|
||||
@@ -863,6 +865,8 @@ class DomainInversionTestCase(unittest.TestCase):
|
||||
|
||||
domain = [['a.id', 'in', [1], 'model']]
|
||||
self.assertEqual(unique_value(domain), (True, 'a.id', ['model', 1]))
|
||||
self.assertEqual(
|
||||
unique_value(domain, single_value=False), (False, None, None))
|
||||
|
||||
def test_evaldomain(self):
|
||||
domain = [['x', '>', 5]]
|
||||
|
||||
@@ -426,16 +426,18 @@ def unique_value(domain, single_value=True):
|
||||
if (isinstance(domain, list)
|
||||
and len(domain) == 1):
|
||||
name, operator, value, *model = domain[0]
|
||||
if (operator == '='
|
||||
or (single_value and operator == 'in' and len(value) == 1)):
|
||||
value = value if operator == '=' else value[0]
|
||||
count = 0
|
||||
count = name.count('.')
|
||||
if (
|
||||
(operator == '='
|
||||
or (single_value
|
||||
and operator == 'in' and len(value) == 1))
|
||||
and (not count
|
||||
or (count == 1 and model and name.endswith('.id')))):
|
||||
value = value if operator == '=' and single_value else value[0]
|
||||
if model and name.endswith('.id'):
|
||||
count = 1
|
||||
model = model[0]
|
||||
value = [model, value]
|
||||
if name.count('.') == count:
|
||||
return True, name, value
|
||||
return True, name, value
|
||||
return False, None, None
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user