From 53885e41867653ad45ca3aef55886c280240b76a Mon Sep 17 00:00:00 2001 From: "Antoine (ande)" Date: Thu, 8 Feb 2024 16:53:17 +0100 Subject: [PATCH] [FIX] phone_validation: brazilian phone numbers Current behavior: Brazilian phone numbers are not managed correctly following the 2016 changes in Brazil. (Adding a 9 to mobile phone numbers) Fix: Patched the phonenumbers library, adding a 9 at the right place for mobile phone numbers. opw-3694150 closes odoo/odoo#159641 X-original-commit: a4f884456180769e0e7db7152d40ddcfb497b090 Signed-off-by: Thibault Delavallee (tde) --- .../lib/phonenumbers_patch/__init__.py | 12 ++++++++++++ .../tests/test_phonenumbers_patch.py | 16 ++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/addons/phone_validation/lib/phonenumbers_patch/__init__.py b/addons/phone_validation/lib/phonenumbers_patch/__init__.py index aefdebdd434..e79f6d96a8e 100644 --- a/addons/phone_validation/lib/phonenumbers_patch/__init__.py +++ b/addons/phone_validation/lib/phonenumbers_patch/__init__.py @@ -27,5 +27,17 @@ try: # loading updated region_CI.py from current directory # https://github.com/daviddrysdale/python-phonenumbers/blob/v8.12.32/python/phonenumbers/data/region_CI.py phonenumbers.phonemetadata.PhoneMetadata.register_region_loader('CI', _local_load_region) + # MONKEY PATCHING phonemetadata to fix Brazilian phonenumbers following 2016 changes + def _hook_load_region(code): + phonenumbers.data._load_region(code) + if code == 'BR': + phonenumbers.data.region_BR.PHONE_METADATA_BR.intl_number_format.append( + phonenumbers.phonemetadata.NumberFormat( + pattern='(\\d{2})(\\d{4})(\\d{4})', + format='\\1 9\\2-\\3', + leading_digits_pattern=['(?:[14689][1-9]|2[12478]|3[1-578]|5[13-5]|7[13-579][689])'], + ) + ) + phonenumbers.phonemetadata.PhoneMetadata.register_region_loader('BR', _hook_load_region) except ImportError: pass diff --git a/addons/phone_validation/tests/test_phonenumbers_patch.py b/addons/phone_validation/tests/test_phonenumbers_patch.py index f4376a107ba..a1d4d3321ce 100644 --- a/addons/phone_validation/tests/test_phonenumbers_patch.py +++ b/addons/phone_validation/tests/test_phonenumbers_patch.py @@ -11,6 +11,22 @@ from odoo.tools.parse_version import parse_version from odoo.addons.phone_validation.lib import phonenumbers_patch class TestPhonenumbersPatch(BaseCase): + def test_region_BR_monkey_patch(self): + """ Test Brazil phone numbers patch for added 9 in mobile numbers + It should not be added for fixed lines numbers""" + if not phonenumbers: + self.skipTest('Cannot test without phonenumbers module installed.') + + # Mobile number => 9 should be added + parsed = phonenumbers.parse('11 6123 4567', region="BR") + formatted = phonenumbers.format_number(parsed, phonenumbers.PhoneNumberFormat.INTERNATIONAL) + self.assertEqual(formatted, '+55 11 96123-4567') + + # Fixed line => 9 should not be added + parsed = phonenumbers.parse('11 2345 6789', region="BR") + formatted = phonenumbers.format_number(parsed, phonenumbers.PhoneNumberFormat.INTERNATIONAL) + self.assertEqual(formatted, '+55 11 2345-6789') + def test_region_CI_monkey_patch(self): """Test if the patch is apply on the good version of the lib And test some phonenumbers"""