From 05861ffdf11d2b9e2156160db378692b6de2a25c Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Tue, 4 Dec 2018 10:00:39 +0000 Subject: [PATCH] [IMP] fields: check for inconsistent many2many definitions closes odoo/odoo#29323 --- odoo/addons/test_new_api/ir.model.access.csv | 1 + odoo/addons/test_new_api/models.py | 5 +++++ odoo/addons/test_new_api/tests/test_new_fields.py | 12 ++++++++++++ odoo/fields.py | 6 +++++- 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/odoo/addons/test_new_api/ir.model.access.csv b/odoo/addons/test_new_api/ir.model.access.csv index 77c881dcc4df3..ffa1086b4aca9 100644 --- a/odoo/addons/test_new_api/ir.model.access.csv +++ b/odoo/addons/test_new_api/ir.model.access.csv @@ -5,6 +5,7 @@ access_message,test_new_api_message,test_new_api.model_test_new_api_message,,1,1 access_emailmessage,test_new_api_emailmessage,test_new_api.model_test_new_api_emailmessage,,1,1,1,1 access_multi,test_new_api_multi,test_new_api.model_test_new_api_multi,,1,1,1,1 access_multi_line,test_new_api_multi_line,test_new_api.model_test_new_api_multi_line,,1,1,1,1 +access_multi_line2,test_new_api_multi_line2,test_new_api.model_test_new_api_multi_line2,,1,1,1,1 access_multi_tag,test_new_api_multi_tag,test_new_api.model_test_new_api_multi_tag,,1,1,1,1 access_creativework_edition,test_new_api_creativework_edition,model_test_new_api_creativework_edition,,1,1,1,1 access_creativework_book,test_new_api_creativework_book,model_test_new_api_creativework_book,,1,1,1,1 diff --git a/odoo/addons/test_new_api/models.py b/odoo/addons/test_new_api/models.py index 90edf91094473..0f09307ef67fb 100644 --- a/odoo/addons/test_new_api/models.py +++ b/odoo/addons/test_new_api/models.py @@ -225,6 +225,11 @@ class MultiLine(models.Model): tags = fields.Many2many('test_new_api.multi.tag') +class MultiLine2(models.Model): + _name = 'test_new_api.multi.line2' + _inherit = 'test_new_api.multi.line' + + class MultiTag(models.Model): _name = 'test_new_api.multi.tag' _description = 'Test New API Multi Tag' diff --git a/odoo/addons/test_new_api/tests/test_new_fields.py b/odoo/addons/test_new_api/tests/test_new_fields.py index 704c85a9dd7b5..d68493f5586b1 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -1104,6 +1104,18 @@ def test_93_monetary_related(self): class TestX2many(common.TransactionCase): + def test_definition_many2many(self): + """ Test the definition of inherited many2many fields. """ + field = self.env['test_new_api.multi.line']._fields['tags'] + self.assertEqual(field.relation, 'test_new_api_multi_line_test_new_api_multi_tag_rel') + self.assertEqual(field.column1, 'test_new_api_multi_line_id') + self.assertEqual(field.column2, 'test_new_api_multi_tag_id') + + field = self.env['test_new_api.multi.line2']._fields['tags'] + self.assertEqual(field.relation, 'test_new_api_multi_line2_test_new_api_multi_tag_rel') + self.assertEqual(field.column1, 'test_new_api_multi_line2_id') + self.assertEqual(field.column2, 'test_new_api_multi_tag_id') + def test_search_many2many(self): """ Tests search on many2many fields. """ tags = self.env['test_new_api.multi.tag'] diff --git a/odoo/fields.py b/odoo/fields.py index e9a8d49d725dc..6c77b5631e21c 100644 --- a/odoo/fields.py +++ b/odoo/fields.py @@ -2557,8 +2557,12 @@ def _setup_regular_full(self, model): comodel = model.env[self.comodel_name] model._field_inverses.add(self, invf) comodel._field_inverses.add(invf, self) - else: + + elif model._auto: # add self in m2m, so that its inverse field can find it + if (self.relation, self.column1, self.column2) in m2m: + msg = "Many2many fields %s and %s use the same table and columns" + raise TypeError(msg % (self, m2m[(self.relation, self.column1, self.column2)])) m2m[(self.relation, self.column1, self.column2)] = self def update_db(self, model, columns):