Last active
August 21, 2021 17:05
-
-
Save mo-mughrabi/54b0284274e7d8412ff1a220b17b2ef2 to your computer and use it in GitHub Desktop.
MENAPhoneNumberProvider Faker for Kuwait & Saudi Arabia Teleco Range
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# a faker provider for handling generating phone numbers for Kuwait & Saudi Arabia | |
class MENAPhoneNumberProvider(faker.providers.BaseProvider): | |
""" Returns a determined list of numbers from MENA Region | |
*Saudi Arabia* | |
+966 50/53/55 XXX XXXX - Saudi Telecom Company | |
+966 51 XXX XXXX - Bravo Telecom (Push-to-talk Motorola) | |
+966 58/59 XXX XXXX - Zain Group | |
+966 54/56 XXX XXXX - Mobily | |
+966 570/571/572 XX XXXX Virgin Mobile | |
+966 576/577/578 XXXXXX Lebara Mobile | |
Source: https://en.wikipedia.org/wiki/Telephone_numbers_in_Saudi_Arabia | |
*Kuwait* | |
+9655 was Stc numbers | |
+9656 was Ooredoo Telecom - Formerly Wataniya Telecom numbers | |
+9659 was Zain numbers | |
Source: https://en.wikipedia.org/wiki/Telephone_numbers_in_Kuwait | |
""" | |
length: typing.Dict[typing.Text] = { | |
"+965": 8, | |
"+966": 9 | |
} | |
telecom_ranges: typing.Dict[typing.List] = { | |
# Saudi Arabia Mobile Telecom Ranges | |
"+966": [ | |
"50", "53", "55", "51", "58", "59", "59", "54", "56", | |
"570", "571", "572", "576", "577", "578" | |
], | |
# Kuwait Mobile Telecom Ranges | |
"+965": [ | |
"5", "6", "9" | |
] | |
} | |
def phone_number(self): | |
country_code = self.random_element(elements=self.telecom_ranges.keys()) | |
prefix = self.random_element(elements=self.telecom_ranges[country_code]) | |
random_number = self.random_number(digits=self.length[country_code] - len(prefix), ) | |
return f"{country_code}{prefix}{random_number}" | |
factory.Faker.add_provider(MENAPhoneNumberProvider) | |
# Example Use Case | |
class UserFactory(factory.django.DjangoModelFactory): | |
phone_number = factory.Faker("phone_number") | |
class Meta: | |
model = User | |
def __new__(cls, *args, **kwargs) -> UserFactory.Meta.model: | |
return super().__new__(*args, **kwargs) | |
# Important note: If you are using PhoneNumber as field type make sure to add following to your settings.py | |
# This will still accept international format numbers but will validate MENA format better | |
PHONENUMBER_DB_FORMAT = "NATIONAL" | |
PHONENUMBER_DEFAULT_REGION = "KW" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment