Skip to content

Commit 5daabf1

Browse files
committed
Merge code changes from upstream r557
1 parent c338bb2 commit 5daabf1

2 files changed

Lines changed: 64 additions & 34 deletions

File tree

python/phonenumbers/phonenumberutil.py

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -932,48 +932,52 @@ def format_number_for_mobile_dialing(numobj, region_calling_from, with_formattin
932932
numobj_no_ext = PhoneNumber()
933933
numobj_no_ext.merge_from(numobj)
934934
numobj_no_ext.extension = None
935-
numobj_type = number_type(numobj_no_ext)
936935
region_code = region_code_for_country_code(country_calling_code)
937-
if region_code == "CO" and region_calling_from == "CO":
938-
if numobj_type == PhoneNumberType.FIXED_LINE:
936+
937+
formatted_number = ""
938+
if region_calling_from == region_code:
939+
numobj_type = number_type(numobj_no_ext)
940+
is_fixed_line_or_mobile = ((numobj_type == PhoneNumberType.FIXED_LINE) or
941+
(numobj_type == PhoneNumberType.MOBILE) or
942+
(numobj_type == PhoneNumberType.FIXED_LINE_OR_MOBILE))
943+
# Carrier codes may be needed in some countries. We handle this here.
944+
if region_code == "CO" and numobj_type == PhoneNumberType.FIXED_LINE:
939945
formatted_number = format_national_number_with_carrier_code(numobj_no_ext,
940946
_COLOMBIA_MOBILE_TO_FIXED_LINE_PREFIX)
947+
elif region_code == "BR" and is_fixed_line_or_mobile:
948+
if numobj_no_ext.preferred_domestic_carrier_code is not None:
949+
formatted_number = format_national_number_with_preferred_carrier_code(numobj_no_ext, "")
950+
else:
951+
# Brazilian fixed line and mobile numbers need to be dialed with a
952+
# carrier code when called within Brazil. Without that, most of
953+
# the carriers won't connect the call. Because of that, we return
954+
# an empty string here.
955+
formatted_number = ""
941956
else:
942-
# E164 doesn't work at all when dialling within Colombia
943-
formatted_number = format_number(numobj_no_ext, PhoneNumberFormat.NATIONAL)
944-
elif region_code == "PE" and region_calling_from == "PE":
945-
# In Peru, numbers cannot be dialled using E164 format from a mobile
946-
# phone for Movistar. Instead they must be dialled in national
947-
# format.
948-
formatted_number = format_number(numobj_no_ext, PhoneNumberFormat.NATIONAL)
949-
elif (region_code == "AE" and region_calling_from == "AE" and
950-
numobj_type == PhoneNumberType.UAN):
951-
# In the United Arab Emirates, numbers with the prefix 600 (UAN
952-
# numbers) cannot be dialled using E164 format. Instead they must be
953-
# dialled in national format.
954-
formatted_number = format_number(numobj_no_ext, PhoneNumberFormat.NATIONAL)
955-
elif (region_code == "BR" and region_calling_from == "BR" and
956-
((numobj_type == PhoneNumberType.FIXED_LINE) or
957-
(numobj_type == PhoneNumberType.MOBILE) or
958-
(numobj_type == PhoneNumberType.FIXED_LINE_OR_MOBILE))):
959-
if numobj_no_ext.preferred_domestic_carrier_code is not None:
960-
formatted_number = format_national_number_with_preferred_carrier_code(numobj_no_ext, "")
961-
else:
962-
# Brazilian fixed line and mobile numbers need to be dialed with a
963-
# carrier code when called within Brazil. Without that, most of
964-
# the carriers won't connect the call. Because of that, we return
965-
# an empty string here.
966-
formatted_number = ""
957+
# For NANPA countries, non-geographical countries, and Mexican
958+
# fixed line and mobile numbers, we output international format
959+
# for numbers that can be dialed internationally as that always
960+
# works.
961+
if ((country_calling_code == _NANPA_COUNTRY_CODE or
962+
region_code == REGION_CODE_FOR_NON_GEO_ENTITY or
963+
(region_code == "MX" and is_fixed_line_or_mobile)) and
964+
_can_be_internationally_dialled(numobj_no_ext)):
965+
# MX fixed line and mobile numbers should always be formatted
966+
# in international format, even when dialed within MX. For
967+
# national format to work, a carrier code needs to be used,
968+
# and the correct carrier code depends on if the caller and
969+
# callee are from the same local area. It is trickier to get
970+
# that to work correctly than using international format,
971+
# which is tested to work fine on all carriers.
972+
formatted_number = format_number(numobj_no_ext, PhoneNumberFormat.INTERNATIONAL)
973+
else:
974+
formatted_number = format_number(numobj_no_ext, PhoneNumberFormat.NATIONAL)
967975
elif _can_be_internationally_dialled(numobj_no_ext):
968976
if with_formatting:
969977
return format_number(numobj_no_ext, PhoneNumberFormat.INTERNATIONAL)
970978
else:
971979
return format_number(numobj_no_ext, PhoneNumberFormat.E164)
972-
else:
973-
if region_calling_from == region_code:
974-
formatted_number = format_number(numobj_no_ext, PhoneNumberFormat.NATIONAL)
975-
else:
976-
formatted_number = ""
980+
977981
if with_formatting:
978982
return formatted_number
979983
else:

python/tests/phonenumberutiltest.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -631,8 +631,23 @@ def testFormatWithPreferredCarrierCode(self):
631631
phonenumbers.format_national_number_with_preferred_carrier_code(usNumber, "15"))
632632

