From 02fbc24024d772e0a351e94de0ea39fa657adb53 Mon Sep 17 00:00:00 2001 From: Anjali Date: Fri, 19 Mar 2021 13:30:25 +0000 Subject: [PATCH] [FW][FIX] base: make parent contact lang prevail on DB lang With commit odoo/odoo@83ffe8b we ensured that while creating a child contact, it takes language from its parent by default if any, otherwise falls back to DB lang. The fix was done with help of `default_get` method. However after merge of odoo/odoo#55995 `default_get` is now called through the onchange for o2m fields. Now we don't get the default value of `parent_id` here which re-introduced the bug. This commit fixes the behavior by setting the language from onchange while creating the child contact and thus (once again) making the language from parent contact prevail on DB lang. We also re-use default_lang coming from parent in form view, which partially reverts odoo/odoo@83ffe8b . TaskID-2416922 closes odoo/odoo#72960 X-original-commit: 4d9b85bd07e487e7843dc458332dede36c2889c2 Signed-off-by: Thibault Delavallee (tde) --- odoo/addons/base/models/res_partner.py | 10 +++ odoo/addons/base/tests/test_res_partner.py | 82 ++++++++++++++++++++ odoo/addons/base/views/res_partner_views.xml | 2 +- 3 files changed, 93 insertions(+), 1 deletion(-) diff --git a/odoo/addons/base/models/res_partner.py b/odoo/addons/base/models/res_partner.py index 6cc6041533d..9582960c6cb 100644 --- a/odoo/addons/base/models/res_partner.py +++ b/odoo/addons/base/models/res_partner.py @@ -381,6 +381,13 @@ class Partner(models.Model): result['value'] = {key: convert(self.parent_id[key]) for key in address_fields} return result + @api.onchange('parent_id') + def _onchange_parent_id_for_lang(self): + # While creating / updating child contact, take the parent lang by default if any + # otherwise, fallback to default context / DB lang + if self.parent_id: + self.lang = self.parent_id.lang or self.env.context.get('default_lang') or self.env.lang + @api.onchange('country_id') def _onchange_country_id(self): if self.country_id and self.country_id != self.state_id.country_id: @@ -608,6 +615,9 @@ class Partner(models.Model): for partner, vals in zip(partners, vals_list): partner._fields_sync(vals) + # Lang: propagate from parent if no value was given + if 'lang' not in vals and partner.parent_id: + partner._onchange_parent_id_for_lang() partner._handle_first_contact_creation() return partners diff --git a/odoo/addons/base/tests/test_res_partner.py b/odoo/addons/base/tests/test_res_partner.py index 9c73a8948d9..a79942da620 100644 --- a/odoo/addons/base/tests/test_res_partner.py +++ b/odoo/addons/base/tests/test_res_partner.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from odoo.tests import Form from odoo.tests.common import TransactionCase from odoo.exceptions import UserError @@ -57,6 +58,87 @@ class TestPartner(TransactionCase): with self.assertRaises(UserError, msg="You should not be able to update the company_id of the partner company if the linked user of a child partner is not an allowed to be assigned to that company"), self.cr.savepoint(): test_partner_company.write({'company_id': company_2.id}) + def test_lang_computation_code(self): + """ Check computation of lang: coming from installed languages, forced + default value and propagation from parent.""" + default_lang_info = self.env['res.lang'].get_installed()[0] + default_lang_code = default_lang_info[0] + self.assertNotEqual(default_lang_code, 'de_DE') # should not be the case, just to ease test + self.assertNotEqual(default_lang_code, 'fr_FR') # should not be the case, just to ease test + + # default is installed lang + partner = self.env['res.partner'].create({'name': "Test Company"}) + self.assertEqual(partner.lang, default_lang_code) + + # check propagation of parent to child + child = self.env['res.partner'].create({'name': 'First Child', 'parent_id': partner.id}) + self.assertEqual(child.lang, default_lang_code) + + # activate another languages to test language propagation when being in multi-lang + self.env['res.lang']._activate_lang('de_DE') + self.env['res.lang']._activate_lang('fr_FR') + + # default from context > default from installed + partner = self.env['res.partner'].with_context(default_lang='de_DE').create({'name': "Test Company"}) + self.assertEqual(partner.lang, 'de_DE') + first_child = self.env['res.partner'].create({'name': 'First Child', 'parent_id': partner.id}) + partner.write({'lang': 'fr_FR'}) + second_child = self.env['res.partner'].create({'name': 'Second Child', 'parent_id': partner.id}) + + # check user input is kept + self.assertEqual(partner.lang, 'fr_FR') + self.assertEqual(first_child.lang, 'de_DE') + self.assertEqual(second_child.lang, 'fr_FR') + + def test_lang_computation_form_view(self): + """ Check computation of lang: coming from installed languages, forced + default value and propagation from parent.""" + default_lang_info = self.env['res.lang'].get_installed()[0] + default_lang_code = default_lang_info[0] + self.assertNotEqual(default_lang_code, 'de_DE') # should not be the case, just to ease test + self.assertNotEqual(default_lang_code, 'fr_FR') # should not be the case, just to ease test + + # default is installed lang + partner_form = Form(self.env['res.partner'], 'base.view_partner_form') + partner_form.name = "Test Company" + self.assertEqual(partner_form.lang, default_lang_code, "New partner's lang should be default one") + partner = partner_form.save() + self.assertEqual(partner.lang, default_lang_code) + + # check propagation of parent to child + with partner_form.child_ids.new() as child: + child.name = "First Child" + self.assertEqual(child.lang, default_lang_code, "Child contact's lang should have the same as its parent") + partner = partner_form.save() + self.assertEqual(partner.child_ids.lang, default_lang_code) + + # activate another languages to test language propagation when being in multi-lang + self.env['res.lang']._activate_lang('de_DE') + self.env['res.lang']._activate_lang('fr_FR') + + # default from context > default from installed + partner_form = Form( + self.env['res.partner'].with_context(default_lang='de_DE'), + 'base.view_partner_form' + ) + partner_form.is_company = True + partner_form.name = "Test Company" + self.assertEqual(partner_form.lang, 'de_DE', "New partner's lang should take default from context") + with partner_form.child_ids.new() as child: + child.name = "First Child" + self.assertEqual(child.lang, 'de_DE', "Child contact's lang should be the same as its parent.") + partner_form.lang = 'fr_FR' + self.assertEqual(partner_form.lang, 'fr_FR', "New partner's lang should take user input") + with partner_form.child_ids.new() as child: + child.name = "Second Child" + self.assertEqual(child.lang, 'fr_FR', "Child contact's lang should be the same as its parent.") + partner = partner_form.save() + + # check final values (kept from form input) + self.assertEqual(partner.lang, 'fr_FR') + self.assertEqual(partner.child_ids.filtered(lambda p: p.name == "First Child").lang, 'de_DE') + self.assertEqual(partner.child_ids.filtered(lambda p: p.name == "Second Child").lang, 'fr_FR') + def test_partner_merge_wizard_dst_partner_id(self): """ Check that dst_partner_id in merge wizard displays id along with partner name """ test_partner = self.env['res.partner'].create({'name': 'Radu the Handsome'}) diff --git a/odoo/addons/base/views/res_partner_views.xml b/odoo/addons/base/views/res_partner_views.xml index ba052612d5a..3d931f1cad3 100644 --- a/odoo/addons/base/views/res_partner_views.xml +++ b/odoo/addons/base/views/res_partner_views.xml @@ -234,7 +234,7 @@ - +