partner-contact/partner_second_lastname/models/res_partner.py
2024-10-01 07:51:46 +02:00

141 lines
4.6 KiB
Python

# Copyright 2015 Grupo ESOC Ingeniería de Servicios, S.L.U. - Jairo Llopis
# Copyright 2015 Antiun Ingenieria S.L. - Antonio Espinosa
# Copyright 2017 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from flectra import _, api, fields, models
from flectra.addons.partner_firstname import exceptions
class ResPartner(models.Model):
"""Adds a second last name."""
_inherit = "res.partner"
lastname2 = fields.Char(
"Second last name",
)
@api.model
def name_fields_in_vals(self, vals):
"""Override to check if `lastname2` is in vals."""
return super().name_fields_in_vals(vals) or vals.get("lastname2")
def get_extra_default_copy_values(self, order):
"""Override to add '(copy)' suffix to lastname2 instead of lastname."""
if order == "first_last":
return {
"lastname2": _("%s (copy)", self.lastname2)
if self.lastname2
else _("(copy)")
}
return super().get_extra_default_copy_values(order)
@api.model
def _get_computed_name(self, lastname, firstname, lastname2=None):
"""Compute the name combined with the second lastname too.
We have 2 lastnames, so lastnames and firstname will be separated by a
comma.
"""
order = self._get_names_order()
names = list()
if order == "first_last":
if firstname:
names.append(firstname)
if lastname:
names.append(lastname)
if lastname2:
names.append(lastname2)
else:
if lastname:
names.append(lastname)
if lastname2:
names.append(lastname2)
if names and firstname and order == "last_first_comma":
names[-1] = names[-1] + ","
if firstname:
names.append(firstname)
return " ".join(names)
@api.depends("firstname", "lastname", "lastname2")
def _compute_name(self):
"""Write :attr:`~.name` according to splitted data."""
for partner in self:
partner.name = self._get_computed_name(
partner.lastname,
partner.firstname,
partner.lastname2,
)
def _inverse_name(self):
"""Try to revert the effect of :meth:`._compute_name`."""
self.ensure_one()
parts = self._get_inverse_name(self.name, self.is_company)
# Avoid to hit :meth:`~._check_name` with all 3 fields being ``False``
before, after = {}, {}
for key, value in parts.items():
(before if value else after)[key] = value
if any([before[k] != self[k] for k in list(before.keys())]):
self.update(before)
if any([after[k] != self[k] for k in list(after.keys())]):
self.update(after)
@api.model
def _get_inverse_name(self, name, is_company=False):
"""Compute the inverted name.
- If the partner is a company, save it in the lastname.
- Otherwise, make a guess.
"""
result = {
"firstname": False,
"lastname": name or False,
"lastname2": False,
}
# Company name goes to the lastname
if not name or is_company:
return result
order = self._get_names_order()
result.update(super()._get_inverse_name(name, is_company))
if order in ("first_last", "last_first_comma"):
parts = self._split_part("lastname", result)
if parts:
result.update({"lastname": parts[0], "lastname2": " ".join(parts[1:])})
else:
parts = self._split_part("firstname", result)
if parts:
result.update(
{"firstname": parts[-1], "lastname2": " ".join(parts[:-1])}
)
return result
def _split_part(self, name_part, name_split):
"""Split a given part of a name.
:param name_split: The parts of the name
:type dict
:param name_part: The part to split
:type str
"""
name = name_split.get(name_part, False)
parts = name.split(" ", 1) if name else []
if not name or len(parts) < 2:
return False
return parts
@api.constrains("firstname", "lastname", "lastname2")
def _check_name(self):
"""Ensure at least one name is set."""
try:
return super()._check_name()
except exceptions.EmptyNamesError:
for partner in self:
if not partner.lastname2:
raise