-
-
Save gladson/3820277 to your computer and use it in GitHub Desktop.
Validação e formatação para campo localidade com cidade e estado juntos (Fortaleza - CE).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from core.validators import format_locality, validate_locality | |
class ClientForm(forms.ModelForm): | |
... | |
... | |
locality = forms.CharField( | |
help_text=u'Local da sede principal do cliente. Ex: São Paulo - SP', | |
validators=[validate_locality], | |
) | |
... | |
... | |
def save(self, commit=True): | |
instance = super(ClientForm, self).save(commit=False) | |
format_locality(self, instance) | |
instance.save() | |
class Meta: | |
model = Client |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django.contrib.localflavor.br.br_states import STATE_CHOICES | |
from string import digits | |
from django.core.exceptions import ValidationError | |
SEPARADOR = '. - , / |'.split() # aprendi com o Luciano =) | |
def validate_locality(value): | |
u""" | |
Verifica se o campo locality está válido. | |
""" | |
lst_upper = [x[0] for x in STATE_CHOICES] | |
lst_lower = [x[0].lower() for x in STATE_CHOICES] | |
lst_capitalize = [x[0].capitalize() for x in STATE_CHOICES] | |
if value[-2:] not in (lst_upper + lst_lower + lst_capitalize): | |
raise ValidationError(u'Insira um estado brasileiro válido. Ex: SP') | |
separador_list = [letra for letra in value if letra in SEPARADOR] | |
if not separador_list: | |
raise ValidationError(u'Insira um separador entre a cidade e o estado como: Ex: . - , / |') | |
if len(separador_list) > 1: | |
raise ValidationError(u'Insira apenas 1 separador entre a cidade e o estado como: Ex: -') | |
for letra in value[:-5]: | |
if letra in digits: | |
raise ValidationError(u'O campo não aceita dígitos.') | |
def format_locality(self, instance): | |
u""" | |
Formata o campo locality no save de uma classe Form: | |
>>> format_locality(self, 'rio de janeiro,rj') | |
... Rio de Janeiro - RJ | |
>>> | |
>>> format_locality(self, 'rio de Janeiro.rj') | |
... Rio de Janeiro - RJ | |
>>> | |
>>> format_locality(self, 'rio de Janeiro | rj') | |
... Rio de Janeiro - RJ | |
Formata pegando qualquer um dos separadores válidos, | |
inserindo um espaço antes e depois do separador e | |
substituindo pelo hífen "-". | |
""" | |
a_str = instance.locality | |
sep = [letra for letra in a_str if letra in SEPARADOR][0] | |
a_str = a_str.replace(sep, ' ') | |
a_str = a_str.split() | |
a_str = ' '.join(a_str) | |
a_str = u'{0} - {1}'.format(a_str[:-2], a_str[-2:]) | |
if len(a_str) > 1: | |
a_lst = [x if x in ['de', 'do'] else x.capitalize() for x in a_str.split()] | |
a_lst[-1] = a_lst[-1].upper() | |
a_str = ' '.join(a_lst) | |
instance.locality = a_str |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment