From 2b8f5dce061269bca48aad5a54e0f8fa767fe17d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20Gonz=C3=A1lez?= Date: Mon, 7 Oct 2019 17:40:57 +0000 Subject: [PATCH] [IMP] base: Forbid spaces in external IDs This introduces a new constraint to the `ir.model.data` model, to disallow external IDs containing spaces. Those cases may cause issues and should be avoided. For more information about why an external ID containing spaces is a bad idea, see: - https://github.com/odoo/odoo/commit/3c568aec0b46 - https://github.com/odoo/odoo/issues/25408 closes odoo/odoo#38139 Signed-off-by: Xavier Morel (xmo) --- odoo/addons/base/models/ir_model.py | 5 +++++ odoo/addons/base/tests/test_ir_model.py | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/odoo/addons/base/models/ir_model.py b/odoo/addons/base/models/ir_model.py index a2e079492df..e23ac5c21b4 100644 --- a/odoo/addons/base/models/ir_model.py +++ b/odoo/addons/base/models/ir_model.py @@ -1561,6 +1561,11 @@ class IrModelData(models.Model): date_init = fields.Datetime(string='Init Date', default=fields.Datetime.now) reference = fields.Char(string='Reference', compute='_compute_reference', readonly=True, store=False) + _sql_constraints = [ + ('name_nospaces', "CHECK(name NOT LIKE '% %')", + "External IDs cannot contain spaces"), + ] + @api.depends('module', 'name') def _compute_complete_name(self): for res in self: diff --git a/odoo/addons/base/tests/test_ir_model.py b/odoo/addons/base/tests/test_ir_model.py index d00d2d1fb55..ea5b4a5fa2e 100644 --- a/odoo/addons/base/tests/test_ir_model.py +++ b/odoo/addons/base/tests/test_ir_model.py @@ -1,7 +1,10 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from psycopg2 import IntegrityError + from odoo.tests.common import TransactionCase +from odoo.tools import mute_logger class TestXMLID(TransactionCase): @@ -155,3 +158,13 @@ class TestXMLID(TransactionCase): self.assertEqual(self.get_data('test_convert.foo').noupdate, True) self.assertEqual(self.get_data('test_convert.bar').noupdate, True) + + @mute_logger('odoo.sql_db', 'odoo.addons.base.models.ir_model') + def test_create_external_id_with_space(self): + model = self.env['res.partner.category'] + data_list = [{ + 'xml_id': 'test_convert.category_with space', + 'values': {'name': 'Bar'}, + }] + with self.assertRaisesRegex(IntegrityError, 'ir_model_data_name_nospaces'): + model._load_records(data_list)