details: https://code.tryton.org/tryton/commit/5492328ef6dd
branch: default
user: Cédric Krier <[email protected]>
date: Thu Jul 16 15:58:16 2026 +0200
description:
Warn when resetting to draft or cancelling production with pending
purchase lines
diffstat:
modules/production_outsourcing/message.xml | 6 +++
modules/production_outsourcing/production.py | 44 +++++++++++++++++++++++++--
2 files changed, 46 insertions(+), 4 deletions(-)
diffs (79 lines):
diff -r 0985df4c4cf2 -r 5492328ef6dd modules/production_outsourcing/message.xml
--- a/modules/production_outsourcing/message.xml Thu Jul 16 15:57:11
2026 +0200
+++ b/modules/production_outsourcing/message.xml Thu Jul 16 15:58:16
2026 +0200
@@ -3,6 +3,12 @@
this repository contains the full copyright notices and license terms. -->
<tryton>
<data grouped="1">
+ <record model="ir.message" id="msg_pending_purchase_draft">
+ <field name="text">The productions "%(productions)s" cannot be
reset to draft as they have pending purchases.</field>
+ </record>
+ <record model="ir.message" id="msg_pending_purchase_cancel">
+ <field name="text">The productions "%(productions)s" cannot be
cancelled as they have pending purchases.</field>
+ </record>
<record model="ir.message" id="msg_pending_purchase_done">
<field name="text">The productions "%(productions)s" cannot be
processed as they have pending purchases.</field>
</record>
diff -r 0985df4c4cf2 -r 5492328ef6dd
modules/production_outsourcing/production.py
--- a/modules/production_outsourcing/production.py Thu Jul 16 15:57:11
2026 +0200
+++ b/modules/production_outsourcing/production.py Thu Jul 16 15:58:16
2026 +0200
@@ -130,9 +130,27 @@
def draft(cls, productions):
pool = Pool()
PurchaseLine = pool.get('purchase.line')
+ Warning = pool.get('res.user.warning')
super().draft(productions)
- PurchaseLine.delete([l for p in productions for l in p.purchase_lines
- if l.purchase_state in {'draft', 'cancelled'}])
+ to_delete, pendings = [], set()
+ for production in productions:
+ for line in production.purchase_lines:
+ if line.purchase_state in {'draft', 'cancelled'}:
+ to_delete.append(line)
+ else:
+ pendings.add(production)
+ if pendings:
+ names = ', '.join(p.rec_name for p in pendings[:5])
+ if len(pendings) > 5:
+ names += '...'
+ warning_name = Warning.format('pending_purchase.draft', pendings)
+ if Warning.check(warning_name):
+ raise PurchaseWarning(
+ warning_name,
+ gettext(
+ 'production_outsourcing.msg_pending_purchase_draft',
+ productions=names))
+ PurchaseLine.delete(to_delete)
@classmethod
@ModelView.button
@@ -140,9 +158,27 @@
def cancel(cls, productions):
pool = Pool()
PurchaseLine = pool.get('purchase.line')
+ Warning = pool.get('res.user.warning')
super().cancel(productions)
- PurchaseLine.delete([l for p in productions for l in p.purchase_lines
- if l.purchase_state in {'draft', 'cancelled'}])
+ to_delete, pendings = [], set()
+ for production in productions:
+ for line in production.purchase_lines:
+ if line.purchase_state in {'draft', 'cancelled'}:
+ to_delete.append(line)
+ else:
+ pendings.add(production)
+ if pendings:
+ names = ', '.join(p.rec_name for p in pendings[:5])
+ if len(pendings) > 5:
+ names += '...'
+ warning_name = Warning.format('pending_purchase.cancel', pendings)
+ if Warning.check(warning_name):
+ raise PurchaseWarning(
+ warning_name,
+ gettext(
+ 'production_outsourcing.msg_pending_purchase_cancel',
+ productions=names))
+ PurchaseLine.delete(to_delete)
@classmethod
@ModelView.button