Validate phone numbers
This commit is contained in:
parent
787bc67794
commit
d7bb1d77f5
|
@ -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'),
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -11,3 +11,4 @@ bleach
|
||||||
chardet
|
chardet
|
||||||
icalendar
|
icalendar
|
||||||
jinja2
|
jinja2
|
||||||
|
phonenumbers
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue