This commit is contained in:
ivan deng
2017-12-27 22:19:31 +08:00
parent 1e40975584
commit 5a5e767008
2 changed files with 28 additions and 18 deletions

View File

@@ -25,21 +25,27 @@ class ProductProduct(models.Model):
# todo: 检查数据,要保证数据唯一性 # todo: 检查数据,要保证数据唯一性
# 为免报错,不限制唯一性 # 为免报错,不限制唯一性
# _sql_constraints = [ _sql_constraints = [
# ('uniq_default_code', ('uniq_default_code',
# 'unique(default_code)', 'unique(default_code)',
# 'The reference must be unique'), 'The reference must be unique'),
# ] ]
@api.model @api.model
def create(self, vals): def create(self, vals):
# todo: but 先建空白产品后编辑2个以上变体序号会少个 -1 # todo: but 先建空白产品后编辑2个以上变体序号会少个 -1
# code_index: 当没有变体现时值为0有变体时为该变体序号 # code_index: 当没有变体现时值为0有变体时为该变体序号
code_index = 0
if 'default_code' not in vals or vals['default_code'] == _('New'): if 'default_code' not in vals or vals['default_code'] == _('New'):
code_index = 0
if 'product_tmpl_id' in vals: if 'product_tmpl_id' in vals:
# 按产品模板创建产品,有多种情况 # 按产品模板创建产品,有多种情况
template = self.env['product.template'].search([('id', '=', vals['product_tmpl_id'])], limit=1) template = self.env['product.template'].search([('id', '=', vals['product_tmpl_id'])], limit=1)
if template.default_code and template.default_code != '':
code_stored = template.default_code
else:
code_stored = template.default_code_stored
if not code_stored:
code_stored = ''
mylen = len(template.product_variant_ids) mylen = len(template.product_variant_ids)
try: try:
attr = vals['attribute_value_ids'][0][2] attr = vals['attribute_value_ids'][0][2]
@@ -52,12 +58,12 @@ class ProductProduct(models.Model):
# 没有属性值则是单规格产品。attribute_value_ids格式为[6,0,[]]。多规格时attribute_value_ids格式为[6,0,[x]] # 没有属性值则是单规格产品。attribute_value_ids格式为[6,0,[]]。多规格时attribute_value_ids格式为[6,0,[x]]
code_index = 0 code_index = 0
vals['default_code_index'] = code_index vals['default_code_index'] = code_index
vals['default_code'] = template.default_code_stored vals['default_code'] = code_stored
elif mylen == 0: elif mylen == 0:
# 有属性值了,自己是第一个规格 # 有属性值了,自己是第一个规格
code_index = 1 code_index = 1
vals['default_code_index'] = code_index vals['default_code_index'] = code_index
vals['default_code'] = template.default_code_stored + '-%03d'%(code_index) vals['default_code'] = code_stored + '-%03d'%(code_index)
elif mylen == 1: elif mylen == 1:
# 已存在1个当存在的1个有属性时要改已存在的product值 # 已存在1个当存在的1个有属性时要改已存在的product值
code_index = template.product_variant_ids[:1].default_code_index code_index = template.product_variant_ids[:1].default_code_index
@@ -65,24 +71,24 @@ class ProductProduct(models.Model):
if code_index == 0: if code_index == 0:
code_index = 1 code_index = 1
template.product_variant_ids[:1].default_code_index = code_index template.product_variant_ids[:1].default_code_index = code_index
template.product_variant_ids[:1].default_code = template.default_code_stored + '-%03d'%(code_index) template.product_variant_ids[:1].default_code = code_stored + '-%03d'%(code_index)
# 接着改当前操作的product值 # 接着改当前操作的product值
code_index = code_index + 1 code_index = code_index + 1
vals['default_code_index'] = code_index vals['default_code_index'] = code_index
vals['default_code'] = template.default_code_stored + '-%03d'%(code_index) vals['default_code'] = code_stored + '-%03d'%(code_index)
elif mylen > 1: elif mylen > 1:
# 找到最大的序号 # 找到最大的序号
variant_max = max(template.product_variant_ids,key=lambda x: x['default_code_index']) variant_max = max(template.product_variant_ids,key=lambda x: x['default_code_index'])
code_index = variant_max['default_code_index'] + 1 code_index = variant_max['default_code_index'] + 1
vals['default_code_index'] = code_index vals['default_code_index'] = code_index
vals['default_code'] = template.default_code_stored + '-%03d'%(code_index) vals['default_code'] = code_stored + '-%03d'%(code_index)
else: else:
# 当按模板 # 当按模板
# 此条件常规不出现,但特殊项目会有 # 此条件常规不出现,但特殊项目会有
variant_max = max(template.product_variant_ids,key=lambda x: x['default_code_index']) variant_max = max(template.product_variant_ids,key=lambda x: x['default_code_index'])
code_index = variant_max['default_code_index'] + 1 code_index = variant_max['default_code_index'] + 1
vals['default_code_index'] = code_index vals['default_code_index'] = code_index
vals['default_code'] = template.default_code_stored + '-%03d'%(code_index) vals['default_code'] = code_stored + '-%03d'%(code_index)
else: else:
# create from product_product # create from product_product
# 默认使用制造成品的编码 # 默认使用制造成品的编码

