Skip to content

Commit

Permalink
Fix #255 - Add phone number validation to sign form (#292)
Browse files Browse the repository at this point in the history
* Fix #255 - Add django-phonenumber-field library and use it to validate Signature's phone + create test
  • Loading branch information
Benbb96 authored Aug 22, 2022
1 parent 935412e commit 45a36b2
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 2.2.28 on 2022-08-20 11:27

from django.db import migrations
import phonenumber_field.modelfields


class Migration(migrations.Migration):

dependencies = [
('petition', '0015_petitiontemplate_has_share_buttons'),
]

operations = [
migrations.AlterField(
model_name='signature',
name='phone',
field=phonenumber_field.modelfields.PhoneNumberField(blank=True, max_length=20, region=None, verbose_name='Phone number'),
),
]
5 changes: 3 additions & 2 deletions pytition/petition/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

from tinymce import models as tinymce_models
from colorfield.fields import ColorField
from phonenumber_field.modelfields import PhoneNumberField

from .helpers import sanitize_html

Expand Down Expand Up @@ -438,7 +439,7 @@ def moderate(self, do_moderate=True):
class Signature(models.Model):
first_name = models.CharField(max_length=50, verbose_name=ugettext_lazy("First name"))
last_name = models.CharField(max_length=50, verbose_name=ugettext_lazy("Last name"))
phone = models.CharField(max_length=20, blank=True, verbose_name=ugettext_lazy("Phone number"))
phone = PhoneNumberField(max_length=20, blank=True, verbose_name=ugettext_lazy("Phone number"))
email = models.EmailField(verbose_name=ugettext_lazy("Email address"))
confirmation_hash = models.CharField(max_length=128)
confirmed = models.BooleanField(default=False, verbose_name=ugettext_lazy("Confirmed"))
Expand Down Expand Up @@ -657,4 +658,4 @@ class ModerationReason(models.Model):

class Moderation(models.Model):
petition = models.ForeignKey(Petition, on_delete=models.CASCADE)
reason = models.ForeignKey(ModerationReason, blank=True, null=True, on_delete=models.SET_NULL)
reason = models.ForeignKey(ModerationReason, blank=True, null=True, on_delete=models.SET_NULL)
17 changes: 17 additions & 0 deletions pytition/petition/tests/tests_CreateSignatureView.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ def test_CreateSignaturePOSTOk(self):
'first_name': 'Alan',
'last_name': 'John',
'email': 'alan@john.org',
'phone': '0605040302',
'subscribed_to_mailinglist': False,
}
petition = Petition.objects.filter(published=True).first()
Expand All @@ -26,10 +27,26 @@ def test_CreateSignaturePOSTOk(self):
signature = Signature.objects.filter(petition=petition).first()
self.assertEqual(signature.confirmed, False)
self.assertEqual(signature.email, 'alan@john.org')
self.assertEqual(signature.phone, '+33605040302')
self.assertEqual(signature.first_name, 'Alan')
self.assertEqual(signature.last_name, 'John')
self.assertEqual(signature.subscribed_to_mailinglist, False)

def test_CreateSignaturePOSTNok(self):
data = {
'first_name': 'Alan',
'last_name': '',
'email': 'wrong-mail.org',
'phone': '060504030201',
}
petition = Petition.objects.filter(published=True).first()
response = self.client.post(reverse('create_signature', args=[petition.id]), data)
self.assertEqual(Signature.objects.count(), 0)
self.assertTemplateUsed(response, 'petition/petition_detail.html')
self.assertContains(response, 'This field is required')
self.assertContains(response, 'Enter a valid phone number')
self.assertContains(response, 'Enter a valid email address')

def test_CreateSignatureGETOk(self):
petition = Petition.objects.filter(published=True).first()
response = self.client.get(reverse('create_signature', args=[petition.id]), follow=True)
Expand Down
6 changes: 6 additions & 0 deletions pytition/pytition/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
'django.contrib.staticfiles',
'widget_tweaks',
'formtools',
'phonenumber_field',
]

MIDDLEWARE = [
Expand Down Expand Up @@ -275,3 +276,8 @@
MAINTENANCE_MODE_IGNORE_ADMIN_SITE = True
# Following setting prevents error 500, due to issue #76 of django_maintenance_mode
MAINTENANCE_MODE_STATE_FILE_PATH = os.path.join(BASE_DIR, 'maintenance_mode_state.txt')

# Set default region to France with regard to accepting phone numbers without international prefix.
# The +33 prefix for France is therefore optional, but it might be mandatory to add a prefix for
# other countries. This does not change anything for translations.
PHONENUMBER_DEFAULT_REGION = "FR"
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ django-colorfield==0.1.15
django-tinymce==2.8.0
django-mailer==1.2.6
django-maintenance-mode
django-phonenumber-field[phonenumbers]==6.3.0
requests~=2.20.0
mysqlclient==2.0.1
django-widget-tweaks==1.4.3
Expand Down

0 comments on commit 45a36b2

Please sign in to comment.