Validate phone numbers

This commit is contained in:
Julien Palard 2023-01-26 22:36:04 +01:00 committed by Gitea
parent 787bc67794
commit d7bb1d77f5
6 changed files with 165 additions and 68 deletions

View File

@ -1,5 +1,6 @@
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
from django.conf import settings
from django.urls import reverse from django.urls import reverse
from django.core.validators import MaxValueValidator, MinValueValidator from django.core.validators import MaxValueValidator, MinValueValidator
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
@ -14,6 +15,7 @@ from django.utils.html import escape, format_html
from autoslug import AutoSlugField from autoslug import AutoSlugField
from colorful.fields import RGBColorField from colorful.fields import RGBColorField
from functools import partial from functools import partial
import phonenumbers
import uuid import uuid
from datetime import timedelta from datetime import timedelta
@ -483,12 +485,22 @@ class Activity(models.Model):
return self.name return self.name
def validate_phone_number(phone_number: str):
try:
number = phonenumbers.parse(phone_number, region=settings.DEFAULT_PHONE_REGION)
except phonenumbers.phonenumberutil.NumberParseException as err:
raise ValidationError(str(err))
else:
if not phonenumbers.is_valid_number(number):
raise ValidationError(_("Invalid phone number"))
class Volunteer(PonyConfModel): class Volunteer(PonyConfModel):
site = models.ForeignKey(Site, on_delete=models.CASCADE) site = models.ForeignKey(Site, on_delete=models.CASCADE)
name = models.CharField(max_length=128, verbose_name=_('Your Name')) name = models.CharField(max_length=128, verbose_name=_('Your Name'))
email = models.EmailField(verbose_name=_('Email')) email = models.EmailField(verbose_name=_('Email'))
token = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) token = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
phone_number = models.CharField(max_length=64, blank=True, default='', verbose_name=_('Phone number')) phone_number = models.CharField(max_length=64, blank=True, default='', verbose_name=_('Phone number'), validators=[validate_phone_number])
sms_prefered = models.BooleanField(default=False, verbose_name=_('SMS prefered')) sms_prefered = models.BooleanField(default=False, verbose_name=_('SMS prefered'))
language = models.CharField(max_length=10, blank=True) language = models.CharField(max_length=10, blank=True)
notes = models.TextField(default='', blank=True, verbose_name=_('Notes'), notes = models.TextField(default='', blank=True, verbose_name=_('Notes'),

View File

@ -2,6 +2,8 @@ from ponyconf.settings import *
SECRET_KEY = 'CHANGE ME' SECRET_KEY = 'CHANGE ME'
DEFAULT_PHONE_REGION = "FR"
DEBUG = False DEBUG = False
LOGGING = { LOGGING = {

View File

@ -128,7 +128,7 @@ LANGUAGES = [
] ]
LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'en-us'
DEFAULT_PHONE_REGION = "US"
LOCALE_PATHS = [ LOCALE_PATHS = [
os.path.join(BASE_DIR, 'locale'), os.path.join(BASE_DIR, 'locale'),
] ]
@ -171,4 +171,3 @@ SERVER_EMAIL = 'ponyconf@example.com'
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost' EMAIL_HOST = 'localhost'
EMAIL_PORT = 25 EMAIL_PORT = 25

View File

@ -1,47 +1,99 @@
# #
# This file is autogenerated by pip-compile # This file is autogenerated by pip-compile with Python 3.9
# To update, run: # by the following command:
# #
# pip-compile requirements-dev.in # pip-compile requirements-dev.in
# #
asgiref==3.2.10 # via django asgiref==3.2.10
backcall==0.2.0 # via ipython # via django
bleach==3.1.5 # via -r requirements.in backcall==0.2.0
chardet==3.0.4 # via -r requirements.in # via ipython
decorator==4.4.2 # via ipython, traitlets bleach==3.1.5
django-appconf==1.0.4 # via django-select2 # via -r requirements.in
django-autoslug==1.9.8 # via -r requirements.in chardet==3.0.4
django-bootstrap3==14.1.0 # via -r requirements.in # via -r requirements.in
django-colorful==1.3 # via -r requirements.in decorator==4.4.2
django-crispy-forms==1.9.2 # via -r requirements.in # via
django-debug-toolbar==2.2 # via -r requirements-dev.in # ipython
django-extensions==3.0.4 # via -r requirements-dev.in # traitlets
django-select2==7.4.2 # via -r requirements.in django==3.1
django==3.1 # via -r requirements.in, django-appconf, django-bootstrap3, django-colorful, django-debug-toolbar, django-select2 # via
icalendar==4.0.6 # via -r requirements.in # -r requirements.in
importlib-metadata==1.7.0 # via django-bootstrap3, markdown # django-appconf
ipython-genutils==0.2.0 # via traitlets # django-bootstrap3
ipython==7.16.1 # via -r requirements-dev.in # django-colorful
jedi==0.17.2 # via ipython # django-debug-toolbar
jinja2==2.11.2 # via -r requirements.in # django-select2
markdown==3.2.2 # via -r requirements.in django-appconf==1.0.4
markupsafe==1.1.1 # via jinja2 # via django-select2
packaging==20.4 # via bleach django-autoslug==1.9.8
parso==0.7.1 # via jedi # via -r requirements.in
pexpect==4.8.0 # via ipython django-bootstrap3==14.1.0
pickleshare==0.7.5 # via ipython # via -r requirements.in
prompt-toolkit==3.0.5 # via ipython django-colorful==1.3
ptyprocess==0.6.0 # via pexpect # via -r requirements.in
pygments==2.6.1 # via ipython django-crispy-forms==1.9.2
pyparsing==2.4.7 # via packaging # via -r requirements.in
python-dateutil==2.8.1 # via icalendar django-debug-toolbar==2.2
pytz==2020.1 # via django, icalendar # via -r requirements-dev.in
six==1.15.0 # via bleach, packaging, python-dateutil, traitlets django-extensions==3.0.4
sqlparse==0.3.1 # via django, django-debug-toolbar # via -r requirements-dev.in
traitlets==4.3.3 # via ipython django-select2==7.4.2
wcwidth==0.2.5 # via prompt-toolkit # via -r requirements.in
webencodings==0.5.1 # via bleach icalendar==4.0.6
zipp==3.1.0 # via importlib-metadata # via -r requirements.in
ipython==7.16.1
# via -r requirements-dev.in
ipython-genutils==0.2.0
# via traitlets
jedi==0.17.2
# via ipython
jinja2==2.11.2
# via -r requirements.in
markdown==3.2.2
# via -r requirements.in
markupsafe==1.1.1
# via jinja2
packaging==20.4
# via bleach
parso==0.7.1
# via jedi
pexpect==4.8.0
# via ipython
phonenumbers==8.13.4
# via -r requirements.in
pickleshare==0.7.5
# via ipython
prompt-toolkit==3.0.5
# via ipython
ptyprocess==0.6.0
# via pexpect
pygments==2.6.1
# via ipython
pyparsing==2.4.7
# via packaging
python-dateutil==2.8.1
# via icalendar
pytz==2020.1
# via
# django
# icalendar
six==1.15.0
# via
# bleach
# packaging
# python-dateutil
# traitlets
sqlparse==0.3.1
# via
# django
# django-debug-toolbar
traitlets==4.3.3
# via ipython
wcwidth==0.2.5
# via prompt-toolkit
webencodings==0.5.1
# via bleach
# The following packages are considered to be unsafe in a requirements file: # The following packages are considered to be unsafe in a requirements file:
# setuptools # setuptools

View File

@ -11,3 +11,4 @@ bleach
chardet chardet
icalendar icalendar
jinja2 jinja2
phonenumbers

View File

@ -1,29 +1,60 @@
# #
# This file is autogenerated by pip-compile # This file is autogenerated by pip-compile with Python 3.9
# To update, run: # by the following command:
# #
# pip-compile # pip-compile
# #
asgiref==3.2.10 # via django asgiref==3.2.10
bleach==3.1.5 # via -r requirements.in # via django
chardet==3.0.4 # via -r requirements.in bleach==3.1.5
django-appconf==1.0.4 # via django-select2 # via -r requirements.in
django-autoslug==1.9.8 # via -r requirements.in chardet==3.0.4
django-bootstrap3==14.1.0 # via -r requirements.in # via -r requirements.in
django-colorful==1.3 # via -r requirements.in django==3.1
django-crispy-forms==1.9.2 # via -r requirements.in # via
django-select2==7.4.2 # via -r requirements.in # -r requirements.in
django==3.1 # via -r requirements.in, django-appconf, django-bootstrap3, django-colorful, django-select2 # django-appconf
icalendar==4.0.6 # via -r requirements.in # django-bootstrap3
importlib-metadata==1.7.0 # via django-bootstrap3, markdown # django-colorful
jinja2==2.11.2 # via -r requirements.in # django-select2
markdown==3.2.2 # via -r requirements.in django-appconf==1.0.4
markupsafe==1.1.1 # via jinja2 # via django-select2
packaging==20.4 # via bleach django-autoslug==1.9.8
pyparsing==2.4.7 # via packaging # via -r requirements.in
python-dateutil==2.8.1 # via icalendar django-bootstrap3==14.1.0
pytz==2020.1 # via django, icalendar # via -r requirements.in
six==1.15.0 # via bleach, packaging, python-dateutil django-colorful==1.3
sqlparse==0.3.1 # via django # via -r requirements.in
webencodings==0.5.1 # via bleach django-crispy-forms==1.9.2
zipp==3.1.0 # via importlib-metadata # via -r requirements.in
django-select2==7.4.2
# via -r requirements.in
icalendar==4.0.6
# via -r requirements.in
jinja2==2.11.2
# via -r requirements.in
markdown==3.2.2
# via -r requirements.in
markupsafe==1.1.1
# via jinja2
packaging==20.4
# via bleach
phonenumbers==8.13.4
# via -r requirements.in
pyparsing==2.4.7
# via packaging
python-dateutil==2.8.1
# via icalendar
pytz==2020.1
# via
# django
# icalendar
six==1.15.0
# via
# bleach
# packaging
# python-dateutil
sqlparse==0.3.1
# via django
webencodings==0.5.1
# via bleach