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
+
+
+
+
+
+
+