diff --git a/web_field_required_invisible_manager/models/custom_field_restriction.py b/web_field_required_invisible_manager/models/custom_field_restriction.py index 5cced2eb4..fabb97763 100644 --- a/web_field_required_invisible_manager/models/custom_field_restriction.py +++ b/web_field_required_invisible_manager/models/custom_field_restriction.py @@ -1,6 +1,7 @@ # Copyright 2023 ooops404 # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html) from odoo import api, fields, models +from odoo.tools.safe_eval import safe_eval class CustomFieldRestriction(models.Model): @@ -100,7 +101,9 @@ class CustomFieldRestriction(models.Model): def create_restriction_field(self, f_type): field_name = self.get_field_name(f_type) - field_id = self.env["ir.model.fields"].search([("name", "=", field_name)]) + field_id = self.env["ir.model.fields"].search( + [("name", "=", field_name), ("state", "=", "manual")] + ) if f_type == "required": rec_model_id = self.required_model_id.id rec_field_name = "required_field_id" @@ -111,6 +114,14 @@ class CustomFieldRestriction(models.Model): rec_model_id = self.invisible_model_id.id rec_field_name = "visibility_field_id" if not field_id: + deps = "" + if self.condition_domain: + deps = ",".join( + [ + r[0] if r[0] not in ["id"] else "" + for r in safe_eval(self.condition_domain) + ] + ) field_id = self.env["ir.model.fields"].create( { "name": field_name, @@ -120,6 +131,7 @@ class CustomFieldRestriction(models.Model): "store": False, "ttype": "boolean", "compute": "for r in self: r._compute_restrictions_fields()", + "depends": deps, } ) self[rec_field_name] = field_id @@ -132,3 +144,10 @@ class CustomFieldRestriction(models.Model): f_type, ) return res + + def unlink(self): + for rec in self: + rec.visibility_field_id.unlink() + rec.readonly_field_id.unlink() + rec.required_field_id.unlink() + return super(CustomFieldRestriction, self).unlink() diff --git a/web_field_required_invisible_manager/readme/ROADMAP.rst b/web_field_required_invisible_manager/readme/ROADMAP.rst new file mode 100644 index 000000000..be02daebd --- /dev/null +++ b/web_field_required_invisible_manager/readme/ROADMAP.rst @@ -0,0 +1,3 @@ +When one model inherits another (e.g. res.users inherits res.partner) and new custom +field is created, then same field is created for inheriting model as well, which should +be avoided or at least duplicated field should be also manual, but created as base. diff --git a/web_field_required_invisible_manager/tests/test_web_field_required_invisible_manager.py b/web_field_required_invisible_manager/tests/test_web_field_required_invisible_manager.py index b378690db..a8679ce37 100644 --- a/web_field_required_invisible_manager/tests/test_web_field_required_invisible_manager.py +++ b/web_field_required_invisible_manager/tests/test_web_field_required_invisible_manager.py @@ -130,3 +130,5 @@ class TestFieldRequiredIvisibleManager(common.SavepointCase): self.invisible_title_rec_id.field_id = self.partner_title_name_field_id self.invisible_title_rec_id.onchange_field_id() self.assertTrue(self.invisible_title_rec_id.required) + # unlink + self.invisible_rec_id.unlink()