Prevent domain error when copy products with product customers on variants
issue9017 review315221002
This commit is contained in:
+55
-1
@@ -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 @@ class Template(metaclass=PoolMeta):
|
||||
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 @@ class Product(metaclass=PoolMeta):
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user