From 4117c9c3ed26cfb84df3458b43844e0e7ba1af6e Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Tue, 8 Jul 2014 09:12:17 +0200 Subject: [PATCH] [FIX] product: add menu item to attributes and attribute values. Adding constraint to prevent deleting attributes with references to products. --- addons/product/product.py | 18 ++++++---- addons/product/product_view.xml | 51 ++++++++++++++++++++++++++++- addons/website_sale/views/views.xml | 10 ++++++ 3 files changed, 72 insertions(+), 7 deletions(-) diff --git a/addons/product/product.py b/addons/product/product.py index 3d4d2350d1a..f0a207a8064 100644 --- a/addons/product/product.py +++ b/addons/product/product.py @@ -364,7 +364,7 @@ class product_attribute_value(osv.osv): _columns = { 'sequence': fields.integer('Sequence', help="Determine the display order"), 'name': fields.char('Value', translate=True, required=True), - 'attribute_id': fields.many2one('product.attribute', 'Attribute', required=True), + 'attribute_id': fields.many2one('product.attribute', 'Attribute', required=True, ondelete='cascade'), 'product_ids': fields.many2many('product.product', id1='att_id', id2='prod_id', string='Variants', readonly=True), 'price_extra': fields.function(_get_price_extra, type='float', string='Attribute Price Extra', fnct_inv=_set_price_extra, @@ -378,20 +378,26 @@ class product_attribute_value(osv.osv): _defaults = { 'price_extra': 0.0, } + def unlink(self, cr, uid, ids, context=None): + ctx = dict(context or {}, active_test=False) + product_ids = self.pool['product.product'].search(cr, uid, [('attribute_value_ids', 'in', ids)], context=ctx) + if product_ids: + raise osv.except_osv(_('Integrity Error!'), _('The operation cannot be completed:\nYou trying to delete an attribute value with a reference on a product variant.')) + return super(product_attribute_value, self).unlink(cr, uid, ids, context=context) class product_attribute_price(osv.osv): _name = "product.attribute.price" _columns = { - 'product_tmpl_id': fields.many2one('product.template', 'Product Template', required=True), - 'value_id': fields.many2one('product.attribute.value', 'Product Attribute Value', required=True), + 'product_tmpl_id': fields.many2one('product.template', 'Product Template', required=True, ondelete='cascade'), + 'value_id': fields.many2one('product.attribute.value', 'Product Attribute Value', required=True, ondelete='cascade'), 'price_extra': fields.float('Price Extra', digits_compute=dp.get_precision('Product Price')), } class product_attribute_line(osv.osv): _name = "product.attribute.line" _columns = { - 'product_tmpl_id': fields.many2one('product.template', 'Product Template', required=True), - 'attribute_id': fields.many2one('product.attribute', 'Attribute', required=True), + 'product_tmpl_id': fields.many2one('product.template', 'Product Template', required=True, ondelete='cascade'), + 'attribute_id': fields.many2one('product.attribute', 'Attribute', required=True, ondelete='restrict'), 'value_ids': fields.many2many('product.attribute.value', id1='line_id', id2='val_id', string='Product Attribute Value'), } @@ -898,7 +904,7 @@ class product_product(osv.osv): 'product.template': (_get_name_template_ids, ['name'], 10), 'product.product': (lambda self, cr, uid, ids, c=None: ids, [], 10), }, select=True), - 'attribute_value_ids': fields.many2many('product.attribute.value', id1='prod_id', id2='att_id', string='Attributes', readonly=True), + 'attribute_value_ids': fields.many2many('product.attribute.value', id1='prod_id', id2='att_id', string='Attributes', readonly=True, ondelete='restrict'), # image: all image fields are base64 encoded and PIL-supported 'image_variant': fields.binary("Variant Image", diff --git a/addons/product/product_view.xml b/addons/product/product_view.xml index 963bdd0eea0..2e72d1aebf0 100644 --- a/addons/product/product_view.xml +++ b/addons/product/product_view.xml @@ -193,6 +193,7 @@ variants.template.tree product.attribute.value + @@ -214,7 +215,7 @@ - + product.product.search @@ -385,6 +386,54 @@ + + product.attribute.tree + product.attribute + + + + + + + + + Attributes + ir.actions.act_window + product.attribute + tree + form + + + + + + product.attribute.value.tree + product.attribute.value + + + + + + + + + + + Attribute Values + ir.actions.act_window + product.attribute.value + tree + form + + + + + + Product Variants ir.actions.act_window diff --git a/addons/website_sale/views/views.xml b/addons/website_sale/views/views.xml index fcc42502035..9971097a061 100644 --- a/addons/website_sale/views/views.xml +++ b/addons/website_sale/views/views.xml @@ -45,6 +45,16 @@ + + variants.template.tree + product.attribute.value + + + + + + +