From fef30e24b1bce21aa091f3076dfac0db9b36a528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Sun, 13 Sep 2026 13:57:29 +0200 Subject: [PATCH] Use explicit order for shipments and invoices on sale and purchase Closes #15090 --- modules/purchase/purchase.py | 15 ++++++++++----- modules/sale/sale.py | 13 +++++++++---- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/modules/purchase/purchase.py b/modules/purchase/purchase.py index 9297b33c03..e18df605f8 100644 --- a/modules/purchase/purchase.py +++ b/modules/purchase/purchase.py @@ -205,7 +205,8 @@ class Purchase( ], '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 @@ class Purchase( ('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 @@ class Purchase( ('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 --git a/modules/sale/sale.py b/modules/sale/sale.py index 9ce1bd952b..830c0d9058 100644 --- a/modules/sale/sale.py +++ b/modules/sale/sale.py @@ -261,7 +261,8 @@ class Sale( ], '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 @@ class Sale( ('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 @@ class Sale( ], "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"),