diff --git a/mrp_workcenter_hierarchical/README.rst b/mrp_workcenter_hierarchical/README.rst index 7a360a134..2f038a10d 100644 --- a/mrp_workcenter_hierarchical/README.rst +++ b/mrp_workcenter_hierarchical/README.rst @@ -7,7 +7,7 @@ MRP Workcenter Hierarchical !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:1cd00ed22c8deb2a6216302ed170d2ebbcbc2664f42823cdb80953015bc57772 + !! source digest: sha256:22cb1398c6641db8541bb53d56ebaec41fea1e8fe3efc39e9786cb19e6e4be01 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -29,7 +29,6 @@ MRP Workcenter Hierarchical |badge1| |badge2| |badge3| |badge4| |badge5| Allow to define a parent workcenter to a workcenter -On workcenter list view, you can group by Parent level and see all workcenters belonging to a same group or subgroup depending on the level you choose to group. **Table of contents** @@ -49,8 +48,21 @@ Usage * Go to Manufacturing > Configuration > Work Centers * Set parent field on workcenters + * Go to Manufacturing > Configuration > Settings + * Set the parent level empty configuration if needed. + + Without setting this parameter, the parent levels are always set, never mind the depth + of the parent workcenters. The last parent level will contain the last parent and + the top parent workcenter, will appear it self in its parent level. + The idea is to be able to see group of workcenters : + ../static/src/img/img1.png + With the parameter, the parent levels will be empty if the depth of the parent is + to small. (ie : a workcenter with 1 parent and 1 great parent will have parent level 1 and 2 set, but parent level 3 will be empty) + + ../static/src/img/img2.png + Bug Tracker =========== @@ -76,7 +88,7 @@ Akretion: * David BEAL * Sébastien BEAU -* Florian da Costa +* Thibault REY Maintainers ~~~~~~~~~~~ diff --git a/mrp_workcenter_hierarchical/__manifest__.py b/mrp_workcenter_hierarchical/__manifest__.py index 1e3d1a94f..4aaf0d8d0 100644 --- a/mrp_workcenter_hierarchical/__manifest__.py +++ b/mrp_workcenter_hierarchical/__manifest__.py @@ -4,7 +4,7 @@ { "name": "MRP Workcenter Hierarchical", - "version": "16.0.1.0.1", + "version": "16.0.1.0.0", "author": "Akretion,Odoo Community Association (OCA)", "summary": "Organise Workcenters by section", "category": "Manufacturing", @@ -17,6 +17,7 @@ "security/ir.model.access.csv", "views/workcenter_view.xml", "wizards/switch_workcenter.xml", + "wizards/res_config_settings_views.xml", ], "demo": [ "data/mrp_demo.xml", diff --git a/mrp_workcenter_hierarchical/models/__init__.py b/mrp_workcenter_hierarchical/models/__init__.py index 567663b3b..8b5645051 100644 --- a/mrp_workcenter_hierarchical/models/__init__.py +++ b/mrp_workcenter_hierarchical/models/__init__.py @@ -1 +1,2 @@ from . import mrp_workcenter +from . import res_company diff --git a/mrp_workcenter_hierarchical/models/mrp_workcenter.py b/mrp_workcenter_hierarchical/models/mrp_workcenter.py index 39c9cd733..7aa625931 100644 --- a/mrp_workcenter_hierarchical/models/mrp_workcenter.py +++ b/mrp_workcenter_hierarchical/models/mrp_workcenter.py @@ -45,33 +45,36 @@ class MrpWorkcenter(models.Model): ids = [] return ids - @api.depends("parent_id.parent_id.parent_id.parent_id", "child_ids") + @api.depends( + "parent_id.parent_id.parent_id", + "child_ids", + "company_id.workcenter_parent_level_empty", + ) def _compute_parent_level(self): - def get_next_level(parent_ids, workcenter): - return ( + def get_next_level(parent_ids, workcenter, exclude_ids): + has_parent = bool(parent_ids) + parent_level_id = ( parent_ids and parent_ids.pop(0) or (workcenter.child_ids and workcenter.id or workcenter.parent_id.id) ) + if exclude_ids and not has_parent: + exclude_ids.append(workcenter.parent_id.id) + return parent_level_id not in exclude_ids and parent_level_id or False for workcenter in self: parent_ids = workcenter._get_parent_ids() - exclude_ids = [workcenter.id, workcenter.parent_id.id] - l_id = [False, False, False] + if workcenter.company_id.workcenter_parent_level_empty: + exclude_ids = [workcenter.id] + else: + exclude_ids = [] - l_id[0] = get_next_level(parent_ids, workcenter) - workcenter.parent_level_1_id = ( - l_id[0] if l_id[0] not in exclude_ids else False + workcenter.parent_level_1_id = get_next_level( + parent_ids, workcenter, exclude_ids ) - exclude_ids.append(l_id[0]) - - l_id[1] = get_next_level(parent_ids, workcenter) - workcenter.parent_level_2_id = ( - l_id[1] if l_id[1] not in exclude_ids else False + workcenter.parent_level_2_id = get_next_level( + parent_ids, workcenter, exclude_ids ) - exclude_ids.append(l_id[1]) - - l_id[2] = get_next_level(parent_ids, workcenter) - workcenter.parent_level_3_id = ( - l_id[2] if l_id[2] not in exclude_ids else False + workcenter.parent_level_3_id = get_next_level( + parent_ids, workcenter, exclude_ids ) diff --git a/mrp_workcenter_hierarchical/models/res_company.py b/mrp_workcenter_hierarchical/models/res_company.py new file mode 100644 index 000000000..212741ea9 --- /dev/null +++ b/mrp_workcenter_hierarchical/models/res_company.py @@ -0,0 +1,9 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + workcenter_parent_level_empty = fields.Boolean() diff --git a/mrp_workcenter_hierarchical/readme/CONTRIBUTORS.rst b/mrp_workcenter_hierarchical/readme/CONTRIBUTORS.rst index e74a49556..e42616dc2 100644 --- a/mrp_workcenter_hierarchical/readme/CONTRIBUTORS.rst +++ b/mrp_workcenter_hierarchical/readme/CONTRIBUTORS.rst @@ -2,4 +2,4 @@ Akretion: * David BEAL * Sébastien BEAU -* Florian da Costa +* Thibault REY diff --git a/mrp_workcenter_hierarchical/readme/DESCRIPTION.rst b/mrp_workcenter_hierarchical/readme/DESCRIPTION.rst index d06a1ec56..8dc1024b2 100644 --- a/mrp_workcenter_hierarchical/readme/DESCRIPTION.rst +++ b/mrp_workcenter_hierarchical/readme/DESCRIPTION.rst @@ -1,2 +1 @@ Allow to define a parent workcenter to a workcenter -On workcenter list view, you can group by Parent level and see all workcenters belonging to a same group or subgroup depending on the level you choose to group. diff --git a/mrp_workcenter_hierarchical/readme/USAGE.rst b/mrp_workcenter_hierarchical/readme/USAGE.rst index e475d34a2..9573d41cc 100644 --- a/mrp_workcenter_hierarchical/readme/USAGE.rst +++ b/mrp_workcenter_hierarchical/readme/USAGE.rst @@ -1,4 +1,17 @@ * Go to Manufacturing > Configuration > Work Centers * Set parent field on workcenters + * Go to Manufacturing > Configuration > Settings + * Set the parent level empty configuration if needed. + + Without setting this parameter, the parent levels are always set, never mind the depth + of the parent workcenters. The last parent level will contain the last parent and + the top parent workcenter, will appear it self in its parent level. + The idea is to be able to see group of workcenters : + ../static/src/img/img1.png + + With the parameter, the parent levels will be empty if the depth of the parent is + to small. (ie : a workcenter with 1 parent and 1 great parent will have parent level 1 and 2 set, but parent level 3 will be empty) + + ../static/src/img/img2.png diff --git a/mrp_workcenter_hierarchical/static/description/index.html b/mrp_workcenter_hierarchical/static/description/index.html index 3007a7585..12580d40a 100644 --- a/mrp_workcenter_hierarchical/static/description/index.html +++ b/mrp_workcenter_hierarchical/static/description/index.html @@ -367,11 +367,10 @@ ul.auto-toc { !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:1cd00ed22c8deb2a6216302ed170d2ebbcbc2664f42823cdb80953015bc57772 +!! source digest: sha256:22cb1398c6641db8541bb53d56ebaec41fea1e8fe3efc39e9786cb19e6e4be01 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/manufacture Translate me on Weblate Try me on Runboat

-

Allow to define a parent workcenter to a workcenter -On workcenter list view, you can group by Parent level and see all workcenters belonging to a same group or subgroup depending on the level you choose to group.

+

Allow to define a parent workcenter to a workcenter

Table of contents

    @@ -403,9 +402,19 @@ On workcenter list view, you can group by Parent level and see all workcenters b
    • Go to Manufacturing > Configuration > Work Centers
    • Set parent field on workcenters
    • +
    • Go to Manufacturing > Configuration > Settings
    • +
    • Set the parent level empty configuration if needed.
    +

    Without setting this parameter, the parent levels are always set, never mind the depth +of the parent workcenters. The last parent level will contain the last parent and +the top parent workcenter, will appear it self in its parent level. +The idea is to be able to see group of workcenters :

    ../static/src/img/img1.png
    +

    With the parameter, the parent levels will be empty if the depth of the parent is +to small. (ie : a workcenter with 1 parent and 1 great parent will have parent level 1 and 2 set, but parent level 3 will be empty)

    +
    +../static/src/img/img2.png
@@ -430,7 +439,7 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
diff --git a/mrp_workcenter_hierarchical/static/src/img/img1.png b/mrp_workcenter_hierarchical/static/src/img/img1.png index 16a3cccfc..de26a4260 100644 Binary files a/mrp_workcenter_hierarchical/static/src/img/img1.png and b/mrp_workcenter_hierarchical/static/src/img/img1.png differ diff --git a/mrp_workcenter_hierarchical/static/src/img/img2.png b/mrp_workcenter_hierarchical/static/src/img/img2.png new file mode 100644 index 000000000..5054f36bd Binary files /dev/null and b/mrp_workcenter_hierarchical/static/src/img/img2.png differ diff --git a/mrp_workcenter_hierarchical/tests/test_compute_level.py b/mrp_workcenter_hierarchical/tests/test_compute_level.py index 89edf972d..e5eea5283 100644 --- a/mrp_workcenter_hierarchical/tests/test_compute_level.py +++ b/mrp_workcenter_hierarchical/tests/test_compute_level.py @@ -3,10 +3,10 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import exceptions -from odoo.tests.common import SavepointCase +from odoo.tests.common import TransactionCase -class ComputeParentLevel(SavepointCase): +class ComputeParentLevel(TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() @@ -23,9 +23,42 @@ class ComputeParentLevel(SavepointCase): assert workcenter.parent_level_2_id == self.workc_1234 assert workcenter.parent_level_1_id == self.workc_12345 + def test_compute_hight_level_workcenter(self): + # test high level has parent_level fields set + self.assertEqual(self.workc_12345.parent_level_1_id, self.workc_12345) + self.assertEqual(self.workc_12345.parent_level_2_id, self.workc_12345) + self.assertEqual(self.workc_12345.parent_level_3_id, self.workc_12345) + + self.assertEqual(self.workc_1234.parent_level_1_id, self.workc_12345) + self.assertEqual(self.workc_1234.parent_level_2_id, self.workc_1234) + self.assertEqual(self.workc_1234.parent_level_3_id, self.workc_1234) + + self.workc_12345.company_id.workcenter_parent_level_empty = True + # test parent level of high parent is left empty if setting is set on company + # level + self.assertFalse(self.workc_12345.parent_level_1_id) + self.assertFalse(self.workc_12345.parent_level_2_id) + self.assertFalse(self.workc_12345.parent_level_2_id) + + self.assertEqual(self.workc_1234.parent_level_1_id, self.workc_12345) + self.assertFalse(self.workc_1234.parent_level_2_id) + self.assertFalse(self.workc_1234.parent_level_3_id) + + self.assertEqual(self.workc_123.parent_level_1_id, self.workc_12345) + self.assertEqual(self.workc_123.parent_level_2_id, self.workc_1234) + self.assertFalse(self.workc_123.parent_level_3_id) + def test_switch_workcenter(self): # take a MO with an operation - mo = self.env.ref("mrp.mrp_production_3") + self.env["mrp.routing.workcenter"].with_context(active_test=False).search( + [] + ).active = True + mo = self.env["mrp.production"].create( + { + "product_id": self.env.ref("mrp.product_product_computer_desk_head").id, + } + ) + mo.action_confirm() mo2 = mo.copy() mo2.action_confirm() wos = mo.workorder_ids + mo2.workorder_ids @@ -33,13 +66,13 @@ class ComputeParentLevel(SavepointCase): ctx = {"active_model": "mrp.workorder", "active_ids": wos.ids} # the default wworkcenter does not belong to any group with self.assertRaises(exceptions.UserError): - self.env["switch.workcenter"].with_context(ctx).create({}) + self.env["switch.workcenter"].with_context(**ctx).create({}) # set workcenter with group wos.write({"workcenter_id": self.workc_12345.id}) wizard = ( self.env["switch.workcenter"] - .with_context(ctx) + .with_context(**ctx) .create({"workcenter_id": self.workc_123.id}) ) # used in view diff --git a/mrp_workcenter_hierarchical/wizards/__init__.py b/mrp_workcenter_hierarchical/wizards/__init__.py index f537c7f0f..289182802 100644 --- a/mrp_workcenter_hierarchical/wizards/__init__.py +++ b/mrp_workcenter_hierarchical/wizards/__init__.py @@ -1 +1,2 @@ from . import switch_workcenter +from . import res_config_settings diff --git a/mrp_workcenter_hierarchical/wizards/res_config_settings.py b/mrp_workcenter_hierarchical/wizards/res_config_settings.py new file mode 100644 index 000000000..da549f7ba --- /dev/null +++ b/mrp_workcenter_hierarchical/wizards/res_config_settings.py @@ -0,0 +1,11 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + workcenter_parent_level_empty = fields.Boolean( + related="company_id.workcenter_parent_level_empty", store=True, readonly=False + ) diff --git a/mrp_workcenter_hierarchical/wizards/res_config_settings_views.xml b/mrp_workcenter_hierarchical/wizards/res_config_settings_views.xml new file mode 100644 index 000000000..ab0fff70d --- /dev/null +++ b/mrp_workcenter_hierarchical/wizards/res_config_settings_views.xml @@ -0,0 +1,31 @@ + + + + res.config.settings + + + +
+ +
+
+
+
+
+
+