forked from dcramer/django-compositepks
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fixed #16202 -- Added a Slovenian localflavor. Thanks to Jure Cuhalev…
… < gandalf@owca.info>, Gasper Zejn and Domen Kozar for the patch. git-svn-id: http://code.djangoproject.com/svn/django/trunk@16706 bcc190cf-cafb-0310-a4f2-bffc1f526a37
- Loading branch information
julien
committed
Aug 28, 2011
1 parent
aa13264
commit 47ae1fb
Showing
7 changed files
with
1,220 additions
and
0 deletions.
There are no files selected for viewing
Empty file.
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,164 @@ | ||
""" | ||
Slovenian specific form helpers. | ||
""" | ||
|
||
import datetime | ||
import re | ||
|
||
from django.forms.fields import CharField, Select, ChoiceField | ||
from django.core.validators import EMPTY_VALUES | ||
from django.forms import ValidationError | ||
from django.utils.translation import ugettext_lazy as _ | ||
|
||
|
||
class SIEMSOField(CharField): | ||
"""A form for validating Slovenian personal identification number. | ||
Additionally stores gender, nationality and birthday to self.info dictionary. | ||
""" | ||
|
||
default_error_messages = { | ||
'invalid': _(u'This field should contain exactly 13 digits.'), | ||
'date': _(u'The first 7 digits of the EMSO must represent a valid past date.'), | ||
'checksum': _(u'The EMSO is not valid.'), | ||
} | ||
emso_regex = re.compile('^(\d{2})(\d{2})(\d{3})(\d{2})(\d{3})(\d)$') | ||
|
||
def clean(self, value): | ||
super(SIEMSOField, self).clean(value) | ||
if value in EMPTY_VALUES: | ||
return u'' | ||
|
||
value = value.strip() | ||
|
||
m = self.emso_regex.match(value) | ||
if m is None: | ||
raise ValidationError(self.default_error_messages['invalid']) | ||
|
||
# Validate EMSO | ||
s = 0 | ||
int_values = [int(i) for i in value] | ||
for a, b in zip(int_values, range(7, 1, -1) * 2): | ||
s += a * b | ||
chk = s % 11 | ||
if chk == 0: | ||
K = 0 | ||
else: | ||
K = 11 - chk | ||
|
||
if K == 10 or int_values[-1] != K: | ||
raise ValidationError(self.default_error_messages['checksum']) | ||
|
||
# Extract extra info in the identification number | ||
day, month, year, nationality, gender, chksum = [int(i) for i in m.groups()] | ||
|
||
if year < 890: | ||
year += 2000 | ||
else: | ||
year += 1000 | ||
|
||
# validate birthday | ||
try: | ||
birthday = datetime.date(year, month, day) | ||
except ValueError: | ||
raise ValidationError(self.error_messages['date']) | ||
if datetime.date.today() < birthday: | ||
raise ValidationError(self.error_messages['date']) | ||
|
||
self.info = { | ||
'gender': gender < 500 and 'male' or 'female', | ||
'birthdate': birthday, | ||
'nationality': nationality, | ||
} | ||
return value | ||
|
||
|
||
class SITaxNumberField(CharField): | ||
"""Slovenian tax number field. | ||
Valid input is SIXXXXXXXX or XXXXXXXX where X is a number. | ||
""" | ||
|
||
default_error_messages = { | ||
'invalid': _(u'Enter a valid tax number in form SIXXXXXXXX'), | ||
} | ||
sitax_regex = re.compile('^(?:SI)?([1-9]\d{7})$') | ||
|
||
def clean(self, value): | ||
super(SITaxNumberField, self).clean(value) | ||
if value in EMPTY_VALUES: | ||
return u'' | ||
|
||
value = value.strip() | ||
|
||
m = self.sitax_regex.match(value) | ||
if m is None: | ||
raise ValidationError(self.default_error_messages['invalid']) | ||
value = m.groups()[0] | ||
|
||
# Validate Tax number | ||
s = 0 | ||
int_values = [int(i) for i in value] | ||
for a, b in zip(int_values, range(8, 1, -1)): | ||
s += a * b | ||
chk = 11 - (s % 11) | ||
if chk == 10: | ||
chk = 0 | ||
|
||
if int_values[-1] != chk: | ||
raise ValidationError(self.default_error_messages['invalid']) | ||
|
||
return value | ||
|
||
|
||
class SIPostalCodeField(ChoiceField): | ||
"""Slovenian post codes field. | ||
""" | ||
|
||
def __init__(self, *args, **kwargs): | ||
from si_postalcodes import SI_POSTALCODES_CHOICES | ||
kwargs.setdefault('choices', SI_POSTALCODES_CHOICES) | ||
super(SIPostalCodeField, self).__init__(*args, **kwargs) | ||
|
||
|
||
class SIPostalCodeSelect(Select): | ||
"""A Select widget that uses Slovenian postal codes as its choices. | ||
""" | ||
def __init__(self, attrs=None): | ||
from si_postalcodes import SI_POSTALCODES_CHOICES | ||
super(SIPostalCodeSelect, self).__init__(attrs, | ||
choices=SI_POSTALCODES_CHOICES) | ||
|
||
|
||
class SIPhoneNumberField(CharField): | ||
"""Slovenian phone number field. | ||
Phone number must contain at least local area code. | ||
Country code can be present. | ||
Examples: | ||
* +38640XXXXXX | ||
* 0038640XXXXXX | ||
* 040XXXXXX | ||
* 01XXXXXX | ||
* 0590XXXXX | ||
""" | ||
|
||
default_error_messages = { | ||
'invalid': _(u'Enter phone number in form +386XXXXXXXX or 0XXXXXXXX.'), | ||
} | ||
phone_regex = re.compile('^(?:(?:00|\+)386|0)(\d{7,8})$') | ||
|
||
def clean(self, value): | ||
super(SIPhoneNumberField, self).clean(value) | ||
if value in EMPTY_VALUES: | ||
return u'' | ||
|
||
value = value.replace(' ', '').replace('-', '').replace('/', '') | ||
m = self.phone_regex.match(value) | ||
|
||
if m is None: | ||
raise ValidationError(self.default_error_messages['invalid']) | ||
return m.groups()[0] |
Oops, something went wrong.