From e9ad610a6f813a325a6ddf8f44778f1054e9caf2 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 18 Oct 2018 15:22:57 -0400 Subject: [PATCH 01/10] Update Alphabet validator to accept hyphens --- atst/forms/validators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atst/forms/validators.py b/atst/forms/validators.py index 142d55d1..c1113f06 100644 --- a/atst/forms/validators.py +++ b/atst/forms/validators.py @@ -52,7 +52,7 @@ def PhoneNumber(message="Please enter a valid 5 or 10 digit phone number."): def Alphabet(message="Please enter only letters."): def _alphabet(form, field): - match = re.match(r"[A-Za-z]+", field.data) + match = re.match(r"[A-Za-z\-]+", field.data) if not match or match.group() != field.data: raise ValidationError(message) From 7693aa03740815ddaa2f9b640d897fe53375e4dd Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 18 Oct 2018 15:38:22 -0400 Subject: [PATCH 02/10] Add apostrophe to Alphabet validator --- atst/forms/validators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atst/forms/validators.py b/atst/forms/validators.py index c1113f06..4d117d29 100644 --- a/atst/forms/validators.py +++ b/atst/forms/validators.py @@ -52,7 +52,7 @@ def PhoneNumber(message="Please enter a valid 5 or 10 digit phone number."): def Alphabet(message="Please enter only letters."): def _alphabet(form, field): - match = re.match(r"[A-Za-z\-]+", field.data) + match = re.match(r"[A-Za-z\-\']+", field.data) if not match or match.group() != field.data: raise ValidationError(message) From 9db981203d88fa8c587352269506fa6c4d7e0793 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 18 Oct 2018 15:52:53 -0400 Subject: [PATCH 03/10] Add all alpha characters to Alphabet validator --- atst/forms/validators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atst/forms/validators.py b/atst/forms/validators.py index 4d117d29..102dce05 100644 --- a/atst/forms/validators.py +++ b/atst/forms/validators.py @@ -52,7 +52,7 @@ def PhoneNumber(message="Please enter a valid 5 or 10 digit phone number."): def Alphabet(message="Please enter only letters."): def _alphabet(form, field): - match = re.match(r"[A-Za-z\-\']+", field.data) + match = re.match(r"[\w \,\.\'\-]+", field.data) if not match or match.group() != field.data: raise ValidationError(message) From 6a15a6ca7b30401a26f82448ee393f4aa9c04151 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 18 Oct 2018 16:35:28 -0400 Subject: [PATCH 04/10] Update tests to reflect new Alphabet validators --- tests/forms/test_validators.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/forms/test_validators.py b/tests/forms/test_validators.py index 3f3dd978..5e101b16 100644 --- a/tests/forms/test_validators.py +++ b/tests/forms/test_validators.py @@ -39,13 +39,13 @@ class TestPhoneNumber: class TestAlphabet: - @pytest.mark.parametrize("valid", ["a", "abcde"]) + @pytest.mark.parametrize("valid", ["a", "abcde", "hi mark", "cloud9", "niña"]) def test_Alphabet_accepts_letters(self, valid, dummy_form, dummy_field): validator = Alphabet() dummy_field.data = valid validator(dummy_form, dummy_field) - @pytest.mark.parametrize("invalid", ["", "hi mark", "cloud9"]) + @pytest.mark.parametrize("invalid", [""]) def test_Alphabet_rejects_non_letters(self, invalid, dummy_form, dummy_field): validator = Alphabet() dummy_field.data = invalid From 13763d8750a1b87cd2780218e0f7eef89e5ac0fb Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 23 Oct 2018 11:22:16 -0400 Subject: [PATCH 05/10] Change name of validator to Name because it is more descriptive --- atst/forms/ccpo_review.py | 10 +++++----- atst/forms/edit_user.py | 6 +++--- atst/forms/validators.py | 6 +++--- tests/forms/test_validators.py | 12 ++++++------ 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/atst/forms/ccpo_review.py b/atst/forms/ccpo_review.py index 2636d529..f2f930bb 100644 --- a/atst/forms/ccpo_review.py +++ b/atst/forms/ccpo_review.py @@ -3,7 +3,7 @@ from wtforms.fields import StringField, TextAreaField from wtforms.validators import Email, Optional from .forms import ValidatedForm -from .validators import Alphabet, PhoneNumber +from .validators import Name, PhoneNumber class CCPOReviewForm(ValidatedForm): @@ -12,9 +12,9 @@ class CCPOReviewForm(ValidatedForm): description="Provide instructions or notes for additional information that is necessary to approve the request here. The requestor may then re-submit the updated request or initiate contact outside of AT-AT if further discussion is required. This message will be shared with the person making the JEDI request..", ) fname_mao = StringField( - "First Name (optional)", validators=[Optional(), Alphabet()] + "First Name (optional)", validators=[Optional(), Name()] ) - lname_mao = StringField("Last Name (optional)", validators=[Optional(), Alphabet()]) + lname_mao = StringField("Last Name (optional)", validators=[Optional(), Name()]) email_mao = EmailField( "Mission Owner e-mail (optional)", validators=[Optional(), Email()] ) @@ -22,8 +22,8 @@ class CCPOReviewForm(ValidatedForm): "Mission Owner phone number (optional)", validators=[Optional(), PhoneNumber()] ) fname_ccpo = StringField( - "First Name (optional)", validators=[Optional(), Alphabet()] + "First Name (optional)", validators=[Optional(), Name()] ) lname_ccpo = StringField( - "Last Name (optional)", validators=[Optional(), Alphabet()] + "Last Name (optional)", validators=[Optional(), Name()] ) diff --git a/atst/forms/edit_user.py b/atst/forms/edit_user.py index a1b3763c..651c3c15 100644 --- a/atst/forms/edit_user.py +++ b/atst/forms/edit_user.py @@ -8,11 +8,11 @@ from .fields import SelectField from .forms import ValidatedForm from .data import SERVICE_BRANCHES -from .validators import Alphabet, DateRange, PhoneNumber +from .validators import Name, DateRange, PhoneNumber USER_FIELDS = { - "first_name": StringField("First Name", validators=[Alphabet()]), - "last_name": StringField("Last Name", validators=[Alphabet()]), + "first_name": StringField("First Name", validators=[Name()]), + "last_name": StringField("Last Name", validators=[Name()]), "email": EmailField( "E-mail Address", description="Enter your preferred contact e-mail address", diff --git a/atst/forms/validators.py b/atst/forms/validators.py index 102dce05..e769c677 100644 --- a/atst/forms/validators.py +++ b/atst/forms/validators.py @@ -50,13 +50,13 @@ def PhoneNumber(message="Please enter a valid 5 or 10 digit phone number."): return _is_phone_number -def Alphabet(message="Please enter only letters."): - def _alphabet(form, field): +def Name(message="Please enter only letters."): + def _name(form, field): match = re.match(r"[\w \,\.\'\-]+", field.data) if not match or match.group() != field.data: raise ValidationError(message) - return _alphabet + return _name def ListItemRequired(message="Please provide at least one.", empty_values=("", None)): diff --git a/tests/forms/test_validators.py b/tests/forms/test_validators.py index 5e101b16..44317aad 100644 --- a/tests/forms/test_validators.py +++ b/tests/forms/test_validators.py @@ -1,7 +1,7 @@ from wtforms.validators import ValidationError import pytest -from atst.forms.validators import Alphabet, IsNumber, PhoneNumber, ListItemsUnique +from atst.forms.validators import Name, IsNumber, PhoneNumber, ListItemsUnique class TestIsNumber: @@ -38,16 +38,16 @@ class TestPhoneNumber: validator(dummy_form, dummy_field) -class TestAlphabet: +class TestName: @pytest.mark.parametrize("valid", ["a", "abcde", "hi mark", "cloud9", "niña"]) - def test_Alphabet_accepts_letters(self, valid, dummy_form, dummy_field): - validator = Alphabet() + def test_Name_accepts_letters(self, valid, dummy_form, dummy_field): + validator = Name() dummy_field.data = valid validator(dummy_form, dummy_field) @pytest.mark.parametrize("invalid", [""]) - def test_Alphabet_rejects_non_letters(self, invalid, dummy_form, dummy_field): - validator = Alphabet() + def test_Name_rejects_non_letters(self, invalid, dummy_form, dummy_field): + validator = Name() dummy_field.data = invalid with pytest.raises(ValidationError): validator(dummy_form, dummy_field) From aad62853bcca9d4572f47e4b0ac72c42406df268 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 23 Oct 2018 13:18:01 -0400 Subject: [PATCH 06/10] Update test name --- tests/forms/test_validators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/forms/test_validators.py b/tests/forms/test_validators.py index 44317aad..b1c69741 100644 --- a/tests/forms/test_validators.py +++ b/tests/forms/test_validators.py @@ -46,7 +46,7 @@ class TestName: validator(dummy_form, dummy_field) @pytest.mark.parametrize("invalid", [""]) - def test_Name_rejects_non_letters(self, invalid, dummy_form, dummy_field): + def test_Name_rejects_empty_string(self, invalid, dummy_form, dummy_field): validator = Name() dummy_field.data = invalid with pytest.raises(ValidationError): From f93c487e802f09f2787e7d8544dfb3f1caf7b490 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 23 Oct 2018 13:53:31 -0400 Subject: [PATCH 07/10] Update error message --- atst/forms/validators.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/atst/forms/validators.py b/atst/forms/validators.py index e769c677..b91b346d 100644 --- a/atst/forms/validators.py +++ b/atst/forms/validators.py @@ -50,7 +50,9 @@ def PhoneNumber(message="Please enter a valid 5 or 10 digit phone number."): return _is_phone_number -def Name(message="Please enter only letters."): +def Name( + message="This field accepts letters, numbers, commas, apostrophes, hyphens, and periods." +): def _name(form, field): match = re.match(r"[\w \,\.\'\-]+", field.data) if not match or match.group() != field.data: From d474091f5e66e8539413c603897834e74b9d5470 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 23 Oct 2018 17:15:50 -0400 Subject: [PATCH 08/10] Add more invalid test cases --- tests/forms/test_validators.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/forms/test_validators.py b/tests/forms/test_validators.py index b1c69741..8e3cc8a0 100644 --- a/tests/forms/test_validators.py +++ b/tests/forms/test_validators.py @@ -45,7 +45,10 @@ class TestName: dummy_field.data = valid validator(dummy_form, dummy_field) - @pytest.mark.parametrize("invalid", [""]) + @pytest.mark.parametrize( + "invalid", + ["", "/my name", ":-)", "Name&Name", "Ke$ha", "A^Name", "#yourvalidname"], + ) def test_Name_rejects_empty_string(self, invalid, dummy_form, dummy_field): validator = Name() dummy_field.data = invalid From 6fdc883a8c6af259ff51f932137a331a0018236e Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Tue, 23 Oct 2018 17:21:46 -0400 Subject: [PATCH 09/10] Formatting --- atst/forms/ccpo_review.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/atst/forms/ccpo_review.py b/atst/forms/ccpo_review.py index f2f930bb..c8a4919d 100644 --- a/atst/forms/ccpo_review.py +++ b/atst/forms/ccpo_review.py @@ -11,9 +11,7 @@ class CCPOReviewForm(ValidatedForm): "Instructions or comments", description="Provide instructions or notes for additional information that is necessary to approve the request here. The requestor may then re-submit the updated request or initiate contact outside of AT-AT if further discussion is required. This message will be shared with the person making the JEDI request..", ) - fname_mao = StringField( - "First Name (optional)", validators=[Optional(), Name()] - ) + fname_mao = StringField("First Name (optional)", validators=[Optional(), Name()]) lname_mao = StringField("Last Name (optional)", validators=[Optional(), Name()]) email_mao = EmailField( "Mission Owner e-mail (optional)", validators=[Optional(), Email()] @@ -21,9 +19,5 @@ class CCPOReviewForm(ValidatedForm): phone_mao = TelField( "Mission Owner phone number (optional)", validators=[Optional(), PhoneNumber()] ) - fname_ccpo = StringField( - "First Name (optional)", validators=[Optional(), Name()] - ) - lname_ccpo = StringField( - "Last Name (optional)", validators=[Optional(), Name()] - ) + fname_ccpo = StringField("First Name (optional)", validators=[Optional(), Name()]) + lname_ccpo = StringField("Last Name (optional)", validators=[Optional(), Name()]) From 6ad4f4c0779b4a217605510d2d22863e357968c2 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Wed, 24 Oct 2018 10:08:49 -0400 Subject: [PATCH 10/10] Fix name of test --- tests/forms/test_validators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/forms/test_validators.py b/tests/forms/test_validators.py index 8e3cc8a0..f6eda1d9 100644 --- a/tests/forms/test_validators.py +++ b/tests/forms/test_validators.py @@ -49,7 +49,7 @@ class TestName: "invalid", ["", "/my name", ":-)", "Name&Name", "Ke$ha", "A^Name", "#yourvalidname"], ) - def test_Name_rejects_empty_string(self, invalid, dummy_form, dummy_field): + def test_Name_rejects_invalid_characters(self, invalid, dummy_form, dummy_field): validator = Name() dummy_field.data = invalid with pytest.raises(ValidationError):