From d3c562d4e8c9696338777935d5f593cc7b8793db Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Mon, 17 Nov 2014 14:24:03 +0100 Subject: [PATCH] [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 --- addons/product/product.py | 21 ++++++++++++++++----- addons/website_sale/controllers/main.py | 5 +++-- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/addons/product/product.py b/addons/product/product.py index 7a2bb678544..10dae7bb253 100644 --- a/addons/product/product.py +++ b/addons/product/product.py @@ -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 = [] diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index 9c06a0e4aa6..17f788c8ff4 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -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