changeset 3bef7a63ee9c in modules/sale_product_customer:default details: https://hg.tryton.org/modules/sale_product_customer?cmd=changeset;node=3bef7a63ee9c description: Prevent domain error when copy products with product customers on variants
issue9017 review315221002 diffstat: product.py | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 55 insertions(+), 1 deletions(-) diffs (77 lines): diff -r 051f513b7592 -r 3bef7a63ee9c product.py --- a/product.py Sat Apr 25 23:53:51 2020 +0200 +++ b/product.py Fri May 01 20:32:37 2020 +0200 @@ -3,7 +3,7 @@ from trytond.model import (fields, ModelSQL, ModelView, sequence_ordered, MatchMixin) -from trytond.pool import PoolMeta +from trytond.pool import PoolMeta, Pool from trytond.pyson import If, Eval, Bool from trytond.tools import lstrip_wildcard @@ -84,6 +84,31 @@ if product_customer.match(pattern): yield product_customer + @classmethod + def copy(cls, templates, default=None): + pool = Pool() + ProductCustomer = pool.get('sale.product_customer') + if default is None: + default = {} + else: + default = default.copy() + + copy_customers = 'product_customers' not in default + default.setdefault('product_customers', None) + new_templates = super().copy(templates, default) + if copy_customers: + old2new = {} + to_copy = [] + for template, new_template in zip(templates, new_templates): + to_copy.extend( + pc for pc in template.product_customers if not pc.product) + old2new[template.id] = new_template.id + if to_copy: + ProductCustomer.copy(to_copy, { + 'template': lambda d: old2new[d['template']], + }) + return new_templates + class Product(metaclass=PoolMeta): __name__ = 'product.product' @@ -103,3 +128,32 @@ yield product_customer pattern['product'] = None yield from self.template.product_customer_used(**pattern) + + @classmethod + def copy(cls, products, default=None): + pool = Pool() + ProductCustomer = pool.get('sale.product_customer') + if default is None: + default = {} + else: + default = default.copy() + + copy_customers = 'product_customers' not in default + if 'template' in default: + default.setdefault('product_customers', None) + new_products = super().copy(products, default) + if 'template' in default and copy_customers: + template2new = {} + product2new = {} + to_copy = [] + for product, new_product in zip(products, new_products): + if product.product_customers: + to_copy.extend(product.product_customers) + template2new[product.template.id] = new_product.template.id + product2new[product.id] = new_product.id + if to_copy: + ProductCustomer.copy(to_copy, { + 'product': lambda d: product2new[d['product']], + 'template': lambda d: template2new[d['template']], + }) + return new_products