diff --git a/odoo/addons/test_new_api/ir.model.access.csv b/odoo/addons/test_new_api/ir.model.access.csv index c0fdba1ea2d..9d984b42652 100644 --- a/odoo/addons/test_new_api/ir.model.access.csv +++ b/odoo/addons/test_new_api/ir.model.access.csv @@ -42,3 +42,5 @@ access_test_new_api_model_child,access_test_new_api_model_child,model_test_new_a access_test_new_api_model_child_nocheck,access_test_new_api_model_child_nocheck,model_test_new_api_model_child_nocheck,,1,1,1,1 access_test_new_api_display,access_test_new_api_display,model_test_new_api_display,,1,1,1,1 access_test_new_api_model_active_field,access_test_new_api_model_active_field,model_test_new_api_model_active_field,,1,1,1,1 +access_test_new_api_model_many2one_reference,access_test_new_api_model_many2one_reference,model_test_new_api_model_many2one_reference,,1,1,1,1 +access_test_new_api_inverse_m2o_ref,access_test_new_api_inverse_m2o_ref,model_test_new_api_inverse_m2o_ref,,1,1,1,1 diff --git a/odoo/addons/test_new_api/models.py b/odoo/addons/test_new_api/models.py index c39f204c2a2..d4176ffa722 100644 --- a/odoo/addons/test_new_api/models.py +++ b/odoo/addons/test_new_api/models.py @@ -726,3 +726,24 @@ class ModelActiveField(models.Model): parent_id = fields.Many2one('test_new_api.model_active_field') children_ids = fields.One2many('test_new_api.model_active_field', 'parent_id') parent_active = fields.Boolean(string='Active Parent', related='parent_id.active', store=True) + + +class ModelMany2oneReference(models.Model): + _name = 'test_new_api.model_many2one_reference' + _description = 'dummy m2oref model' + + res_model = fields.Char('Resource Model') + res_id = fields.Many2oneReference('Resource ID', model_field='res_model') + + +class InverseM2oRef(models.Model): + _name = 'test_new_api.inverse_m2o_ref' + _description = 'dummy m2oref inverse model' + + model_ids = fields.One2many('test_new_api.model_many2one_reference', 'res_id', string="Models") + model_ids_count = fields.Integer("Count", compute='_compute_model_ids_count') + + @api.depends('model_ids') + def _compute_model_ids_count(self): + for rec in self: + rec.model_ids_count = len(rec.model_ids) 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 7d968aac0fe..e326d8575b1 100644 --- a/odoo/addons/test_new_api/tests/test_new_fields.py +++ b/odoo/addons/test_new_api/tests/test_new_fields.py @@ -2001,3 +2001,15 @@ class TestRequiredMany2oneTransient(common.TransactionCase): with self.assertRaises(ValueError): field._setup_regular_base(Model) + + +@common.tagged('m2oref') +class TestMany2oneReference(common.TransactionCase): + + def test_delete_m2o_reference_records(self): + m = self.env['test_new_api.model_many2one_reference'] + self.env.cr.execute("SELECT max(id) FROM test_new_api_model_many2one_reference") + ids = self.env.cr.fetchone() + # fake record to emulate the unlink of a non-existant record + foo = m.browse(1 if not ids[0] else (ids[0] + 1)) + self.assertTrue(foo.unlink()) diff --git a/odoo/models.py b/odoo/models.py index 2f346874189..d917558c9e1 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -5571,8 +5571,11 @@ Record ids: %(records)s if invf.type == 'many2one_reference': rec_ids = set() for rec in self: - if rec[invf.model_field] == key.model_name: - rec_ids.add(rec[invf.name]) + try: + if rec[invf.model_field] == key.model_name: + rec_ids.add(rec[invf.name]) + except MissingError: + continue records = model.browse(rec_ids) else: try: