Skip to content

Commit fbb975e

Browse files
committed
Add local flavor for Ukraine.
1 parent cfc436e commit fbb975e

File tree

12 files changed

+290
-0
lines changed

12 files changed

+290
-0
lines changed

docs/authors.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ Authors
3939
* Grzes Furga
4040
* Honza Král
4141
* Horst Gutmann
42+
* Illia Volochii
4243
* Ivan Fisun
4344
* Jaap Roes
4445
* Jacob Kaplan-Moss

docs/changelog.rst

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,27 @@
11
Changelog
22
=========
33

4+
5+
1.5 (unreleased)
6+
------------------
7+
8+
New flavors:
9+
10+
- Added local flavor for Ukraine
11+
(`gh-273 <https://github.com/django/django-localflavor/pull/273>`_)
12+
13+
New fields for existing flavors:
14+
15+
- None
16+
17+
Modifications to existing flavors:
18+
19+
- None
20+
21+
Other changes:
22+
23+
- None
24+
425
1.4 (unreleased)
526
------------------
627

docs/localflavor/ua.rst

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
Ukraine (``ua``)
2+
================
3+
4+
Forms
5+
-----
6+
7+
.. automodule:: localflavor.ua.forms
8+
:members:
9+
10+
Models
11+
------
12+
13+
.. automodule:: localflavor.ua.models
14+
:members:
15+
16+
Data
17+
----
18+
19+
.. autodata:: localflavor.ua.ua_regions.UA_REGION_CHOICES

localflavor/ua/__init__.py

Whitespace-only changes.

localflavor/ua/forms.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
from django.forms.fields import RegexField, Select
2+
from django.utils.translation import ugettext_lazy as _
3+
4+
from .ua_regions import UA_REGION_CHOICES
5+
6+
7+
class UARegionSelect(Select):
8+
"""
9+
A Select widget that uses a list of Ukrainian regions as its choices.
10+
11+
.. versionadded:: 1.5
12+
"""
13+
14+
def __init__(self, *args, **kwargs):
15+
kwargs['choices'] = UA_REGION_CHOICES
16+
super(UARegionSelect, self).__init__(*args, **kwargs)
17+
18+
19+
class UAVatNumberField(RegexField):
20+
"""
21+
A form field that validates input as a Ukrainian analog of a VAT number.
22+
23+
Valid format is XXXXXXXXXX.
24+
25+
Whitespace around a VAT number is accepted and automatically trimmed.
26+
27+
.. versionadded:: 1.5
28+
"""
29+
30+
default_error_messages = {
31+
'invalid': _('Enter a valid VAT number.'),
32+
}
33+
34+
def __init__(self, *args, **kwargs):
35+
kwargs['max_length'] = kwargs['min_length'] = 10
36+
super(UAVatNumberField, self).__init__(r'^\d{10}$', *args, **kwargs)
37+
38+
def to_python(self, value):
39+
value = super(UAVatNumberField, self).to_python(value)
40+
return value.strip()
41+
42+
43+
class UAPostalCodeField(RegexField):
44+
"""
45+
A form field that validates input as a Ukrainian postal code.
46+
47+
Valid format is XXXXX. Note: first two numbers cannot be '00'.
48+
49+
Whitespace around a postal code is accepted and automatically trimmed.
50+
51+
.. versionadded:: 1.5
52+
"""
53+
54+
default_error_messages = {
55+
'invalid': _('Enter a valid postal code.'),
56+
}
57+
58+
def __init__(self, *args, **kwargs):
59+
kwargs['max_length'] = kwargs['min_length'] = 5
60+
super(UAPostalCodeField, self).__init__(r'^(?!00)\d{5}$', *args, **kwargs)
61+
62+
def to_python(self, value):
63+
value = super(UAPostalCodeField, self).to_python(value)
64+
return value.strip()

