From c15be7dac5220ce8da0b16246d43cc9eed3e4f51 Mon Sep 17 00:00:00 2001 From: "Kay K. Cross" Date: Fri, 18 Oct 2024 11:20:53 +0200 Subject: [PATCH] [IMP] mrp_bom_version: pre-commit stuff --- mrp_bom_version/__init__.py | 7 +- mrp_bom_version/__openerp__.py | 9 +- mrp_bom_version/data/mrp_bom_data.xml | 4 +- mrp_bom_version/models/__init__.py | 1 - mrp_bom_version/models/mrp_bom.py | 200 +++++++++--------- mrp_bom_version/models/res_config.py | 32 +-- .../security/mrp_bom_version_security.xml | 2 +- mrp_bom_version/tests/__init__.py | 1 - mrp_bom_version/tests/test_mrp_bom_version.py | 87 ++++---- mrp_bom_version/views/mrp_bom_view.xml | 143 +++++++++---- mrp_bom_version/views/res_config_view.xml | 10 +- setup/mrp_bom_version/odoo_addons/__init__.py | 1 + .../odoo_addons/mrp_bom_version | 1 + setup/mrp_bom_version/setup.py | 6 + 14 files changed, 283 insertions(+), 221 deletions(-) create mode 100644 setup/mrp_bom_version/odoo_addons/__init__.py create mode 120000 setup/mrp_bom_version/odoo_addons/mrp_bom_version create mode 100644 setup/mrp_bom_version/setup.py diff --git a/mrp_bom_version/__init__.py b/mrp_bom_version/__init__.py index f2dc1b552..8a46a7873 100644 --- a/mrp_bom_version/__init__.py +++ b/mrp_bom_version/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # (c) 2015 Oihane Crucelaegui - AvanzOSC # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html @@ -7,6 +6,8 @@ from . import models def set_active_bom_active_state(cr, registry): """Set those active BoMs to state 'active'""" - cr.execute("""UPDATE mrp_bom + cr.execute( + """UPDATE mrp_bom SET state = 'active' - WHERE active = True""") + WHERE active = True""" + ) diff --git a/mrp_bom_version/__openerp__.py b/mrp_bom_version/__openerp__.py index 00f1fd1dd..215a21d88 100644 --- a/mrp_bom_version/__openerp__.py +++ b/mrp_bom_version/__openerp__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # (c) 2015 Alfredo de la Fuente - AvanzOSC # (c) 2015 Oihane Crucelaegui - AvanzOSC # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html @@ -9,10 +8,10 @@ "version": "8.0.1.0.0", "license": "AGPL-3", "author": "OdooMRP team," - "AvanzOSC," - "Serv. Tecnol. Avanzados - Pedro M. Baeza, " - "Odoo Community Association (OCA)", - "website": "http://www.odoomrp.com", + "AvanzOSC," + "Serv. Tecnol. Avanzados - Pedro M. Baeza, " + "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/manufacture", "contributors": [ "Pedro M. Baeza ", "Ana Juaristi ", diff --git a/mrp_bom_version/data/mrp_bom_data.xml b/mrp_bom_version/data/mrp_bom_data.xml index 2fe6424ca..eddf44b40 100644 --- a/mrp_bom_version/data/mrp_bom_data.xml +++ b/mrp_bom_version/data/mrp_bom_data.xml @@ -1,10 +1,10 @@ - + MRP BoM Active mrp.bom - + MRP BoM Active diff --git a/mrp_bom_version/models/__init__.py b/mrp_bom_version/models/__init__.py index fa22f90a6..8ec9ccdfe 100644 --- a/mrp_bom_version/models/__init__.py +++ b/mrp_bom_version/models/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # (c) 2015 Oihane Crucelaegui - AvanzOSC # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html diff --git a/mrp_bom_version/models/mrp_bom.py b/mrp_bom_version/models/mrp_bom.py index 839aee4be..7b79e14e1 100644 --- a/mrp_bom_version/models/mrp_bom.py +++ b/mrp_bom_version/models/mrp_bom.py @@ -1,25 +1,24 @@ -# -*- coding: utf-8 -*- # (c) 2015 Oihane Crucelaegui - AvanzOSC # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html -from openerp import models, fields, api +from openerp import api, fields, models from openerp.tools import config class MrpBom(models.Model): - _inherit = 'mrp.bom' + _inherit = "mrp.bom" _track = { - 'state': { - 'mrp_bom_version.mt_active': lambda self, cr, uid, obj, - ctx=None: obj.state == 'active', + "state": { + "mrp_bom_version.mt_active": lambda self, cr, uid, obj, ctx=None: obj.state + == "active", }, } @api.one def _get_old_versions(self): parent = self.parent_bom - old_version = self.env['mrp.bom'] + old_version = self.env["mrp.bom"] while parent: old_version += parent parent = parent.parent_bom @@ -28,78 +27,74 @@ class MrpBom(models.Model): def _default_active(self): """Needed for preserving normal flow when testing other modules.""" res = False - if config['test_enable']: - res = not bool(self.env.context.get('test_mrp_bom_version')) + if config["test_enable"]: + res = not bool(self.env.context.get("test_mrp_bom_version")) return res def _default_state(self): """Needed for preserving normal flow when testing other modules.""" - res = 'draft' - if (config['test_enable'] and - not self.env.context.get('test_mrp_bom_version')): - res = 'active' + res = "draft" + if config["test_enable"] and not self.env.context.get("test_mrp_bom_version"): + res = "active" return res active = fields.Boolean( - default=_default_active, - readonly=True, states={'draft': [('readonly', False)]}) - historical_date = fields.Date(string='Historical Date', readonly=True) + default=_default_active, readonly=True, states={"draft": [("readonly", False)]} + ) + historical_date = fields.Date(string="Historical Date", readonly=True) state = fields.Selection( - selection=[('draft', 'Draft'), ('active', 'Active'), - ('historical', 'Historical')], string='State', - index=True, readonly=True, default=_default_state, copy=False) + selection=[ + ("draft", "Draft"), + ("active", "Active"), + ("historical", "Historical"), + ], + string="State", + index=True, + readonly=True, + default=_default_state, + copy=False, + ) product_tmpl_id = fields.Many2one( - readonly=True, states={'draft': [('readonly', False)]}) - product_id = fields.Many2one( - readonly=True, states={'draft': [('readonly', False)]}) - product_qty = fields.Float( - readonly=True, states={'draft': [('readonly', False)]}) - name = fields.Char( - states={'historical': [('readonly', True)]}) - code = fields.Char( - states={'historical': [('readonly', True)]}) - type = fields.Selection( - states={'historical': [('readonly', True)]}) - company_id = fields.Many2one( - states={'historical': [('readonly', True)]}) - product_uom = fields.Many2one( - states={'historical': [('readonly', True)]}) - routing_id = fields.Many2one( - readonly=True, states={'draft': [('readonly', False)]}) + readonly=True, states={"draft": [("readonly", False)]} + ) + product_id = fields.Many2one(readonly=True, states={"draft": [("readonly", False)]}) + product_qty = fields.Float(readonly=True, states={"draft": [("readonly", False)]}) + name = fields.Char(states={"historical": [("readonly", True)]}) + code = fields.Char(states={"historical": [("readonly", True)]}) + type = fields.Selection(states={"historical": [("readonly", True)]}) + company_id = fields.Many2one(states={"historical": [("readonly", True)]}) + product_uom = fields.Many2one(states={"historical": [("readonly", True)]}) + routing_id = fields.Many2one(readonly=True, states={"draft": [("readonly", False)]}) bom_line_ids = fields.One2many( - readonly=True, states={'draft': [('readonly', False)]}) - position = fields.Char( - states={'historical': [('readonly', True)]}) - date_start = fields.Date( - states={'historical': [('readonly', True)]}) - date_stop = fields.Date( - states={'historical': [('readonly', True)]}) - property_ids = fields.Many2many( - states={'historical': [('readonly', True)]}) - product_rounding = fields.Float( - states={'historical': [('readonly', True)]}) - product_efficiency = fields.Float( - states={'historical': [('readonly', True)]}) - message_follower_ids = fields.Many2many( - states={'historical': [('readonly', True)]}) - message_ids = fields.One2many( - states={'historical': [('readonly', True)]}) - version = fields.Integer(states={'historical': [('readonly', True)]}, - copy=False, default=1) + readonly=True, states={"draft": [("readonly", False)]} + ) + position = fields.Char(states={"historical": [("readonly", True)]}) + date_start = fields.Date(states={"historical": [("readonly", True)]}) + date_stop = fields.Date(states={"historical": [("readonly", True)]}) + property_ids = fields.Many2many(states={"historical": [("readonly", True)]}) + product_rounding = fields.Float(states={"historical": [("readonly", True)]}) + product_efficiency = fields.Float(states={"historical": [("readonly", True)]}) + message_follower_ids = fields.Many2many(states={"historical": [("readonly", True)]}) + message_ids = fields.One2many(states={"historical": [("readonly", True)]}) + version = fields.Integer( + states={"historical": [("readonly", True)]}, copy=False, default=1 + ) parent_bom = fields.Many2one( - comodel_name='mrp.bom', string='Parent BoM', copy=False) + comodel_name="mrp.bom", string="Parent BoM", copy=False + ) old_versions = fields.Many2many( - comodel_name='mrp.bom', string='Old Versions', - compute='_get_old_versions') + comodel_name="mrp.bom", string="Old Versions", compute="_get_old_versions" + ) @api.multi def button_draft(self): - active_draft = self.env['mrp.config.settings']._get_parameter( - 'active.draft') - self.write({ - 'active': active_draft and active_draft.value or False, - 'state': 'draft', - }) + active_draft = self.env["mrp.config.settings"]._get_parameter("active.draft") + self.write( + { + "active": active_draft and active_draft.value or False, + "state": "draft", + } + ) @api.multi def button_new_version(self): @@ -107,63 +102,72 @@ class MrpBom(models.Model): new_bom = self._copy_bom() self.button_historical() return { - 'type': 'ir.actions.act_window', - 'view_type': 'form, tree', - 'view_mode': 'form', - 'res_model': 'mrp.bom', - 'res_id': new_bom.id, - 'target': 'current', + "type": "ir.actions.act_window", + "view_type": "form, tree", + "view_mode": "form", + "res_model": "mrp.bom", + "res_id": new_bom.id, + "target": "current", } def _copy_bom(self): - active_draft = self.env['mrp.config.settings']._get_parameter( - 'active.draft') - new_bom = self.copy({ - 'version': self.version + 1, - 'active': active_draft and active_draft.value or False, - 'parent_bom': self.id, - }) + active_draft = self.env["mrp.config.settings"]._get_parameter("active.draft") + new_bom = self.copy( + { + "version": self.version + 1, + "active": active_draft and active_draft.value or False, + "parent_bom": self.id, + } + ) return new_bom @api.multi def button_activate(self): - self.write({ - 'active': True, - 'state': 'active' - }) + self.write({"active": True, "state": "active"}) @api.multi def button_historical(self): - self.write({ - 'active': False, - 'state': 'historical', - 'historical_date': fields.Date.today() - }) + self.write( + { + "active": False, + "state": "historical", + "historical_date": fields.Date.today(), + } + ) - def search(self, cr, uid, args, offset=0, limit=None, order=None, - context=None, count=False): + def search( + self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False + ): """Add search argument for field type if the context says so. This should be in old API because context argument is not the last one. """ if context is None: context = {} - search_state = context.get('state', False) + search_state = context.get("state", False) if search_state: - args += [('state', '=', search_state)] + args += [("state", "=", search_state)] return super(MrpBom, self).search( - cr, uid, args, offset=offset, limit=limit, order=order, - context=context, count=count) + cr, + uid, + args, + offset=offset, + limit=limit, + order=order, + context=context, + count=count, + ) @api.model - def _bom_find( - self, product_tmpl_id=None, product_id=None, properties=None): - """ Finds BoM for particular product and product uom. + def _bom_find(self, product_tmpl_id=None, product_id=None, properties=None): + """Finds BoM for particular product and product uom. @param product_tmpl_id: Selected product. @param product_uom: Unit of measure of a product. @param properties: List of related properties. @return: False or BoM id. """ - bom_id = super(MrpBom, self.with_context(state='active'))._bom_find( - product_tmpl_id=product_tmpl_id, product_id=product_id, - properties=properties) + bom_id = super(MrpBom, self.with_context(state="active"))._bom_find( + product_tmpl_id=product_tmpl_id, + product_id=product_id, + properties=properties, + ) return bom_id diff --git a/mrp_bom_version/models/res_config.py b/mrp_bom_version/models/res_config.py index 67cd714d4..46eb8c7db 100644 --- a/mrp_bom_version/models/res_config.py +++ b/mrp_bom_version/models/res_config.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # (c) 2015 Oihane Crucelaegui - AvanzOSC # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html @@ -6,24 +5,26 @@ from openerp import api, fields, models class MrpConfigSettings(models.TransientModel): - _inherit = 'mrp.config.settings' + _inherit = "mrp.config.settings" group_mrp_bom_version = fields.Boolean( - string='Allow to re-edit BoMs', - implied_group='mrp_bom_version.group_mrp_bom_version', - help='The active state may be passed back to state draft') + string="Allow to re-edit BoMs", + implied_group="mrp_bom_version.group_mrp_bom_version", + help="The active state may be passed back to state draft", + ) active_draft = fields.Boolean( - string='Keep re-editing BoM active', - help='This will allow you to define if those BoM passed back to draft' - ' are still activated or not') + string="Keep re-editing BoM active", + help="This will allow you to define if those BoM passed back to draft" + " are still activated or not", + ) def _get_parameter(self, key, default=False): - param_obj = self.env['ir.config_parameter'] - rec = param_obj.search([('key', '=', key)]) + param_obj = self.env["ir.config_parameter"] + rec = param_obj.search([("key", "=", key)]) return rec or default def _write_or_create_param(self, key, value): - param_obj = self.env['ir.config_parameter'] + param_obj = self.env["ir.config_parameter"] rec = self._get_parameter(key) if rec: if not value: @@ -31,17 +32,18 @@ class MrpConfigSettings(models.TransientModel): else: rec.value = value elif value: - param_obj.create({'key': key, 'value': value}) + param_obj.create({"key": key, "value": value}) @api.multi def get_default_parameters(self): - def get_value(key, default=''): + def get_value(key, default=""): rec = self._get_parameter(key) return rec and rec.value or default + return { - 'active_draft': get_value('active.draft', False), + "active_draft": get_value("active.draft", False), } @api.multi def set_parameters(self): - self._write_or_create_param('active.draft', self.active_draft) + self._write_or_create_param("active.draft", self.active_draft) diff --git a/mrp_bom_version/security/mrp_bom_version_security.xml b/mrp_bom_version/security/mrp_bom_version_security.xml index a0ea08559..3c3c675ea 100644 --- a/mrp_bom_version/security/mrp_bom_version_security.xml +++ b/mrp_bom_version/security/mrp_bom_version_security.xml @@ -1,4 +1,4 @@ - + diff --git a/mrp_bom_version/tests/__init__.py b/mrp_bom_version/tests/__init__.py index 12e4e76f0..2e0619a72 100644 --- a/mrp_bom_version/tests/__init__.py +++ b/mrp_bom_version/tests/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # (c) 2015 Oihane Crucelaegui - AvanzOSC # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html diff --git a/mrp_bom_version/tests/test_mrp_bom_version.py b/mrp_bom_version/tests/test_mrp_bom_version.py index 6a9dd4d1c..c75313f4e 100644 --- a/mrp_bom_version/tests/test_mrp_bom_version.py +++ b/mrp_bom_version/tests/test_mrp_bom_version.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # (c) 2015 Alfredo de la Fuente - AvanzOSC # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html @@ -6,78 +5,78 @@ import openerp.tests.common as common class TestMrpBomVersion(common.TransactionCase): - def setUp(self): super(TestMrpBomVersion, self).setUp() - self.parameter_model = self.env['ir.config_parameter'] - self.bom_model = self.env['mrp.bom'].with_context( - test_mrp_bom_version=True) - self.company = self.env.ref('base.main_company') + self.parameter_model = self.env["ir.config_parameter"] + self.bom_model = self.env["mrp.bom"].with_context(test_mrp_bom_version=True) + self.company = self.env.ref("base.main_company") vals = { - 'company_id': self.company.id, - 'product_tmpl_id': - self.env.ref('product.product_product_11_product_template').id, - 'bom_line_ids': - [(0, 0, {'product_id': - self.env.ref('product.product_product_5').id}), - (0, 0, {'product_id': - self.env.ref('product.product_product_6').id})], + "company_id": self.company.id, + "product_tmpl_id": self.env.ref( + "product.product_product_11_product_template" + ).id, + "bom_line_ids": [ + (0, 0, {"product_id": self.env.ref("product.product_product_5").id}), + (0, 0, {"product_id": self.env.ref("product.product_product_6").id}), + ], } self.mrp_bom = self.bom_model.create(vals) def test_mrp_bom(self): self.assertEqual( - self.mrp_bom.state, 'draft', "New BoM must be in state 'draft'") - self.assertEqual( - self.mrp_bom.version, 1, 'Incorrect version for new BoM') - self.assertFalse( - self.mrp_bom.active, 'New BoMs must be created inactive') + self.mrp_bom.state, "draft", "New BoM must be in state 'draft'" + ) + self.assertEqual(self.mrp_bom.version, 1, "Incorrect version for new BoM") + self.assertFalse(self.mrp_bom.active, "New BoMs must be created inactive") self.mrp_bom.button_activate() - self.assertTrue( - self.mrp_bom.active, 'Incorrect activation, check must be True') + self.assertTrue(self.mrp_bom.active, "Incorrect activation, check must be True") self.assertEqual( - self.mrp_bom.state, 'active', - "Incorrect state, it should be 'active'") + self.mrp_bom.state, "active", "Incorrect state, it should be 'active'" + ) self.mrp_bom.button_historical() self.assertFalse( - self.mrp_bom.active, 'Check must be False, after historification') + self.mrp_bom.active, "Check must be False, after historification" + ) self.assertEqual( - self.mrp_bom.state, 'historical', - "Incorrect state, it should be 'historical'") + self.mrp_bom.state, + "historical", + "Incorrect state, it should be 'historical'", + ) def test_mrp_bom_back2draft_default(self): self.mrp_bom.button_activate() self.mrp_bom.button_draft() - self.assertFalse( - self.mrp_bom.active, 'Check must be False') + self.assertFalse(self.mrp_bom.active, "Check must be False") def test_mrp_bom_back2draft_active(self): - self.parameter_model.create({'key': 'active.draft', 'value': True}) + self.parameter_model.create({"key": "active.draft", "value": True}) self.mrp_bom.button_activate() self.mrp_bom.button_draft() - self.assertTrue( - self.mrp_bom.active, 'Check must be True, as set in parameters') + self.assertTrue(self.mrp_bom.active, "Check must be True, as set in parameters") def test_mrp_bom_versioning(self): self.mrp_bom.button_activate() self.mrp_bom.button_new_version() self.assertFalse( - self.mrp_bom.active, - 'Check must be False, it must have been historified') + self.mrp_bom.active, "Check must be False, it must have been historified" + ) self.assertEqual( - self.mrp_bom.state, 'historical', - 'Incorrect state, it must have been historified') - new_boms = self.bom_model.search( - [('parent_bom', '=', self.mrp_bom.id)]) + self.mrp_bom.state, + "historical", + "Incorrect state, it must have been historified", + ) + new_boms = self.bom_model.search([("parent_bom", "=", self.mrp_bom.id)]) for new_bom in new_boms: self.assertEqual( - new_bom.version, self.mrp_bom.version + 1, - 'New BoM version must be +1 from origin BoM version') + new_bom.version, + self.mrp_bom.version + 1, + "New BoM version must be +1 from origin BoM version", + ) self.assertEqual( new_bom.active, - self.parameter_model.search( - [('key', '=', 'active.draft')]).value, - 'It does not match active draft check state set in company') + self.parameter_model.search([("key", "=", "active.draft")]).value, + "It does not match active draft check state set in company", + ) self.assertEqual( - new_bom.state, 'draft', - "New version must be created in 'draft' state") + new_bom.state, "draft", "New version must be created in 'draft' state" + ) diff --git a/mrp_bom_version/views/mrp_bom_view.xml b/mrp_bom_version/views/mrp_bom_view.xml index e96b51c9b..e14bf5ebf 100644 --- a/mrp_bom_version/views/mrp_bom_view.xml +++ b/mrp_bom_version/views/mrp_bom_view.xml @@ -1,4 +1,4 @@ - + @@ -10,9 +10,9 @@ mrp.bom - - - + + + @@ -20,29 +20,45 @@ mrp.bom.version.tree mrp.bom - + - -