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()
 |