Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/phonenumber_field/formfields.py: 34%
38 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1import phonenumbers
2from django.conf import settings
3from django.core import validators
4from django.core.exceptions import ValidationError
5from django.forms.fields import CharField
6from django.utils.text import format_lazy
7from django.utils.translation import gettext_lazy as _
9from phonenumber_field.phonenumber import to_python, validate_region
10from phonenumber_field.validators import validate_international_phonenumber
11from phonenumber_field.widgets import RegionalPhoneNumberWidget
14class PhoneNumberField(CharField):
15 default_validators = [validate_international_phonenumber]
16 widget = RegionalPhoneNumberWidget
18 def __init__(self, *args, region=None, widget=None, **kwargs):
19 """
20 :keyword str region: 2-letter country code as defined in ISO 3166-1.
21 When not supplied, defaults to :setting:`PHONENUMBER_DEFAULT_REGION`
22 :keyword django.forms.Widget widget: defaults to
23 :class:`~phonenumber_field.widgets.RegionalPhoneNumberWidget`
24 """
25 validate_region(region)
26 self.region = region or getattr(settings, "PHONENUMBER_DEFAULT_REGION", None)
28 if widget is None:
29 try:
30 widget = self.widget(region=self.region)
31 except TypeError:
32 widget = self.widget()
34 super().__init__(*args, widget=widget, **kwargs)
35 self.widget.input_type = "tel"
37 if "invalid" not in self.error_messages:
38 if self.region:
39 number = phonenumbers.example_number(self.region)
40 example_number = to_python(number).as_national
41 # Translators: {example_number} is a national phone number.
42 error_message = _(
43 "Enter a valid phone number (e.g. {example_number}) "
44 "or a number with an international call prefix."
45 )
46 else:
47 example_number = "+12125552368" # Ghostbusters
48 # Translators: {example_number} is an international phone number.
49 error_message = _("Enter a valid phone number (e.g. {example_number}).")
50 self.error_messages["invalid"] = format_lazy(
51 error_message, example_number=example_number
52 )
54 def to_python(self, value):
55 phone_number = to_python(value, region=self.region)
57 if phone_number in validators.EMPTY_VALUES:
58 return self.empty_value
60 if phone_number and not phone_number.is_valid():
61 raise ValidationError(self.error_messages["invalid"])
63 return phone_number