diff --git a/addons/phone_validation/lib/phonenumbers_patch/__init__.py b/addons/phone_validation/lib/phonenumbers_patch/__init__.py index e79f6d96a8e..dc8dc8b991d 100644 --- a/addons/phone_validation/lib/phonenumbers_patch/__init__.py +++ b/addons/phone_validation/lib/phonenumbers_patch/__init__.py @@ -17,16 +17,24 @@ from odoo.tools.parse_version import parse_version + +def _local_load_region(code): + __import__("region_%s" % code, globals(), locals(), + fromlist=["PHONE_METADATA_%s" % code], level=1) + + try: import phonenumbers # MONKEY PATCHING phonemetadata of Ivory Coast if phonenumbers is too old if parse_version('7.6.1') <= parse_version(phonenumbers.__version__) < parse_version('8.12.32'): - def _local_load_region(code): - __import__("region_%s" % code, globals(), locals(), - fromlist=["PHONE_METADATA_%s" % code], level=1) # 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 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: + # https://github.com/daviddrysdale/python-phonenumbers/blob/v8.12.43/python/phonenumbers/data/region_PA.py + phonenumbers.phonemetadata.PhoneMetadata.register_region_loader('PA', _local_load_region) # MONKEY PATCHING phonemetadata to fix Brazilian phonenumbers following 2016 changes def _hook_load_region(code): phonenumbers.data._load_region(code) diff --git a/addons/phone_validation/lib/phonenumbers_patch/region_PA.py b/addons/phone_validation/lib/phonenumbers_patch/region_PA.py new file mode 100644 index 00000000000..739546fca24 --- /dev/null +++ b/addons/phone_validation/lib/phonenumbers_patch/region_PA.py @@ -0,0 +1,13 @@ +"""Auto-generated file, do not edit by hand. PA metadata""" +from ..phonemetadata import NumberFormat, PhoneNumberDesc, PhoneMetadata + +PHONE_METADATA_PA = PhoneMetadata(id='PA', country_code=507, international_prefix='00', + general_desc=PhoneNumberDesc(national_number_pattern='(?:00800|8\\d{3})\\d{6}|[68]\\d{7}|[1-57-9]\\d{6}', possible_length=(7, 8, 10, 11)), + fixed_line=PhoneNumberDesc(national_number_pattern='(?:1(?:0\\d|1[479]|2[37]|3[0137]|4[17]|5[05]|6[58]|7[0167]|8[258]|9[1389])|2(?:[0235-79]\\d|1[0-7]|4[013-9]|8[02-9])|3(?:[089]\\d|1[0-7]|2[0-5]|33|4[0-79]|5[05]|6[068]|7[0-8])|4(?:00|3[0-579]|4\\d|7[0-57-9])|5(?:[01]\\d|2[0-7]|[56]0|79)|7(?:0[09]|2[0-26-8]|3[03]|4[04]|5[05-9]|6[056]|7[0-24-9]|8[6-9]|90)|8(?:09|2[89]|3\\d|4[0-24-689]|5[014]|8[02])|9(?:0[5-9]|1[0135-8]|2[036-9]|3[35-79]|40|5[0457-9]|6[05-9]|7[04-9]|8[35-8]|9\\d))\\d{4}', example_number='2001234', possible_length=(7,)), + mobile=PhoneNumberDesc(national_number_pattern='(?:1[16]1|21[89]|6\\d{3}|8(?:1[01]|7[23]))\\d{4}', example_number='61234567', possible_length=(7, 8)), + toll_free=PhoneNumberDesc(national_number_pattern='800\\d{4,5}|(?:00800|800\\d)\\d{6}', example_number='8001234', possible_length=(7, 8, 10, 11)), + premium_rate=PhoneNumberDesc(national_number_pattern='(?:8(?:22|55|60|7[78]|86)|9(?:00|81))\\d{4}', example_number='8601234', possible_length=(7,)), + number_format=[NumberFormat(pattern='(\\d{3})(\\d{4})', format='\\1-\\2', leading_digits_pattern=['[1-57-9]']), + NumberFormat(pattern='(\\d{4})(\\d{4})', format='\\1-\\2', leading_digits_pattern=['[68]']), + NumberFormat(pattern='(\\d{3})(\\d{3})(\\d{4})', format='\\1 \\2 \\3', leading_digits_pattern=['8'])], + mobile_number_portable_region=True) diff --git a/addons/phone_validation/tests/test_phonenumbers_patch.py b/addons/phone_validation/tests/test_phonenumbers_patch.py index a1d4d3321ce..9626708bf10 100644 --- a/addons/phone_validation/tests/test_phonenumbers_patch.py +++ b/addons/phone_validation/tests/test_phonenumbers_patch.py @@ -33,16 +33,37 @@ class TestPhonenumbersPatch(BaseCase): if not phonenumbers: self.skipTest('Cannot test without phonenumbers module installed.') # MONKEY PATCHING phonemetadata of Ivory Coast if phonenumbers is too old - if parse_version('7.6.1') <= parse_version(phonenumbers.__version__) < parse_version('8.12.32'): - # 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 ivory coast phone number without error - parsed_phonenumber_1 = phonenumbers.parse("20 25/35-51 ", region="CI", keep_raw_input=True) - self.assertEqual(parsed_phonenumber_1.national_number, 20253551, "The national part of the phonenumber should be 22522586") - self.assertEqual(parsed_phonenumber_1.country_code, 225, "The country code of Ivory Coast is 225") + if not parse_version('7.6.1') <= parse_version(phonenumbers.__version__) < parse_version('8.12.32'): + self.assertNotEqual( + phonenumbers.PhoneMetadata._region_available['CI'], + phonenumbers_patch._local_load_region, + "The code should not be monkey patched with phonenumbers > 8.12.32.", + ) + # check that you can load a new ivory coast phone number without error + parsed_phonenumber_1 = phonenumbers.parse("20 25/35-51 ", region="CI", keep_raw_input=True) + self.assertEqual(parsed_phonenumber_1.national_number, 20253551, "The national part of the phonenumber should be 22522586") + self.assertEqual(parsed_phonenumber_1.country_code, 225, "The country code of Ivory Coast is 225") - parsed_phonenumber_2 = phonenumbers.parse("+225 22 52 25 86 ", region="CI", keep_raw_input=True) - 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") - else: - self.assertFalse(hasattr(phonenumbers_patch, '_local_load_region'), - "The code should not be monkey patched with phonenumbers > 8.12.32.") + parsed_phonenumber_2 = phonenumbers.parse("+225 22 52 25 86 ", region="CI", keep_raw_input=True) + 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_PA_monkey_patch(self): + """Makes sure that patch for Panama's phone numbers work""" + if not phonenumbers: + self.skipTest('Cannot test without phonenumbers module installed.') + # MONKEY PATCHING phonemetadata of Panama if phonenumbers is too old + if parse_version(phonenumbers.__version__) >= parse_version('8.12.43'): + self.assertNotEqual( + phonenumbers.PhoneMetadata._region_available['PA'], + phonenumbers_patch._local_load_region, + "The phonenumbers module should not get patched after version 8.12.43", + ) + # Mobile phone number without country code + parsed = phonenumbers.parse('6198 5462', region='PA') + self.assertTrue(phonenumbers.is_valid_number(parsed)) + self.assertEqual(parsed.country_code, 507) + # Landline phone number with country code + parsed = phonenumbers.parse('+507 833 8744') + self.assertTrue(phonenumbers.is_valid_number(parsed)) + self.assertEqual(parsed.national_number, 8338744)