diff --git a/partner_second_lastname/README.rst b/partner_second_lastname/README.rst index 7a70668d7cc..2d0c9576bdc 100644 --- a/partner_second_lastname/README.rst +++ b/partner_second_lastname/README.rst @@ -1,7 +1,3 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - ======================== Partner second last name ======================== @@ -17,7 +13,7 @@ Partner second last name .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpartner--contact-lightgray.png?logo=github @@ -59,6 +55,8 @@ Settings > Configuration > General settings: Robert' - Firstname Lastname SecondLastname: For example 'Robert Anderson Lavarge' +- Lastname, Firstname SecondLastname: For example 'Anderson, Robert + Lavarge' After applying the changes, you can recalculate all partners name clicking "Recalculate names" button. Note: This process could take so @@ -113,6 +111,9 @@ Contributors - Nikul Chaudhary - Manuel Regidor - Eduardo de Miguel (``Moduon ``\ \_\_) +- `Heliconia Solutions Pvt. Ltd. `__ + + - Bhavesh Heliconia Maintainers ----------- diff --git a/partner_second_lastname/models/res_config_settings.py b/partner_second_lastname/models/res_config_settings.py index d3f59054a1d..b951be50611 100644 --- a/partner_second_lastname/models/res_config_settings.py +++ b/partner_second_lastname/models/res_config_settings.py @@ -14,7 +14,10 @@ def _partner_names_order_selection(self): "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] + result = [(k, new_labels[k]) if k in new_labels else (k, v) for k, v in options] + # Separate format where only the first lastname is followed by a comma + result.append(("last_first_comma2", "Lastname, Firstname SecondLastname")) + return result def _partners_for_recalculating(self): return self.env["res.partner"].search( diff --git a/partner_second_lastname/models/res_partner.py b/partner_second_lastname/models/res_partner.py index 93c2974806f..e97319f5af2 100644 --- a/partner_second_lastname/models/res_partner.py +++ b/partner_second_lastname/models/res_partner.py @@ -23,8 +23,12 @@ def name_fields_in_vals(self, vals): return super().name_fields_in_vals(vals) or vals.get("lastname2") def get_extra_default_copy_values(self): - """Override to add '(copy)' suffix to lastname2 instead of lastname.""" - if self._get_names_order() == "first_last": + """Override to add '(copy)' suffix to lastname2 instead of lastname. + + For formats where lastname2 is the trailing part of the displayed + name (first_last, last_first_comma2), the copy marker belongs there. + """ + if self._get_names_order() in ("first_last", "last_first_comma2"): return { "lastname2": _("%s (copy)", self.lastname2) if self.lastname2 @@ -36,8 +40,8 @@ def get_extra_default_copy_values(self): 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. + We have 2 lastnames, so lastnames and firstname will be separated + differently depending on the configured name order. """ order = self._get_names_order() names = list() @@ -48,6 +52,16 @@ def _get_computed_name(self, lastname, firstname, lastname2=None): names.append(lastname) if lastname2: names.append(lastname2) + elif order == "last_first_comma2": + # Format: "Lastname, Firstname SecondLastname" + if lastname: + names.append(lastname) + if names and (firstname or lastname2): + names[0] = names[0] + "," + if firstname: + names.append(firstname) + if lastname2: + names.append(lastname2) else: if lastname: names.append(lastname) @@ -100,6 +114,21 @@ def _get_inverse_name(self, name, is_company=False): return result order = self._get_names_order() + + if order == "last_first_comma2": + # Expected input: "Lastname, Firstname SecondLastname" + # Split on comma to isolate the first lastname from the rest. + clean = self._get_whitespace_cleaned_name(name, comma=True) + parts = clean.split(",", 1) + result["lastname"] = parts[0].strip() or False + if len(parts) > 1: + rest = parts[1].strip() + rest_parts = rest.split(" ", 1) + result["firstname"] = rest_parts[0] or False + if len(rest_parts) > 1: + result["lastname2"] = rest_parts[1] or False + return result + result.update(super()._get_inverse_name(name, is_company)) if order in ("first_last", "last_first_comma"): diff --git a/partner_second_lastname/readme/CONFIGURE.md b/partner_second_lastname/readme/CONFIGURE.md index 57155a17cb7..096fdfd20c9 100644 --- a/partner_second_lastname/readme/CONFIGURE.md +++ b/partner_second_lastname/readme/CONFIGURE.md @@ -7,6 +7,8 @@ Settings \> Configuration \> General settings: Robert' - Firstname Lastname SecondLastname: For example 'Robert Anderson Lavarge' +- Lastname, Firstname SecondLastname: For example 'Anderson, Robert + Lavarge' After applying the changes, you can recalculate all partners name clicking "Recalculate names" button. Note: This process could take so diff --git a/partner_second_lastname/readme/CONTRIBUTORS.md b/partner_second_lastname/readme/CONTRIBUTORS.md index c76ccc30bb0..472d68191f7 100644 --- a/partner_second_lastname/readme/CONTRIBUTORS.md +++ b/partner_second_lastname/readme/CONTRIBUTORS.md @@ -4,3 +4,5 @@ - Nikul Chaudhary \<\> - Manuel Regidor \<\> - Eduardo de Miguel (`Moduon `__) +- [Heliconia Solutions Pvt. Ltd.](https://www.heliconia.io) + - Bhavesh Heliconia diff --git a/partner_second_lastname/static/description/index.html b/partner_second_lastname/static/description/index.html index bfb2b4aabaf..577aa683ac0 100644 --- a/partner_second_lastname/static/description/index.html +++ b/partner_second_lastname/static/description/index.html @@ -3,7 +3,7 @@ -README.rst +Partner second last name -
+
+

Partner second last name

- - -Odoo Community Association - -
-

Partner second last name

-

Beta License: AGPL-3 OCA/partner-contact Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/partner-contact Translate me on Weblate Try me on Runboat

This module was written to extend the functionality of partner_firstname to support having a second lastname for contact partners.

@@ -397,7 +392,7 @@

Partner second last name

-

Configuration

+

Configuration

You can configure some common name patterns for the inverse function in Settings > Configuration > General settings:

    @@ -407,6 +402,8 @@

    Configuration

    Robert’
  • Firstname Lastname SecondLastname: For example ‘Robert Anderson Lavarge’
  • +
  • Lastname, Firstname SecondLastname: For example ‘Anderson, Robert +Lavarge’

After applying the changes, you can recalculate all partners name clicking “Recalculate names” button. Note: This process could take so @@ -417,7 +414,7 @@

Configuration

methods can be overridden to change the format specified above.

-

Usage

+

Usage

To use this module, you need to:

  • Edit any partner’s form.
  • @@ -432,7 +429,7 @@

    Usage

    fail for you easily in some corner cases.

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -440,15 +437,15 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Tecnativa
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -472,6 +473,5 @@

Maintainers

-
diff --git a/partner_second_lastname/tests/test_config.py b/partner_second_lastname/tests/test_config.py index 8202744d827..30d361ed273 100644 --- a/partner_second_lastname/tests/test_config.py +++ b/partner_second_lastname/tests/test_config.py @@ -30,3 +30,9 @@ def test_first_last(self): self.wizard.set_values() self.wizard.action_recalculate_partners_name() self.assertEqual(self.partner.name, "First Last Second") + + def test_last_first_comma2(self): + self.wizard.partner_names_order = "last_first_comma2" + self.wizard.set_values() + self.wizard.action_recalculate_partners_name() + self.assertEqual(self.partner.name, "Last, First Second") diff --git a/partner_second_lastname/tests/test_multiple_names.py b/partner_second_lastname/tests/test_multiple_names.py index 2d37a47f9ec..911f3b4d148 100644 --- a/partner_second_lastname/tests/test_multiple_names.py +++ b/partner_second_lastname/tests/test_multiple_names.py @@ -39,3 +39,10 @@ def test_recalculate_names(self): "last_first_comma", f"{lastname} {lastname2}, {firstname}", ) + self.assert_name( + config_settings, + partner, + vals, + "last_first_comma2", + f"{lastname}, {firstname} {lastname2}", + ) diff --git a/partner_second_lastname/tests/test_name.py b/partner_second_lastname/tests/test_name.py index 81cd39ef6ea..5f9fcf9ba89 100644 --- a/partner_second_lastname/tests/test_name.py +++ b/partner_second_lastname/tests/test_name.py @@ -177,6 +177,31 @@ def test_lastname_firstname_only_wo_comma(self): "name": f"{self.lastname} {self.firstname}", } + def test_firstname_last_comma2(self): + """Create a person using the 'last_first_comma2' order. + Expected name format: Lastname, Firstname SecondLastname""" + self.env["ir.config_parameter"].set_param( + "partner_names_order", "last_first_comma2" + ) + self.template = "%(last1)s, %(first)s %(last2)s" + self.params = { + "is_company": False, + "name": f"{self.lastname}, {self.firstname} {self.lastname2}", + } + + def test_lastname_firstname_only_comma2(self): + """Create a person with only lastname and firstname under the + 'last_first_comma2' order, i.e. no second lastname provided.""" + self.env["ir.config_parameter"].set_param( + "partner_names_order", "last_first_comma2" + ) + self.lastname2 = False + self.template = "%(last1)s, %(first)s" + self.params = { + "is_company": False, + "name": f"{self.lastname}, {self.firstname}", + } + def test_separately(self): """Create a person setting separately all fields.""" self.params = {