mirror of https://github.com/OCA/web.git
commit
ba30b217ea
|
@ -1,6 +1,7 @@
|
||||||
# Copyright 2023 ooops404
|
# Copyright 2023 ooops404
|
||||||
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
|
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
|
||||||
from odoo import api, fields, models
|
from odoo import api, fields, models
|
||||||
|
from odoo.tools.safe_eval import safe_eval
|
||||||
|
|
||||||
|
|
||||||
class CustomFieldRestriction(models.Model):
|
class CustomFieldRestriction(models.Model):
|
||||||
|
@ -100,7 +101,9 @@ class CustomFieldRestriction(models.Model):
|
||||||
|
|
||||||
def create_restriction_field(self, f_type):
|
def create_restriction_field(self, f_type):
|
||||||
field_name = self.get_field_name(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":
|
if f_type == "required":
|
||||||
rec_model_id = self.required_model_id.id
|
rec_model_id = self.required_model_id.id
|
||||||
rec_field_name = "required_field_id"
|
rec_field_name = "required_field_id"
|
||||||
|
@ -111,6 +114,14 @@ class CustomFieldRestriction(models.Model):
|
||||||
rec_model_id = self.invisible_model_id.id
|
rec_model_id = self.invisible_model_id.id
|
||||||
rec_field_name = "visibility_field_id"
|
rec_field_name = "visibility_field_id"
|
||||||
if not 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(
|
field_id = self.env["ir.model.fields"].create(
|
||||||
{
|
{
|
||||||
"name": field_name,
|
"name": field_name,
|
||||||
|
@ -120,6 +131,7 @@ class CustomFieldRestriction(models.Model):
|
||||||
"store": False,
|
"store": False,
|
||||||
"ttype": "boolean",
|
"ttype": "boolean",
|
||||||
"compute": "for r in self: r._compute_restrictions_fields()",
|
"compute": "for r in self: r._compute_restrictions_fields()",
|
||||||
|
"depends": deps,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
self[rec_field_name] = field_id
|
self[rec_field_name] = field_id
|
||||||
|
@ -132,3 +144,10 @@ class CustomFieldRestriction(models.Model):
|
||||||
f_type,
|
f_type,
|
||||||
)
|
)
|
||||||
return res
|
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()
|
||||||
|
|
|
@ -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.
|
|
@ -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.field_id = self.partner_title_name_field_id
|
||||||
self.invisible_title_rec_id.onchange_field_id()
|
self.invisible_title_rec_id.onchange_field_id()
|
||||||
self.assertTrue(self.invisible_title_rec_id.required)
|
self.assertTrue(self.invisible_title_rec_id.required)
|
||||||
|
# unlink
|
||||||
|
self.invisible_rec_id.unlink()
|
||||||
|
|
Loading…
Reference in New Issue