diff --git a/cfp/models.py b/cfp/models.py index d233574..0c14ec8 100644 --- a/cfp/models.py +++ b/cfp/models.py @@ -1,5 +1,6 @@ from django.contrib.auth.models import User from django.contrib.sites.models import Site +from django.conf import settings from django.urls import reverse from django.core.validators import MaxValueValidator, MinValueValidator from django.core.exceptions import ValidationError @@ -14,6 +15,7 @@ from django.utils.html import escape, format_html from autoslug import AutoSlugField from colorful.fields import RGBColorField from functools import partial +import phonenumbers import uuid from datetime import timedelta @@ -483,12 +485,22 @@ class Activity(models.Model): 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): site = models.ForeignKey(Site, on_delete=models.CASCADE) name = models.CharField(max_length=128, verbose_name=_('Your Name')) email = models.EmailField(verbose_name=_('Email')) 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')) language = models.CharField(max_length=10, blank=True) notes = models.TextField(default='', blank=True, verbose_name=_('Notes'), diff --git a/ponyconf/local_settings.py.example b/ponyconf/local_settings.py.example index 7450c91..14e5ac5 100644 --- a/ponyconf/local_settings.py.example +++ b/ponyconf/local_settings.py.example @@ -2,6 +2,8 @@ from ponyconf.settings import * SECRET_KEY = 'CHANGE ME' +DEFAULT_PHONE_REGION = "FR" + DEBUG = False LOGGING = { diff --git a/ponyconf/settings.py b/ponyconf/settings.py index c41d590..84dd1bd 100644 --- a/ponyconf/settings.py +++ b/ponyconf/settings.py @@ -128,7 +128,7 @@ LANGUAGES = [ ] LANGUAGE_CODE = 'en-us' - +DEFAULT_PHONE_REGION = "US" LOCALE_PATHS = [ os.path.join(BASE_DIR, 'locale'), ] @@ -171,4 +171,3 @@ SERVER_EMAIL = 'ponyconf@example.com' EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'localhost' EMAIL_PORT = 25 - diff --git a/requirements-dev.txt b/requirements-dev.txt index 5b667c3..06ef82e 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,47 +1,99 @@ # -# This file is autogenerated by pip-compile -# To update, run: +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: # # pip-compile requirements-dev.in # -asgiref==3.2.10 # via django -backcall==0.2.0 # via ipython -bleach==3.1.5 # via -r requirements.in -chardet==3.0.4 # via -r requirements.in -decorator==4.4.2 # via ipython, traitlets -django-appconf==1.0.4 # via django-select2 -django-autoslug==1.9.8 # via -r requirements.in -django-bootstrap3==14.1.0 # via -r requirements.in -django-colorful==1.3 # via -r requirements.in -django-crispy-forms==1.9.2 # via -r requirements.in -django-debug-toolbar==2.2 # via -r requirements-dev.in -django-extensions==3.0.4 # via -r requirements-dev.in -django-select2==7.4.2 # via -r requirements.in -django==3.1 # via -r requirements.in, django-appconf, django-bootstrap3, django-colorful, django-debug-toolbar, django-select2 -icalendar==4.0.6 # via -r requirements.in -importlib-metadata==1.7.0 # via django-bootstrap3, markdown -ipython-genutils==0.2.0 # via traitlets -ipython==7.16.1 # via -r requirements-dev.in -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 -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 -zipp==3.1.0 # via importlib-metadata +asgiref==3.2.10 + # via django +backcall==0.2.0 + # via ipython +bleach==3.1.5 + # via -r requirements.in +chardet==3.0.4 + # via -r requirements.in +decorator==4.4.2 + # via + # ipython + # traitlets +django==3.1 + # via + # -r requirements.in + # django-appconf + # django-bootstrap3 + # django-colorful + # django-debug-toolbar + # django-select2 +django-appconf==1.0.4 + # via django-select2 +django-autoslug==1.9.8 + # via -r requirements.in +django-bootstrap3==14.1.0 + # via -r requirements.in +django-colorful==1.3 + # via -r requirements.in +django-crispy-forms==1.9.2 + # via -r requirements.in +django-debug-toolbar==2.2 + # via -r requirements-dev.in +django-extensions==3.0.4 + # via -r requirements-dev.in +django-select2==7.4.2 + # via -r requirements.in +icalendar==4.0.6 + # 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: # setuptools diff --git a/requirements.in b/requirements.in index 1e44517..2b49bd0 100644 --- a/requirements.in +++ b/requirements.in @@ -11,3 +11,4 @@ bleach chardet icalendar jinja2 +phonenumbers diff --git a/requirements.txt b/requirements.txt index c78917b..18cc1e9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,29 +1,60 @@ # -# This file is autogenerated by pip-compile -# To update, run: +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: # # pip-compile # -asgiref==3.2.10 # via django -bleach==3.1.5 # via -r requirements.in -chardet==3.0.4 # via -r requirements.in -django-appconf==1.0.4 # via django-select2 -django-autoslug==1.9.8 # via -r requirements.in -django-bootstrap3==14.1.0 # via -r requirements.in -django-colorful==1.3 # via -r requirements.in -django-crispy-forms==1.9.2 # via -r requirements.in -django-select2==7.4.2 # via -r requirements.in -django==3.1 # via -r requirements.in, django-appconf, django-bootstrap3, django-colorful, django-select2 -icalendar==4.0.6 # via -r requirements.in -importlib-metadata==1.7.0 # via django-bootstrap3, markdown -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 -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 -zipp==3.1.0 # via importlib-metadata +asgiref==3.2.10 + # via django +bleach==3.1.5 + # via -r requirements.in +chardet==3.0.4 + # via -r requirements.in +django==3.1 + # via + # -r requirements.in + # django-appconf + # django-bootstrap3 + # django-colorful + # django-select2 +django-appconf==1.0.4 + # via django-select2 +django-autoslug==1.9.8 + # via -r requirements.in +django-bootstrap3==14.1.0 + # via -r requirements.in +django-colorful==1.3 + # via -r requirements.in +django-crispy-forms==1.9.2 + # 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