changeset c43a5ec13cf7 in modules/purchase:default details: https://hg.tryton.org/modules/purchase?cmd=changeset;node=c43a5ec13cf7 description: Prevent domain error when copy products with product suppliers on variants
issue9017 review315221002V diffstat: product.py | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 54 insertions(+), 0 deletions(-) diffs (71 lines): diff -r 0c64a201a7c4 -r c43a5ec13cf7 product.py --- a/product.py Sat Apr 25 23:53:51 2020 +0200 +++ b/product.py Fri May 01 20:31:02 2020 +0200 @@ -85,6 +85,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' @@ -181,6 +206,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'