Skip to content

Instantly share code, notes, and snippets.

@mo-mughrabi
Last active August 21, 2021 17:05
Show Gist options
  • Save mo-mughrabi/54b0284274e7d8412ff1a220b17b2ef2 to your computer and use it in GitHub Desktop.
Save mo-mughrabi/54b0284274e7d8412ff1a220b17b2ef2 to your computer and use it in GitHub Desktop.
MENAPhoneNumberProvider Faker for Kuwait & Saudi Arabia Teleco Range
# 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