From ed95da37dc96581f12dce03eb621d354f74f4f72 Mon Sep 17 00:00:00 2001 From: AH-Yussef Date: Fri, 24 Nov 2023 09:27:34 +0000 Subject: [PATCH] [FIX] base: translate partner display_name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Steps to reproduce: - Install Contacts app - Go to General Settings and add another language - Add a new contact to a parent. - Don't add a specific contact name - Assign a contact type (delivery address, invoice address, other address) - Go to the list or kanban view of the contancts and change the language - The type of the contact listed next to the parent name is not translated from English. Investigation: - When the contact name is not set, the `display_name` displayed in both kanban and list views is set by concatinating the parent name with the contact type. - The line https://github.com/odoo/odoo/blob/03b7e17faef4075dbbb805bca4e7f40f7fbcc988/odoo/addons/base/models/res_partner.py#L345 in the function `_compute_display_name`, `with_context({})` in particular basically enforce to compute the name in english language regardless of the active language. That actually makes sense as the `display_name` field has `store=True` https://github.com/odoo/odoo/blob/03b7e17faef4075dbbb805bca4e7f40f7fbcc988/odoo/addons/base/models/res_partner.py#L199 Solution: - add a computed field that is not stored that gets recomputed on changing the language. opw-3569171 closes odoo/odoo#147650 X-original-commit: 60b3ae846de59b1f6e71df68e99e29758ba734fe Signed-off-by: Rémy Voet (ryv) Signed-off-by: Ali Hassan Youssef (alhy) --- .../crm/tests/test_crm_lead_convert_mass.py | 4 +-- odoo/addons/base/models/res_partner.py | 32 ++++++++++--------- odoo/addons/base/tests/test_res_partner.py | 20 ++++++++++++ 3 files changed, 39 insertions(+), 17 deletions(-) diff --git a/addons/crm/tests/test_crm_lead_convert_mass.py b/addons/crm/tests/test_crm_lead_convert_mass.py index 0da42cebb26..b153a053198 100644 --- a/addons/crm/tests/test_crm_lead_convert_mass.py +++ b/addons/crm/tests/test_crm_lead_convert_mass.py @@ -42,7 +42,7 @@ class TestLeadConvertMass(crm_common.TestLeadConvertMassCommon): with self.assertQueryCount(user_sales_manager=0): test_leads = self.env['crm.lead'].browse(test_leads.ids) - with self.assertQueryCount(user_sales_manager=583): # crm 543 / com 545 / ent 583 + with self.assertQueryCount(user_sales_manager=584): # crm 543 / com 545 / ent 584 test_leads._handle_salesmen_assignment(user_ids=user_ids, team_id=team_id) self.assertEqual(test_leads.team_id, self.sales_team_convert) @@ -167,7 +167,7 @@ class TestLeadConvertMass(crm_common.TestLeadConvertMassCommon): user_ids = self.assign_users.ids # randomness: at least 1 query - with self.assertQueryCount(user_sales_manager=1800): # crm 1503 / com 1790 / ent 1800 + with self.assertQueryCount(user_sales_manager=1801): # crm 1503 / com 1790 / ent 1800 mass_convert = self.env['crm.lead2opportunity.partner.mass'].with_context({ 'active_model': 'crm.lead', 'active_ids': test_leads.ids, diff --git a/odoo/addons/base/models/res_partner.py b/odoo/addons/base/models/res_partner.py index 24158403b0f..982096871aa 100644 --- a/odoo/addons/base/models/res_partner.py +++ b/odoo/addons/base/models/res_partner.py @@ -333,22 +333,24 @@ class Partner(models.Model): return "base/static/img/money.png" return super()._avatar_get_placeholder_path() + def _get_complete_name(self): + self.ensure_one() + + displayed_types = self._complete_name_displayed_types + type_description = dict(self._fields['type']._description_selection(self.env)) + + name = self.name or '' + if self.company_name or self.parent_id: + if not name and self.type in displayed_types: + name = type_description[self.type] + if not self.is_company: + name = f"{self.commercial_company_name or self.sudo().parent_id.name}, {name}" + return name.strip() + @api.depends('is_company', 'name', 'parent_id.name', 'type', 'company_name', 'commercial_company_name') def _compute_complete_name(self): - displayed_types = self._complete_name_displayed_types - # determine the labels of partner types to be included - # as 'displayed_types' (without user lang to avoid context dependency) - type_description = dict(self._fields['type']._description_selection(self.with_context({}).env)) - for partner in self: - name = partner.name or '' - if partner.company_name or partner.parent_id: - if not name and partner.type in displayed_types: - name = type_description[partner.type] - if not partner.is_company: - name = f"{partner.commercial_company_name or partner.sudo().parent_id.name}, {name}" - - partner.complete_name = name.strip() + partner.complete_name = partner.with_context({})._get_complete_name() @api.depends('lang') def _compute_active_lang_count(self): @@ -841,10 +843,10 @@ class Partner(models.Model): } @api.depends('complete_name', 'email', 'vat', 'state_id', 'country_id', 'commercial_company_name') - @api.depends_context('show_address', 'partner_show_db_id', 'address_inline', 'show_email', 'show_vat') + @api.depends_context('show_address', 'partner_show_db_id', 'address_inline', 'show_email', 'show_vat', 'lang') def _compute_display_name(self): for partner in self: - name = partner.complete_name + name = partner.with_context({'lang': self.env.lang})._get_complete_name() if partner._context.get('show_address'): name = name + "\n" + partner._display_address(without_company=True) name = re.sub(r'\s+\n', '\n', name) diff --git a/odoo/addons/base/tests/test_res_partner.py b/odoo/addons/base/tests/test_res_partner.py index dcf6c15170e..f61565900ce 100644 --- a/odoo/addons/base/tests/test_res_partner.py +++ b/odoo/addons/base/tests/test_res_partner.py @@ -394,6 +394,26 @@ class TestPartner(TransactionCaseWithUserDemo): self.assertEqual([g['title_count'] for g in groups_data], [2, 4], 'Incorrect number of results') self.assertEqual([g['color'] for g in groups_data], [-1, 10], 'Incorrect aggregation of int column') + def test_display_name_translation(self): + self.env['res.lang']._activate_lang('fr_FR') + self.env.ref('base.module_base')._update_translations(['fr_FR']) + + res_partner = self.env['res.partner'] + + parent_contact = res_partner.create({ + 'name': 'Parent', + 'type': 'contact', + }) + + child_contact = res_partner.create({ + 'type': 'other', + 'parent_id': parent_contact.id, + }) + + self.assertEqual(child_contact.with_context(lang='en_US').display_name, 'Parent, Other Address') + + self.assertEqual(child_contact.with_context(lang='fr_FR').display_name, 'Parent, Autre adresse') + @tagged('res_partner') class TestPartnerAddressCompany(TransactionCase):