From 10620c0cafc3c87adf608ec166abe149166fa372 Mon Sep 17 00:00:00 2001 From: Rahul Prajapati Date: Tue, 14 Feb 2023 11:02:07 +0000 Subject: [PATCH] [FIX] base: fix validation for co-model field in ir_field view MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The co-model field in `IrField` view is accepting Related Model name even if it is invalid. And replaces the invalid model name with `_unknown`. This causes KeyError `display_name` when trying to create or read a record. To fix that we are adding Validations for the Related Model field when it gets updated from UI side. sentry-3933471439 closes odoo/odoo#118052 X-original-commit: e4f7798fd5a5cccd5d385f535fbc21264cb6948b Signed-off-by: Rémy Voet --- odoo/addons/base/i18n/base.pot | 7 +++++++ odoo/addons/base/models/ir_model.py | 20 ++++++++++++++------ odoo/addons/base/tests/test_ir_actions.py | 15 +++++++++++++++ 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/odoo/addons/base/i18n/base.pot b/odoo/addons/base/i18n/base.pot index 678eb7c2631..85c6d8c2fda 100644 --- a/odoo/addons/base/i18n/base.pot +++ b/odoo/addons/base/i18n/base.pot @@ -22402,6 +22402,13 @@ msgstr "" msgid "Unknown field name '%s' in related field '%s'" msgstr "" +#. module: base +#. odoo-python +#: code:addons/base/models/ir_model.py:0 +#, python-format +msgid "Unknown model name '%s' in Related Model" +msgstr "" + #. module: base #. odoo-python #: code:addons/base/models/ir_fields.py:0 diff --git a/odoo/addons/base/models/ir_model.py b/odoo/addons/base/models/ir_model.py index cbca93c29a5..332cd56ea0e 100644 --- a/odoo/addons/base/models/ir_model.py +++ b/odoo/addons/base/models/ir_model.py @@ -638,6 +638,19 @@ class IrModelFields(models.Model): self.relation = field.relation self.readonly = True + @api.onchange('relation') + def _onchange_relation(self): + try: + self._check_relation() + except ValidationError as e: + return {'warning': {'title': _("Model %s does not exist", self.relation), 'message': e}} + + @api.constrains('relation') + def _check_relation(self): + for rec in self: + if rec.state == 'manual' and rec.relation and not rec.env['ir.model']._get_id(rec.relation): + raise ValidationError(_("Unknown model name '%s' in Related Model", rec.relation)) + @api.constrains('depends') def _check_depends(self): """ Check whether all fields in dependencies are valid. """ @@ -684,12 +697,7 @@ class IrModelFields(models.Model): def _onchange_ttype(self): if self.ttype == 'many2many' and self.model_id and self.relation: if self.relation not in self.env: - return { - 'warning': { - 'title': _('Model %s does not exist', self.relation), - 'message': _('Please specify a valid model for the object relation'), - } - } + return names = self._custom_many2many_names(self.model_id.model, self.relation) self.relation_table, self.column1, self.column2 = names else: diff --git a/odoo/addons/base/tests/test_ir_actions.py b/odoo/addons/base/tests/test_ir_actions.py index 616bcfee551..faeecbc012f 100644 --- a/odoo/addons/base/tests/test_ir_actions.py +++ b/odoo/addons/base/tests/test_ir_actions.py @@ -563,6 +563,21 @@ class TestCustomFields(common.TransactionCase): for partner in partners: self.assertEqual(partner.x_oh_boy, partner.country_id.code) + def test_relation_of_a_custom_field(self): + """ change the relation model of a custom field """ + model = self.env['ir.model'].search([('model', '=', self.MODEL)]) + field = self.env['ir.model.fields'].create({ + 'name': 'x_foo', + 'model_id': model.id, + 'field_description': 'x_foo', + 'ttype': 'many2many', + 'relation': self.COMODEL, + }) + + # change the relation + with self.assertRaises(ValidationError): + field.relation = 'foo' + def test_selection(self): """ custom selection field """ Model = self.env[self.MODEL]