From 318c037ccdf4d3d61f201a49c23499aedd897f6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Freitag?= Date: Thu, 14 Mar 2024 08:47:49 +0100 Subject: [PATCH] Add validate_phonenumber to allow short numbers --- phonenumber_field/validators.py | 12 ++++++++++++ tests/test_formfields.py | 21 +++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/phonenumber_field/validators.py b/phonenumber_field/validators.py index e4be52d..236be96 100644 --- a/phonenumber_field/validators.py +++ b/phonenumber_field/validators.py @@ -1,3 +1,4 @@ +import phonenumbers from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ @@ -10,3 +11,14 @@ def validate_international_phonenumber(value): raise ValidationError( _("The phone number entered is not valid."), code="invalid" ) + + +def validate_phonenumber(value): + phone_number = to_python(value) + if isinstance(phone_number, PhoneNumber) and not ( + phonenumbers.is_valid_number(phone_number) + or phonenumbers.is_valid_short_number(phone_number) + ): + raise ValidationError( + _("The phone number entered is not valid."), code="invalid" + ) diff --git a/tests/test_formfields.py b/tests/test_formfields.py index eafb860..89ea573 100644 --- a/tests/test_formfields.py +++ b/tests/test_formfields.py @@ -10,6 +10,7 @@ from phonenumber_field.formfields import PhoneNumberField, SplitPhoneNumberField from phonenumber_field.phonenumber import PhoneNumber +from phonenumber_field.validators import validate_phonenumber ALGERIAN_PHONE_NUMBER = "+213799136332" @@ -132,6 +133,16 @@ class PhoneNumberForm(forms.Form): form.errors, {"number": ["Enter a valid phone number (e.g. +12125552368)."]} ) + def test_validate_shortcode(self): + class ShortCodePhoneNumberField(PhoneNumberField): + default_validators = [validate_phonenumber] + + class TestForm(forms.Form): + phone = ShortCodePhoneNumberField(region="FR") + + form = TestForm({"phone": "1010"}) + self.assertIs(form.is_valid(), True) + class SplitPhoneNumberFormFieldTest(SimpleTestCase): def example_number(self, region_code: str) -> PhoneNumber: @@ -549,3 +560,13 @@ class TestForm(forms.Form): form = TestForm(phone_data) self.assertIs(form.is_valid(), False) self.assertEqual(form.errors["phone"], [error_message]) + + def test_validate_shortcode(self): + class ShortCodeSplitPhoneNumberField(SplitPhoneNumberField): + default_validators = [validate_phonenumber] + + class TestForm(forms.Form): + phone = ShortCodeSplitPhoneNumberField() + + form = TestForm({"phone_0": "FR", "phone_1": "1010"}) + self.assertIs(form.is_valid(), True)