633633
def testFormatNumberForMobileDialing(self):
634+
# Numbers are normally dialed in national format in-country, and
635+
# international format from outside the country.
636+
self.assertEqual("030123456",
637+
phonenumbers.format_number_for_mobile_dialing(DE_NUMBER, "DE", False))
638+
self.assertEqual("+4930123456",
639+
phonenumbers.format_number_for_mobile_dialing(DE_NUMBER, "CH", False))
640+
deNumberWithExtn = PhoneNumber()
641+
deNumberWithExtn.merge_from(DE_NUMBER)
642+
deNumberWithExtn.extension = "1234"
643+
self.assertEqual("030123456",
644+
phonenumbers.format_number_for_mobile_dialing(deNumberWithExtn, "DE", False))
645+
self.assertEqual("+4930123456",
646+
phonenumbers.format_number_for_mobile_dialing(deNumberWithExtn, "CH", False))
647+
634648
# US toll free numbers are marked as noInternationalDialling in the
635-
# test metadata for testing purposes.
649+
# test metadata for testing purposes.For such numbers, we expect
650+
# nothing to be returned when the region code is not the same one.
636651
self.assertEqual("800 253 0000",
637652
phonenumbers.format_number_for_mobile_dialing(US_TOLLFREE, "US",
638653
True)) # Keep formatting
@@ -677,6 +692,17 @@ def testFormatNumberForMobileDialing(self):
677692
self.assertEqual("600123456",
678693
phonenumbers.format_number_for_mobile_dialing(AE_UAN, "AE", False))
679694

695+
self.assertEqual("+523312345678",
696+
phonenumbers.format_number_for_mobile_dialing(MX_NUMBER1, "MX", False))
697+
self.assertEqual("+523312345678",
698+
phonenumbers.format_number_for_mobile_dialing(MX_NUMBER1, "US", False))
699+
700+
# Non-geographical numbers should always be dialed in international format.
701+
self.assertEqual("+80012345678",
702+
phonenumbers.format_number_for_mobile_dialing(INTERNATIONAL_TOLL_FREE, "US", False))
703+
self.assertEqual("+80012345678",
704+
phonenumbers.format_number_for_mobile_dialing(INTERNATIONAL_TOLL_FREE, "001", False))
705+
680706
# Python version extra tests
681707
number = PhoneNumber()
682708
number.merge_from(XY_NUMBER)

0 commit comments

Comments
 (0)