From 20873d4ecb6d3e52df575f7b61a1551f6b344478 Mon Sep 17 00:00:00 2001 From: Sandip Mangukiya Date: Wed, 9 Aug 2017 19:44:21 +0530 Subject: [PATCH 01/10] [MIG] migrate default_val feature for product attribute to v10.0, product_configurator_default_val --- product_configurator_default_val/README.md | 36 ++++++++++++++++++ product_configurator_default_val/__init__.py | 8 ++++ .../__manifest__.py | 23 +++++++++++ .../models/__init__.py | 9 +++++ .../models/product.py | 33 ++++++++++++++++ .../models/product_attribute.py | 32 ++++++++++++++++ .../models/product_config.py | 31 +++++++++++++++ .../static/description/icon.png | Bin 0 -> 9725 bytes .../views/product_view.xml | 20 ++++++++++ 9 files changed, 192 insertions(+) create mode 100644 product_configurator_default_val/README.md create mode 100755 product_configurator_default_val/__init__.py create mode 100755 product_configurator_default_val/__manifest__.py create mode 100755 product_configurator_default_val/models/__init__.py create mode 100644 product_configurator_default_val/models/product.py create mode 100644 product_configurator_default_val/models/product_attribute.py create mode 100644 product_configurator_default_val/models/product_config.py create mode 100644 product_configurator_default_val/static/description/icon.png create mode 100644 product_configurator_default_val/views/product_view.xml diff --git a/product_configurator_default_val/README.md b/product_configurator_default_val/README.md new file mode 100644 index 00000000..93e83a34 --- /dev/null +++ b/product_configurator_default_val/README.md @@ -0,0 +1,36 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +================================== +Product Configurator Default Value +================================== + +This module provides the scope to allow default value for attribute line. + +Installation +============ + +* No specific installation step required. + +Configuration +============= + +* No specific configuration step required. + +Usage +===== + +To use this module + +* Go to Product Templates> Attributes. + +Credits +======= + +* Sandip Mangukiya + +Contributors +------------ + +* Ursa Information Systems diff --git a/product_configurator_default_val/__init__.py b/product_configurator_default_val/__init__.py new file mode 100755 index 00000000..dad7b151 --- /dev/null +++ b/product_configurator_default_val/__init__.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2012 - TODAY, Ursa Information Systems +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import ( + models, +# wizard, +) diff --git a/product_configurator_default_val/__manifest__.py b/product_configurator_default_val/__manifest__.py new file mode 100755 index 00000000..176a8daf --- /dev/null +++ b/product_configurator_default_val/__manifest__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2012 - TODAY, Ursa Information Systems +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Product Configurator Default Value", + "summary": "To allow default value for attribute line", + "version": "10.0.1.0.0", + "license": "AGPL-3", + "author": "Ursa Information Systems", + "category": "Sales", + "maintainer": "Ursa Information Systems", + "website": "http://www.ursainfosystems.com", + "depends": [ + "product_configurator", + ], + "qweb": [ + ], + "data": [ + "views/product_view.xml", + ], + "application": False, +} diff --git a/product_configurator_default_val/models/__init__.py b/product_configurator_default_val/models/__init__.py new file mode 100755 index 00000000..6f33640e --- /dev/null +++ b/product_configurator_default_val/models/__init__.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2012 - TODAY, Ursa Information Systems +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import ( + product_config, + product_attribute, + product +) diff --git a/product_configurator_default_val/models/product.py b/product_configurator_default_val/models/product.py new file mode 100644 index 00000000..9a099401 --- /dev/null +++ b/product_configurator_default_val/models/product.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2012 - TODAY, Ursa Information Systems +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo.exceptions import ValidationError +from odoo import models, fields, api, tools, _ + + +class ProductTemplate(models.Model): + _inherit = 'product.template' + + @api.multi + @api.constrains('attribute_line_ids') + def _check_default_values(self): + """Validate default values set on the product template""" + default_val_ids = self.attribute_line_ids.filtered( + lambda l: l.default_val).mapped('default_val').ids + + # TODO: Remove if cond when PR with raise error on github is merged + if not self.validate_configuration(default_val_ids, final=False): + raise ValidationError( + _('Default values provided generate an invalid configuration') + ) + + @api.multi + @api.constrains('config_line_ids') + def _check_default_value_domains(self): + try: + self._check_default_values() + except ValidationError: + raise ValidationError( + _('Restrictions added make the current default values ' + 'generate an invalid configuration') + ) diff --git a/product_configurator_default_val/models/product_attribute.py b/product_configurator_default_val/models/product_attribute.py new file mode 100644 index 00000000..c7b92d90 --- /dev/null +++ b/product_configurator_default_val/models/product_attribute.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2012 - TODAY, Ursa Information Systems +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, fields, api, _ +from odoo.exceptions import ValidationError + + +class ProductAttributeLine(models.Model): + _inherit = 'product.attribute.line' + + @api.onchange('value_ids') + def onchange_values(self): + if self.default_val and self.default_val not in self.value_ids: + self.default_val = None + + default_val = fields.Many2one( + comodel_name='product.attribute.value', + string='Default Value' + ) + + @api.multi + @api.constrains('value_ids', 'default_val') + def _check_default_values(self): + for line in self.filtered(lambda l: l.default_val): + if line.default_val not in line.value_ids: + raise ValidationError( + _("Default values for each attribute line must exist in " + "the attribute values (%s: %s)" % ( + line.attribute_id.name, line.default_val.name) + ) + ) diff --git a/product_configurator_default_val/models/product_config.py b/product_configurator_default_val/models/product_config.py new file mode 100644 index 00000000..b6f319e5 --- /dev/null +++ b/product_configurator_default_val/models/product_config.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2012 - TODAY, Ursa Information Systems +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, fields, api, _ +from odoo.exceptions import ValidationError + + +class ProductConfigSession(models.Model): + _inherit = 'product.config.session' + + @api.model + def create(self, vals): + product_tmpl = self.env['product.template'].browse( + vals.get('product_tmpl_id')).exists() + if product_tmpl: + default_val_ids = product_tmpl.attribute_line_ids.filtered( + lambda l: l.default_val).mapped('default_val').ids + value_ids = vals.get('value_ids') + if value_ids: + default_val_ids += value_ids[0][2] + valid_conf = product_tmpl.validate_configuration( + default_val_ids, final=False) + # TODO: Remove if cond when PR with raise error on github is merged + if not valid_conf: + raise ValidationError( + _('Default values provided generate an invalid ' + 'configuration') + ) + vals.update({'value_ids': [(6, 0, default_val_ids)]}) + return super(ProductConfigSession, self).create(vals) diff --git a/product_configurator_default_val/static/description/icon.png b/product_configurator_default_val/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..601dab3d7b234de82fa5d36cf98c8d684e3f37ff GIT binary patch literal 9725 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 literal 0 HcmV?d00001 diff --git a/product_configurator_default_val/views/product_view.xml b/product_configurator_default_val/views/product_view.xml new file mode 100644 index 00000000..662afc41 --- /dev/null +++ b/product_configurator_default_val/views/product_view.xml @@ -0,0 +1,20 @@ + + + + + product.configurator.product.template.form + product.template + + + + + + + + + + From 5c779ff6f872811c17a929caefb712a4042a7d2e Mon Sep 17 00:00:00 2001 From: Sandip Mangukiya Date: Thu, 10 Aug 2017 10:41:32 +0530 Subject: [PATCH 02/10] [CODE FORMATTING] --- product_configurator_default_val/__init__.py | 1 - .../views/product_view.xml | 18 ++++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/product_configurator_default_val/__init__.py b/product_configurator_default_val/__init__.py index dad7b151..75492fa5 100755 --- a/product_configurator_default_val/__init__.py +++ b/product_configurator_default_val/__init__.py @@ -4,5 +4,4 @@ from . import ( models, -# wizard, ) diff --git a/product_configurator_default_val/views/product_view.xml b/product_configurator_default_val/views/product_view.xml index 662afc41..3af5045f 100644 --- a/product_configurator_default_val/views/product_view.xml +++ b/product_configurator_default_val/views/product_view.xml @@ -1,20 +1,22 @@ - + product.configurator.product.template.form product.template - + - + + domain="[('id', 'in', value_ids and value_ids[0][2])]" + context="{'show_attribute': False}" + options="{'no_create': True, 'no_create_edit': True}" + invisible="not context.get('default_config_ok', False)"/> - + From a2eaab01dfa72f42e372a8703aede353c1fdfa94 Mon Sep 17 00:00:00 2001 From: Maxime Chambreuil Date: Thu, 10 Aug 2017 09:26:35 -0500 Subject: [PATCH 03/10] [FIX] PEP8 Errors [IMP] Documentation and attribution --- .../{README.md => README.rst} | 21 ++++++++----------- .../models/product.py | 2 +- .../models/product_attribute.py | 3 +-- .../models/product_config.py | 2 +- 4 files changed, 12 insertions(+), 16 deletions(-) rename product_configurator_default_val/{README.md => README.rst} (55%) diff --git a/product_configurator_default_val/README.md b/product_configurator_default_val/README.rst similarity index 55% rename from product_configurator_default_val/README.md rename to product_configurator_default_val/README.rst index 93e83a34..b1e62994 100644 --- a/product_configurator_default_val/README.md +++ b/product_configurator_default_val/README.rst @@ -8,26 +8,23 @@ Product Configurator Default Value This module provides the scope to allow default value for attribute line. -Installation -============ - -* No specific installation step required. - -Configuration -============= - -* No specific configuration step required. - Usage ===== -To use this module +To use this module: -* Go to Product Templates> Attributes. +* Go to Sales > Configurable Products > Configurable Templates +* Create or Select a configurable template +* In the Variants tab, enter the attribute and its values +* Enter a default attribute value +* Save the configurable template +* Run the configuration wizard in the back or on the website +* The default attribute value is selected by default Credits ======= +* Paul Catinean * Sandip Mangukiya Contributors diff --git a/product_configurator_default_val/models/product.py b/product_configurator_default_val/models/product.py index 9a099401..f9be29a1 100644 --- a/product_configurator_default_val/models/product.py +++ b/product_configurator_default_val/models/product.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # Copyright (C) 2012 - TODAY, Ursa Information Systems # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import api, models, _ from odoo.exceptions import ValidationError -from odoo import models, fields, api, tools, _ class ProductTemplate(models.Model): diff --git a/product_configurator_default_val/models/product_attribute.py b/product_configurator_default_val/models/product_attribute.py index c7b92d90..f6645cb6 100644 --- a/product_configurator_default_val/models/product_attribute.py +++ b/product_configurator_default_val/models/product_attribute.py @@ -1,8 +1,7 @@ # -*- coding: utf-8 -*- # Copyright (C) 2012 - TODAY, Ursa Information Systems # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from odoo import models, fields, api, _ +from odoo import api, fields, models, _ from odoo.exceptions import ValidationError diff --git a/product_configurator_default_val/models/product_config.py b/product_configurator_default_val/models/product_config.py index b6f319e5..8af7e7bb 100644 --- a/product_configurator_default_val/models/product_config.py +++ b/product_configurator_default_val/models/product_config.py @@ -2,7 +2,7 @@ # Copyright (C) 2012 - TODAY, Ursa Information Systems # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import models, fields, api, _ +from odoo import api, models, _ from odoo.exceptions import ValidationError From fc1463c9183207b259fcd9b753fd211828f16163 Mon Sep 17 00:00:00 2001 From: Sandip Mangukiya Date: Tue, 29 Aug 2017 23:57:33 +0530 Subject: [PATCH 04/10] [ADD]13383: product_configurator_refactor module has been added --- product_configurator_refactor/README.rst | 27 +++++++++ product_configurator_refactor/__init__.py | 7 +++ product_configurator_refactor/__manifest__.py | 26 +++++++++ .../models/__init__.py | 8 +++ .../models/product_attribute.py | 21 +++++++ .../models/product_attribute_value_line.py | 34 +++++++++++ .../security/ir.model.access.csv | 2 + .../static/description/icon.png | Bin 0 -> 9725 bytes .../product_attribute_value_line_view.xml | 39 +++++++++++++ .../views/product_attribute_views.xml | 17 ++++++ .../views/product_view.xml | 53 ++++++++++++++++++ 11 files changed, 234 insertions(+) create mode 100644 product_configurator_refactor/README.rst create mode 100755 product_configurator_refactor/__init__.py create mode 100755 product_configurator_refactor/__manifest__.py create mode 100755 product_configurator_refactor/models/__init__.py create mode 100644 product_configurator_refactor/models/product_attribute.py create mode 100644 product_configurator_refactor/models/product_attribute_value_line.py create mode 100644 product_configurator_refactor/security/ir.model.access.csv create mode 100644 product_configurator_refactor/static/description/icon.png create mode 100644 product_configurator_refactor/views/product_attribute_value_line_view.xml create mode 100644 product_configurator_refactor/views/product_attribute_views.xml create mode 100644 product_configurator_refactor/views/product_view.xml diff --git a/product_configurator_refactor/README.rst b/product_configurator_refactor/README.rst new file mode 100644 index 00000000..cb192fc7 --- /dev/null +++ b/product_configurator_refactor/README.rst @@ -0,0 +1,27 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +============================= +Product Configurator Refactor +============================= + +This module refactors product configurator module. + +Usage +===== + +To use this module: + +* Go to Sales > Configurable Products + +Credits +======= + +* Paul Catinean +* Sandip Mangukiya + +Contributors +------------ + +* Ursa Information Systems diff --git a/product_configurator_refactor/__init__.py b/product_configurator_refactor/__init__.py new file mode 100755 index 00000000..75492fa5 --- /dev/null +++ b/product_configurator_refactor/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2012 - TODAY, Ursa Information Systems +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import ( + models, +) diff --git a/product_configurator_refactor/__manifest__.py b/product_configurator_refactor/__manifest__.py new file mode 100755 index 00000000..7c4d0ba9 --- /dev/null +++ b/product_configurator_refactor/__manifest__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2012 - TODAY, Ursa Information Systems +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Product Configurator Refactor", + "summary": "To refactor product configurator", + "version": "10.0.1.0.0", + "license": "AGPL-3", + "author": "Ursa Information Systems", + "category": "Sales", + "maintainer": "Ursa Information Systems", + "website": "http://www.ursainfosystems.com", + "depends": [ + "product_configurator_default_val" + ], + "qweb": [ + ], + "data": [ + "security/ir.model.access.csv", + "views/product_attribute_value_line_view.xml", + "views/product_attribute_views.xml", + "views/product_view.xml", + ], + "application": True, +} diff --git a/product_configurator_refactor/models/__init__.py b/product_configurator_refactor/models/__init__.py new file mode 100755 index 00000000..c15351bb --- /dev/null +++ b/product_configurator_refactor/models/__init__.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2012 - TODAY, Ursa Information Systems +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import ( + product_attribute_value_line, + product_attribute, +) diff --git a/product_configurator_refactor/models/product_attribute.py b/product_configurator_refactor/models/product_attribute.py new file mode 100644 index 00000000..5c5102ce --- /dev/null +++ b/product_configurator_refactor/models/product_attribute.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2012 - TODAY, Ursa Information Systems +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import api, fields, models, _ + + +class ProductAttributeLine(models.Model): + _inherit = 'product.attribute.line' + + @api.multi + def _get_attribute_values(self): + for line in self: + attribute_value_ids = [] + for new_value in line.value_idss: + attrib_value_id = new_value.attrib_value_id and new_value.attrib_value_id.id or False + if attrib_value_id: + attribute_value_ids.append(attrib_value_id) + line.value_ids = [(6,0,attribute_value_ids)] + + value_idss = fields.One2many('product.attribute.value.line', 'attribute_line_id', 'Values', copy=True) + value_ids = fields.Many2many(compute='_get_attribute_values', comodel_name='product.attribute.value', string='Attribute Values') diff --git a/product_configurator_refactor/models/product_attribute_value_line.py b/product_configurator_refactor/models/product_attribute_value_line.py new file mode 100644 index 00000000..938ff34f --- /dev/null +++ b/product_configurator_refactor/models/product_attribute_value_line.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2012 - TODAY, Ursa Information Systems +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError + + +class ProductAttributeValueLine(models.Model): + _name = 'product.attribute.value.line' + + related_attribute_id = fields.Many2one(related='attribute_line_id.attribute_id', string='Product Attribute') + attribute_line_id = fields.Many2one('product.attribute.line', 'Product Attribute') + attrib_value_id = fields.Many2one('product.attribute.value', 'Attribute Value') + is_default = fields.Boolean("Is Default") + + @api.onchange('is_default') + def onchange_values(self): + if self.is_default: + #Check if its checked earlier or not + if not self._origin.attribute_line_id.default_val: + self._origin.attribute_line_id.write({'default_val':self._origin.attrib_value_id.id}) + else: + title = ("Warning for Attribute %s") % self._origin.attribute_line_id.attribute_id.name + message = ("Attribute Value %s is already set!") % self._origin.attribute_line_id.default_val.name + warning = { + 'title': title, + 'message': message, + } + self.update({'is_default': False}) + return {'warning': warning} + else: + #Check if its checked earlier or not + if self._origin.attribute_line_id.default_val: + self._origin.attribute_line_id.write({'default_val':False}) diff --git a/product_configurator_refactor/security/ir.model.access.csv b/product_configurator_refactor/security/ir.model.access.csv new file mode 100644 index 00000000..2bf3676f --- /dev/null +++ b/product_configurator_refactor/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +product_configurator_refactor,Attribute Value Line,model_product_attribute_value_line,product_configurator.group_product_configurator,1,1,1,1 diff --git a/product_configurator_refactor/static/description/icon.png b/product_configurator_refactor/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..601dab3d7b234de82fa5d36cf98c8d684e3f37ff GIT binary patch literal 9725 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 literal 0 HcmV?d00001 diff --git a/product_configurator_refactor/views/product_attribute_value_line_view.xml b/product_configurator_refactor/views/product_attribute_value_line_view.xml new file mode 100644 index 00000000..9f1bd516 --- /dev/null +++ b/product_configurator_refactor/views/product_attribute_value_line_view.xml @@ -0,0 +1,39 @@ + + + + + + product.attribute.value.line.form + product.attribute.value.line + +
+ + + + + + + + + + + + +
+
+
+ + + product.attribute.value.line.tree + product.attribute.value.line + +
+ + + + + +
+
+
+
\ No newline at end of file diff --git a/product_configurator_refactor/views/product_attribute_views.xml b/product_configurator_refactor/views/product_attribute_views.xml new file mode 100644 index 00000000..68c5c949 --- /dev/null +++ b/product_configurator_refactor/views/product_attribute_views.xml @@ -0,0 +1,17 @@ + + + + + product.attribute.line.form + product.attribute.line + + primary + + + + + + + + + \ No newline at end of file diff --git a/product_configurator_refactor/views/product_view.xml b/product_configurator_refactor/views/product_view.xml new file mode 100644 index 00000000..d8d25598 --- /dev/null +++ b/product_configurator_refactor/views/product_view.xml @@ -0,0 +1,53 @@ + + + + + product.configurator.product.template.form.refactor + product.template + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+

+ Warning: adding or deleting attributes + will delete and recreate existing variants and lead + to the loss of their possible customizations. +

+
+
+
+
+ +
From aa0695568f6bc0e525767a5d81d05ebbc46f0935 Mon Sep 17 00:00:00 2001 From: Sandip Mangukiya Date: Wed, 30 Aug 2017 00:13:25 +0530 Subject: [PATCH 05/10] [CODE FORMATTING] --- product_configurator_refactor/README.rst | 2 +- product_configurator_refactor/__manifest__.py | 2 +- .../models/product_attribute.py | 11 ++-- .../models/product_attribute_value_line.py | 28 +++++---- .../product_attribute_value_line_view.xml | 3 +- .../views/product_attribute_views.xml | 6 +- .../views/product_view.xml | 61 ++++++++++++------- 7 files changed, 71 insertions(+), 42 deletions(-) diff --git a/product_configurator_refactor/README.rst b/product_configurator_refactor/README.rst index cb192fc7..84605c45 100644 --- a/product_configurator_refactor/README.rst +++ b/product_configurator_refactor/README.rst @@ -1,5 +1,5 @@ .. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html +:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 ============================= diff --git a/product_configurator_refactor/__manifest__.py b/product_configurator_refactor/__manifest__.py index 7c4d0ba9..19147a66 100755 --- a/product_configurator_refactor/__manifest__.py +++ b/product_configurator_refactor/__manifest__.py @@ -22,5 +22,5 @@ "views/product_attribute_views.xml", "views/product_view.xml", ], - "application": True, + "application": False, } diff --git a/product_configurator_refactor/models/product_attribute.py b/product_configurator_refactor/models/product_attribute.py index 5c5102ce..59bfb72b 100644 --- a/product_configurator_refactor/models/product_attribute.py +++ b/product_configurator_refactor/models/product_attribute.py @@ -6,7 +6,7 @@ class ProductAttributeLine(models.Model): _inherit = 'product.attribute.line' - + @api.multi def _get_attribute_values(self): for line in self: @@ -15,7 +15,10 @@ def _get_attribute_values(self): attrib_value_id = new_value.attrib_value_id and new_value.attrib_value_id.id or False if attrib_value_id: attribute_value_ids.append(attrib_value_id) - line.value_ids = [(6,0,attribute_value_ids)] + line.value_ids = [(6, 0, attribute_value_ids)] - value_idss = fields.One2many('product.attribute.value.line', 'attribute_line_id', 'Values', copy=True) - value_ids = fields.Many2many(compute='_get_attribute_values', comodel_name='product.attribute.value', string='Attribute Values') + value_idss = fields.One2many('product.attribute.value.line', + 'attribute_line_id', 'Values', copy=True) + value_ids = fields.Many2many(compute='_get_attribute_values', + comodel_name='product.attribute.value', + string='Attribute Values') diff --git a/product_configurator_refactor/models/product_attribute_value_line.py b/product_configurator_refactor/models/product_attribute_value_line.py index 938ff34f..dddccd0f 100644 --- a/product_configurator_refactor/models/product_attribute_value_line.py +++ b/product_configurator_refactor/models/product_attribute_value_line.py @@ -8,27 +8,33 @@ class ProductAttributeValueLine(models.Model): _name = 'product.attribute.value.line' - related_attribute_id = fields.Many2one(related='attribute_line_id.attribute_id', string='Product Attribute') - attribute_line_id = fields.Many2one('product.attribute.line', 'Product Attribute') - attrib_value_id = fields.Many2one('product.attribute.value', 'Attribute Value') + related_attribute_id = fields.Many2one( + related='attribute_line_id.attribute_id', string='Product Attribute') + attribute_line_id = fields.Many2one('product.attribute.line', + 'Product Attribute') + attrib_value_id = fields.Many2one('product.attribute.value', + 'Attribute Value') is_default = fields.Boolean("Is Default") @api.onchange('is_default') def onchange_values(self): if self.is_default: - #Check if its checked earlier or not + # Check if its checked earlier or not if not self._origin.attribute_line_id.default_val: - self._origin.attribute_line_id.write({'default_val':self._origin.attrib_value_id.id}) + self._origin.attribute_line_id.write( + {'default_val': self._origin.attrib_value_id.id}) else: - title = ("Warning for Attribute %s") % self._origin.attribute_line_id.attribute_id.name - message = ("Attribute Value %s is already set!") % self._origin.attribute_line_id.default_val.name + title = ( + "Warning for Attribute %s") % self._origin.attribute_line_id.attribute_id.name + message = ( + "Attribute Value %s is already set!") % self._origin.attribute_line_id.default_val.name warning = { - 'title': title, - 'message': message, + 'title': title, + 'message': message, } self.update({'is_default': False}) return {'warning': warning} else: - #Check if its checked earlier or not + # Check if its checked earlier or not if self._origin.attribute_line_id.default_val: - self._origin.attribute_line_id.write({'default_val':False}) + self._origin.attribute_line_id.write({'default_val': False}) diff --git a/product_configurator_refactor/views/product_attribute_value_line_view.xml b/product_configurator_refactor/views/product_attribute_value_line_view.xml index 9f1bd516..26ebc2af 100644 --- a/product_configurator_refactor/views/product_attribute_value_line_view.xml +++ b/product_configurator_refactor/views/product_attribute_value_line_view.xml @@ -12,7 +12,8 @@ - + diff --git a/product_configurator_refactor/views/product_attribute_views.xml b/product_configurator_refactor/views/product_attribute_views.xml index 68c5c949..097b5b44 100644 --- a/product_configurator_refactor/views/product_attribute_views.xml +++ b/product_configurator_refactor/views/product_attribute_views.xml @@ -8,9 +8,9 @@ primary - - - + + + diff --git a/product_configurator_refactor/views/product_view.xml b/product_configurator_refactor/views/product_view.xml index d8d25598..45fe746e 100644 --- a/product_configurator_refactor/views/product_view.xml +++ b/product_configurator_refactor/views/product_view.xml @@ -2,17 +2,26 @@ - product.configurator.product.template.form.refactor + + product.configurator.product.template.form.refactor + product.template - + - - + + - + @@ -21,26 +30,36 @@ - - - - - - - + + + + + + + - - - - - - - - + + + + + + + + -

