details:   https://code.tryton.org/tryton/commit/c271e69bc1c6
branch:    7.6
user:      Cédric Krier <[email protected]>
date:      Fri Jan 16 12:11:35 2026 +0100
description:
        Do not compare records order with negative id

        Closes #14508
        (grafted from 9fdf4dbd66f2f603d73268f1a4048849e3e19854)
diffstat:

 sao/src/model.js                                  |   7 +++++--
 tryton/tryton/gui/window/view_form/model/group.py |  10 ++++++++--
 2 files changed, 13 insertions(+), 4 deletions(-)

diffs (74 lines):

diff -r 8f2189c7f348 -r c271e69bc1c6 sao/src/model.js
--- a/sao/src/model.js  Thu Jan 15 17:20:32 2026 +0100
+++ b/sao/src/model.js  Fri Jan 16 12:11:35 2026 +0100
@@ -513,11 +513,14 @@
             } else {
                 cmp = function(a, b) { return a < b; };
             }
+            let max_id = Math.max(0, ...this.map((r) => r.id));
             for (const record of this) {
                 if (record.get_loaded([field]) || changed || record.id < 0) {
+                    let prev_id = null;
                     if (prev) {
                         prev.load(field, false);
                         index = prev.field_get(field);
+                        prev_id = prev.id >= 0 ? prev.id : max_id++;
                     } else {
                         index = null;
                     }
@@ -528,7 +531,7 @@
                             update = true;
                         } else if (prev) {
                             if (record.id >= 0) {
-                                update = cmp(record.id, prev.id);
+                                update = cmp(record.id, prev_id);
                             } else if (position === 0) {
                                 update = true;
                             }
@@ -536,7 +539,7 @@
                     } else if (value === index) {
                         if (prev) {
                             if (record.id >= 0) {
-                                update = cmp(record.id, prev.id);
+                                update = cmp(record.id, prev_id);
                             } else if (position === 0) {
                                 update = true;
                             }
diff -r 8f2189c7f348 -r c271e69bc1c6 
tryton/tryton/gui/window/view_form/model/group.py
--- a/tryton/tryton/gui/window/view_form/model/group.py Thu Jan 15 17:20:32 
2026 +0100
+++ b/tryton/tryton/gui/window/view_form/model/group.py Fri Jan 16 12:11:35 
2026 +0100
@@ -345,12 +345,18 @@
             cmp = operator.gt
         else:
             cmp = operator.lt
+        max_id = max(0, *(r.id for r in self))
         for record in self:
             # Assume not loaded records are correctly ordered
             # as far as we do not change any previous records.
             if record.get_loaded([field]) or changed or record.id < 0:
                 if prev:
                     index = prev[field].get(prev)
+                    if prev.id >= 0:
+                        prev_id = prev.id
+                    else:
+                        max_id += 1
+                        prev_id = max_id
                 else:
                     index = None
                 update = False
@@ -360,13 +366,13 @@
                         update = True
                     elif prev:
                         if record.id >= 0:
-                            update = cmp(record.id, prev.id)
+                            update = cmp(record.id, prev_id)
                         elif position == 0:
                             update = True
                 elif value == index:
                     if prev:
                         if record.id >= 0:
-                            update = cmp(record.id, prev.id)
+                            update = cmp(record.id, prev_id)
                         elif position == 0:
                             update = True
                 elif value <= (index or 0):

Reply via email to