diff --git a/.oca/oca-port/blacklist/uom_unece.json b/.oca/oca-port/blacklist/uom_unece.json new file mode 100644 index 000000000..2980a2a85 --- /dev/null +++ b/.oca/oca-port/blacklist/uom_unece.json @@ -0,0 +1,5 @@ +{ + "pull_requests": { + "OCA/community-data-files#185": "(auto) Nothing to port from PR #185" + } +} diff --git a/uom_unece/models/uom_uom.py b/uom_unece/models/uom_uom.py index ab0e0419c..905027268 100644 --- a/uom_unece/models/uom_uom.py +++ b/uom_unece/models/uom_uom.py @@ -2,7 +2,8 @@ # @author: Alexis de Lattre # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import fields, models +from odoo import api, fields, models +from odoo.tools import ormcache class UomUom(models.Model): @@ -13,3 +14,33 @@ class UomUom(models.Model): help="Standard nomenclature of the United Nations Economic " "Commission for Europe (UNECE).", ) + + @api.model + @ormcache() + def _get_uom_id_by_unece_code(self): + uoms = self.with_context(active_test=False).search( + [("unece_code", "!=", False)] + ) + return {u.unece_code: u.id for u in uoms} + + def get_uom_id_by_unece_code(self, unece_code): + uom_ids_by_code = self._get_uom_id_by_unece_code() + return uom_ids_by_code.get(unece_code) + + @api.model_create_multi + def create(self, vals_list): + records = super().create(vals_list) + if records.filtered("unece_code"): + self.env.registry.clear_cache() + return records + + def write(self, vals): + res = super().write(vals) + if "unece_code" in vals: + self.env.registry.clear_cache() + return res + + def unlink(self): + res = super().unlink() + self.env.registry.clear_cache() + return res diff --git a/uom_unece/tests/__init__.py b/uom_unece/tests/__init__.py new file mode 100644 index 000000000..fe1997c6f --- /dev/null +++ b/uom_unece/tests/__init__.py @@ -0,0 +1 @@ +from . import test_uom_unece diff --git a/uom_unece/tests/test_uom_unece.py b/uom_unece/tests/test_uom_unece.py new file mode 100644 index 000000000..e8146b459 --- /dev/null +++ b/uom_unece/tests/test_uom_unece.py @@ -0,0 +1,44 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.tests.common import TransactionCase + + +class TestUomUnece(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.uom_model = cls.env["uom.uom"] + cls.uom_unit = cls.env.ref("uom.product_uom_unit") + cls.uom_dozen = cls.env.ref("uom.product_uom_dozen") + cls.uom_hour = cls.env.ref("uom.product_uom_hour") + + def test_get_uom_id_by_unece_code(self): + self.assertEqual( + self.uom_model.get_uom_id_by_unece_code("C62"), self.uom_unit.id + ) + self.assertEqual( + self.uom_model.get_uom_id_by_unece_code("DPC"), self.uom_dozen.id + ) + self.assertEqual( + self.uom_model.get_uom_id_by_unece_code("HUR"), self.uom_hour.id + ) + + def test_get_uom_id_by_unece_code_unknown(self): + self.assertFalse(self.uom_model.get_uom_id_by_unece_code("UNKNOWN")) + + def test_get_uom_id_by_unece_code_cache_invalidation_on_write(self): + self.assertEqual( + self.uom_model.get_uom_id_by_unece_code("C62"), self.uom_unit.id + ) + self.uom_unit.write({"unece_code": "C62_NEW"}) + self.assertFalse(self.uom_model.get_uom_id_by_unece_code("C62")) + self.assertEqual( + self.uom_model.get_uom_id_by_unece_code("C62_NEW"), self.uom_unit.id + ) + + def test_get_uom_id_by_unece_code_cache_invalidation_on_unlink(self): + uom = self.uom_hour.copy({"name": "Test Hour Copy", "unece_code": "ZZZ"}) + self.assertEqual(self.uom_model.get_uom_id_by_unece_code("ZZZ"), uom.id) + uom.unlink() + self.assertFalse(self.uom_model.get_uom_id_by_unece_code("ZZZ"))