-
-
Notifications
You must be signed in to change notification settings - Fork 31.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fixed #3879 -- Added Norwegian localflavor. Thanks bp@datakortet.no
git-svn-id: http://code.djangoproject.com/svn/django/trunk@4875 bcc190cf-cafb-0310-a4f2-bffc1f526a37
- Loading branch information
Showing
4 changed files
with
108 additions
and
0 deletions.
There are no files selected for viewing
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
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,75 @@ | ||
# -*- coding: iso-8859-1 -*- | ||
""" | ||
Norwegian-specific Form helpers | ||
""" | ||
|
||
import re, datetime | ||
from django.newforms import ValidationError | ||
from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES | ||
from django.utils.translation import gettext | ||
|
||
class NOZipCodeField(RegexField): | ||
def __init__(self, *args, **kwargs): | ||
super(NOZipCodeField, self).__init__(r'^\d{4}$', | ||
max_length=None, min_length=None, | ||
error_message=gettext(u'Enter a zip code in the format XXXX.'), | ||
*args, **kwargs) | ||
|
||
class NOMunicipalitySelect(Select): | ||
""" | ||
A Select widget that uses a list of Norwegian municipalities (fylker) | ||
as its choices. | ||
""" | ||
def __init__(self, attrs=None): | ||
from no_municipalities import MUNICIPALITY_CHOICES | ||
super(NOMunicipalitySelect, self).__init__(attrs, choices=MUNICIPALITY_CHOICES) | ||
|
||
class NOSocialSecurityNumber(Field): | ||
""" | ||
Algorithm is documented at http://no.wikipedia.org/wiki/Personnummer | ||
""" | ||
def clean(self, value): | ||
super(NOSocialSecurityNumber, self).clean(value) | ||
if value in EMPTY_VALUES: | ||
return u'' | ||
|
||
msg = gettext(u'Enter a valid Norwegian social security number.') | ||
if not re.match(r'^\d{11}$', value): | ||
raise ValidationError(msg) | ||
|
||
day = int(value[:2]) | ||
month = int(value[2:4]) | ||
year2 = int(value[4:6]) | ||
|
||
inum = int(value[6:9]) | ||
self.birthday = None | ||
try: | ||
if 000 <= inum < 500: | ||
self.birthday = datetime.date(1900+year2, month, day) | ||
if 500 <= inum < 750: | ||
self.birthday = datetime.date(1800+year2, month, day) | ||
if 500 <= inum < 1000: | ||
self.birthday = datetime.date(2000+year2, month, day) | ||
except ValueError: | ||
raise ValidationError(msg) | ||
|
||
sexnum = int(value[8]) | ||
if sexnum % 2 == 0: | ||
self.gender = 'F' | ||
else: | ||
self.gender = 'M' | ||
|
||
digits = map(int, list(value)) | ||
weight_1 = [3, 7, 6, 1, 8, 9, 4, 5, 2, 1, 0] | ||
weight_2 = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2, 1] | ||
|
||
def multiply_reduce(aval, bval): | ||
return sum((a * b) for (a, b) in zip(aval, bval)) | ||
|
||
if multiply_reduce(digits, weight_1) % 11 != 0: | ||
raise ValidationError(msg) | ||
if multiply_reduce(digits, weight_2) % 11 != 0: | ||
raise ValidationError(msg) | ||
|
||
return value | ||
|
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,32 @@ | ||
# -*- coding: iso-8859-1 -*- | ||
""" | ||
An alphabetical list of Norwegian municipalities (fylker) fro use as `choices` | ||
in a formfield. | ||
This exists in this standalone file so that it's on ly imported into memory | ||
when explicitly needed. | ||
""" | ||
|
||
MUNICIPALITY_CHOICES = ( | ||
('akershus', u'Akershus'), | ||
('austagder', u'Aust-Agder'), | ||
('buskerud', u'Buskerud'), | ||
('finnmark', u'Finnmark'), | ||
('hedmark', u'Hedmark'), | ||
('hordaland', u'Hordaland'), | ||
('janmayen', u'Jan Mayen'), | ||
('moreogromsdal', u'Møre og Romsdal'), | ||
('nordtrondelag', u'Nord-Trøndelag'), | ||
('nordland', u'Nordland'), | ||
('oppland', u'Oppland'), | ||
('oslo', u'Oslo'), | ||
('rogaland', u'Rogaland'), | ||
('sognogfjordane', u'Sogn og Fjordane'), | ||
('svalbard', u'Svalbard'), | ||
('sortrondelag', u'Sør-Trøndelag'), | ||
('telemark', u'Telemark'), | ||
('troms', u'Troms'), | ||
('vestagder', u'Vest-Agder'), | ||
('vestfold', u'Vestfold'), | ||
('ostfold', u'Østfold') | ||
) |