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}))

Reply via email to