[FIX] product: keep attribute on a variant with only one attribute

When adding informational attribute, with only one possible value, it used to be skipped.
Instead keep it and add it on every variant.

To avoid dropping and recreating product (and lose eventual customisations), the attributes with only one possible value are set on every product.
This makes sure that in following test, these are not considered in variants_inactive variable.

Fixes #3204
This commit is contained in:
Christophe Matthieu 2014-11-17 14:24:03 +01:00 committed by Martin Trigaux
parent f317fedc4b
commit d3c562d4e8
2 changed files with 19 additions and 7 deletions

View File

@ -650,14 +650,25 @@ class product_template(osv.osv):
for tmpl_id in tmpl_ids:
# list of values combination
variant_alone = []
all_variants = [[]]
for variant_id in tmpl_id.attribute_line_ids:
if len(variant_id.value_ids) > 1:
temp_variants = []
if len(variant_id.value_ids) == 1:
variant_alone.append(variant_id.value_ids[0])
temp_variants = []
for variant in all_variants:
for value_id in variant_id.value_ids:
for variant in all_variants:
temp_variants.append(variant + [int(value_id)])
all_variants = temp_variants
temp_variants.append(variant + [int(value_id)])
all_variants = temp_variants
# adding an attribute with only one value should not recreate product
# write this attribute on every product to make sure we don't lose them
for variant_id in variant_alone:
product_ids = []
for product_id in tmpl_id.product_variant_ids:
if variant_id.id not in map(int, product_id.attribute_value_ids):
product_ids.append(product_id.id)
product_obj.write(cr, uid, product_ids, {'attribute_value_ids': [(4, variant_id.id)]}, context=ctx)
# check product
variant_ids_to_active = []

View File

@ -126,9 +126,10 @@ class website_sale(http.Controller):
currency_id = self.get_pricelist().currency_id.id
for p in product.product_variant_ids:
price = currency_obj.compute(cr, uid, website_currency_id, currency_id, p.lst_price)
attribute_value_ids.append([p.id, map(int, p.attribute_value_ids), p.price, price])
attribute_value_ids.append([p.id, [v.id for v in p.attribute_value_ids if len(v.attribute_id.value_ids) > 1], p.price, price])
else:
attribute_value_ids = [[p.id, map(int, p.attribute_value_ids), p.price, p.lst_price] for p in product.product_variant_ids]
attribute_value_ids = [[p.id, [v.id for v in p.attribute_value_ids if len(v.attribute_id.value_ids) > 1], p.price, p.lst_price]
for p in product.product_variant_ids]
return attribute_value_ids