Fixed #8068 - Added Kuwaiti (kw) localflavor. Thanks to Ahmad Al-Ibrahim for providing the patch.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@12042 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
3825bb2350
commit
82b33b1d80
1
AUTHORS
1
AUTHORS
|
@ -31,6 +31,7 @@ answer newbie questions, and generally made Django that much better:
|
||||||
Andi Albrecht <albrecht.andi@gmail.com>
|
Andi Albrecht <albrecht.andi@gmail.com>
|
||||||
Marty Alchin <gulopine@gamemusic.org>
|
Marty Alchin <gulopine@gamemusic.org>
|
||||||
Ahmad Alhashemi <trans@ahmadh.com>
|
Ahmad Alhashemi <trans@ahmadh.com>
|
||||||
|
Ahmad Al-Ibrahim
|
||||||
Daniel Alves Barbosa de Oliveira Vaz <danielvaz@gmail.com>
|
Daniel Alves Barbosa de Oliveira Vaz <danielvaz@gmail.com>
|
||||||
AgarFu <heaven@croasanaso.sytes.net>
|
AgarFu <heaven@croasanaso.sytes.net>
|
||||||
Dagur Páll Ammendrup <dagurp@gmail.com>
|
Dagur Páll Ammendrup <dagurp@gmail.com>
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
"""
|
||||||
|
Kuwait-specific Form helpers
|
||||||
|
"""
|
||||||
|
import re
|
||||||
|
from datetime import date
|
||||||
|
from django.forms import ValidationError
|
||||||
|
from django.forms.fields import Field, RegexField, EMPTY_VALUES
|
||||||
|
from django.utils.translation import gettext as _
|
||||||
|
|
||||||
|
id_re = re.compile(r'^(?P<initial>\d{1})(?P<yy>\d\d)(?P<mm>\d\d)(?P<dd>\d\d)(?P<mid>\d{4})(?P<checksum>\d{1})')
|
||||||
|
|
||||||
|
class KWCivilIDNumberField(Field):
|
||||||
|
"""
|
||||||
|
Kuwaiti Civil ID numbers are 12 digits, second to seventh digits
|
||||||
|
represents the person's birthdate.
|
||||||
|
|
||||||
|
Checks the following rules to determine the validty of the number:
|
||||||
|
* The number consist of 12 digits.
|
||||||
|
* The birthdate of the person is a valid date.
|
||||||
|
* The calculated checksum equals to the last digit of the Civil ID.
|
||||||
|
"""
|
||||||
|
default_error_messages = {
|
||||||
|
'invalid': _('Enter a valid Kuwaiti Civil ID number'),
|
||||||
|
}
|
||||||
|
|
||||||
|
def has_valid_checksum(self, value):
|
||||||
|
weight = (2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2)
|
||||||
|
calculated_checksum = 0
|
||||||
|
for i in range(11):
|
||||||
|
calculated_checksum += int(value[i]) * weight[i]
|
||||||
|
|
||||||
|
remainder = calculated_checksum % 11
|
||||||
|
checkdigit = 11 - remainder
|
||||||
|
if checkdigit != int(value[11]):
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def clean(self, value):
|
||||||
|
super(KWCivilIDNumberField, self).clean(value)
|
||||||
|
if value in EMPTY_VALUES:
|
||||||
|
return u''
|
||||||
|
|
||||||
|
if not re.match(r'^\d{12}$', value):
|
||||||
|
raise ValidationError(self.error_messages['invalid'])
|
||||||
|
|
||||||
|
match = re.match(id_re, value)
|
||||||
|
|
||||||
|
if not match:
|
||||||
|
raise ValidationError(self.error_messages['invalid'])
|
||||||
|
|
||||||
|
gd = match.groupdict()
|
||||||
|
|
||||||
|
try:
|
||||||
|
d = date(int(gd['yy']), int(gd['mm']), int(gd['dd']))
|
||||||
|
except ValueError:
|
||||||
|
raise ValidationError(self.error_messages['invalid'])
|
||||||
|
|
||||||
|
if not self.has_valid_checksum(value):
|
||||||
|
raise ValidationError(self.error_messages['invalid'])
|
||||||
|
|
||||||
|
return value
|
|
@ -52,6 +52,7 @@ Countries currently supported by :mod:`~django.contrib.localflavor` are:
|
||||||
* India_
|
* India_
|
||||||
* Italy_
|
* Italy_
|
||||||
* Japan_
|
* Japan_
|
||||||
|
* Kuwait_
|
||||||
* Mexico_
|
* Mexico_
|
||||||
* `The Netherlands`_
|
* `The Netherlands`_
|
||||||
* Norway_
|
* Norway_
|
||||||
|
@ -95,6 +96,7 @@ Here's an example of how to use them::
|
||||||
.. _India: `India (in\_)`_
|
.. _India: `India (in\_)`_
|
||||||
.. _Italy: `Italy (it)`_
|
.. _Italy: `Italy (it)`_
|
||||||
.. _Japan: `Japan (jp)`_
|
.. _Japan: `Japan (jp)`_
|
||||||
|
.. _Kuwait: `Kuwait (kw)`_
|
||||||
.. _Mexico: `Mexico (mx)`_
|
.. _Mexico: `Mexico (mx)`_
|
||||||
.. _Norway: `Norway (no)`_
|
.. _Norway: `Norway (no)`_
|
||||||
.. _Peru: `Peru (pe)`_
|
.. _Peru: `Peru (pe)`_
|
||||||
|
@ -410,6 +412,18 @@ Japan (``jp``)
|
||||||
|
|
||||||
A ``Select`` widget that uses a list of Japanese prefectures as its choices.
|
A ``Select`` widget that uses a list of Japanese prefectures as its choices.
|
||||||
|
|
||||||
|
Kuwait (``kw``)
|
||||||
|
===============
|
||||||
|
|
||||||
|
.. class:: kw.forms.KWCivilIDNumberField
|
||||||
|
|
||||||
|
A form field that validates input as a Kuwaiti Civil ID number. A valid
|
||||||
|
Civil ID number must obey the following rules:
|
||||||
|
|
||||||
|
* The number consist of 12 digits.
|
||||||
|
* The birthdate of the person is a valid date.
|
||||||
|
* The calculated checksum equals to the last digit of the Civil ID.
|
||||||
|
|
||||||
Mexico (``mx``)
|
Mexico (``mx``)
|
||||||
===============
|
===============
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Tests for the contrib/localflavor/ KW form fields.
|
||||||
|
|
||||||
|
tests = r"""
|
||||||
|
# KWCivilIDNumberField ########################################################
|
||||||
|
|
||||||
|
>>> from django.contrib.localflavor.kw.forms import KWCivilIDNumberField
|
||||||
|
>>> f = KWCivilIDNumberField()
|
||||||
|
>>> f.clean('282040701483')
|
||||||
|
'282040701483'
|
||||||
|
>>> f.clean('289332013455')
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValidationError: [u'Enter a valid Kuwaiti Civil ID number']
|
||||||
|
"""
|
|
@ -18,6 +18,7 @@ from localflavor.generic import tests as localflavor_generic_tests
|
||||||
from localflavor.is_ import tests as localflavor_is_tests
|
from localflavor.is_ import tests as localflavor_is_tests
|
||||||
from localflavor.it import tests as localflavor_it_tests
|
from localflavor.it import tests as localflavor_it_tests
|
||||||
from localflavor.jp import tests as localflavor_jp_tests
|
from localflavor.jp import tests as localflavor_jp_tests
|
||||||
|
from localflavor.kw import tests as localflavor_kw_tests
|
||||||
from localflavor.nl import tests as localflavor_nl_tests
|
from localflavor.nl import tests as localflavor_nl_tests
|
||||||
from localflavor.pl import tests as localflavor_pl_tests
|
from localflavor.pl import tests as localflavor_pl_tests
|
||||||
from localflavor.ro import tests as localflavor_ro_tests
|
from localflavor.ro import tests as localflavor_ro_tests
|
||||||
|
@ -55,6 +56,7 @@ __test__ = {
|
||||||
'localflavor_is_tests': localflavor_is_tests,
|
'localflavor_is_tests': localflavor_is_tests,
|
||||||
'localflavor_it_tests': localflavor_it_tests,
|
'localflavor_it_tests': localflavor_it_tests,
|
||||||
'localflavor_jp_tests': localflavor_jp_tests,
|
'localflavor_jp_tests': localflavor_jp_tests,
|
||||||
|
'localflavor_kw_tests': localflavor_kw_tests,
|
||||||
'localflavor_nl_tests': localflavor_nl_tests,
|
'localflavor_nl_tests': localflavor_nl_tests,
|
||||||
'localflavor_pl_tests': localflavor_pl_tests,
|
'localflavor_pl_tests': localflavor_pl_tests,
|
||||||
'localflavor_ro_tests': localflavor_ro_tests,
|
'localflavor_ro_tests': localflavor_ro_tests,
|
||||||
|
|
Loading…
Reference in New Issue