80 lines
2.8 KiB
Python
80 lines
2.8 KiB
Python
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
# this repository contains the full copyright notices and license terms.
|
|
from trytond.model import fields
|
|
from trytond.pool import Pool, PoolMeta
|
|
from trytond.pyson import Eval
|
|
|
|
|
|
class Template(metaclass=PoolMeta):
|
|
__name__ = 'product.template'
|
|
locations = fields.One2Many('stock.product.location', 'template',
|
|
"Default Locations",
|
|
states={
|
|
'invisible': ~Eval('type').in_(['goods', 'assets']),
|
|
})
|
|
|
|
@classmethod
|
|
def copy(cls, templates, default=None):
|
|
pool = Pool()
|
|
ProductLocation = pool.get('stock.product.location')
|
|
if default is None:
|
|
default = {}
|
|
else:
|
|
default = default.copy()
|
|
|
|
copy_locations = 'locations' not in default
|
|
default.setdefault('locations', None)
|
|
new_templates = super().copy(templates, default)
|
|
if copy_locations:
|
|
old2new = {}
|
|
to_copy = []
|
|
for template, new_template in zip(templates, new_templates):
|
|
to_copy.extend(l for l in template.locations if not l.product)
|
|
old2new[template.id] = new_template.id
|
|
if to_copy:
|
|
ProductLocation.copy(to_copy, {
|
|
'template': lambda d: old2new[d['template']],
|
|
})
|
|
return new_templates
|
|
|
|
|
|
class Product(metaclass=PoolMeta):
|
|
__name__ = 'product.product'
|
|
locations = fields.One2Many('stock.product.location', 'product',
|
|
"Default Locations",
|
|
domain=[
|
|
('template', '=', Eval('template', -1)),
|
|
],
|
|
states={
|
|
'invisible': ~Eval('type').in_(['goods', 'assets']),
|
|
})
|
|
|
|
@classmethod
|
|
def copy(cls, products, default=None):
|
|
pool = Pool()
|
|
ProductLocation = pool.get('stock.product.location')
|
|
if default is None:
|
|
default = {}
|
|
else:
|
|
default = default.copy()
|
|
|
|
copy_locations = 'locations' not in default
|
|
if 'template' in default:
|
|
default.setdefault('locations', None)
|
|
new_products = super().copy(products, default)
|
|
if 'template' in default and copy_locations:
|
|
template2new = {}
|
|
product2new = {}
|
|
to_copy = []
|
|
for product, new_product in zip(products, new_products):
|
|
if product.locations:
|
|
to_copy.extend(product.locations)
|
|
template2new[product.template.id] = new_product.template.id
|
|
product2new[product.id] = new_product.id
|
|
if to_copy:
|
|
ProductLocation.copy(to_copy, {
|
|
'product': lambda d: product2new[d['product']],
|
|
'template': lambda d: template2new[d['template']],
|
|
})
|
|
return new_products
|