[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) <tde@openerp.com>
This commit is contained in:
aktr-odoo
2024-04-09 15:06:51 +00:00
parent f7688eb47e
commit 7a7d6d0353
3 changed files with 43 additions and 0 deletions
@@ -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:
@@ -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'])])
@@ -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: