diff --git a/odoo/addons/base/models/ir_actions.py b/odoo/addons/base/models/ir_actions.py index 7f0dd39695a..0071cb701a0 100644 --- a/odoo/addons/base/models/ir_actions.py +++ b/odoo/addons/base/models/ir_actions.py @@ -498,7 +498,10 @@ class IrActionsServer(models.Model): if action.link_field_id: record = self.env[action.model_id.model].browse(self._context.get('active_id')) - record.write({action.link_field_id.name: res.id}) + if action.link_field_id.ttype in ['one2many', 'many2many']: + record.write({action.link_field_id.name: [(4, res.id)]}) + else: + record.write({action.link_field_id.name: res.id}) @api.model def _get_eval_context(self, action=None): diff --git a/odoo/addons/base/tests/test_ir_actions.py b/odoo/addons/base/tests/test_ir_actions.py index 9eb47d569da..bb05fc22b99 100644 --- a/odoo/addons/base/tests/test_ir_actions.py +++ b/odoo/addons/base/tests/test_ir_actions.py @@ -38,9 +38,13 @@ class TestServerActionsBase(common.TransactionCase): self.res_partner_city_field = Fields.search([('model', '=', 'res.partner'), ('name', '=', 'city')]) self.res_partner_country_field = Fields.search([('model', '=', 'res.partner'), ('name', '=', 'country_id')]) self.res_partner_parent_field = Fields.search([('model', '=', 'res.partner'), ('name', '=', 'parent_id')]) + self.res_partner_children_field = Fields.search([('model', '=', 'res.partner'), ('name', '=', 'child_ids')]) + self.res_partner_category_field = Fields.search([('model', '=', 'res.partner'), ('name', '=', 'category_id')]) self.res_country_model = Model.search([('model', '=', 'res.country')]) self.res_country_name_field = Fields.search([('model', '=', 'res.country'), ('name', '=', 'name')]) self.res_country_code_field = Fields.search([('model', '=', 'res.country'), ('name', '=', 'code')]) + self.res_partner_category_model = Model.search([('model', '=', 'res.partner.category')]) + self.res_partner_category_name_field = Fields.search([('model', '=', 'res.partner.category'), ('name', '=', 'name')]) # create server action to self.action = self.env['ir.actions.server'].create({ @@ -79,10 +83,27 @@ class TestServerActions(TestServerActionsBase): self.assertEqual(len(partners), 1, 'ir_actions_server: 1 new partner should have been created') def test_20_crud_create(self): + # Do: create a new record in another model + self.action.write({ + 'state': 'object_create', + 'crud_model_id': self.res_country_model.id, + 'link_field_id': False, + 'fields_lines': [(5,), + (0, 0, {'col1': self.res_country_name_field.id, 'value': 'record.name', 'evaluation_type': 'equation'}), + (0, 0, {'col1': self.res_country_code_field.id, 'value': 'record.name[0:2]', 'evaluation_type': 'equation'})], + }) + run_res = self.action.with_context(self.context).run() + self.assertFalse(run_res, 'ir_actions_server: create record action correctly finished should return False') + # Test: new country created + country = self.test_country.search([('name', 'ilike', 'TestingPartner')]) + self.assertEqual(len(country), 1, 'ir_actions_server: TODO') + self.assertEqual(country.code, 'TE', 'ir_actions_server: TODO') + + def test_20_crud_create_link_many2one(self): _city = 'TestCity' _name = 'TestNew' - # Do: create a new record in the same model and link it + # Do: create a new record in the same model and link it with a many2one self.action.write({ 'state': 'object_create', 'crud_model_id': self.action.model_id.id, @@ -99,21 +120,39 @@ class TestServerActions(TestServerActionsBase): # Test: new partner linked self.assertEqual(self.test_partner.parent_id, partner, 'ir_actions_server: TODO') - # Do: create a new record in another model + def test_20_crud_create_link_one2many(self): + _name = 'TestNew' + + # Do: create a new record in the same model and link it with a one2many self.action.write({ 'state': 'object_create', - 'crud_model_id': self.res_country_model.id, - 'link_field_id': False, - 'fields_lines': [(5,), - (0, 0, {'col1': self.res_country_name_field.id, 'value': 'record.name', 'evaluation_type': 'equation'}), - (0, 0, {'col1': self.res_country_code_field.id, 'value': 'record.name[0:2]', 'evaluation_type': 'equation'})], + 'crud_model_id': self.action.model_id.id, + 'link_field_id': self.res_partner_children_field.id, + 'fields_lines': [(0, 0, {'col1': self.res_partner_name_field.id, 'value': _name})], }) run_res = self.action.with_context(self.context).run() self.assertFalse(run_res, 'ir_actions_server: create record action correctly finished should return False') - # Test: new country created - country = self.test_country.search([('name', 'ilike', 'TestingPartner')]) - self.assertEqual(len(country), 1, 'ir_actions_server: TODO') - self.assertEqual(country.code, 'TE', 'ir_actions_server: TODO') + # Test: new partner created + partner = self.test_partner.search([('name', 'ilike', _name)]) + self.assertEqual(len(partner), 1, 'ir_actions_server: TODO') + self.assertEqual(partner.name, _name, 'ir_actions_server: TODO') + # Test: new partner linked + self.assertIn(partner, self.test_partner.child_ids, 'ir_actions_server: TODO') + + def test_20_crud_create_link_many2many(self): + # Do: create a new record in another model + self.action.write({ + 'state': 'object_create', + 'crud_model_id': self.res_partner_category_model.id, + 'link_field_id': self.res_partner_category_field.id, + 'fields_lines': [(0, 0, {'col1': self.res_partner_category_name_field.id, 'value': 'record.name', 'evaluation_type': 'equation'})], + }) + run_res = self.action.with_context(self.context).run() + self.assertFalse(run_res, 'ir_actions_server: create record action correctly finished should return False') + # Test: new category created + category = self.env['res.partner.category'].search([('name', 'ilike', 'TestingPartner')]) + self.assertEqual(len(category), 1, 'ir_actions_server: TODO') + self.assertIn(category, self.test_partner.category_id) def test_30_crud_write(self): _name = 'TestNew'