Prevent DomainValidationError when coping product with components
issue10701 review350521002
This commit is contained in:
1 parent
3c88a9ccfe
commit
55efc5b45f
1 file changed
+57
+57
@@ -33,6 +33,32 @@ class Template(metaclass=PoolMeta):
|
||||
if self.type == 'kit':
|
||||
self.cost_price_method = 'fixed'
|
||||
|
||||
@classmethod
|
||||
def copy(cls, templates, default=None):
|
||||
pool = Pool()
|
||||
Component = pool.get('product.component')
|
||||
if default is None:
|
||||
default = {}
|
||||
else:
|
||||
default = default.copy()
|
||||
|
||||
copy_components = 'components' not in default
|
||||
default.setdefault('components', None)
|
||||
new_templates = super().copy(templates, default)
|
||||
if copy_components:
|
||||
old2new = {}
|
||||
to_copy = []
|
||||
for template, new_template in zip(templates, new_templates):
|
||||
to_copy.extend(
|
||||
c for c in template.components if not c.product)
|
||||
old2new[template.id] = new_template.id
|
||||
if to_copy:
|
||||
Component.copy(to_copy, {
|
||||
'parent_template': (lambda d:
|
||||
old2new[d['parent_template']]),
|
||||
})
|
||||
return new_templates
|
||||
|
||||
|
||||
class Product(metaclass=PoolMeta):
|
||||
__name__ = "product.product"
|
||||
@@ -78,6 +104,37 @@ class Product(metaclass=PoolMeta):
|
||||
quantities[kit.id] = kit.default_uom.floor(min(qties, default=0))
|
||||
return quantities
|
||||
|
||||
@classmethod
|
||||
def copy(cls, products, default=None):
|
||||
pool = Pool()
|
||||
Component = pool.get('product.component')
|
||||
if default is None:
|
||||
default = {}
|
||||
else:
|
||||
default = default.copy()
|
||||
|
||||
copy_components = 'components' not in default
|
||||
if 'template' in default:
|
||||
default.setdefault('components', None)
|
||||
new_products = super().copy(products, default)
|
||||
if 'template' in default and copy_components:
|
||||
template2new = {}
|
||||
product2new = {}
|
||||
to_copy = []
|
||||
for product, new_product in zip(products, new_products):
|
||||
if product.components:
|
||||
to_copy.extend(product.components)
|
||||
template2new[product.template.id] = new_product.template.id
|
||||
product2new[product.id] = new_product.id
|
||||
if to_copy:
|
||||
Component.copy(to_copy, {
|
||||
'parent_product': (lambda d:
|
||||
product2new[d['parent_product']]),
|
||||
'parent_template': (lambda d:
|
||||
template2new[d['parent_template']]),
|
||||
})
|
||||
return new_products
|
||||
|
||||
|
||||
class ComponentMixin(sequence_ordered(), ModelStorage):
|
||||
|
||||
|
||||
Reference in new issue
Block a user