details:   https://code.tryton.org/tryton/commit/05dbc76d7b37
branch:    default
user:      Cédric Krier <[email protected]>
date:      Sun Sep 13 13:57:29 2026 +0200
description:
        Use explicit order for shipments and invoices on sale and purchase

        Closes #15090
diffstat:

 modules/purchase/purchase.py |  15 ++++++++++-----
 modules/sale/sale.py         |  13 +++++++++----
 2 files changed, 19 insertions(+), 9 deletions(-)

diffs (89 lines):

diff -r 9385c3660f17 -r 05dbc76d7b37 modules/purchase/purchase.py
--- a/modules/purchase/purchase.py      Thu Sep 10 14:14:16 2026 +0200
+++ b/modules/purchase/purchase.py      Sun Sep 13 13:57:29 2026 +0200
@@ -205,7 +205,8 @@
             ], 'Invoice State', readonly=True, required=True, sort=False)
     to_invoice = fields.Boolean("To Invoice", readonly=True)
     invoices = fields.Function(fields.Many2Many(
-            'account.invoice', None, None, "Invoices"),
+            'account.invoice', None, None, "Invoices",
+            order=[('id', 'ASC')]),
         'get_invoices', searcher='search_invoices')
     invoices_ignored = fields.Many2Many(
         'purchase.purchase-ignored-account.invoice',
@@ -214,12 +215,14 @@
             ('id', 'in', Eval('invoices', [])),
             ('state', '=', 'cancelled'),
             ],
+        order=[('id', 'ASC')],
         states={
             'invisible': ~Eval('invoices_ignored', []),
             })
     invoices_recreated = fields.Many2Many(
-            'purchase.purchase-recreated-account.invoice',
-            'purchase', 'invoice', 'Recreated Invoices', readonly=True)
+        'purchase.purchase-recreated-account.invoice',
+        'purchase', 'invoice', 'Recreated Invoices', readonly=True,
+        order=[('id', 'ASC')])
     origin = fields.Reference(
         "Origin", selection='get_origin',
         states={
@@ -240,10 +243,12 @@
             ('exception', 'Exception'),
             ], 'Shipment State', readonly=True, required=True, sort=False)
     shipments = fields.Function(fields.Many2Many(
-            'stock.shipment.in', None, None, "Shipments"),
+            'stock.shipment.in', None, None, "Shipments",
+            order=[('id', 'ASC')]),
         'get_shipments', searcher='search_shipments')
     shipment_returns = fields.Function(fields.Many2Many(
-            'stock.shipment.in.return', None, None, "Shipment Returns"),
+            'stock.shipment.in.return', None, None, "Shipment Returns",
+            order=[('id', 'ASC')]),
         'get_shipment_returns', searcher='search_shipment_returns')
     moves = fields.Function(
         fields.Many2Many('stock.move', None, None, "Stock Moves"),
diff -r 9385c3660f17 -r 05dbc76d7b37 modules/sale/sale.py
--- a/modules/sale/sale.py      Thu Sep 10 14:14:16 2026 +0200
+++ b/modules/sale/sale.py      Sun Sep 13 13:57:29 2026 +0200
@@ -261,7 +261,8 @@
             ], 'Invoice State', readonly=True, required=True, sort=False)
     to_invoice = fields.Boolean("To Invoice", readonly=True)
     invoices = fields.Function(fields.Many2Many(
-            'account.invoice', None, None, "Invoices"),
+            'account.invoice', None, None, "Invoices",
+            order=[('id', 'ASC')]),
         'get_invoices', searcher='search_invoices')
     invoices_ignored = fields.Many2Many(
         'sale.sale-ignored-account.invoice', 'sale', 'invoice',
@@ -270,12 +271,14 @@
             ('id', 'in', Eval('invoices', [])),
             ('state', '=', 'cancelled'),
             ],
+        order=[('id', 'ASC')],
         states={
             'invisible': ~Eval('invoices_ignored', []),
             })
     invoices_recreated = fields.Many2Many(
         'sale.sale-recreated-account.invoice', 'sale', 'invoice',
-        'Recreated Invoices', readonly=True)
+        'Recreated Invoices', readonly=True,
+        order=[('id', 'ASC')])
     shipment_method = fields.Selection([
             ('manual', 'Manual'),
             ('order', 'On Order Processed'),
@@ -294,10 +297,12 @@
             ], "Shipment State", readonly=True, required=True, sort=False)
     to_ship = fields.Boolean("To Ship", readonly=True)
     shipments = fields.Function(fields.Many2Many(
-            'stock.shipment.out', None, None, "Shipments"),
+            'stock.shipment.out', None, None, "Shipments",
+            order=[('id', 'ASC')]),
         'get_shipments', searcher='search_shipments')
     shipment_returns = fields.Function(fields.Many2Many(
-            'stock.shipment.out.return', None, None, "Shipment Returns"),
+            'stock.shipment.out.return', None, None, "Shipment Returns",
+            order=[('id', 'ASC')]),
         'get_shipment_returns', searcher='search_shipment_returns')
     moves = fields.Function(
         fields.Many2Many('stock.move', None, None, "Stock Moves"),

Reply via email to