diff --git a/mrp_workcenter_category/README.rst b/mrp_workcenter_category/README.rst new file mode 100644 index 000000000..b2c0bd68a --- /dev/null +++ b/mrp_workcenter_category/README.rst @@ -0,0 +1 @@ +# TO BE GENERATED diff --git a/mrp_workcenter_category/__init__.py b/mrp_workcenter_category/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/mrp_workcenter_category/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/mrp_workcenter_category/__manifest__.py b/mrp_workcenter_category/__manifest__.py new file mode 100644 index 000000000..d75387d1b --- /dev/null +++ b/mrp_workcenter_category/__manifest__.py @@ -0,0 +1,21 @@ +# Copyright 2023 Camptocamp SA (https://www.camptocamp.com). +# @author Iván Todorovich +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "MRP Workcenter Category", + "summary": "Adds a category to workcenters", + "version": "15.0.1.0.0", + "author": "Camptocamp, Odoo Community Association (OCA)", + "maintainers": ["ivantodorovich"], + "website": "https://github.com/OCA/manufacture", + "license": "AGPL-3", + "category": "Manufacturing", + "depends": ["mrp"], + "data": [ + "security/ir.model.access.csv", + "views/mrp_workcenter_category.xml", + "views/mrp_workcenter.xml", + ], + "demo": ["demo/mrp_workcenter_category.xml"], +} diff --git a/mrp_workcenter_category/demo/mrp_workcenter_category.xml b/mrp_workcenter_category/demo/mrp_workcenter_category.xml new file mode 100644 index 000000000..c1e89b34c --- /dev/null +++ b/mrp_workcenter_category/demo/mrp_workcenter_category.xml @@ -0,0 +1,32 @@ + + + + + + Extrusion + + + + Polypropylene + + + + + PVC + + + + + Injection Molding + + + + Polypropylene + + + + diff --git a/mrp_workcenter_category/models/__init__.py b/mrp_workcenter_category/models/__init__.py new file mode 100644 index 000000000..282c82f60 --- /dev/null +++ b/mrp_workcenter_category/models/__init__.py @@ -0,0 +1,2 @@ +from . import mrp_workcenter +from . import mrp_workcenter_category diff --git a/mrp_workcenter_category/models/mrp_workcenter.py b/mrp_workcenter_category/models/mrp_workcenter.py new file mode 100644 index 000000000..f1e33a2fa --- /dev/null +++ b/mrp_workcenter_category/models/mrp_workcenter.py @@ -0,0 +1,14 @@ +# Copyright 2023 Camptocamp SA (https://www.camptocamp.com). +# @author Iván Todorovich +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class MrpWorkcenter(models.Model): + _inherit = "mrp.workcenter" + + category_id = fields.Many2one( + string="Category", + comodel_name="mrp.workcenter.category", + ) diff --git a/mrp_workcenter_category/models/mrp_workcenter_category.py b/mrp_workcenter_category/models/mrp_workcenter_category.py new file mode 100644 index 000000000..1dac18628 --- /dev/null +++ b/mrp_workcenter_category/models/mrp_workcenter_category.py @@ -0,0 +1,53 @@ +# Copyright 2023 Camptocamp SA (https://www.camptocamp.com). +# @author Iván Todorovich +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class MrpWorkcenterCategory(models.Model): + _name = "mrp.workcenter.category" + _description = "Work Center Category" + _parent_name = "parent_id" + _parent_store = True + _rec_name = "complete_name" + _order = "complete_name" + + ref = fields.Char(string="Internal Reference", index=True) + name = fields.Char(required=True) + parent_path = fields.Char(index=True) + parent_id = fields.Many2one( + string="Parent Category", + comodel_name="mrp.workcenter.category", + ondelete="cascade", + index=True, + ) + child_ids = fields.One2many( + string="Children Categories", + comodel_name="mrp.workcenter.category", + inverse_name="parent_id", + ) + complete_name = fields.Char( + compute="_compute_complete_name", + store=True, + recursive=True, + ) + description = fields.Html() + + _sql_constraints = [ + ("ref_uniq", "UNIQUE(ref)", "The reference must be unique!"), + ] + + @api.depends("name", "parent_id.complete_name") + def _compute_complete_name(self): + for rec in self: + if rec.parent_id: + rec.complete_name = f"{rec.parent_id.complete_name} / {rec.name}" + else: + rec.complete_name = rec.name + + @api.model + def name_create(self, name): + # OVERRIDE: `name_create` should ignore `_rec_name = "complete_name"` + record = self.create({"name": name}) + return record.name_get()[0] diff --git a/mrp_workcenter_category/readme/CONTRIBUTORS.rst b/mrp_workcenter_category/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..a1e0a8395 --- /dev/null +++ b/mrp_workcenter_category/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `Camptocamp `_ + + * Iván Todorovich diff --git a/mrp_workcenter_category/readme/DESCRIPTION.rst b/mrp_workcenter_category/readme/DESCRIPTION.rst new file mode 100644 index 000000000..1ab59fa52 --- /dev/null +++ b/mrp_workcenter_category/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +Allows to set a Category on Work Centers. diff --git a/mrp_workcenter_category/security/ir.model.access.csv b/mrp_workcenter_category/security/ir.model.access.csv new file mode 100644 index 000000000..f998cc4d9 --- /dev/null +++ b/mrp_workcenter_category/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_mrp_workcenter_category_user,mrp.workcenter.category user,model_mrp_workcenter_category,mrp.group_mrp_user,1,0,0,0 +access_mrp_workcenter_category_manager,mrp.workcenter.category manager,model_mrp_workcenter_category,mrp.group_mrp_manager,1,1,1,1 diff --git a/mrp_workcenter_category/tests/__init__.py b/mrp_workcenter_category/tests/__init__.py new file mode 100644 index 000000000..481dd1ee4 --- /dev/null +++ b/mrp_workcenter_category/tests/__init__.py @@ -0,0 +1 @@ +from . import test_mrp_workcenter_category diff --git a/mrp_workcenter_category/tests/test_mrp_workcenter_category.py b/mrp_workcenter_category/tests/test_mrp_workcenter_category.py new file mode 100644 index 000000000..e304e36ab --- /dev/null +++ b/mrp_workcenter_category/tests/test_mrp_workcenter_category.py @@ -0,0 +1,27 @@ +# Copyright 2023 Camptocamp SA (https://www.camptocamp.com). +# @author Iván Todorovich +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.exceptions import UserError +from odoo.tests import TransactionCase + + +class TestMrpWorkcenterCategory(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.categ_extrusion = cls.env.ref("mrp_workcenter_category.categ_extrusion") + cls.categ_pp = cls.env.ref("mrp_workcenter_category.categ_extrusion_pp") + cls.categ_pvc = cls.env.ref("mrp_workcenter_category.categ_extrusion_pvc") + + def test_complete_name(self): + self.assertEqual(self.categ_pp.complete_name, "Extrusion / Polypropylene") + + def test_check_recursion(self): + with self.assertRaisesRegex(UserError, "Recursion Detected"): + self.categ_extrusion.parent_id = self.categ_pvc + + def test_name_create(self): + record_id, __ = self.env["mrp.workcenter.category"].name_create("Test") + record = self.env["mrp.workcenter.category"].browse(record_id) + self.assertEqual(record.name, "Test") diff --git a/mrp_workcenter_category/views/mrp_workcenter.xml b/mrp_workcenter_category/views/mrp_workcenter.xml new file mode 100644 index 000000000..d02c39a72 --- /dev/null +++ b/mrp_workcenter_category/views/mrp_workcenter.xml @@ -0,0 +1,47 @@ + + + + + + mrp.workcenter + + + + + + + + + + mrp.workcenter + + + + + + + + + + mrp.workcenter + + + + + + + + + + + + diff --git a/mrp_workcenter_category/views/mrp_workcenter_category.xml b/mrp_workcenter_category/views/mrp_workcenter_category.xml new file mode 100644 index 000000000..0fe9ac229 --- /dev/null +++ b/mrp_workcenter_category/views/mrp_workcenter_category.xml @@ -0,0 +1,72 @@ + + + + + + mrp.workcenter.category + + + + + + + + + + + mrp.workcenter.category + +
+ +
+
+ + + + + + + + + + + + + +
+
+
+
+ + + mrp.workcenter.category + + + + + + + + + + Work Center Categories + mrp.workcenter.category + + + + +
diff --git a/setup/mrp_workcenter_category/odoo/addons/mrp_workcenter_category b/setup/mrp_workcenter_category/odoo/addons/mrp_workcenter_category new file mode 120000 index 000000000..f1cab6c8c --- /dev/null +++ b/setup/mrp_workcenter_category/odoo/addons/mrp_workcenter_category @@ -0,0 +1 @@ +../../../../mrp_workcenter_category \ No newline at end of file diff --git a/setup/mrp_workcenter_category/setup.py b/setup/mrp_workcenter_category/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/mrp_workcenter_category/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)