changeset f415efd9a3af in modules/purchase:5.4
details: https://hg.tryton.org/modules/purchase?cmd=changeset;node=f415efd9a3af
description:
Prevent domain error when copy products with product suppliers on
variants
issue9017
review315221002V
(grafted from c43a5ec13cf70fcc64f5e9d7d7a639de74dd660e)
diffstat:
product.py | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 54 insertions(+), 0 deletions(-)
diffs (71 lines):
diff -r 1449c17d7b19 -r f415efd9a3af product.py
--- a/product.py Sat Apr 04 16:42:20 2020 +0200
+++ b/product.py Fri May 01 20:31:02 2020 +0200
@@ -91,6 +91,31 @@
name, gettext('purchase.msg_change_purchase_uom'))
super(Template, cls).write(*args)
+ @classmethod
+ def copy(cls, templates, default=None):
+ pool = Pool()
+ ProductSupplier = pool.get('purchase.product_supplier')
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+
+ copy_suppliers = 'product_suppliers' not in default
+ default.setdefault('product_suppliers', None)
+ new_templates = super().copy(templates, default)
+ if copy_suppliers:
+ old2new = {}
+ to_copy = []
+ for template, new_template in zip(templates, new_templates):
+ to_copy.extend(
+ ps for ps in template.product_suppliers if not ps.product)
+ old2new[template.id] = new_template.id
+ if to_copy:
+ ProductSupplier.copy(to_copy, {
+ 'template': lambda d: old2new[d['template']],
+ })
+ return new_templates
+
class Product(metaclass=PoolMeta):
__name__ = 'product.product'
@@ -188,6 +213,35 @@
prices[product.id], currency, round=False)
return prices
+ @classmethod
+ def copy(cls, products, default=None):
+ pool = Pool()
+ ProductSupplier = pool.get('purchase.product_supplier')
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+
+ copy_suppliers = 'product_suppliers' not in default
+ if 'template' in default:
+ default.setdefault('product_suppliers', None)
+ new_products = super().copy(products, default)
+ if 'template' in default and copy_suppliers:
+ template2new = {}
+ product2new = {}
+ to_copy = []
+ for product, new_product in zip(products, new_products):
+ if product.product_suppliers:
+ to_copy.extend(product.product_suppliers)
+ template2new[product.template.id] = new_product.template.id
+ product2new[product.id] = new_product.id
+ if to_copy:
+ ProductSupplier.copy(to_copy, {
+ 'product': lambda d: product2new[d['product']],
+ 'template': lambda d: template2new[d['template']],
+ })
+ return new_products
+
class ProductSupplier(sequence_ordered(), ModelSQL, ModelView, MatchMixin):
'Product Supplier'