details:   https://code.tryton.org/tryton/commit/c6aeff622056
branch:    7.0
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 195151e4ff25 -r c6aeff622056 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
@@ -474,11 +474,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;
                     }
@@ -489,7 +492,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;
                             }
@@ -497,7 +500,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 195151e4ff25 -r c6aeff622056 
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
@@ -342,12 +342,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
@@ -357,13 +363,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