From 7a7d6d0353e849efd9542f7aaa442a672b249a16 Mon Sep 17 00:00:00 2001 From: aktr-odoo Date: Mon, 11 Mar 2024 13:24:48 +0000 Subject: [PATCH] [FIX] phone_validation: update phone number parsing for mauritius When the user adds a valid Mauritius phone number, it is not correctly parsed by the phonenumbers library, resulting in a user error while sending a WhatsApp message to that number. Steps to produce: - Create a new contact with the Mauritius country selected. - Add a phone number (e.g., '+23057654321'). - Try to send WhatsApp messages using this phone number. - This will throw an Invalid number error. Problem: `phonenumbers==8.12.1` python library is used in odoo for parsing phone numbers. The `8.12.1` version is too old and cannot parse Mauritius phone numbers correctly. Solution: The `8.12.13` version accurately parses Mauritius phone numbers. Currently, The latest version of the phonenumbers library is `8.13.31`. Hence, the latest code from the latest version of the phonenumbers library is monkey-patched into the system. Task - 3799632 closes odoo/odoo#161039 X-original-commit: c3743b5fcfb5d67c442e5eee9f084b684e4baac3 Signed-off-by: Thibault Delavallee (tde) --- .../lib/phonenumbers_patch/__init__.py | 5 ++++ .../lib/phonenumbers_patch/region_MU.py | 14 +++++++++++ .../tests/test_phonenumbers_patch.py | 24 +++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 addons/phone_validation/lib/phonenumbers_patch/region_MU.py diff --git a/addons/phone_validation/lib/phonenumbers_patch/__init__.py b/addons/phone_validation/lib/phonenumbers_patch/__init__.py index dc8dc8b991d..326383f118f 100644 --- a/addons/phone_validation/lib/phonenumbers_patch/__init__.py +++ b/addons/phone_validation/lib/phonenumbers_patch/__init__.py @@ -30,6 +30,11 @@ 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 of Mauritius if phonenumbers is too old + if parse_version(phonenumbers.__version__) < parse_version('8.12.13'): + # loading updated region_MU.py from current directory + # https://github.com/daviddrysdale/python-phonenumbers/blob/v8.13.31/python/phonenumbers/data/region_MU.py + phonenumbers.phonemetadata.PhoneMetadata.register_region_loader('MU', _local_load_region) # MONKEY PATCHING phonemetadata of Panama if phonenumbers is too old if parse_version(phonenumbers.__version__) < parse_version('8.12.43'): # region_PA.py in the current directory was copied from external source: diff --git a/addons/phone_validation/lib/phonenumbers_patch/region_MU.py b/addons/phone_validation/lib/phonenumbers_patch/region_MU.py new file mode 100644 index 00000000000..391aef7296c --- /dev/null +++ b/addons/phone_validation/lib/phonenumbers_patch/region_MU.py @@ -0,0 +1,14 @@ +"""Auto-generated file, do not edit by hand. MU metadata""" +from ..phonemetadata import NumberFormat, PhoneNumberDesc, PhoneMetadata + +PHONE_METADATA_MU = PhoneMetadata(id='MU', country_code=230, international_prefix='0(?:0|[24-7]0|3[03])', + general_desc=PhoneNumberDesc(national_number_pattern='(?:[57]|8\\d\\d)\\d{7}|[2-468]\\d{6}', possible_length=(7, 8, 10)), + fixed_line=PhoneNumberDesc(national_number_pattern='(?:2(?:[0346-8]\\d|1[0-7])|4(?:[013568]\\d|2[4-8])|54(?:[3-5]\\d|71)|6\\d\\d|8(?:14|3[129]))\\d{4}', example_number='54480123', possible_length=(7, 8)), + mobile=PhoneNumberDesc(national_number_pattern='5(?:4(?:2[1-389]|7[1-9])|87[15-8])\\d{4}|(?:5(?:2[5-9]|4[3-689]|[57]\\d|8[0-689]|9[0-8])|7(?:0[0-3]|3[013]))\\d{5}', example_number='52512345', possible_length=(8,)), + toll_free=PhoneNumberDesc(national_number_pattern='802\\d{7}|80[0-2]\\d{4}', example_number='8001234', possible_length=(7, 10)), + premium_rate=PhoneNumberDesc(national_number_pattern='30\\d{5}', example_number='3012345', possible_length=(7,)), + voip=PhoneNumberDesc(national_number_pattern='3(?:20|9\\d)\\d{4}', example_number='3201234', possible_length=(7,)), + preferred_international_prefix='020', + number_format=[NumberFormat(pattern='(\\d{3})(\\d{4})', format='\\1 \\2', leading_digits_pattern=['[2-46]|8[013]']), + NumberFormat(pattern='(\\d{4})(\\d{4})', format='\\1 \\2', leading_digits_pattern=['[57]']), + NumberFormat(pattern='(\\d{5})(\\d{5})', format='\\1 \\2', leading_digits_pattern=['8'])]) diff --git a/addons/phone_validation/tests/test_phonenumbers_patch.py b/addons/phone_validation/tests/test_phonenumbers_patch.py index 9626708bf10..fc37e924e84 100644 --- a/addons/phone_validation/tests/test_phonenumbers_patch.py +++ b/addons/phone_validation/tests/test_phonenumbers_patch.py @@ -48,6 +48,30 @@ class TestPhonenumbersPatch(BaseCase): self.assertEqual(parsed_phonenumber_2.national_number, 22522586, "The national part of the phonenumber should be 22522586") self.assertEqual(parsed_phonenumber_2.country_code, 225, "The country code of Ivory Coast is 225") + def test_region_MU_monkey_patch(self): + """Makes sure that patch for Mauritius phone numbers work""" + if not phonenumbers: + self.skipTest('Cannot test without phonenumbers module installed.') + + # check that _local_load_region is set to `odoo.addons.phone_validation.lib.phonenumbers_patch._local_load_region` + # check that you can load a new Mauritius phone number without error + for test_number, country_region, exp_national_number, exp_country_code in [ + ( + "+23057654321", "", 57654321, 230, + ), ( + "+2305 76/54 3-21 ", "", 57654321, 230, + ), ( + "57654321", "MU", 57654321, 230, + ), ( + "5 76/54 3-21 ", "MU", 57654321, 230, + ), + ]: + with self.subTest(exp_national_number=exp_national_number, exp_country_code=exp_country_code): + parsed_phonenumber = phonenumbers.parse(test_number, region=country_region, keep_raw_input=True) + self.assertTrue(phonenumbers.is_valid_number(parsed_phonenumber)) + self.assertEqual(parsed_phonenumber.national_number, exp_national_number) + self.assertEqual(parsed_phonenumber.country_code, exp_country_code) + def test_region_PA_monkey_patch(self): """Makes sure that patch for Panama's phone numbers work""" if not phonenumbers: