details:   https://code.tryton.org/tryton/commit/bca2b503c6e3
branch:    default
user:      Cédric Krier <[email protected]>
date:      Tue Sep 23 16:04:29 2025 +0200
description:
        Add sequence_reorder to model order

        Closes #14251
diffstat:

 trytond/CHANGELOG                   |   1 +
 trytond/doc/ref/models.rst          |  10 +++++++++
 trytond/trytond/model/__init__.py   |  38 ++++++++++++++++++++++++++++++------
 trytond/trytond/model/order.py      |   8 +++++++
 trytond/trytond/tests/test_order.py |  12 ++++++++++-
 5 files changed, 61 insertions(+), 8 deletions(-)

diffs (119 lines):

diff -r c9d4cbb242a7 -r bca2b503c6e3 trytond/CHANGELOG
--- a/trytond/CHANGELOG Tue Oct 07 15:21:08 2025 +0200
+++ b/trytond/CHANGELOG Tue Sep 23 16:04:29 2025 +0200
@@ -1,3 +1,4 @@
+* Add sequence_reorder to model order
 * Remove has_window_functions from Database
 * Set minimal supported version of SQLite to 3.30.1
 * Refactor of trytond.config to add cache
diff -r c9d4cbb242a7 -r bca2b503c6e3 trytond/doc/ref/models.rst
--- a/trytond/doc/ref/models.rst        Tue Oct 07 15:21:08 2025 +0200
+++ b/trytond/doc/ref/models.rst        Tue Sep 23 16:04:29 2025 +0200
@@ -1125,6 +1125,16 @@
 Return a new list of records ordered by the ``order`` list defined like in
 :meth:`~ModelStorage.search`.
 
+
+sequence_reorder
+================
+
+.. function:: sequence_reorder(records[, field_name])
+
+   Updates the sequence ``field_name`` to follow the current order of the
+   records.
+   Returns the list of records.
+
 MultiValueMixin
 ===============
 
diff -r c9d4cbb242a7 -r bca2b503c6e3 trytond/trytond/model/__init__.py
--- a/trytond/trytond/model/__init__.py Tue Oct 07 15:21:08 2025 +0200
+++ b/trytond/trytond/model/__init__.py Tue Sep 23 16:04:29 2025 +0200
@@ -13,15 +13,39 @@
 from .modelstorage import EvalEnvironment, ModelStorage
 from .modelview import ModelView
 from .multivalue import MultiValueMixin, ValueMixin
-from .order import sequence_ordered, sort
+from .order import sequence_ordered, sequence_reorder, sort
 from .symbol import SymbolMixin
 from .tree import sum_tree, tree
 from .union import UnionMixin
 from .workflow import Workflow
 
-__all__ = ['Model', 'ModelView', 'ModelStorage', 'ModelSingleton', 'ModelSQL',
-    'Check', 'Unique', 'Exclude', 'Index', 'convert_from',
-    'Workflow', 'DictSchemaMixin', 'MatchMixin', 'UnionMixin', 'dualmethod',
-    'MultiValueMixin', 'ValueMixin', 'SymbolMixin', 'DigitsMixin',
-    'EvalEnvironment', 'sequence_ordered', 'sort', 'DeactivableMixin', 'tree',
-    'sum_tree', 'avatar_mixin', 'ChatMixin']
+__all__ = [
+    ChatMixin,
+    Check,
+    DeactivableMixin,
+    DictSchemaMixin,
+    DigitsMixin,
+    EvalEnvironment,
+    Exclude,
+    Index,
+    MatchMixin,
+    Model,
+    ModelSQL,
+    ModelSingleton,
+    ModelStorage,
+    ModelView,
+    MultiValueMixin,
+    SymbolMixin,
+    UnionMixin,
+    Unique,
+    ValueMixin,
+    Workflow,
+    avatar_mixin,
+    convert_from,
+    dualmethod,
+    sequence_ordered,
+    sequence_reorder,
+    sort,
+    sum_tree,
+    tree,
+    ]
diff -r c9d4cbb242a7 -r bca2b503c6e3 trytond/trytond/model/order.py
--- a/trytond/trytond/model/order.py    Tue Oct 07 15:21:08 2025 +0200
+++ b/trytond/trytond/model/order.py    Tue Sep 23 16:04:29 2025 +0200
@@ -109,3 +109,11 @@
     def func(obj):
         return tuple(getter(obj) for getter in getters)
     return sorted(records, key=func)
+
+
+def sequence_reorder(records, field_name='sequence'):
+    "Updates sequence to follow records order"
+    for i, record in enumerate(records):
+        if getattr(record, field_name, None) != i:
+            setattr(record, field_name, i)
+    return records
diff -r c9d4cbb242a7 -r bca2b503c6e3 trytond/trytond/tests/test_order.py
--- a/trytond/trytond/tests/test_order.py       Tue Oct 07 15:21:08 2025 +0200
+++ b/trytond/trytond/tests/test_order.py       Tue Sep 23 16:04:29 2025 +0200
@@ -2,7 +2,7 @@
 # this repository contains the full copyright notices and license terms.
 from unittest.mock import Mock
 
-from trytond.model import sort
+from trytond.model import sequence_reorder, sort
 from trytond.pool import Pool
 from trytond.tests.test_tryton import (
     TestCase, activate_module, with_transaction)
@@ -101,3 +101,13 @@
         self.assertListEqual(
             sort([record1, record2], [('name', 'DESC NULLS LAST')]),
             [record1, record2])
+
+    def test_sequence_reorder(self):
+        "Test sequence_reorder"
+        record1 = Mock()
+        record2 = Mock()
+
+        records = sequence_reorder([record1, record2])
+
+        self.assertEqual(records, [record1, record2])
+        self.assertLess(record1.sequence, record2.sequence)

Reply via email to