mirror of https://github.com/django/django.git
Fixed #3882 -- Added Brazilian localflavor. Thanks, Wiliam Alves de Souza.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@4874 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
7be1f44053
commit
79312f7a4e
1
AUTHORS
1
AUTHORS
|
@ -179,6 +179,7 @@ answer newbie questions, and generally made Django that much better:
|
||||||
SmileyChris <smileychris@gmail.com>
|
SmileyChris <smileychris@gmail.com>
|
||||||
smurf@smurf.noris.de
|
smurf@smurf.noris.de
|
||||||
sopel
|
sopel
|
||||||
|
Wiliam Alves de Souza <wiliamsouza83@gmail.com>
|
||||||
Georgi Stanojevski <glisha@gmail.com>
|
Georgi Stanojevski <glisha@gmail.com>
|
||||||
Thomas Steinacher <http://www.eggdrop.ch/>
|
Thomas Steinacher <http://www.eggdrop.ch/>
|
||||||
nowell strite
|
nowell strite
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
A brazilian mapping of state misspellings/abbreviations to normalized
|
||||||
|
abbreviations, and an alphabetical list of states for use as `choices
|
||||||
|
in a formfield.
|
||||||
|
|
||||||
|
This exists in this standalone file so that it's only imported into
|
||||||
|
memory when explicitly needed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
STATE_CHOICES = (
|
||||||
|
('AC', 'Acre'),
|
||||||
|
('AL', 'Alagoas'),
|
||||||
|
('AP', u'Amapá'),
|
||||||
|
('AM', 'Amazonas'),
|
||||||
|
('BA', 'Bahia'),
|
||||||
|
('CE', u'Ceará'),
|
||||||
|
('DF', 'Distrito Federal'),
|
||||||
|
('ES', u'Espírito Santo'),
|
||||||
|
('GO', u'Goiás'),
|
||||||
|
('MA', u'Maranhão'),
|
||||||
|
('MT', 'Mato Grosso'),
|
||||||
|
('MS', 'Mato Grosso do Sul'),
|
||||||
|
('MG', 'Minas Gerais'),
|
||||||
|
('PA', u'Pará'),
|
||||||
|
('PB', u'Paraíba'),
|
||||||
|
('PR', u'Paraná'),
|
||||||
|
('PE', 'Pernambuco'),
|
||||||
|
('PI', u'Piauí'),
|
||||||
|
('RJ', 'Rio de Janeiro'),
|
||||||
|
('RN', 'Rio Grande do Norte'),
|
||||||
|
('RS', 'Rio Grande do Sul'),
|
||||||
|
('RO', u'Rondônia'),
|
||||||
|
('RR', 'Roraima'),
|
||||||
|
('SC', 'Santa Catarina'),
|
||||||
|
('SP', u'São Paulo'),
|
||||||
|
('SE', 'Sergipe'),
|
||||||
|
('TO', 'Tocantins'),
|
||||||
|
)
|
|
@ -0,0 +1,39 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
BR-specific Form helpers
|
||||||
|
"""
|
||||||
|
|
||||||
|
from django.newforms import ValidationError
|
||||||
|
from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES
|
||||||
|
from django.newforms.util import smart_unicode
|
||||||
|
from django.utils.translation import gettext
|
||||||
|
import re
|
||||||
|
|
||||||
|
phone_digits_re = re.compile(r'^(\d{2})[-\.]?(\d{4})[-\.]?(\d{4})$')
|
||||||
|
|
||||||
|
class BRZipCodeField(RegexField):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(BRZipCodeField, self).__init__(r'^\d{5}-\d{3}$',
|
||||||
|
max_length=None, min_length=None,
|
||||||
|
error_message=u'Informe um código postal no formato XXXXX-XXX.',
|
||||||
|
*args, **kwargs)
|
||||||
|
|
||||||
|
class BRPhoneNumberField(Field):
|
||||||
|
def clean(self, value):
|
||||||
|
super(BRPhoneNumberField, self).clean(value)
|
||||||
|
if value in EMPTY_VALUES:
|
||||||
|
return u''
|
||||||
|
value = re.sub('(\(|\)|\s+)', '', smart_unicode(value))
|
||||||
|
m = phone_digits_re.search(value)
|
||||||
|
if m:
|
||||||
|
return u'%s-%s-%s' % (m.group(1), m.group(2), m.group(3))
|
||||||
|
raise ValidationError(u'Números de telefone devem estar no formato XX-XXXX-XXXX.')
|
||||||
|
|
||||||
|
class BRStateSelect(Select):
|
||||||
|
"""
|
||||||
|
A Select widget that uses a list of brazilian states/territories
|
||||||
|
as its choices.
|
||||||
|
"""
|
||||||
|
def __init__(self, attrs=None):
|
||||||
|
from br_states import STATE_CHOICES # relative import
|
||||||
|
super(BRStateSelect, self).__init__(attrs, choices=STATE_CHOICES)
|
|
@ -3974,6 +3974,120 @@ u''
|
||||||
>>> f.clean('')
|
>>> f.clean('')
|
||||||
u''
|
u''
|
||||||
|
|
||||||
|
# BRZipCodeField ############################################################
|
||||||
|
>>> from django.contrib.localflavor.br.forms import BRZipCodeField
|
||||||
|
>>> f = BRZipCodeField()
|
||||||
|
>>> f.clean('12345-123')
|
||||||
|
u'12345-123'
|
||||||
|
>>> f.clean('12345_123')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Informe um c\xf3digo postal no formato XXXXX-XXX.']
|
||||||
|
>>> f.clean('1234-123')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Informe um c\xf3digo postal no formato XXXXX-XXX.']
|
||||||
|
>>> f.clean('abcde-abc')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Informe um c\xf3digo postal no formato XXXXX-XXX.']
|
||||||
|
>>> f.clean('12345-')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Informe um c\xf3digo postal no formato XXXXX-XXX.']
|
||||||
|
>>> f.clean('-123')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Informe um c\xf3digo postal no formato XXXXX-XXX.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = BRZipCodeField(required=False)
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
>>> f.clean('-123')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Informe um c\xf3digo postal no formato XXXXX-XXX.']
|
||||||
|
>>> f.clean('12345-')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Informe um c\xf3digo postal no formato XXXXX-XXX.']
|
||||||
|
>>> f.clean('abcde-abc')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Informe um c\xf3digo postal no formato XXXXX-XXX.']
|
||||||
|
>>> f.clean('1234-123')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Informe um c\xf3digo postal no formato XXXXX-XXX.']
|
||||||
|
>>> f.clean('12345_123')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Informe um c\xf3digo postal no formato XXXXX-XXX.']
|
||||||
|
>>> f.clean('12345-123')
|
||||||
|
u'12345-123'
|
||||||
|
|
||||||
|
# BRPhoneNumberField #########################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.br.forms import BRPhoneNumberField
|
||||||
|
>>> f = BRPhoneNumberField()
|
||||||
|
>>> f.clean('41-3562-3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('4135623464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('41 3562-3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('41 3562 3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('(41) 3562 3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('41.3562.3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('41.3562-3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean(' (41) 3562.3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean(None)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
>>> f.clean('')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'This field is required.']
|
||||||
|
|
||||||
|
>>> f = BRPhoneNumberField(required=False)
|
||||||
|
>>> f.clean('')
|
||||||
|
u''
|
||||||
|
>>> f.clean(None)
|
||||||
|
u''
|
||||||
|
>>> f.clean(' (41) 3562.3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('41.3562-3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('(41) 3562 3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('4135623464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
>>> f.clean('41 3562-3464')
|
||||||
|
u'41-3562-3464'
|
||||||
|
|
||||||
|
# BRStateSelect ##############################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.br.forms import BRStateSelect
|
||||||
|
>>> w = BRStateSelect()
|
||||||
|
>>> w.render('states', 'PR')
|
||||||
|
u'<select name="states">\n<option value="AC">Acre</option>\n<option value="AL">Alagoas</option>\n<option value="AP">Amap\xe1</option>\n<option value="AM">Amazonas</option>\n<option value="BA">Bahia</option>\n<option value="CE">Cear\xe1</option>\n<option value="DF">Distrito Federal</option>\n<option value="ES">Esp\xedrito Santo</option>\n<option value="GO">Goi\xe1s</option>\n<option value="MA">Maranh\xe3o</option>\n<option value="MT">Mato Grosso</option>\n<option value="MS">Mato Grosso do Sul</option>\n<option value="MG">Minas Gerais</option>\n<option value="PA">Par\xe1</option>\n<option value="PB">Para\xedba</option>\n<option value="PR" selected="selected">Paran\xe1</option>\n<option value="PE">Pernambuco</option>\n<option value="PI">Piau\xed</option>\n<option value="RJ">Rio de Janeiro</option>\n<option value="RN">Rio Grande do Norte</option>\n<option value="RS">Rio Grande do Sul</option>\n<option value="RO">Rond\xf4nia</option>\n<option value="RR">Roraima</option>\n<option value="SC">Santa Catarina</option>\n<option value="SP">S\xe3o Paulo</option>\n<option value="SE">Sergipe</option>\n<option value="TO">Tocantins</option>\n</select>'
|
||||||
|
|
||||||
#################################
|
#################################
|
||||||
# Tests of underlying functions #
|
# Tests of underlying functions #
|
||||||
#################################
|
#################################
|
||||||
|
|
Loading…
Reference in New Issue