From d69daf9d7bceb9db03be4adf6df6b9b9e18d2f37 Mon Sep 17 00:00:00 2001 From: leopazes Date: Wed, 6 Apr 2022 15:37:15 -0300 Subject: [PATCH 1/7] First commit, just addind the fields and validators --- localflavor/br/models.py | 12 ++++++++++++ localflavor/br/validators.py | 15 ++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/localflavor/br/models.py b/localflavor/br/models.py index 1d06d2194..f8bfee32a 100644 --- a/localflavor/br/models.py +++ b/localflavor/br/models.py @@ -69,3 +69,15 @@ def __init__(self, *args, **kwargs): kwargs['max_length'] = 9 super().__init__(*args, **kwargs) self.validators.append(validators.BRPostalCodeValidator()) + +class BRLandLineField(CharField): + def __init__(self, *args, **kwargs): + kwargs['max_length'] = 14 + super().__init__(*args, **kwargs) + self.validators.append(validators.BRLandLineValidator()) + +class BRCellPhoneField(CharField): + def __init__(self, *args, **kwargs): + kwargs['max_length'] = 15 + super().__init__(*args, **kwargs) + self.validators.append(validators.BRMobilePhoneValidator()) diff --git a/localflavor/br/validators.py b/localflavor/br/validators.py index fee51ab54..f58aebbaf 100644 --- a/localflavor/br/validators.py +++ b/localflavor/br/validators.py @@ -7,6 +7,8 @@ postal_code_re = re.compile(r'^\d{5}-\d{3}$') cnpj_digits_re = re.compile(r'^(\d{2})[.-]?(\d{3})[.-]?(\d{3})/(\d{4})-(\d{2})$') cpf_digits_re = re.compile(r'^(\d{3})\.(\d{3})\.(\d{3})-(\d{2})$') +telefone_re = re.compile(r'^[(][0-9][0-9][)] \d{4}-\d{4}$') +celular_re = re.compile(r'^[(][0-9][0-9][)] \d{5}-\d{4}$') def dv_maker(v): @@ -103,4 +105,15 @@ def __call__(self, value): if value[-2:] != orig_dv: raise ValidationError(self.message, code='invalid') if value.count(value[0]) == 11: - raise ValidationError(self.message, code='invalid') + raise ValidationError(self.message, code='invalid') + + +class BRLandLineValidator(RegexValidator): + def __init__(self, *args, **kwargs): + self.message = 'Telefone precisa ser no formato (00) 0000-0000.' + super().__init__(telefone_re, *args, **kwargs) + +class BRMobilePhoneValidator(RegexValidator): + def __init__(self, *args, **kwargs): + self.message = 'Telefone precisa ser no formato (00) 00000-0000.' + super().__init__(celular_re, *args, **kwargs) From 144360b197cd6b3d183b043e8e61986a9195af02 Mon Sep 17 00:00:00 2001 From: Leonardo Paz Estevam Date: Sat, 9 Apr 2022 22:55:15 -0300 Subject: [PATCH 2/7] Testing LandLineField and CellPhoneField --- localflavor/br/forms.py | 22 ++++++++++++++++++++-- localflavor/br/models.py | 6 +++++- localflavor/br/validators.py | 18 +++++++++++------- tests/test_br/test_br.py | 35 ++++++++++++++++++++++++++++++++--- 4 files changed, 68 insertions(+), 13 deletions(-) diff --git a/localflavor/br/forms.py b/localflavor/br/forms.py index 4fb6f4d23..054cafa14 100644 --- a/localflavor/br/forms.py +++ b/localflavor/br/forms.py @@ -9,7 +9,7 @@ from django.utils.translation import gettext_lazy as _ from .br_states import STATE_CHOICES -from .validators import BRCNPJValidator, BRCPFValidator, BRPostalCodeValidator +from .validators import BRCNPJValidator, BRCPFValidator, BRLandLineValidator, BRPostalCodeValidator, BRCellPhoneValidator process_digits_re = re.compile( r'^(\d{7})-?(\d{2})\.?(\d{4})\.?(\d)\.?(\d{2})\.?(\d{4})$' @@ -156,4 +156,22 @@ def clean(self, value): if str(mod_97_base10(value_without_digits)).zfill(2) != orig_dv: raise ValidationError(self.error_messages['invalid'], code='invalid') - return orig_value + return orig_value + +class BRCellPhoneField(CharField): + default_error_messages = { + 'invalid': _("Invalid Cell Phone, number needs to be in the format (XX) 9XXXX-XXXX."), + } + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.validators.append(BRCellPhoneValidator()) + +class BRLandLineField(CharField): + default_error_messages = { + 'invalid': _("Invalid Landline, number needs to be in the format (XX) XXXX-XXXX."), + } + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.validators.append(BRLandLineValidator()) diff --git a/localflavor/br/models.py b/localflavor/br/models.py index f8bfee32a..c7eb47914 100644 --- a/localflavor/br/models.py +++ b/localflavor/br/models.py @@ -71,13 +71,17 @@ def __init__(self, *args, **kwargs): self.validators.append(validators.BRPostalCodeValidator()) class BRLandLineField(CharField): + description = _("Landline Number") + def __init__(self, *args, **kwargs): kwargs['max_length'] = 14 super().__init__(*args, **kwargs) self.validators.append(validators.BRLandLineValidator()) class BRCellPhoneField(CharField): + description = _("Cell Phone Number") + def __init__(self, *args, **kwargs): kwargs['max_length'] = 15 super().__init__(*args, **kwargs) - self.validators.append(validators.BRMobilePhoneValidator()) + self.validators.append(validators.BRCellPhoneValidator()) diff --git a/localflavor/br/validators.py b/localflavor/br/validators.py index f58aebbaf..69c7e3f24 100644 --- a/localflavor/br/validators.py +++ b/localflavor/br/validators.py @@ -7,8 +7,8 @@ postal_code_re = re.compile(r'^\d{5}-\d{3}$') cnpj_digits_re = re.compile(r'^(\d{2})[.-]?(\d{3})[.-]?(\d{3})/(\d{4})-(\d{2})$') cpf_digits_re = re.compile(r'^(\d{3})\.(\d{3})\.(\d{3})-(\d{2})$') -telefone_re = re.compile(r'^[(][0-9][0-9][)] \d{4}-\d{4}$') -celular_re = re.compile(r'^[(][0-9][0-9][)] \d{5}-\d{4}$') +landline_number_re = re.compile(r'^[(][1-9][1-9][)] [2-8]\d{3}-\d{4}$') +cell_phone_number_re = re.compile(r'^[(][1-9][1-9][)] 9\d{4}-\d{4}$') def dv_maker(v): @@ -110,10 +110,14 @@ def __call__(self, value): class BRLandLineValidator(RegexValidator): def __init__(self, *args, **kwargs): - self.message = 'Telefone precisa ser no formato (00) 0000-0000.' - super().__init__(telefone_re, *args, **kwargs) + super().__init__(*args, + regex = landline_number_re, + message = _("Invalid Landline, number needs to be in the format (XX) XXXX-XXXX."), + **kwargs) -class BRMobilePhoneValidator(RegexValidator): +class BRCellPhoneValidator(RegexValidator): def __init__(self, *args, **kwargs): - self.message = 'Telefone precisa ser no formato (00) 00000-0000.' - super().__init__(celular_re, *args, **kwargs) + super().__init__(*args, + regex = cell_phone_number_re, + message = _("Invalid Cell Phone, number needs to be in the format (XX) 9XXXX-XXXX."), + **kwargs) diff --git a/tests/test_br/test_br.py b/tests/test_br/test_br.py index a1a3726ab..93ab19170 100644 --- a/tests/test_br/test_br.py +++ b/tests/test_br/test_br.py @@ -1,8 +1,8 @@ from django.test import SimpleTestCase from localflavor.br import models -from localflavor.br.forms import (BRCNPJField, BRCPFField, BRProcessoField, BRStateChoiceField, BRStateSelect, - BRZipCodeField) +from localflavor.br.forms import (BRCNPJField, BRCPFField, BRLandLineField, BRProcessoField, BRStateChoiceField, BRStateSelect, + BRZipCodeField, BRCellPhoneField) from tests.test_br.forms import BRPersonProfileForm @@ -222,7 +222,36 @@ def test_model_form_valid(self): for case in data_to_test: form = BRPersonProfileForm(case) - self.assertTrue(form.is_valid()) + self.assertTrue(form.is_valid()) + + def test_CellPhoneField(self): + error_format = ["Invalid Cell Phone, number needs to be in the format (XX) 9XXXX-XXXX."] + valid = { + '(11) 99919-2696': '(11) 99919-2696', + } + invalid = { + '(08) 99919-2696': error_format, + '(11) 89919-2696': error_format, + '(ab) cdefg-hijk': error_format, + '(11) 99919 2696': error_format, + '(11)99919-2696': error_format, + } + self.assertFieldOutput(BRCellPhoneField, valid, invalid) + + def test_LandLineField(self): + error_format = ['Invalid Landline, number needs to be in the format (XX) XXXX-XXXX.'] + valid = { + '(11) 3223-3946': '(11) 3223-3946', + } + invalid = { + '(08) 99919-2696': error_format, + '(11) 9919-2696': error_format, + '(ab) cdefg-hijk': error_format, + '(11) 3919 2696': error_format, + '(11)3919-2696': error_format, + } + self.assertFieldOutput(BRLandLineField, valid, invalid) + class BRLocalFlavorModelTests(SimpleTestCase): From 4d3a3f56e5521fe3647c8e329b588671e71d0268 Mon Sep 17 00:00:00 2001 From: Leonardo Paz Estevam Date: Mon, 23 May 2022 11:31:53 -0300 Subject: [PATCH 3/7] Removing space between numbers and removing de constraint of 9 in the first number of cellphone --- localflavor/br/forms.py | 4 ++-- localflavor/br/validators.py | 8 ++++---- tests/test_br/test_br.py | 27 +++++++++++++-------------- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/localflavor/br/forms.py b/localflavor/br/forms.py index 054cafa14..8863c7701 100644 --- a/localflavor/br/forms.py +++ b/localflavor/br/forms.py @@ -160,7 +160,7 @@ def clean(self, value): class BRCellPhoneField(CharField): default_error_messages = { - 'invalid': _("Invalid Cell Phone, number needs to be in the format (XX) 9XXXX-XXXX."), + 'invalid': _("Invalid Cell Phone, number needs to be in the format (XX)XXXXX-XXXX."), } def __init__(self, **kwargs): @@ -169,7 +169,7 @@ def __init__(self, **kwargs): class BRLandLineField(CharField): default_error_messages = { - 'invalid': _("Invalid Landline, number needs to be in the format (XX) XXXX-XXXX."), + 'invalid': _("Invalid Landline, number needs to be in the format (XX)XXXX-XXXX."), } def __init__(self, **kwargs): diff --git a/localflavor/br/validators.py b/localflavor/br/validators.py index 69c7e3f24..6fdb34fac 100644 --- a/localflavor/br/validators.py +++ b/localflavor/br/validators.py @@ -7,8 +7,8 @@ postal_code_re = re.compile(r'^\d{5}-\d{3}$') cnpj_digits_re = re.compile(r'^(\d{2})[.-]?(\d{3})[.-]?(\d{3})/(\d{4})-(\d{2})$') cpf_digits_re = re.compile(r'^(\d{3})\.(\d{3})\.(\d{3})-(\d{2})$') -landline_number_re = re.compile(r'^[(][1-9][1-9][)] [2-8]\d{3}-\d{4}$') -cell_phone_number_re = re.compile(r'^[(][1-9][1-9][)] 9\d{4}-\d{4}$') +landline_number_re = re.compile(r'^[(][1-9][1-9][)][2-8]\d{3}-\d{4}$') +cell_phone_number_re = re.compile(r'^[(][1-9][1-9][)]\d{5}-\d{4}$') def dv_maker(v): @@ -112,12 +112,12 @@ class BRLandLineValidator(RegexValidator): def __init__(self, *args, **kwargs): super().__init__(*args, regex = landline_number_re, - message = _("Invalid Landline, number needs to be in the format (XX) XXXX-XXXX."), + message = _("Invalid Landline, number needs to be in the format (XX)XXXX-XXXX."), **kwargs) class BRCellPhoneValidator(RegexValidator): def __init__(self, *args, **kwargs): super().__init__(*args, regex = cell_phone_number_re, - message = _("Invalid Cell Phone, number needs to be in the format (XX) 9XXXX-XXXX."), + message = _("Invalid Cell Phone, number needs to be in the format (XX)XXXXX-XXXX."), **kwargs) diff --git a/tests/test_br/test_br.py b/tests/test_br/test_br.py index 93ab19170..795118130 100644 --- a/tests/test_br/test_br.py +++ b/tests/test_br/test_br.py @@ -225,30 +225,29 @@ def test_model_form_valid(self): self.assertTrue(form.is_valid()) def test_CellPhoneField(self): - error_format = ["Invalid Cell Phone, number needs to be in the format (XX) 9XXXX-XXXX."] + error_format = ["Invalid Cell Phone, number needs to be in the format (XX)XXXXX-XXXX."] valid = { - '(11) 99919-2696': '(11) 99919-2696', + '(11)99919-2696': '(11)99919-2696', } invalid = { - '(08) 99919-2696': error_format, - '(11) 89919-2696': error_format, - '(ab) cdefg-hijk': error_format, - '(11) 99919 2696': error_format, - '(11)99919-2696': error_format, + '(08)99919-2696': error_format, + '(ab)cdefg-hijk': error_format, + '(11)99919 2696': error_format, + '(11) 99919-2696': error_format, } self.assertFieldOutput(BRCellPhoneField, valid, invalid) def test_LandLineField(self): - error_format = ['Invalid Landline, number needs to be in the format (XX) XXXX-XXXX.'] + error_format = ['Invalid Landline, number needs to be in the format (XX)XXXX-XXXX.'] valid = { - '(11) 3223-3946': '(11) 3223-3946', + '(11)3223-3946': '(11)3223-3946', } invalid = { - '(08) 99919-2696': error_format, - '(11) 9919-2696': error_format, - '(ab) cdefg-hijk': error_format, - '(11) 3919 2696': error_format, - '(11)3919-2696': error_format, + '(08)99919-2696': error_format, + '(11)9919-2696': error_format, + '(ab)cdefg-hijk': error_format, + '(11)3919 2696': error_format, + '(11) 3919-2696': error_format, } self.assertFieldOutput(BRLandLineField, valid, invalid) From 65c509db6bc95be822e20a69cfebf884fc195ce3 Mon Sep 17 00:00:00 2001 From: Leonardo Paz Estevam Date: Mon, 23 May 2022 12:02:52 -0300 Subject: [PATCH 4/7] Adding validation to first digit landline from 2-5 --- localflavor/br/forms.py | 9 +++++++++ localflavor/br/models.py | 8 ++++++++ localflavor/br/validators.py | 12 ++++++++++-- tests/test_br/test_br.py | 3 ++- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/localflavor/br/forms.py b/localflavor/br/forms.py index 8863c7701..b6e23e8c2 100644 --- a/localflavor/br/forms.py +++ b/localflavor/br/forms.py @@ -159,6 +159,11 @@ def clean(self, value): return orig_value class BRCellPhoneField(CharField): + """ + A form field that validates a Cell Phone number. + + """ + default_error_messages = { 'invalid': _("Invalid Cell Phone, number needs to be in the format (XX)XXXXX-XXXX."), } @@ -168,6 +173,10 @@ def __init__(self, **kwargs): self.validators.append(BRCellPhoneValidator()) class BRLandLineField(CharField): + """ + A form field that validates a Landline number. + + """ default_error_messages = { 'invalid': _("Invalid Landline, number needs to be in the format (XX)XXXX-XXXX."), } diff --git a/localflavor/br/models.py b/localflavor/br/models.py index c7eb47914..58a645a07 100644 --- a/localflavor/br/models.py +++ b/localflavor/br/models.py @@ -71,6 +71,10 @@ def __init__(self, *args, **kwargs): self.validators.append(validators.BRPostalCodeValidator()) class BRLandLineField(CharField): + """ + A model field for brazilian LandLine number + + """ description = _("Landline Number") def __init__(self, *args, **kwargs): @@ -79,6 +83,10 @@ def __init__(self, *args, **kwargs): self.validators.append(validators.BRLandLineValidator()) class BRCellPhoneField(CharField): + """ + A model field for brazilian Cell Phone number + + """ description = _("Cell Phone Number") def __init__(self, *args, **kwargs): diff --git a/localflavor/br/validators.py b/localflavor/br/validators.py index 6fdb34fac..fd0712ef6 100644 --- a/localflavor/br/validators.py +++ b/localflavor/br/validators.py @@ -7,8 +7,8 @@ postal_code_re = re.compile(r'^\d{5}-\d{3}$') cnpj_digits_re = re.compile(r'^(\d{2})[.-]?(\d{3})[.-]?(\d{3})/(\d{4})-(\d{2})$') cpf_digits_re = re.compile(r'^(\d{3})\.(\d{3})\.(\d{3})-(\d{2})$') -landline_number_re = re.compile(r'^[(][1-9][1-9][)][2-8]\d{3}-\d{4}$') -cell_phone_number_re = re.compile(r'^[(][1-9][1-9][)]\d{5}-\d{4}$') +landline_number_re = re.compile(r'^[(][1-9][1-9][)][2-5]\d{3}-\d{4}$') +cell_phone_number_re = re.compile(r'^[(][1-9][1-9][)]9\d{4}-\d{4}$') def dv_maker(v): @@ -109,6 +109,10 @@ def __call__(self, value): class BRLandLineValidator(RegexValidator): + """ + Validator for brazilian LandLine number. + + """ def __init__(self, *args, **kwargs): super().__init__(*args, regex = landline_number_re, @@ -116,6 +120,10 @@ def __init__(self, *args, **kwargs): **kwargs) class BRCellPhoneValidator(RegexValidator): + """ + Validator for brazilian Cell Phone number. + + """ def __init__(self, *args, **kwargs): super().__init__(*args, regex = cell_phone_number_re, diff --git a/tests/test_br/test_br.py b/tests/test_br/test_br.py index 795118130..dc354173c 100644 --- a/tests/test_br/test_br.py +++ b/tests/test_br/test_br.py @@ -231,6 +231,7 @@ def test_CellPhoneField(self): } invalid = { '(08)99919-2696': error_format, + '(11)89919-2696': error_format, '(ab)cdefg-hijk': error_format, '(11)99919 2696': error_format, '(11) 99919-2696': error_format, @@ -244,7 +245,7 @@ def test_LandLineField(self): } invalid = { '(08)99919-2696': error_format, - '(11)9919-2696': error_format, + '(11)6919-2696': error_format, '(ab)cdefg-hijk': error_format, '(11)3919 2696': error_format, '(11) 3919-2696': error_format, From d46972fe6d502dae8ac9005120b3a6479297d3a1 Mon Sep 17 00:00:00 2001 From: Leonardo Paz Estevam Date: Mon, 23 May 2022 12:05:49 -0300 Subject: [PATCH 5/7] Adding more information --- localflavor/br/forms.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/localflavor/br/forms.py b/localflavor/br/forms.py index b6e23e8c2..bf52044ab 100644 --- a/localflavor/br/forms.py +++ b/localflavor/br/forms.py @@ -162,6 +162,8 @@ class BRCellPhoneField(CharField): """ A form field that validates a Cell Phone number. + More information: + https://www.gov.br/anatel/pt-br/regulado/numeracao/tabela-servico-movel-celular """ default_error_messages = { @@ -176,6 +178,8 @@ class BRLandLineField(CharField): """ A form field that validates a Landline number. + More information: + https://www.gov.br/anatel/pt-br/regulado/numeracao/tabela-servico-telefonico-fixo-comutado """ default_error_messages = { 'invalid': _("Invalid Landline, number needs to be in the format (XX)XXXX-XXXX."), From 1f0a4969d1286258dde213de9cd14b1c5834fe39 Mon Sep 17 00:00:00 2001 From: Leonardo Paz Date: Thu, 26 May 2022 14:09:08 -0300 Subject: [PATCH 6/7] Adding my name to authors Signed-off-by: Leonardo Paz --- docs/authors.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/authors.rst b/docs/authors.rst index 6177720b0..f11f08269 100644 --- a/docs/authors.rst +++ b/docs/authors.rst @@ -122,3 +122,4 @@ Authors * Vishal Pandey * Vladimir Nani * Abhineet Tamrakar +* Leonardo Paz Estevam \ No newline at end of file From 637b163695a0f0f65ffcd6e56b0d2b3721f10ec0 Mon Sep 17 00:00:00 2001 From: Leonardo Paz Date: Thu, 26 May 2022 14:13:45 -0300 Subject: [PATCH 7/7] Adding changes to changelog Signed-off-by: Leonardo Paz --- docs/changelog.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index f18bc43d6..62f702c11 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -20,6 +20,8 @@ New fields for existing flavors: (`gh-457 `_). - Added the Canadian Models fields. (`gh-465 `_). +- Added Cellphone and Landline fields in Brazilian flavor. + (`gh-471 `_) Modifications to existing flavors: