Antonio Espinosa
9 years ago
committed by
Jordi Ballester
8 changed files with 218 additions and 113 deletions
-
39partner_second_lastname/README.rst
-
9partner_second_lastname/__openerp__.py
-
97partner_second_lastname/models.py
-
6partner_second_lastname/models/__init__.py
-
29partner_second_lastname/models/base_config_settings.py
-
113partner_second_lastname/models/res_partner.py
-
31partner_second_lastname/tests/test_name.py
-
7partner_second_lastname/tests/test_onchange.py
@ -1,97 +0,0 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
# © 2015 Grupo ESOC Ingeniería de Servicios, S.L.U. |
|||
|
|||
from openerp import api, fields, models |
|||
from openerp.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 _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. |
|||
""" |
|||
names = list() |
|||
|
|||
if lastname: |
|||
names.append(lastname) |
|||
if lastname2: |
|||
names.append(lastname2) |
|||
if names and firstname: |
|||
names[-1] = names[-1] + "," |
|||
if firstname: |
|||
names.append(firstname) |
|||
|
|||
return u" ".join(names) |
|||
|
|||
@api.one |
|||
@api.depends("firstname", "lastname", "lastname2") |
|||
def _compute_name(self): |
|||
"""Write :attr:`~.name` according to splitted data.""" |
|||
self.name = self._get_computed_name(self.lastname, |
|||
self.firstname, |
|||
self.lastname2) |
|||
|
|||
@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 = dict(), dict() |
|||
for key, value in parts.iteritems(): |
|||
(before if value else after)[key] = value |
|||
self.update(before) |
|||
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 |
|||
if is_company or not name: |
|||
parts = [False, name or False, False] |
|||
|
|||
# The comma separates the firstname |
|||
elif "," in name: |
|||
lastnames, firstname = name.split(",", 1) |
|||
parts = [firstname.strip()] + lastnames.split(" ", 1) |
|||
|
|||
# Without comma, the user wrote the firstname first |
|||
else: |
|||
parts = name.split(" ", 2) |
|||
|
|||
while len(parts) < 3: |
|||
parts.append(False) |
|||
|
|||
return {"firstname": parts[0], |
|||
"lastname": parts[1], |
|||
"lastname2": parts[2]} |
|||
|
|||
@api.one |
|||
@api.constrains("firstname", "lastname", "lastname2") |
|||
def _check_name(self): |
|||
"""Ensure at least one name is set.""" |
|||
try: |
|||
super(ResPartner, self)._check_name() |
|||
except exceptions.EmptyNamesError as error: |
|||
if not self.lastname2: |
|||
raise error |
|||
|
|||
@api.one |
|||
@api.onchange("firstname", "lastname", "lastname2") |
|||
def _onchange_subnames(self): |
|||
"""Trigger onchange with :attr:`~.lastname2` too.""" |
|||
super(ResPartner, self)._onchange_subnames() |
@ -0,0 +1,6 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2015 Antiun Ingenieria S.L. - Antonio Espinosa |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
from . import base_config_settings |
|||
from . import res_partner |
@ -0,0 +1,29 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2015 Antiun Ingenieria S.L. - Antonio Espinosa |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
from openerp import models, api |
|||
|
|||
|
|||
class BaseConfigSettings(models.TransientModel): |
|||
_inherit = 'base.config.settings' |
|||
|
|||
def _partner_names_order_selection(self): |
|||
options = super( |
|||
BaseConfigSettings, self)._partner_names_order_selection() |
|||
new_labels = { |
|||
'last_first': 'Lastname SecondLastname Firstname', |
|||
'last_first_comma': 'Lastname SecondLastname, Firstname', |
|||
'first_last': 'Firstname Lastname SecondLastname', |
|||
} |
|||
return [(k, new_labels[k]) if k in new_labels else (k, v) |
|||
for k, v in options] |
|||
|
|||
@api.multi |
|||
def _partners_for_recalculating(self): |
|||
return self.env['res.partner'].search([ |
|||
('is_company', '=', False), |
|||
'|', '&', ('firstname', '!=', False), ('lastname', '!=', False), |
|||
'|', '&', ('firstname', '!=', False), ('lastname2', '!=', False), |
|||
'&', ('lastname', '!=', False), ('lastname2', '!=', False), |
|||
]) |
@ -0,0 +1,113 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
# © 2015 Grupo ESOC Ingeniería de Servicios, S.L.U. |
|||
# © 2015 Antiun Ingenieria S.L. - Antonio Espinosa |
|||
|
|||
from openerp import api, fields, models |
|||
from openerp.addons.partner_firstname.models import exceptions |
|||
|
|||
|
|||
class ResPartner(models.Model): |
|||
"""Adds a second last name.""" |
|||
|
|||
_inherit = "res.partner" |
|||
|
|||
lastname2 = fields.Char("Second last name", oldname="lastname_second") |
|||
|
|||
@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 u" ".join(names) |
|||
|
|||
@api.one |
|||
@api.depends("firstname", "lastname", "lastname2") |
|||
def _compute_name(self): |
|||
"""Write :attr:`~.name` according to splitted data.""" |
|||
self.name = self._get_computed_name( |
|||
self.lastname, self.firstname, self.lastname2) |
|||
|
|||
@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 = dict(), dict() |
|||
for key, value in parts.iteritems(): |
|||
(before if value else after)[key] = value |
|||
if any([before[k] != self[k] for k in before.keys()]): |
|||
self.update(before) |
|||
if any([after[k] != self[k] for k in 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, |
|||
'lastname2': 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['lastname2'] = 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['lastname2'] = parts[1] |
|||
return result |
|||
|
|||
@api.one |
|||
@api.constrains("firstname", "lastname", "lastname2") |
|||
def _check_name(self): |
|||
"""Ensure at least one name is set.""" |
|||
try: |
|||
super(ResPartner, self)._check_name() |
|||
except exceptions.EmptyNamesError as error: |
|||
if not self.lastname2: |
|||
raise error |
|||
|
|||
@api.one |
|||
@api.onchange("firstname", "lastname", "lastname2") |
|||
def _onchange_subnames(self): |
|||
"""Trigger onchange with :attr:`~.lastname2` too.""" |
|||
super(ResPartner, self)._onchange_subnames() |
Write
Preview
Loading…
Cancel
Save
Reference in new issue