details: https://code.tryton.org/tryton/commit/1e9143123687
branch: 7.0
user: Cédric Krier <[email protected]>
date: Wed Oct 14 22:42:30 2026 +0200
description:
Convert only Number instances to number when evaluate domain for
inversion
Closes #15159
(grafted from 88cc5493f11bb7dc50026f87e34b416812eae666)
diffstat:
sao/src/common.js | 8 +++-
sao/tests/sao.js | 38 ++++++++++++++++++++++++
trytond/trytond/tests/test_tools.py | 58 +++++++++++++++++++++++++++++++++++++
3 files changed, 102 insertions(+), 2 deletions(-)
diffs (142 lines):
diff -r 0f833c024fa3 -r 1e9143123687 sao/src/common.js
--- a/sao/src/common.js Fri Oct 09 23:25:45 2026 +0200
+++ b/sao/src/common.js Wed Oct 14 22:42:30 2026 +0200
@@ -2960,9 +2960,13 @@
return ((a.isDate == b.isDate) &&
(a.isDateTime == b.isDateTime) &&
(a.valueOf() == b.valueOf()));
- } else if ((a instanceof Number) || (b instanceof Number)) {
- return (Number(a) === Number(b));
} else {
+ if (a instanceof Number) {
+ a = a.valueOf();
+ }
+ if (b instanceof Number) {
+ b = b.valueOf();
+ }
return (a === b);
}
};
diff -r 0f833c024fa3 -r 1e9143123687 sao/tests/sao.js
--- a/sao/tests/sao.js Fri Oct 09 23:25:45 2026 +0200
+++ b/sao/tests/sao.js Wed Oct 14 22:42:30 2026 +0200
@@ -2916,6 +2916,44 @@
var now = new Date();
[
+ [[['x', '=', 42]], {'x': 42}, true],
+ [[['x', '=', 42]], {'x': new Number(42)}, true],
+ [[['x', '=', 42]], {'x': 0}, false],
+ [[['x', '=', 42]], {'x': new Number(0)}, false],
+ [[['x', '=', 42]], {'x': null}, false],
+ [[['x', '=', new Number(42)]], {'x': 42}, true],
+ [[['x', '=', new Number(42)]], {'x': new Number(42)}, true],
+ [[['x', '=', new Number(42)]], {'x': 0}, false],
+ [[['x', '=', new Number(42)]], {'x': new Number(0)}, false],
+ [[['x', '=', new Number(42)]], {'x': null}, false],
+ [[['x', '=', 0]], {'x': 0}, true],
+ [[['x', '=', 0]], {'x': new Number(0)}, true],
+ [[['x', '=', 0]], {'x': null}, false],
+ [[['x', '=', new Number(0)]], {'x': 0}, true],
+ [[['x', '=', new Number(0)]], {'x': new Number(0)}, true],
+ [[['x', '=', new Number(0)]], {'x': null}, false],
+ [[['x', '=', null]], {'x': 0}, false],
+ [[['x', '=', null]], {'x': new Number(0)}, false],
+ [[['x', '=', null]], {'x': null}, true],
+ [[['x', '!=', 42]], {'x': 42}, false],
+ [[['x', '!=', 42]], {'x': new Number(42)}, false],
+ [[['x', '!=', 42]], {'x': 0}, true],
+ [[['x', '!=', 42]], {'x': new Number(0)}, true],
+ [[['x', '!=', 42]], {'x': null}, true],
+ [[['x', '!=', new Number(42)]], {'x': 42}, false],
+ [[['x', '!=', new Number(42)]], {'x': new Number(42)}, false],
+ [[['x', '!=', new Number(42)]], {'x': 0}, true],
+ [[['x', '!=', new Number(42)]], {'x': new Number(0)}, true],
+ [[['x', '!=', new Number(42)]], {'x': null}, true],
+ [[['x', '!=', 0]], {'x': 0}, false],
+ [[['x', '!=', 0]], {'x': new Number(0)}, false],
+ [[['x', '!=', 0]], {'x': null}, true],
+ [[['x', '!=', new Number(0)]], {'x': 0}, false],
+ [[['x', '!=', new Number(0)]], {'x': new Number(0)}, false],
+ [[['x', '!=', new Number(0)]], {'x': null}, true],
+ [[['x', '!=', null]], {'x': 0}, true],
+ [[['x', '!=', null]], {'x': new Number(0)}, true],
+ [[['x', '!=', null]], {'x': null}, false],
[[['x', '>', 5]], {'x': 6}, true],
[[['x', '>', 5]], {'x': 4}, false],
[[['x', '>', null]], {'x': today}, false],
diff -r 0f833c024fa3 -r 1e9143123687 trytond/trytond/tests/test_tools.py
--- a/trytond/trytond/tests/test_tools.py Fri Oct 09 23:25:45 2026 +0200
+++ b/trytond/trytond/tests/test_tools.py Wed Oct 14 22:42:30 2026 +0200
@@ -7,6 +7,7 @@
import sys
import unittest
from copy import deepcopy
+from decimal import Decimal
from io import BytesIO
import sql
@@ -874,6 +875,63 @@
unique_value(domain, single_value=False), (False, None, None))
def test_evaldomain(self):
+
+ domain = [['x', '=', 42]]
+ self.assertTrue(eval_domain(domain, {'x': 42}))
+ self.assertTrue(eval_domain(domain, {'x': Decimal('42')}))
+ self.assertFalse(eval_domain(domain, {'x': 0}))
+ self.assertFalse(eval_domain(domain, {'x': Decimal('0')}))
+ self.assertFalse(eval_domain(domain, {'x': None}))
+
+ domain = [['x', '=', Decimal('42')]]
+ self.assertTrue(eval_domain(domain, {'x': 42}))
+ self.assertTrue(eval_domain(domain, {'x': Decimal('42')}))
+ self.assertFalse(eval_domain(domain, {'x': 0}))
+ self.assertFalse(eval_domain(domain, {'x': Decimal('0')}))
+ self.assertFalse(eval_domain(domain, {'x': None}))
+
+ domain = [['x', '=', 0]]
+ self.assertTrue(eval_domain(domain, {'x': 0}))
+ self.assertTrue(eval_domain(domain, {'x': Decimal('0')}))
+ self.assertFalse(eval_domain(domain, {'x': None}))
+
+ domain = [['x', '=', Decimal('0')]]
+ self.assertTrue(eval_domain(domain, {'x': 0}))
+ self.assertTrue(eval_domain(domain, {'x': Decimal('0')}))
+ self.assertFalse(eval_domain(domain, {'x': None}))
+
+ domain = [['x', '=', None]]
+ self.assertFalse(eval_domain(domain, {'x': 0}))
+ self.assertFalse(eval_domain(domain, {'x': Decimal('0')}))
+ self.assertTrue(eval_domain(domain, {'x': None}))
+
+ domain = [['x', '!=', 42]]
+ self.assertFalse(eval_domain(domain, {'x': 42}))
+ self.assertFalse(eval_domain(domain, {'x': Decimal('42')}))
+ self.assertTrue(eval_domain(domain, {'x': Decimal('0')}))
+ self.assertTrue(eval_domain(domain, {'x': None}))
+
+ domain = [['x', '!=', Decimal('42')]]
+ self.assertFalse(eval_domain(domain, {'x': 42}))
+ self.assertFalse(eval_domain(domain, {'x': Decimal('42')}))
+ self.assertTrue(eval_domain(domain, {'x': Decimal('0')}))
+ self.assertTrue(eval_domain(domain, {'x': None}))
+
+ domain = [['x', '!=', 0]]
+ self.assertFalse(eval_domain(domain, {'x': 0}))
+ self.assertFalse(eval_domain(domain, {'x': Decimal('0')}))
+ self.assertTrue(eval_domain(domain, {'x': None}))
+
+ domain = [['x', '!=', Decimal('0')]]
+ self.assertFalse(eval_domain(domain, {'x': 0}))
+ self.assertFalse(eval_domain(domain, {'x': Decimal('0')}))
+ self.assertTrue(eval_domain(domain, {'x': None}))
+
+ domain = [['x', '!=', None]]
+ self.assertTrue(eval_domain(domain, {'x': 0}))
+ self.assertTrue(eval_domain(domain, {'x': Decimal('0')}))
+ self.assertFalse(eval_domain(domain, {'x': None}))
+
domain = [['x', '>', 5]]
self.assertTrue(eval_domain(domain, {'x': 6}))
self.assertFalse(eval_domain(domain, {'x': 4}))