localflavor/ua/models.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
from django.core.validators import RegexValidator
2+
from django.db.models import CharField
3+
from django.utils.translation import ugettext_lazy as _
4+
5+
from .ua_regions import UA_REGION_CHOICES
6+
7+
8+
class UARegionField(CharField):
9+
"""
10+
A model field which stores a Ukrainian region.
11+
12+
This field is represented by forms as
13+
a :class:`~localflavor.ua.forms.UARegionSelect` field.
14+
15+
.. versionadded:: 1.5
16+
"""
17+
18+
description = _('Ukrainian region')
19+
20+
def __init__(self, *args, **kwargs):
21+
kwargs['choices'] = UA_REGION_CHOICES
22+
kwargs['max_length'] = 5
23+
super(UARegionField, self).__init__(*args, **kwargs)
24+
25+
def deconstruct(self):
26+
name, path, args, kwargs = super(UARegionField, self).deconstruct()
27+
del kwargs['choices']
28+
return name, path, args, kwargs
29+
30+
31+
class UAVatNumberField(CharField):
32+
"""
33+
A model field which stores a Ukrainian analog of a VAT number.
34+
35+
This field is represented by forms as
36+
a :class:`~localflavor.ua.forms.UAVatNumberField` field.
37+
38+
.. versionadded:: 1.5
39+
"""
40+
41+
description = _('Ukrainian VAT number')
42+
validators = [RegexValidator(r'^\d{10}$', 'Enter a valid VAT number.')]
43+
44+
def __init__(self, *args, **kwargs):
45+
kwargs['max_length'] = 10
46+
super(UAVatNumberField, self).__init__(*args, **kwargs)
47+
48+
49+
class UAPostalCodeField(CharField):
50+
"""
51+
A model field which stores a Ukrainian postal code.
52+
53+
This field is represented by forms as
54+
a :class:`~localflavor.ua.forms.UAPostalCodeField` field.
55+
56+
.. versionadded:: 1.5
57+
"""
58+
59+
description = _('Ukrainian postal code')
60+
validators = [RegexValidator(r'^(?!00)\d{5}$', 'Enter a valid postal code.')]
61+
62+
def __init__(self, *args, **kwargs):
63+
kwargs['max_length'] = 5
64+
super(UAPostalCodeField, self).__init__(*args, **kwargs)

localflavor/ua/ua_regions.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from django.utils.translation import ugettext_lazy as _
2+
3+
#: 24 oblasts, Avtonomna Respublika Krym and 2 cities with special status
4+
# Codes were gotten from ISO 3166-2:UA
5+
UA_REGION_CHOICES = (
6+
('UA-71', _('Cherkaska oblast')),
7+
('UA-74', _('Chernihivska oblast')),
8+
('UA-77', _('Chernivetska oblast')),
9+
('UA-12', _('Dnipropetrovska oblast')),
10+
('UA-14', _('Donetska oblast')),
11+
('UA-26', _('Ivano-Frankivska oblast')),
12+
('UA-63', _('Kharkivska oblast')),
13+
('UA-65', _('Khersonska oblast')),
14+
('UA-68', _('Khmelnytska oblast')),
15+
('UA-35', _('Kirovohradska oblast')),
16+
('UA-32', _('Kyivska oblast')),
17+
('UA-09', _('Luhanska oblast')),
18+
('UA-46', _('Lvivska oblast')),
19+
('UA-48', _('Mykolaivska oblast')),
20+
('UA-51', _('Odeska oblast')),
21+
('UA-53', _('Poltavska oblast')),
22+
('UA-56', _('Rivnenska oblast')),
23+
('UA-59', _('Sumska oblast')),
24+
('UA-61', _('Ternopilska oblast')),
25+
('UA-05', _('Vinnytska oblast')),
26+
('UA-07', _('Volynska oblast')),
27+
('UA-21', _('Zakarpatska oblast')),
28+
('UA-23', _('Zaporizka oblast')),
29+
('UA-18', _('Zhytomyrska oblast')),
30+
('UA-43', _('Avtonomna Respublika Krym')),
31+
('UA-30', _('Kyiv')),
32+
('UA-40', _('Sevastopol'))
33+
)

tests/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
'tests.test_ec',
1414
'tests.test_mk',
1515
'tests.test_mx',
16+
'tests.test_ua',
1617
'tests.test_us',
1718
'tests.test_pk',
1819
'tests.test_generic',

tests/test_ua/__init__.py

Whitespace-only changes.

tests/test_ua/forms.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from django.forms import ModelForm
2+
3+
from .models import UAFlavorTestModel
4+
5+
6+
class UAFlavorTestForm(ModelForm):
7+
8+
class Meta:
9+
model = UAFlavorTestModel
10+
fields = '__all__'

0 commit comments

Comments
 (0)