+

Warning: adding or deleting attributes will delete and recreate existing variants and lead to the loss of their possible customizations. From 6475fe56f30e8c4606b54eda561cd6145e11fb21 Mon Sep 17 00:00:00 2001 From: Sandip Mangukiya Date: Wed, 30 Aug 2017 15:18:33 +0530 Subject: [PATCH 06/10] [IMP]13383: set default value option in more improved way and value_ids calculations improved --- .../models/product_attribute.py | 26 ++++++++++++++----- .../models/product_attribute_value_line.py | 23 ---------------- 2 files changed, 20 insertions(+), 29 deletions(-) diff --git a/product_configurator_refactor/models/product_attribute.py b/product_configurator_refactor/models/product_attribute.py index 59bfb72b..1483d58b 100644 --- a/product_configurator_refactor/models/product_attribute.py +++ b/product_configurator_refactor/models/product_attribute.py @@ -2,6 +2,7 @@ # Copyright (C) 2012 - TODAY, Ursa Information Systems # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError class ProductAttributeLine(models.Model): @@ -10,15 +11,28 @@ class ProductAttributeLine(models.Model): @api.multi def _get_attribute_values(self): for line in self: - attribute_value_ids = [] - for new_value in line.value_idss: - attrib_value_id = new_value.attrib_value_id and new_value.attrib_value_id.id or False - if attrib_value_id: - attribute_value_ids.append(attrib_value_id) - line.value_ids = [(6, 0, attribute_value_ids)] + attribute_value_ids = line.value_idss.mapped('attrib_value_id') + if attribute_value_ids: + line.value_ids = [(6, 0, attribute_value_ids.ids)] value_idss = fields.One2many('product.attribute.value.line', 'attribute_line_id', 'Values', copy=True) value_ids = fields.Many2many(compute='_get_attribute_values', comodel_name='product.attribute.value', string='Attribute Values') + default_val = fields.Many2one('product.attribute.value',compute='_is_default_value', + string="Default Value", store=True) + + @api.one + @api.depends('value_idss.is_default') + def _is_default_value(self): + default_lines = [default for default in self.value_idss.mapped('is_default') if default] + if default_lines: + if len(default_lines)==1: + for value in self.value_idss: + if value.is_default: + self.default_val = value.attrib_value_id + else: + raise ValidationError(_("Please select one, first selected option will be valid!")) + else: + self.default_val = False diff --git a/product_configurator_refactor/models/product_attribute_value_line.py b/product_configurator_refactor/models/product_attribute_value_line.py index dddccd0f..8eac9fae 100644 --- a/product_configurator_refactor/models/product_attribute_value_line.py +++ b/product_configurator_refactor/models/product_attribute_value_line.py @@ -15,26 +15,3 @@ class ProductAttributeValueLine(models.Model): attrib_value_id = fields.Many2one('product.attribute.value', 'Attribute Value') is_default = fields.Boolean("Is Default") - - @api.onchange('is_default') - def onchange_values(self): - if self.is_default: - # Check if its checked earlier or not - if not self._origin.attribute_line_id.default_val: - self._origin.attribute_line_id.write( - {'default_val': self._origin.attrib_value_id.id}) - else: - title = ( - "Warning for Attribute %s") % self._origin.attribute_line_id.attribute_id.name - message = ( - "Attribute Value %s is already set!") % self._origin.attribute_line_id.default_val.name - warning = { - 'title': title, - 'message': message, - } - self.update({'is_default': False}) - return {'warning': warning} - else: - # Check if its checked earlier or not - if self._origin.attribute_line_id.default_val: - self._origin.attribute_line_id.write({'default_val': False}) From 10d6a598c25f431385d8ff64e6c8679e817eec7a Mon Sep 17 00:00:00 2001 From: Sandip Mangukiya Date: Wed, 30 Aug 2017 15:21:31 +0530 Subject: [PATCH 07/10] [CODE FORMATTING] --- .../models/product_attribute.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/product_configurator_refactor/models/product_attribute.py b/product_configurator_refactor/models/product_attribute.py index 1483d58b..41dce336 100644 --- a/product_configurator_refactor/models/product_attribute.py +++ b/product_configurator_refactor/models/product_attribute.py @@ -20,19 +20,22 @@ def _get_attribute_values(self): value_ids = fields.Many2many(compute='_get_attribute_values', comodel_name='product.attribute.value', string='Attribute Values') - default_val = fields.Many2one('product.attribute.value',compute='_is_default_value', - string="Default Value", store=True) + default_val = fields.Many2one('product.attribute.value', + compute='_is_default_value', + string="Default Value", store=True) @api.one @api.depends('value_idss.is_default') def _is_default_value(self): - default_lines = [default for default in self.value_idss.mapped('is_default') if default] + default_lines = [default for default in + self.value_idss.mapped('is_default') if default] if default_lines: - if len(default_lines)==1: + if len(default_lines) == 1: for value in self.value_idss: if value.is_default: self.default_val = value.attrib_value_id else: - raise ValidationError(_("Please select one, first selected option will be valid!")) + raise ValidationError(_( + "Please select one, first selected option will be valid!")) else: self.default_val = False From 06a57c911dbc7031beb0427fec6840379653efec Mon Sep 17 00:00:00 2001 From: Maxime Chambreuil Date: Wed, 30 Aug 2017 09:12:29 -0500 Subject: [PATCH 08/10] [IMP] Formatting and documentation --- product_configurator_refactor/README.rst | 4 +++- .../views/product_attribute_value_line_view.xml | 5 +++-- .../views/product_attribute_views.xml | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/product_configurator_refactor/README.rst b/product_configurator_refactor/README.rst index 84605c45..1e81cdc9 100644 --- a/product_configurator_refactor/README.rst +++ b/product_configurator_refactor/README.rst @@ -6,7 +6,9 @@ Product Configurator Refactor ============================= -This module refactors product configurator module. +This module refactors the product configurator module to add the +product.attribute.value.line object to store additional fields specific to the +product-attribute-value. Usage ===== diff --git a/product_configurator_refactor/views/product_attribute_value_line_view.xml b/product_configurator_refactor/views/product_attribute_value_line_view.xml index 26ebc2af..1d764c74 100644 --- a/product_configurator_refactor/views/product_attribute_value_line_view.xml +++ b/product_configurator_refactor/views/product_attribute_value_line_view.xml @@ -1,7 +1,7 @@ - + product.attribute.value.line.form product.attribute.value.line @@ -37,4 +37,5 @@ - \ No newline at end of file + + diff --git a/product_configurator_refactor/views/product_attribute_views.xml b/product_configurator_refactor/views/product_attribute_views.xml index 097b5b44..16062308 100644 --- a/product_configurator_refactor/views/product_attribute_views.xml +++ b/product_configurator_refactor/views/product_attribute_views.xml @@ -14,4 +14,4 @@ - \ No newline at end of file + From 25a458d7c4c07e9bf3b126adb761c9c6c68f0e48 Mon Sep 17 00:00:00 2001 From: Sandip Mangukiya Date: Wed, 30 Aug 2017 20:02:10 +0530 Subject: [PATCH 09/10] [FIX]13383: on new attribute value creation load attribute, resolve on save default value validation --- product_configurator_refactor/models/product_attribute.py | 5 +++++ product_configurator_refactor/views/product_view.xml | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/product_configurator_refactor/models/product_attribute.py b/product_configurator_refactor/models/product_attribute.py index 41dce336..098f824c 100644 --- a/product_configurator_refactor/models/product_attribute.py +++ b/product_configurator_refactor/models/product_attribute.py @@ -39,3 +39,8 @@ def _is_default_value(self): "Please select one, first selected option will be valid!")) else: self.default_val = False + + @api.multi + @api.constrains('value_ids', 'default_val') + def _check_default_values(self): + return True diff --git a/product_configurator_refactor/views/product_view.xml b/product_configurator_refactor/views/product_view.xml index 45fe746e..6e34da9a 100644 --- a/product_configurator_refactor/views/product_view.xml +++ b/product_configurator_refactor/views/product_view.xml @@ -53,7 +53,8 @@ + domain="[('attribute_id','=',related_attribute_id)]" + context="{'default_attribute_id': related_attribute_id}"/> From 6af3a8f3d72c7ad8567391ee0efb7e22e2cc7eb3 Mon Sep 17 00:00:00 2001 From: Sandip Mangukiya Date: Wed, 30 Aug 2017 20:04:14 +0530 Subject: [PATCH 10/10] [FIX]13383: remove api.one --- product_configurator_refactor/models/product_attribute.py | 1 - 1 file changed, 1 deletion(-) diff --git a/product_configurator_refactor/models/product_attribute.py b/product_configurator_refactor/models/product_attribute.py index 098f824c..126bf59e 100644 --- a/product_configurator_refactor/models/product_attribute.py +++ b/product_configurator_refactor/models/product_attribute.py @@ -24,7 +24,6 @@ def _get_attribute_values(self): compute='_is_default_value', string="Default Value", store=True) - @api.one @api.depends('value_idss.is_default') def _is_default_value(self): default_lines = [default for default in