113 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
| # -*- coding: utf-8 -*-
 | |
| # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
 | |
| # 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
 | |
| 
 | |
| from odoo import api, fields, models
 | |
| from odoo.addons.partner_firstname import exceptions
 | |
| 
 | |
| 
 | |
| class ResPartner(models.Model):
 | |
|     """Adds a Midname."""
 | |
|     _inherit = "res.partner"
 | |
| 
 | |
|     midname = fields.Char("Midname", oldname="lastname_second")
 | |
| 
 | |
|     @api.model
 | |
|     def _get_computed_name(self, lastname, firstname, midname=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 midname:
 | |
|                 names.append(midname)
 | |
|         else:
 | |
|             if lastname:
 | |
|                 names.append(lastname)
 | |
|             if midname:
 | |
|                 names.append(midname)
 | |
|             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", "midname")
 | |
|     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.midname,
 | |
|             )
 | |
| 
 | |
|     @api.one
 | |
|     def _inverse_name(self):
 | |
|         """Try to revert the effect of :meth:`._compute_name`."""
 | |
|         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.
 | |
|         """
 | |
|         # Company name goes to the lastname
 | |
|         result = {
 | |
|             'firstname': False,
 | |
|             'lastname': name or False,
 | |
|             'midname': False,
 | |
|         }
 | |
|         if not is_company and name:
 | |
|             order = self._get_names_order()
 | |
|             result = super(ResPartner, self)._get_inverse_name(
 | |
|                 name, is_company)
 | |
|             parts = []
 | |
|             if order == 'last_first':
 | |
|                 if result['firstname']:
 | |
|                     parts = result['firstname'].split(" ", 1)
 | |
|                 while len(parts) < 2:
 | |
|                     parts.append(False)
 | |
|                 result['midname'] = parts[0]
 | |
|                 result['firstname'] = parts[1]
 | |
|             else:
 | |
|                 if result['lastname']:
 | |
|                     parts = result['lastname'].split(" ", 1)
 | |
|                 while len(parts) < 2:
 | |
|                     parts.append(False)
 | |
|                 result['lastname'] = parts[0]
 | |
|                 result['midname'] = parts[1]
 | |
|         return result
 | |
| 
 | |
|     @api.constrains("firstname", "lastname", "midname")
 | |
|     def _check_name(self):
 | |
|         """Ensure at least one name is set."""
 | |
|         try:
 | |
|             super(ResPartner, self)._check_name()
 | |
|         except exceptions.EmptyNamesError:
 | |
|             for partner in self:
 | |
|                 if not partner.midname:
 | |
|                     raise
 | |
| 
 | |
|     @api.onchange("firstname", "lastname", "midname")
 | |
|     def _onchange_subnames(self):
 | |
|         """Trigger onchange with :attr:`~.midname` too."""
 | |
|         super(ResPartner, self)._onchange_subnames()
 |