Source code for terminusgps.django.validators

from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _

VALID_COUNTRY_CODES = ("+1", "+52")


[docs] def validate_e164_phone_number(value: str) -> None: """Raises :py:exc:`~django.core.exceptions.ValidationError` if the value is not a valid `E.164 <https://en.wikipedia.org/wiki/E.164>`_ formatted phone number.""" if not value.startswith("+"): raise ValidationError( _("E.164 phone number must begin with a '+', got '%(char)s'."), code="invalid", params={"char": value[0]}, ) if " " in value: raise ValidationError( _("E.164 phone number cannot contain spaces, got '%(value)s'."), code="invalid", params={"value": value}, ) if "-" in value: raise ValidationError( _("E.164 phone number cannot contain hyphens, got '%(value)s'."), code="invalid", params={"value": value}, ) if len(value) < 12: raise ValidationError( _( "E.164 phone number cannot be less than 12 characters in length, got %(len)s." ), code="invalid", params={"len": len(value)}, ) if len(value) > 15: raise ValidationError( _( "E.164 phone number cannot be greater than 15 characters in length, got %(len)s." ), code="invalid", params={"len": len(value)}, ) country_code: str = value[:-10] area_code: str = value[-10:-7] subscriber_number: str = value[-7:] if len(country_code) < 2 or len(country_code) > 5: raise ValidationError( _( "E.164 phone number country code must be between 2 and 5 characters in length, got %(len)s." ), code="invalid", params={"len": len(country_code)}, ) if country_code not in VALID_COUNTRY_CODES: raise ValidationError( _( "E.164 phone number cannot contain an invalid country code, got '%(country_code)s'." ), code="invalid", params={"country_code": country_code}, ) if not len(area_code) == 3: raise ValidationError( _( "E.164 phone number must contain a 3-digit area code, got '%(area_code)s'." ), code="invalid", params={"area_code": area_code}, ) if not area_code.isdigit(): raise ValidationError( _("E.164 phone number must have a valid area code, got '%(area_code)s'"), code="invalid", params={"area_code": area_code}, ) if not len(subscriber_number) == 7: raise ValidationError( _( "E.164 phone number must contain a 7-digit subscriber number, got '%(subscriber_number)s'." ), code="invalid", params={"subscriber_number": subscriber_number}, ) if not subscriber_number.isdigit(): raise ValidationError( _( "E.164 phone number must have a valid subscriber number, got '%(subscriber_number)s'" ), code="invalid", params={"subscriber_number": subscriber_number}, )