You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
3.8 KiB

  1. # -*- coding: utf-8 -*-
  2. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  3. # © 2015 Grupo ESOC Ingeniería de Servicios, S.L.U.
  4. # © 2015 Antiun Ingenieria S.L. - Antonio Espinosa
  5. from openerp import api, fields, models
  6. from openerp.addons.partner_firstname.models import exceptions
  7. class ResPartner(models.Model):
  8. """Adds a second last name."""
  9. _inherit = "res.partner"
  10. lastname2 = fields.Char("Second last name", oldname="lastname_second")
  11. @api.model
  12. def _get_computed_name(self, lastname, firstname, lastname2=None):
  13. """Compute the name combined with the second lastname too.
  14. We have 2 lastnames, so lastnames and firstname will be separated by a
  15. comma.
  16. """
  17. order = self._get_names_order()
  18. names = list()
  19. if order == 'first_last':
  20. if firstname:
  21. names.append(firstname)
  22. if lastname:
  23. names.append(lastname)
  24. if lastname2:
  25. names.append(lastname2)
  26. else:
  27. if lastname:
  28. names.append(lastname)
  29. if lastname2:
  30. names.append(lastname2)
  31. if names and firstname and order == 'last_first_comma':
  32. names[-1] = names[-1] + ","
  33. if firstname:
  34. names.append(firstname)
  35. return u" ".join(names)
  36. @api.one
  37. @api.depends("firstname", "lastname", "lastname2")
  38. def _compute_name(self):
  39. """Write :attr:`~.name` according to splitted data."""
  40. self.name = self._get_computed_name(self.lastname,
  41. self.firstname,
  42. self.lastname2)
  43. @api.one
  44. def _inverse_name(self):
  45. """Try to revert the effect of :meth:`._compute_name`."""
  46. parts = self._get_inverse_name(self.name, self.is_company)
  47. # Avoid to hit :meth:`~._check_name` with all 3 fields being ``False``
  48. before, after = dict(), dict()
  49. for key, value in parts.iteritems():
  50. (before if value else after)[key] = value
  51. self.update(before)
  52. self.update(after)
  53. @api.model
  54. def _get_inverse_name(self, name, is_company=False):
  55. """Compute the inverted name.
  56. - If the partner is a company, save it in the lastname.
  57. - Otherwise, make a guess.
  58. """
  59. # Company name goes to the lastname
  60. result = {
  61. 'firstname': False,
  62. 'lastname': name or False,
  63. 'lastname2': False,
  64. }
  65. if not is_company and name:
  66. order = self._get_names_order()
  67. result = super(ResPartner, self)._get_inverse_name(
  68. name, is_company)
  69. parts = []
  70. if order == 'last_first':
  71. if result['firstname']:
  72. parts = result['firstname'].split(" ", 1)
  73. while len(parts) < 2:
  74. parts.append(False)
  75. result['lastname2'] = parts[0]
  76. result['firstname'] = parts[1]
  77. else:
  78. if result['lastname']:
  79. parts = result['lastname'].split(" ", 1)
  80. while len(parts) < 2:
  81. parts.append(False)
  82. result['lastname'] = parts[0]
  83. result['lastname2'] = parts[1]
  84. return result
  85. @api.one
  86. @api.constrains("firstname", "lastname", "lastname2")
  87. def _check_name(self):
  88. """Ensure at least one name is set."""
  89. try:
  90. super(ResPartner, self)._check_name()
  91. except exceptions.EmptyNamesError as error:
  92. if not self.lastname2:
  93. raise error
  94. @api.one
  95. @api.onchange("firstname", "lastname", "lastname2")
  96. def _onchange_subnames(self):
  97. """Trigger onchange with :attr:`~.lastname2` too."""
  98. super(ResPartner, self)._onchange_subnames()