Skip to content

Instantly share code, notes, and snippets.

@gladson
Forked from macndesign/forms.py
Created October 2, 2012 15:44
Show Gist options
  • Save gladson/3820277 to your computer and use it in GitHub Desktop.
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).
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
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