[FIX] base: translate partner display_name

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) <ryv@odoo.com>
Signed-off-by: Ali Hassan Youssef (alhy) <alhy@odoo.com>
This commit is contained in:
AH-Yussef
2024-01-24 10:44:36 +00:00
parent cdb2612357
commit ed95da37dc
3 changed files with 39 additions and 17 deletions
@@ -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,
+17 -15
View File
@@ -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)
@@ -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):