diff -r 57b4279d8c4e -r 03e267d67478 app/django/contrib/localflavor/is_/forms.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/django/contrib/localflavor/is_/forms.py Fri Jul 18 18:22:23 2008 +0000 @@ -0,0 +1,82 @@ +""" +Iceland specific form helpers. +""" + +from django.newforms import ValidationError +from django.newforms.fields import RegexField, EMPTY_VALUES +from django.newforms.widgets import Select +from django.utils.translation import ugettext +from django.utils.encoding import smart_unicode + +class ISIdNumberField(RegexField): + """ + Icelandic identification number (kennitala). This is a number every citizen + of Iceland has. + """ + default_error_messages = { + 'invalid': ugettext('Enter a valid Icelandic identification number. The format is XXXXXX-XXXX.'), + 'checksum': ugettext(u'The Icelandic identification number is not valid.'), + } + + def __init__(self, *args, **kwargs): + kwargs['min_length'],kwargs['max_length'] = 10,11 + super(ISIdNumberField, self).__init__(r'^\d{6}(-| )?\d{4}$', *args, **kwargs) + + def clean(self, value): + value = super(ISIdNumberField, self).clean(value) + + if value in EMPTY_VALUES: + return u'' + + value = self._canonify(value) + if self._validate(value): + return self._format(value) + else: + raise ValidationError(self.error_messages['checksum']) + + def _canonify(self, value): + """ + Returns the value as only digits. + """ + return value.replace('-', '').replace(' ', '') + + def _validate(self, value): + """ + Takes in the value in canonical form and checks the verifier digit. The + method is modulo 11. + """ + check = [3, 2, 7, 6, 5, 4, 3, 2, 1, 0] + return sum([int(value[i]) * check[i] for i in range(10)]) % 11 == 0 + + def _format(self, value): + """ + Takes in the value in canonical form and returns it in the common + display format. + """ + return smart_unicode(value[:6]+'-'+value[6:]) + +class ISPhoneNumberField(RegexField): + """ + Icelandic phone number. Seven digits with an optional hyphen or space after + the first three digits. + """ + def __init__(self, *args, **kwargs): + kwargs['min_length'], kwargs['max_length'] = 7,8 + super(ISPhoneNumberField, self).__init__(r'^\d{3}(-| )?\d{4}$', *args, **kwargs) + + def clean(self, value): + value = super(ISPhoneNumberField, self).clean(value) + + if value in EMPTY_VALUES: + return u'' + + return value.replace('-', '').replace(' ', '') + +class ISPostalCodeSelect(Select): + """ + A Select widget that uses a list of Icelandic postal codes as its choices. + """ + def __init__(self, attrs=None): + from is_postalcodes import IS_POSTALCODES + super(ISPostalCodeSelect, self).__init__(attrs, choices=IS_POSTALCODES) +