details: https://code.tryton.org/tryton/commit/995561fc1573
branch: 8.0
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
(grafted from 05dbc76d7b374aebf7aaef7c03617cbec6c67393)
diffstat:
modules/purchase/purchase.py | 15 ++++++++++-----
modules/sale/sale.py | 13 +++++++++----
2 files changed, 19 insertions(+), 9 deletions(-)
diffs (89 lines):
diff -r 0ab867bb59af -r 995561fc1573 modules/purchase/purchase.py
--- a/modules/purchase/purchase.py Sun Sep 13 14:01:21 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 0ab867bb59af -r 995561fc1573 modules/sale/sale.py
--- a/modules/sale/sale.py Sun Sep 13 14:01:21 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"),