View File

@@ -33,7 +33,8 @@ class ProductTemplate(models.Model):
inverse='_set_default_code', inverse='_set_default_code',
store=True, default=lambda self: _('New'), copy=False) store=True, default=lambda self: _('New'), copy=False)
# 因为default_code有odoo的处理方式影响面大故会将其另存到 default_code_stored # 因为default_code有odoo的处理方式影响面大故会将其另存到 default_code_stored
default_code_stored = fields.Char('Internal Reference Stored',default='New') default_code_stored = fields.Char('Internal Reference Stored',
default=lambda self: _('New'))
@api.model @api.model
def create(self, vals): def create(self, vals):
@@ -41,22 +42,25 @@ class ProductTemplate(models.Model):
if len(vals['attribute_line_ids'])>0: if len(vals['attribute_line_ids'])>0:
raise exceptions.ValidationError(_('Please save product first before adding varients!')) raise exceptions.ValidationError(_('Please save product first before adding varients!'))
if not (self.env.context.get('create_product_product')): if 'default_code' not in vals or vals['default_code'] == _('New'):
# 当从产品模板界面建立时(如果从产品界面建立,则已经生成了编码,不需要再处理)
if 'default_code' not in vals or vals['default_code'] == _('New'):
sequence = self.env['product.internal.type'].search([('id', '=', vals['internal_type'])], limit=1) sequence = self.env['product.internal.type'].search([('id', '=', vals['internal_type'])], limit=1)
if not sequence: if not sequence:
sequence = self.env.ref('app_product_type_sequence.internal_type_mrp_product', raise_if_not_found=False) sequence = self.env.ref('app_product_type_sequence.internal_type_mrp_product', raise_if_not_found=False)
vals['default_code'] = sequence.link_sequence.next_by_id() vals['default_code'] = sequence.link_sequence.next_by_id()
vals['default_code_stored'] = vals['default_code'] else:
pass
if 'default_code' in vals and vals['default_code']:
vals['default_code_stored'] = vals['default_code']
return super(ProductTemplate, self).create(vals) return super(ProductTemplate, self).create(vals)
@api.depends('product_variant_ids', 'product_variant_ids.default_code') @api.depends('product_variant_ids', 'product_variant_ids.default_code')
def _compute_default_code(self): def _compute_default_code(self):
unique_variants = self.filtered(lambda template: len(template.product_variant_ids) == 1) unique_variants = self.filtered(lambda template: len(template.product_variant_ids) == 1)
# 设置default_code
for template in unique_variants: for template in unique_variants:
template.default_code = template.product_variant_ids.default_code template.default_code = template.product_variant_ids.default_code
template.default_code_store = template.default_code
for template in (self): for template in (self):
if len(template.product_variant_ids)>1: if len(template.product_variant_ids)>1:
template.default_code = '' template.default_code = ''