1
0
mirror of https://github.com/django/django.git synced 2025-06-04 02:59:13 +00:00

Fixed #18269 -- Applied unicode_literals for Python 3 compatibility.

Thanks Vinay Sajip for the support of his django3 branch and
Jannis Leidel for the review.
This commit is contained in:
Claude Paroz 2012-06-07 18:08:47 +02:00
parent 706fd9adc0
commit 4a103086d5
401 changed files with 6647 additions and 6157 deletions

View File

@ -1,434 +1,436 @@
from __future__ import unicode_literals
LANG_INFO = { LANG_INFO = {
'ar': { 'ar': {
'bidi': True, 'bidi': True,
'code': 'ar', 'code': 'ar',
'name': 'Arabic', 'name': 'Arabic',
'name_local': u'\u0627\u0644\u0639\u0631\u0628\u064a\u0651\u0629', 'name_local': '\u0627\u0644\u0639\u0631\u0628\u064a\u0651\u0629',
}, },
'az': { 'az': {
'bidi': True, 'bidi': True,
'code': 'az', 'code': 'az',
'name': 'Azerbaijani', 'name': 'Azerbaijani',
'name_local': u'az\u0259rbaycan dili', 'name_local': 'az\u0259rbaycan dili',
}, },
'bg': { 'bg': {
'bidi': False, 'bidi': False,
'code': 'bg', 'code': 'bg',
'name': 'Bulgarian', 'name': 'Bulgarian',
'name_local': u'\u0431\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438', 'name_local': '\u0431\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438',
}, },
'bn': { 'bn': {
'bidi': False, 'bidi': False,
'code': 'bn', 'code': 'bn',
'name': 'Bengali', 'name': 'Bengali',
'name_local': u'\u09ac\u09be\u0982\u09b2\u09be', 'name_local': '\u09ac\u09be\u0982\u09b2\u09be',
}, },
'bs': { 'bs': {
'bidi': False, 'bidi': False,
'code': 'bs', 'code': 'bs',
'name': 'Bosnian', 'name': 'Bosnian',
'name_local': u'bosanski', 'name_local': 'bosanski',
}, },
'ca': { 'ca': {
'bidi': False, 'bidi': False,
'code': 'ca', 'code': 'ca',
'name': 'Catalan', 'name': 'Catalan',
'name_local': u'catal\xe0', 'name_local': 'catal\xe0',
}, },
'cs': { 'cs': {
'bidi': False, 'bidi': False,
'code': 'cs', 'code': 'cs',
'name': 'Czech', 'name': 'Czech',
'name_local': u'\u010desky', 'name_local': '\u010desky',
}, },
'cy': { 'cy': {
'bidi': False, 'bidi': False,
'code': 'cy', 'code': 'cy',
'name': 'Welsh', 'name': 'Welsh',
'name_local': u'Cymraeg', 'name_local': 'Cymraeg',
}, },
'da': { 'da': {
'bidi': False, 'bidi': False,
'code': 'da', 'code': 'da',
'name': 'Danish', 'name': 'Danish',
'name_local': u'Dansk', 'name_local': 'Dansk',
}, },
'de': { 'de': {
'bidi': False, 'bidi': False,
'code': 'de', 'code': 'de',
'name': 'German', 'name': 'German',
'name_local': u'Deutsch', 'name_local': 'Deutsch',
}, },
'el': { 'el': {
'bidi': False, 'bidi': False,
'code': 'el', 'code': 'el',
'name': 'Greek', 'name': 'Greek',
'name_local': u'\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac', 'name_local': '\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac',
}, },
'en': { 'en': {
'bidi': False, 'bidi': False,
'code': 'en', 'code': 'en',
'name': 'English', 'name': 'English',
'name_local': u'English', 'name_local': 'English',
}, },
'en-gb': { 'en-gb': {
'bidi': False, 'bidi': False,
'code': 'en-gb', 'code': 'en-gb',
'name': 'British English', 'name': 'British English',
'name_local': u'British English', 'name_local': 'British English',
}, },
'eo': { 'eo': {
'bidi': False, 'bidi': False,
'code': 'eo', 'code': 'eo',
'name': 'Esperanto', 'name': 'Esperanto',
'name_local': u'Esperanto', 'name_local': 'Esperanto',
}, },
'es': { 'es': {
'bidi': False, 'bidi': False,
'code': 'es', 'code': 'es',
'name': 'Spanish', 'name': 'Spanish',
'name_local': u'espa\xf1ol', 'name_local': 'espa\xf1ol',
}, },
'es-ar': { 'es-ar': {
'bidi': False, 'bidi': False,
'code': 'es-ar', 'code': 'es-ar',
'name': 'Argentinian Spanish', 'name': 'Argentinian Spanish',
'name_local': u'espa\xf1ol de Argentina', 'name_local': 'espa\xf1ol de Argentina',
}, },
'es-mx': { 'es-mx': {
'bidi': False, 'bidi': False,
'code': 'es-mx', 'code': 'es-mx',
'name': 'Mexican Spanish', 'name': 'Mexican Spanish',
'name_local': u'espa\xf1ol de Mexico', 'name_local': 'espa\xf1ol de Mexico',
}, },
'es-ni': { 'es-ni': {
'bidi': False, 'bidi': False,
'code': 'es-ni', 'code': 'es-ni',
'name': 'Nicaraguan Spanish', 'name': 'Nicaraguan Spanish',
'name_local': u'espa\xf1ol de Nicaragua', 'name_local': 'espa\xf1ol de Nicaragua',
}, },
'et': { 'et': {
'bidi': False, 'bidi': False,
'code': 'et', 'code': 'et',
'name': 'Estonian', 'name': 'Estonian',
'name_local': u'eesti', 'name_local': 'eesti',
}, },
'eu': { 'eu': {
'bidi': False, 'bidi': False,
'code': 'eu', 'code': 'eu',
'name': 'Basque', 'name': 'Basque',
'name_local': u'Basque', 'name_local': 'Basque',
}, },
'fa': { 'fa': {
'bidi': True, 'bidi': True,
'code': 'fa', 'code': 'fa',
'name': 'Persian', 'name': 'Persian',
'name_local': u'\u0641\u0627\u0631\u0633\u06cc', 'name_local': '\u0641\u0627\u0631\u0633\u06cc',
}, },
'fi': { 'fi': {
'bidi': False, 'bidi': False,
'code': 'fi', 'code': 'fi',
'name': 'Finnish', 'name': 'Finnish',
'name_local': u'suomi', 'name_local': 'suomi',
}, },
'fr': { 'fr': {
'bidi': False, 'bidi': False,
'code': 'fr', 'code': 'fr',
'name': 'French', 'name': 'French',
'name_local': u'Fran\xe7ais', 'name_local': 'Fran\xe7ais',
}, },
'fy-nl': { 'fy-nl': {
'bidi': False, 'bidi': False,
'code': 'fy-nl', 'code': 'fy-nl',
'name': 'Frisian', 'name': 'Frisian',
'name_local': u'Frisian', 'name_local': 'Frisian',
}, },
'ga': { 'ga': {
'bidi': False, 'bidi': False,
'code': 'ga', 'code': 'ga',
'name': 'Irish', 'name': 'Irish',
'name_local': u'Gaeilge', 'name_local': 'Gaeilge',
}, },
'gl': { 'gl': {
'bidi': False, 'bidi': False,
'code': 'gl', 'code': 'gl',
'name': 'Galician', 'name': 'Galician',
'name_local': u'galego', 'name_local': 'galego',
}, },
'he': { 'he': {
'bidi': True, 'bidi': True,
'code': 'he', 'code': 'he',
'name': 'Hebrew', 'name': 'Hebrew',
'name_local': u'\u05e2\u05d1\u05e8\u05d9\u05ea', 'name_local': '\u05e2\u05d1\u05e8\u05d9\u05ea',
}, },
'hi': { 'hi': {
'bidi': False, 'bidi': False,
'code': 'hi', 'code': 'hi',
'name': 'Hindi', 'name': 'Hindi',
'name_local': u'Hindi', 'name_local': 'Hindi',
}, },
'hr': { 'hr': {
'bidi': False, 'bidi': False,
'code': 'hr', 'code': 'hr',
'name': 'Croatian', 'name': 'Croatian',
'name_local': u'Hrvatski', 'name_local': 'Hrvatski',
}, },
'hu': { 'hu': {
'bidi': False, 'bidi': False,
'code': 'hu', 'code': 'hu',
'name': 'Hungarian', 'name': 'Hungarian',
'name_local': u'Magyar', 'name_local': 'Magyar',
}, },
'id': { 'id': {
'bidi': False, 'bidi': False,
'code': 'id', 'code': 'id',
'name': 'Indonesian', 'name': 'Indonesian',
'name_local': u'Bahasa Indonesia', 'name_local': 'Bahasa Indonesia',
}, },
'is': { 'is': {
'bidi': False, 'bidi': False,
'code': 'is', 'code': 'is',
'name': 'Icelandic', 'name': 'Icelandic',
'name_local': u'\xcdslenska', 'name_local': '\xcdslenska',
}, },
'it': { 'it': {
'bidi': False, 'bidi': False,
'code': 'it', 'code': 'it',
'name': 'Italian', 'name': 'Italian',
'name_local': u'italiano', 'name_local': 'italiano',
}, },
'ja': { 'ja': {
'bidi': False, 'bidi': False,
'code': 'ja', 'code': 'ja',
'name': 'Japanese', 'name': 'Japanese',
'name_local': u'\u65e5\u672c\u8a9e', 'name_local': '\u65e5\u672c\u8a9e',
}, },
'ka': { 'ka': {
'bidi': False, 'bidi': False,
'code': 'ka', 'code': 'ka',
'name': 'Georgian', 'name': 'Georgian',
'name_local': u'\u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8', 'name_local': '\u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8',
}, },
'kk': { 'kk': {
'bidi': False, 'bidi': False,
'code': 'kk', 'code': 'kk',
'name': 'Kazakh', 'name': 'Kazakh',
'name_local': u'\u049a\u0430\u0437\u0430\u049b', 'name_local': '\u049a\u0430\u0437\u0430\u049b',
}, },
'km': { 'km': {
'bidi': False, 'bidi': False,
'code': 'km', 'code': 'km',
'name': 'Khmer', 'name': 'Khmer',
'name_local': u'Khmer', 'name_local': 'Khmer',
}, },
'kn': { 'kn': {
'bidi': False, 'bidi': False,
'code': 'kn', 'code': 'kn',
'name': 'Kannada', 'name': 'Kannada',
'name_local': u'Kannada', 'name_local': 'Kannada',
}, },
'ko': { 'ko': {
'bidi': False, 'bidi': False,
'code': 'ko', 'code': 'ko',
'name': 'Korean', 'name': 'Korean',
'name_local': u'\ud55c\uad6d\uc5b4', 'name_local': '\ud55c\uad6d\uc5b4',
}, },
'lt': { 'lt': {
'bidi': False, 'bidi': False,
'code': 'lt', 'code': 'lt',
'name': 'Lithuanian', 'name': 'Lithuanian',
'name_local': u'Lithuanian', 'name_local': 'Lithuanian',
}, },
'lv': { 'lv': {
'bidi': False, 'bidi': False,
'code': 'lv', 'code': 'lv',
'name': 'Latvian', 'name': 'Latvian',
'name_local': u'latvie\u0161u', 'name_local': 'latvie\u0161u',
}, },
'mk': { 'mk': {
'bidi': False, 'bidi': False,
'code': 'mk', 'code': 'mk',
'name': 'Macedonian', 'name': 'Macedonian',
'name_local': u'\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438', 'name_local': '\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438',
}, },
'ml': { 'ml': {
'bidi': False, 'bidi': False,
'code': 'ml', 'code': 'ml',
'name': 'Malayalam', 'name': 'Malayalam',
'name_local': u'Malayalam', 'name_local': 'Malayalam',
}, },
'mn': { 'mn': {
'bidi': False, 'bidi': False,
'code': 'mn', 'code': 'mn',
'name': 'Mongolian', 'name': 'Mongolian',
'name_local': u'Mongolian', 'name_local': 'Mongolian',
}, },
'nb': { 'nb': {
'bidi': False, 'bidi': False,
'code': 'nb', 'code': 'nb',
'name': 'Norwegian Bokmal', 'name': 'Norwegian Bokmal',
'name_local': u'Norsk (bokm\xe5l)', 'name_local': 'Norsk (bokm\xe5l)',
}, },
'ne': { 'ne': {
'bidi': False, 'bidi': False,
'code': 'ne', 'code': 'ne',
'name': 'Nepali', 'name': 'Nepali',
'name_local': u'\u0928\u0947\u092a\u093e\u0932\u0940', 'name_local': '\u0928\u0947\u092a\u093e\u0932\u0940',
}, },
'nl': { 'nl': {
'bidi': False, 'bidi': False,
'code': 'nl', 'code': 'nl',
'name': 'Dutch', 'name': 'Dutch',
'name_local': u'Nederlands', 'name_local': 'Nederlands',
}, },
'nn': { 'nn': {
'bidi': False, 'bidi': False,
'code': 'nn', 'code': 'nn',
'name': 'Norwegian Nynorsk', 'name': 'Norwegian Nynorsk',
'name_local': u'Norsk (nynorsk)', 'name_local': 'Norsk (nynorsk)',
}, },
'no': { 'no': {
'bidi': False, 'bidi': False,
'code': 'no', 'code': 'no',
'name': 'Norwegian', 'name': 'Norwegian',
'name_local': u'Norsk', 'name_local': 'Norsk',
}, },
'pa': { 'pa': {
'bidi': False, 'bidi': False,
'code': 'pa', 'code': 'pa',
'name': 'Punjabi', 'name': 'Punjabi',
'name_local': u'Punjabi', 'name_local': 'Punjabi',
}, },
'pl': { 'pl': {
'bidi': False, 'bidi': False,
'code': 'pl', 'code': 'pl',
'name': 'Polish', 'name': 'Polish',
'name_local': u'polski', 'name_local': 'polski',
}, },
'pt': { 'pt': {
'bidi': False, 'bidi': False,
'code': 'pt', 'code': 'pt',
'name': 'Portuguese', 'name': 'Portuguese',
'name_local': u'Portugu\xeas', 'name_local': 'Portugu\xeas',
}, },
'pt-br': { 'pt-br': {
'bidi': False, 'bidi': False,
'code': 'pt-br', 'code': 'pt-br',
'name': 'Brazilian Portuguese', 'name': 'Brazilian Portuguese',
'name_local': u'Portugu\xeas Brasileiro', 'name_local': 'Portugu\xeas Brasileiro',
}, },
'ro': { 'ro': {
'bidi': False, 'bidi': False,
'code': 'ro', 'code': 'ro',
'name': 'Romanian', 'name': 'Romanian',
'name_local': u'Rom\xe2n\u0103', 'name_local': 'Rom\xe2n\u0103',
}, },
'ru': { 'ru': {
'bidi': False, 'bidi': False,
'code': 'ru', 'code': 'ru',
'name': 'Russian', 'name': 'Russian',
'name_local': u'\u0420\u0443\u0441\u0441\u043a\u0438\u0439', 'name_local': '\u0420\u0443\u0441\u0441\u043a\u0438\u0439',
}, },
'sk': { 'sk': {
'bidi': False, 'bidi': False,
'code': 'sk', 'code': 'sk',
'name': 'Slovak', 'name': 'Slovak',
'name_local': u'slovensk\xfd', 'name_local': 'slovensk\xfd',
}, },
'sl': { 'sl': {
'bidi': False, 'bidi': False,
'code': 'sl', 'code': 'sl',
'name': 'Slovenian', 'name': 'Slovenian',
'name_local': u'Sloven\u0161\u010dina', 'name_local': 'Sloven\u0161\u010dina',
}, },
'sq': { 'sq': {
'bidi': False, 'bidi': False,
'code': 'sq', 'code': 'sq',
'name': 'Albanian', 'name': 'Albanian',
'name_local': u'Albanian', 'name_local': 'Albanian',
}, },
'sr': { 'sr': {
'bidi': False, 'bidi': False,
'code': 'sr', 'code': 'sr',
'name': 'Serbian', 'name': 'Serbian',
'name_local': u'\u0441\u0440\u043f\u0441\u043a\u0438', 'name_local': '\u0441\u0440\u043f\u0441\u043a\u0438',
}, },
'sr-latn': { 'sr-latn': {
'bidi': False, 'bidi': False,
'code': 'sr-latn', 'code': 'sr-latn',
'name': 'Serbian Latin', 'name': 'Serbian Latin',
'name_local': u'srpski (latinica)', 'name_local': 'srpski (latinica)',
}, },
'sv': { 'sv': {
'bidi': False, 'bidi': False,
'code': 'sv', 'code': 'sv',
'name': 'Swedish', 'name': 'Swedish',
'name_local': u'Svenska', 'name_local': 'Svenska',
}, },
'sw': { 'sw': {
'bidi': False, 'bidi': False,
'code': 'sw', 'code': 'sw',
'name': 'Swahili', 'name': 'Swahili',
'name_local': u'Kiswahili', 'name_local': 'Kiswahili',
}, },
'ta': { 'ta': {
'bidi': False, 'bidi': False,
'code': 'ta', 'code': 'ta',
'name': 'Tamil', 'name': 'Tamil',
'name_local': u'\u0ba4\u0bae\u0bbf\u0bb4\u0bcd', 'name_local': '\u0ba4\u0bae\u0bbf\u0bb4\u0bcd',
}, },
'te': { 'te': {
'bidi': False, 'bidi': False,
'code': 'te', 'code': 'te',
'name': 'Telugu', 'name': 'Telugu',
'name_local': u'\u0c24\u0c46\u0c32\u0c41\u0c17\u0c41', 'name_local': '\u0c24\u0c46\u0c32\u0c41\u0c17\u0c41',
}, },
'th': { 'th': {
'bidi': False, 'bidi': False,
'code': 'th', 'code': 'th',
'name': 'Thai', 'name': 'Thai',
'name_local': u'Thai', 'name_local': 'Thai',
}, },
'tr': { 'tr': {
'bidi': False, 'bidi': False,
'code': 'tr', 'code': 'tr',
'name': 'Turkish', 'name': 'Turkish',
'name_local': u'T\xfcrk\xe7e', 'name_local': 'T\xfcrk\xe7e',
}, },
'tt': { 'tt': {
'bidi': False, 'bidi': False,
'code': 'tt', 'code': 'tt',
'name': 'Tatar', 'name': 'Tatar',
'name_local': u'\u0422\u0430\u0442\u0430\u0440\u0447\u0430', 'name_local': '\u0422\u0430\u0442\u0430\u0440\u0447\u0430',
}, },
'uk': { 'uk': {
'bidi': False, 'bidi': False,
'code': 'uk', 'code': 'uk',
'name': 'Ukrainian', 'name': 'Ukrainian',
'name_local': u'\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430', 'name_local': '\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430',
}, },
'ur': { 'ur': {
'bidi': False, 'bidi': False,
'code': 'ur', 'code': 'ur',
'name': 'Urdu', 'name': 'Urdu',
'name_local': u'\u0627\u0631\u062f\u0648', 'name_local': '\u0627\u0631\u062f\u0648',
}, },
'vi': { 'vi': {
'bidi': False, 'bidi': False,
'code': 'vi', 'code': 'vi',
'name': 'Vietnamese', 'name': 'Vietnamese',
'name_local': u'Vietnamese', 'name_local': 'Vietnamese',
}, },
'zh-cn': { 'zh-cn': {
'bidi': False, 'bidi': False,
'code': 'zh-cn', 'code': 'zh-cn',
'name': 'Simplified Chinese', 'name': 'Simplified Chinese',
'name_local': u'\u7b80\u4f53\u4e2d\u6587', 'name_local': '\u7b80\u4f53\u4e2d\u6587',
}, },
'zh-tw': { 'zh-tw': {
'bidi': False, 'bidi': False,
'code': 'zh-tw', 'code': 'zh-tw',
'name': 'Traditional Chinese', 'name': 'Traditional Chinese',
'name_local': u'\u7e41\u9ad4\u4e2d\u6587', 'name_local': '\u7e41\u9ad4\u4e2d\u6587',
} }
} }

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@ -19,5 +20,5 @@ SHORT_DATE_FORMAT = 'd.m.Y'
# TIME_INPUT_FORMATS = # TIME_INPUT_FORMATS =
# DATETIME_INPUT_FORMATS = # DATETIME_INPUT_FORMATS =
DECIMAL_SEPARATOR = ',' DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = u' ' # Non-breaking space THOUSAND_SEPARATOR = ' ' # Non-breaking space
# NUMBER_GROUPING = # NUMBER_GROUPING =

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@ -33,5 +34,5 @@ DATETIME_INPUT_FORMATS = (
'%Y-%m-%d', # '2006-10-25' '%Y-%m-%d', # '2006-10-25'
) )
DECIMAL_SEPARATOR = ',' DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = u'\xa0' # non-breaking space THOUSAND_SEPARATOR = '\xa0' # non-breaking space
NUMBER_GROUPING = 3 NUMBER_GROUPING = 3

View File

@ -37,7 +37,7 @@ DATETIME_INPUT_FORMATS = (
'%m/%d/%y %H:%M', # '10/25/06 14:30' '%m/%d/%y %H:%M', # '10/25/06 14:30'
'%m/%d/%y', # '10/25/06' '%m/%d/%y', # '10/25/06'
) )
DECIMAL_SEPARATOR = u'.' DECIMAL_SEPARATOR = '.'
THOUSAND_SEPARATOR = u',' THOUSAND_SEPARATOR = ','
NUMBER_GROUPING = 3 NUMBER_GROUPING = 3

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
DATE_FORMAT = r'j \d\e F \d\e Y' DATE_FORMAT = r'j \d\e F \d\e Y'
TIME_FORMAT = 'H:i:s' TIME_FORMAT = 'H:i:s'
@ -24,5 +25,5 @@ DATETIME_INPUT_FORMATS = (
'%d/%m/%y %H:%M', '%d/%m/%y %H:%M',
) )
DECIMAL_SEPARATOR = '.' # ',' is also official (less common): NOM-008-SCFI-2002 DECIMAL_SEPARATOR = '.' # ',' is also official (less common): NOM-008-SCFI-2002
THOUSAND_SEPARATOR = u'\xa0' # non-breaking space THOUSAND_SEPARATOR = '\xa0' # non-breaking space
NUMBER_GROUPING = 3 NUMBER_GROUPING = 3

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@ -19,5 +20,5 @@ SHORT_DATE_FORMAT = 'd.m.Y'
# TIME_INPUT_FORMATS = # TIME_INPUT_FORMATS =
# DATETIME_INPUT_FORMATS = # DATETIME_INPUT_FORMATS =
DECIMAL_SEPARATOR = ',' DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = u' ' # Non-breaking space THOUSAND_SEPARATOR = ' ' # Non-breaking space
# NUMBER_GROUPING = # NUMBER_GROUPING =

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@ -19,5 +20,5 @@ SHORT_DATE_FORMAT = 'j.n.Y'
# TIME_INPUT_FORMATS = # TIME_INPUT_FORMATS =
# DATETIME_INPUT_FORMATS = # DATETIME_INPUT_FORMATS =
DECIMAL_SEPARATOR = ',' DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = u' ' # Non-breaking space THOUSAND_SEPARATOR = ' ' # Non-breaking space
# NUMBER_GROUPING = # NUMBER_GROUPING =

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@ -37,5 +38,5 @@ DATETIME_INPUT_FORMATS = (
'%Y-%m-%d', # '2006-10-25' '%Y-%m-%d', # '2006-10-25'
) )
DECIMAL_SEPARATOR = ',' DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = u'\xa0' # non-breaking space THOUSAND_SEPARATOR = '\xa0' # non-breaking space
NUMBER_GROUPING = 3 NUMBER_GROUPING = 3

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@ -28,5 +29,5 @@ DATETIME_INPUT_FORMATS = (
'%Y.%m.%d.', # '2006.10.25.' '%Y.%m.%d.', # '2006.10.25.'
) )
DECIMAL_SEPARATOR = ',' DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = u' ' # Non-breaking space THOUSAND_SEPARATOR = ' ' # Non-breaking space
NUMBER_GROUPING = 3 NUMBER_GROUPING = 3

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@ -37,5 +38,5 @@ DATETIME_INPUT_FORMATS = (
'%d.%m.%y', # '25.10.06' '%d.%m.%y', # '25.10.06'
) )
DECIMAL_SEPARATOR = ',' DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = u' ' # Non-breaking space THOUSAND_SEPARATOR = ' ' # Non-breaking space
NUMBER_GROUPING = 3 NUMBER_GROUPING = 3

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@ -39,5 +40,5 @@ DATETIME_INPUT_FORMATS = (
'%d.%m.%y', # '25.10.06' '%d.%m.%y', # '25.10.06'
) )
DECIMAL_SEPARATOR = ',' DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = u'\xa0' # non-breaking space THOUSAND_SEPARATOR = '\xa0' # non-breaking space
NUMBER_GROUPING = 3 NUMBER_GROUPING = 3

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@ -39,5 +40,5 @@ DATETIME_INPUT_FORMATS = (
'%d.%m.%y', # '25.10.06' '%d.%m.%y', # '25.10.06'
) )
DECIMAL_SEPARATOR = ',' DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = u'\xa0' # non-breaking space THOUSAND_SEPARATOR = '\xa0' # non-breaking space
NUMBER_GROUPING = 3 NUMBER_GROUPING = 3

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@ -33,5 +34,5 @@ DATETIME_INPUT_FORMATS = (
'%Y-%m-%d', # '2006-10-25' '%Y-%m-%d', # '2006-10-25'
) )
DECIMAL_SEPARATOR = ',' DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = u' ' THOUSAND_SEPARATOR = ' '
NUMBER_GROUPING = 3 NUMBER_GROUPING = 3

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@ -36,5 +37,5 @@ DATETIME_INPUT_FORMATS = (
'%Y-%m-%d', # '2006-10-25' '%Y-%m-%d', # '2006-10-25'
) )
DECIMAL_SEPARATOR = ',' DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = u'\xa0' # non-breaking space THOUSAND_SEPARATOR = '\xa0' # non-breaking space
NUMBER_GROUPING = 3 NUMBER_GROUPING = 3

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@ -33,5 +34,5 @@ DATETIME_INPUT_FORMATS = (
'%Y-%m-%d', # '2006-10-25' '%Y-%m-%d', # '2006-10-25'
) )
DECIMAL_SEPARATOR = ',' DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = u'\xa0' # non-breaking space THOUSAND_SEPARATOR = '\xa0' # non-breaking space
NUMBER_GROUPING = 3 NUMBER_GROUPING = 3

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@ -36,5 +37,5 @@ DATETIME_INPUT_FORMATS = (
'%m/%d/%y', # '10/25/06' '%m/%d/%y', # '10/25/06'
) )
DECIMAL_SEPARATOR = ',' DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = u'\xa0' # non-breaking space THOUSAND_SEPARATOR = '\xa0' # non-breaking space
NUMBER_GROUPING = 3 NUMBER_GROUPING = 3

View File

@ -2,6 +2,8 @@
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
DATE_FORMAT = 'j E Y р.' DATE_FORMAT = 'j E Y р.'
@ -19,5 +21,5 @@ SHORT_DATE_FORMAT = 'j M Y'
# TIME_INPUT_FORMATS = # TIME_INPUT_FORMATS =
# DATETIME_INPUT_FORMATS = # DATETIME_INPUT_FORMATS =
DECIMAL_SEPARATOR = ',' DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = u' ' THOUSAND_SEPARATOR = ' '
# NUMBER_GROUPING = # NUMBER_GROUPING =

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
# This file is distributed under the same license as the Django package. # This file is distributed under the same license as the Django package.
# #
from __future__ import unicode_literals
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date

View File

@ -1,9 +1,10 @@
from __future__ import unicode_literals
from django import forms from django import forms
from django.contrib.auth import authenticate from django.contrib.auth import authenticate
from django.contrib.auth.forms import AuthenticationForm from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy, ugettext as _ from django.utils.translation import ugettext_lazy, ugettext as _
ERROR_MESSAGE = ugettext_lazy("Please enter the correct username and password " ERROR_MESSAGE = ugettext_lazy("Please enter the correct username and password "
@ -25,7 +26,7 @@ class AdminAuthenticationForm(AuthenticationForm):
if username and password: if username and password:
self.user_cache = authenticate(username=username, password=password) self.user_cache = authenticate(username=username, password=password)
if self.user_cache is None: if self.user_cache is None:
if u'@' in username: if '@' in username:
# Mistakenly entered e-mail address instead of username? Look it up. # Mistakenly entered e-mail address instead of username? Look it up.
try: try:
user = User.objects.get(email=username) user = User.objects.get(email=username)

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
from django import forms from django import forms
from django.contrib.admin.util import (flatten_fieldsets, lookup_field, from django.contrib.admin.util import (flatten_fieldsets, lookup_field,
display_for_field, label_for_field, help_text_for_field) display_for_field, label_for_field, help_text_for_field)
@ -69,7 +71,7 @@ class Fieldset(object):
description=None, model_admin=None): description=None, model_admin=None):
self.form = form self.form = form
self.name, self.fields = name, fields self.name, self.fields = name, fields
self.classes = u' '.join(classes) self.classes = ' '.join(classes)
self.description = description self.description = description
self.model_admin = model_admin self.model_admin = model_admin
self.readonly_fields = readonly_fields self.readonly_fields = readonly_fields
@ -109,7 +111,7 @@ class Fieldline(object):
yield AdminField(self.form, field, is_first=(i == 0)) yield AdminField(self.form, field, is_first=(i == 0))
def errors(self): def errors(self):
return mark_safe(u'\n'.join([self.form[f].errors.as_ul() for f in self.fields if f not in self.readonly_fields]).strip('\n')) return mark_safe('\n'.join([self.form[f].errors.as_ul() for f in self.fields if f not in self.readonly_fields]).strip('\n'))
class AdminField(object): class AdminField(object):
def __init__(self, form, field, is_first): def __init__(self, form, field, is_first):
@ -121,14 +123,14 @@ class AdminField(object):
classes = [] classes = []
contents = conditional_escape(force_unicode(self.field.label)) contents = conditional_escape(force_unicode(self.field.label))
if self.is_checkbox: if self.is_checkbox:
classes.append(u'vCheckboxLabel') classes.append('vCheckboxLabel')
else: else:
contents += u':' contents += ':'
if self.field.field.required: if self.field.field.required:
classes.append(u'required') classes.append('required')
if not self.is_first: if not self.is_first:
classes.append(u'inline') classes.append('inline')
attrs = classes and {'class': u' '.join(classes)} or {} attrs = classes and {'class': ' '.join(classes)} or {}
return self.field.label_tag(contents=mark_safe(contents), attrs=attrs) return self.field.label_tag(contents=mark_safe(contents), attrs=attrs)
def errors(self): def errors(self):
@ -161,7 +163,7 @@ class AdminReadonlyField(object):
if not self.is_first: if not self.is_first:
attrs["class"] = "inline" attrs["class"] = "inline"
label = self.field['label'] label = self.field['label']
contents = capfirst(force_unicode(escape(label))) + u":" contents = capfirst(force_unicode(escape(label))) + ":"
return mark_safe('<label%(attrs)s>%(contents)s</label>' % { return mark_safe('<label%(attrs)s>%(contents)s</label>' % {
"attrs": flatatt(attrs), "attrs": flatatt(attrs),
"contents": contents, "contents": contents,

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
from django.db import models from django.db import models
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import User from django.contrib.auth.models import User
@ -64,5 +66,5 @@ class LogEntry(models.Model):
This is relative to the Django admin index page. This is relative to the Django admin index page.
""" """
if self.content_type and self.object_id: if self.content_type and self.object_id:
return mark_safe(u"%s/%s/%s/" % (self.content_type.app_label, self.content_type.model, quote(self.object_id))) return mark_safe("%s/%s/%s/" % (self.content_type.app_label, self.content_type.model, quote(self.object_id)))
return None return None

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
import datetime import datetime
from django.contrib.admin.util import (lookup_field, display_for_field, from django.contrib.admin.util import (lookup_field, display_for_field,
@ -27,11 +29,11 @@ def paginator_number(cl,i):
Generates an individual page index link in a paginated list. Generates an individual page index link in a paginated list.
""" """
if i == DOT: if i == DOT:
return u'... ' return '... '
elif i == cl.page_num: elif i == cl.page_num:
return mark_safe(u'<span class="this-page">%d</span> ' % (i+1)) return mark_safe('<span class="this-page">%d</span> ' % (i+1))
else: else:
return mark_safe(u'<a href="%s"%s>%d</a> ' % (escape(cl.get_query_string({PAGE_VAR: i})), (i == cl.paginator.num_pages-1 and ' class="end"' or ''), i+1)) return mark_safe('<a href="%s"%s>%d</a> ' % (escape(cl.get_query_string({PAGE_VAR: i})), (i == cl.paginator.num_pages-1 and ' class="end"' or ''), i+1))
@register.inclusion_tag('admin/pagination.html') @register.inclusion_tag('admin/pagination.html')
def pagination(cl): def pagination(cl):
@ -163,7 +165,7 @@ def result_headers(cl):
def _boolean_icon(field_val): def _boolean_icon(field_val):
icon_url = static('admin/img/icon-%s.gif' % icon_url = static('admin/img/icon-%s.gif' %
{True: 'yes', False: 'no', None: 'unknown'}[field_val]) {True: 'yes', False: 'no', None: 'unknown'}[field_val])
return mark_safe(u'<img src="%s" alt="%s" />' % (icon_url, field_val)) return mark_safe('<img src="%s" alt="%s" />' % (icon_url, field_val))
def items_for_result(cl, result, form): def items_for_result(cl, result, form):
""" """
@ -179,7 +181,7 @@ def items_for_result(cl, result, form):
result_repr = EMPTY_CHANGELIST_VALUE result_repr = EMPTY_CHANGELIST_VALUE
else: else:
if f is None: if f is None:
if field_name == u'action_checkbox': if field_name == 'action_checkbox':
row_class = ' class="action-checkbox"' row_class = ' class="action-checkbox"'
allow_tags = getattr(attr, 'allow_tags', False) allow_tags = getattr(attr, 'allow_tags', False)
boolean = getattr(attr, 'boolean', False) boolean = getattr(attr, 'boolean', False)
@ -220,7 +222,7 @@ def items_for_result(cl, result, form):
attr = pk attr = pk
value = result.serializable_value(attr) value = result.serializable_value(attr)
result_id = repr(force_unicode(value))[1:] result_id = repr(force_unicode(value))[1:]
yield mark_safe(u'<%s%s><a href="%s"%s>%s</a></%s>' % \ yield mark_safe('<%s%s><a href="%s"%s>%s</a></%s>' % \
(table_tag, row_class, url, (cl.is_popup and ' onclick="opener.dismissRelatedLookupPopup(window, %s); return false;"' % result_id or ''), conditional_escape(result_repr), table_tag)) (table_tag, row_class, url, (cl.is_popup and ' onclick="opener.dismissRelatedLookupPopup(window, %s); return false;"' % result_id or ''), conditional_escape(result_repr), table_tag))
else: else:
# By default the fields come from ModelAdmin.list_editable, but if we pull # By default the fields come from ModelAdmin.list_editable, but if we pull
@ -233,9 +235,9 @@ def items_for_result(cl, result, form):
result_repr = mark_safe(force_unicode(bf.errors) + force_unicode(bf)) result_repr = mark_safe(force_unicode(bf.errors) + force_unicode(bf))
else: else:
result_repr = conditional_escape(result_repr) result_repr = conditional_escape(result_repr)
yield mark_safe(u'<td%s>%s</td>' % (row_class, result_repr)) yield mark_safe('<td%s>%s</td>' % (row_class, result_repr))
if form and not form[cl.model._meta.pk.name].is_hidden: if form and not form[cl.model._meta.pk.name].is_hidden:
yield mark_safe(u'<td>%s</td>' % force_unicode(form[cl.model._meta.pk.name])) yield mark_safe('<td>%s</td>' % force_unicode(form[cl.model._meta.pk.name]))
class ResultList(list): class ResultList(list):
# Wrapper class used to return items in a list_editable # Wrapper class used to return items in a list_editable

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
import datetime import datetime
import decimal import decimal
@ -122,14 +124,14 @@ def get_deleted_objects(objs, opts, user, admin_site, using):
if not user.has_perm(p): if not user.has_perm(p):
perms_needed.add(opts.verbose_name) perms_needed.add(opts.verbose_name)
# Display a link to the admin page. # Display a link to the admin page.
return mark_safe(u'%s: <a href="%s">%s</a>' % return mark_safe('%s: <a href="%s">%s</a>' %
(escape(capfirst(opts.verbose_name)), (escape(capfirst(opts.verbose_name)),
admin_url, admin_url,
escape(obj))) escape(obj)))
else: else:
# Don't display link to edit, because it either has no # Don't display link to edit, because it either has no
# admin or is edited inline. # admin or is edited inline.
return u'%s: %s' % (capfirst(opts.verbose_name), return '%s: %s' % (capfirst(opts.verbose_name),
force_unicode(obj)) force_unicode(obj))
to_delete = collector.nested(format_callback) to_delete = collector.nested(format_callback)

View File

@ -1,8 +1,10 @@
""" """
Form Widget classes specific to the Django admin site. Form Widget classes specific to the Django admin site.
""" """
from __future__ import unicode_literals
import copy import copy
from django import forms from django import forms
from django.contrib.admin.templatetags.admin_static import static from django.contrib.admin.templatetags.admin_static import static
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
@ -39,12 +41,12 @@ class FilteredSelectMultiple(forms.SelectMultiple):
if self.is_stacked: if self.is_stacked:
attrs['class'] += 'stacked' attrs['class'] += 'stacked'
output = [super(FilteredSelectMultiple, self).render(name, value, attrs, choices)] output = [super(FilteredSelectMultiple, self).render(name, value, attrs, choices)]
output.append(u'<script type="text/javascript">addEvent(window, "load", function(e) {') output.append('<script type="text/javascript">addEvent(window, "load", function(e) {')
# TODO: "id_" is hard-coded here. This should instead use the correct # TODO: "id_" is hard-coded here. This should instead use the correct
# API to determine the ID dynamically. # API to determine the ID dynamically.
output.append(u'SelectFilter.init("id_%s", "%s", %s, "%s"); });</script>\n' output.append('SelectFilter.init("id_%s", "%s", %s, "%s"); });</script>\n'
% (name, self.verbose_name.replace('"', '\\"'), int(self.is_stacked), static('admin/'))) % (name, self.verbose_name.replace('"', '\\"'), int(self.is_stacked), static('admin/')))
return mark_safe(u''.join(output)) return mark_safe(''.join(output))
class AdminDateWidget(forms.DateInput): class AdminDateWidget(forms.DateInput):
@ -83,24 +85,24 @@ class AdminSplitDateTime(forms.SplitDateTimeWidget):
forms.MultiWidget.__init__(self, widgets, attrs) forms.MultiWidget.__init__(self, widgets, attrs)
def format_output(self, rendered_widgets): def format_output(self, rendered_widgets):
return mark_safe(u'<p class="datetime">%s %s<br />%s %s</p>' % \ return mark_safe('<p class="datetime">%s %s<br />%s %s</p>' % \
(_('Date:'), rendered_widgets[0], _('Time:'), rendered_widgets[1])) (_('Date:'), rendered_widgets[0], _('Time:'), rendered_widgets[1]))
class AdminRadioFieldRenderer(RadioFieldRenderer): class AdminRadioFieldRenderer(RadioFieldRenderer):
def render(self): def render(self):
"""Outputs a <ul> for this set of radio fields.""" """Outputs a <ul> for this set of radio fields."""
return mark_safe(u'<ul%s>\n%s\n</ul>' % ( return mark_safe('<ul%s>\n%s\n</ul>' % (
flatatt(self.attrs), flatatt(self.attrs),
u'\n'.join([u'<li>%s</li>' % force_unicode(w) for w in self])) '\n'.join(['<li>%s</li>' % force_unicode(w) for w in self]))
) )
class AdminRadioSelect(forms.RadioSelect): class AdminRadioSelect(forms.RadioSelect):
renderer = AdminRadioFieldRenderer renderer = AdminRadioFieldRenderer
class AdminFileWidget(forms.ClearableFileInput): class AdminFileWidget(forms.ClearableFileInput):
template_with_initial = (u'<p class="file-upload">%s</p>' template_with_initial = ('<p class="file-upload">%s</p>'
% forms.ClearableFileInput.template_with_initial) % forms.ClearableFileInput.template_with_initial)
template_with_clear = (u'<span class="clearable-file-input">%s</span>' template_with_clear = ('<span class="clearable-file-input">%s</span>'
% forms.ClearableFileInput.template_with_clear) % forms.ClearableFileInput.template_with_clear)
def url_params_from_lookup_dict(lookups): def url_params_from_lookup_dict(lookups):
@ -113,7 +115,7 @@ def url_params_from_lookup_dict(lookups):
items = [] items = []
for k, v in lookups.items(): for k, v in lookups.items():
if isinstance(v, (tuple, list)): if isinstance(v, (tuple, list)):
v = u','.join([str(x) for x in v]) v = ','.join([str(x) for x in v])
elif isinstance(v, bool): elif isinstance(v, bool):
# See django.db.fields.BooleanField.get_prep_lookup # See django.db.fields.BooleanField.get_prep_lookup
v = ('0', '1')[v] v = ('0', '1')[v]
@ -148,21 +150,21 @@ class ForeignKeyRawIdWidget(forms.TextInput):
params = self.url_parameters() params = self.url_parameters()
if params: if params:
url = u'?' + u'&amp;'.join([u'%s=%s' % (k, v) for k, v in params.items()]) url = '?' + '&amp;'.join(['%s=%s' % (k, v) for k, v in params.items()])
else: else:
url = u'' url = ''
if "class" not in attrs: if "class" not in attrs:
attrs['class'] = 'vForeignKeyRawIdAdminField' # The JavaScript code looks for this hook. attrs['class'] = 'vForeignKeyRawIdAdminField' # The JavaScript code looks for this hook.
# TODO: "lookup_id_" is hard-coded here. This should instead use # TODO: "lookup_id_" is hard-coded here. This should instead use
# the correct API to determine the ID dynamically. # the correct API to determine the ID dynamically.
extra.append(u'<a href="%s%s" class="related-lookup" id="lookup_id_%s" onclick="return showRelatedObjectLookupPopup(this);"> ' extra.append('<a href="%s%s" class="related-lookup" id="lookup_id_%s" onclick="return showRelatedObjectLookupPopup(this);"> '
% (related_url, url, name)) % (related_url, url, name))
extra.append(u'<img src="%s" width="16" height="16" alt="%s" /></a>' extra.append('<img src="%s" width="16" height="16" alt="%s" /></a>'
% (static('admin/img/selector-search.gif'), _('Lookup'))) % (static('admin/img/selector-search.gif'), _('Lookup')))
output = [super(ForeignKeyRawIdWidget, self).render(name, value, attrs)] + extra output = [super(ForeignKeyRawIdWidget, self).render(name, value, attrs)] + extra
if value: if value:
output.append(self.label_for_value(value)) output.append(self.label_for_value(value))
return mark_safe(u''.join(output)) return mark_safe(''.join(output))
def base_url_parameters(self): def base_url_parameters(self):
return url_params_from_lookup_dict(self.rel.limit_choices_to) return url_params_from_lookup_dict(self.rel.limit_choices_to)
@ -261,11 +263,11 @@ class RelatedFieldWidgetWrapper(forms.Widget):
related_url = reverse('admin:%s_%s_add' % info, current_app=self.admin_site.name) related_url = reverse('admin:%s_%s_add' % info, current_app=self.admin_site.name)
# TODO: "add_id_" is hard-coded here. This should instead use the # TODO: "add_id_" is hard-coded here. This should instead use the
# correct API to determine the ID dynamically. # correct API to determine the ID dynamically.
output.append(u'<a href="%s" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' output.append('<a href="%s" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> '
% (related_url, name)) % (related_url, name))
output.append(u'<img src="%s" width="10" height="10" alt="%s"/></a>' output.append('<img src="%s" width="10" height="10" alt="%s"/></a>'
% (static('admin/img/icon_addlink.gif'), _('Add Another'))) % (static('admin/img/icon_addlink.gif'), _('Add Another')))
return mark_safe(u''.join(output)) return mark_safe(''.join(output))
def build_attrs(self, extra_attrs=None, **kwargs): def build_attrs(self, extra_attrs=None, **kwargs):
"Helper function for building an attribute dictionary." "Helper function for building an attribute dictionary."

View File

@ -1,4 +1,4 @@
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
from django.contrib.admindocs import views from django.contrib.admindocs import views
from django.db.models import fields as builtin_fields from django.db.models import fields as builtin_fields
@ -20,17 +20,17 @@ class TestFieldType(unittest.TestCase):
def test_builtin_fields(self): def test_builtin_fields(self):
self.assertEqual( self.assertEqual(
views.get_readable_field_data_type(builtin_fields.BooleanField()), views.get_readable_field_data_type(builtin_fields.BooleanField()),
_(u'Boolean (Either True or False)') _('Boolean (Either True or False)')
) )
def test_custom_fields(self): def test_custom_fields(self):
self.assertEqual( self.assertEqual(
views.get_readable_field_data_type(fields.CustomField()), views.get_readable_field_data_type(fields.CustomField()),
_(u'A custom field type') _('A custom field type')
) )
self.assertEqual( self.assertEqual(
views.get_readable_field_data_type(fields.DescriptionLackingField()), views.get_readable_field_data_type(fields.DescriptionLackingField()),
_(u'Field of type: %(field_type)s') % { _('Field of type: %(field_type)s') % {
'field_type': 'DescriptionLackingField' 'field_type': 'DescriptionLackingField'
} }
) )

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
from django.contrib.auth.models import User, Permission from django.contrib.auth.models import User, Permission
@ -36,7 +38,7 @@ class ModelBackend(object):
if user_obj.is_anonymous() or obj is not None: if user_obj.is_anonymous() or obj is not None:
return set() return set()
if not hasattr(user_obj, '_perm_cache'): if not hasattr(user_obj, '_perm_cache'):
user_obj._perm_cache = set([u"%s.%s" % (p.content_type.app_label, p.codename) for p in user_obj.user_permissions.select_related()]) user_obj._perm_cache = set(["%s.%s" % (p.content_type.app_label, p.codename) for p in user_obj.user_permissions.select_related()])
user_obj._perm_cache.update(self.get_group_permissions(user_obj)) user_obj._perm_cache.update(self.get_group_permissions(user_obj))
return user_obj._perm_cache return user_obj._perm_cache

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
import hashlib import hashlib
from django.dispatch import receiver from django.dispatch import receiver

View File

@ -1,6 +1,8 @@
""" """
Creates permissions for all installed apps that need permissions. Creates permissions for all installed apps that need permissions.
""" """
from __future__ import unicode_literals
import getpass import getpass
import locale import locale
import unicodedata import unicodedata
@ -10,14 +12,14 @@ from django.contrib.auth.models import User
def _get_permission_codename(action, opts): def _get_permission_codename(action, opts):
return u'%s_%s' % (action, opts.object_name.lower()) return '%s_%s' % (action, opts.object_name.lower())
def _get_all_permissions(opts): def _get_all_permissions(opts):
"Returns (codename, name) for all permissions in the given opts." "Returns (codename, name) for all permissions in the given opts."
perms = [] perms = []
for action in ('add', 'change', 'delete'): for action in ('add', 'change', 'delete'):
perms.append((_get_permission_codename(action, opts), u'Can %s %s' % (action, opts.verbose_name_raw))) perms.append((_get_permission_codename(action, opts), 'Can %s %s' % (action, opts.verbose_name_raw)))
return perms + list(opts.permissions) return perms + list(opts.permissions)
@ -88,7 +90,7 @@ def get_system_username():
# if there is no corresponding entry in the /etc/passwd file # if there is no corresponding entry in the /etc/passwd file
# (a very restricted chroot environment, for example). # (a very restricted chroot environment, for example).
# UnicodeDecodeError - preventive treatment for non-latin Windows. # UnicodeDecodeError - preventive treatment for non-latin Windows.
return u'' return ''
def get_default_username(check_db=True): def get_default_username(check_db=True):

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
import urllib import urllib
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
@ -76,7 +78,7 @@ class Permission(models.Model):
'codename') 'codename')
def __unicode__(self): def __unicode__(self):
return u"%s | %s | %s" % ( return "%s | %s | %s" % (
unicode(self.content_type.app_label), unicode(self.content_type.app_label),
unicode(self.content_type), unicode(self.content_type),
unicode(self.name)) unicode(self.name))
@ -285,7 +287,7 @@ class User(models.Model):
""" """
Returns the first_name plus the last_name, with a space in between. Returns the first_name plus the last_name, with a space in between.
""" """
full_name = u'%s %s' % (self.first_name, self.last_name) full_name = '%s %s' % (self.first_name, self.last_name)
return full_name.strip() return full_name.strip()
def set_password(self, raw_password): def set_password(self, raw_password):

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User, Group, Permission, AnonymousUser from django.contrib.auth.models import User, Group, Permission, AnonymousUser
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
@ -51,7 +53,7 @@ class BackendTest(TestCase):
# reloading user to purge the _perm_cache # reloading user to purge the _perm_cache
user = User.objects.get(username='test') user = User.objects.get(username='test')
self.assertEqual(user.get_all_permissions() == set([u'auth.test']), True) self.assertEqual(user.get_all_permissions() == set(['auth.test']), True)
self.assertEqual(user.get_group_permissions(), set([])) self.assertEqual(user.get_group_permissions(), set([]))
self.assertEqual(user.has_module_perms('Group'), False) self.assertEqual(user.has_module_perms('Group'), False)
self.assertEqual(user.has_module_perms('auth'), True) self.assertEqual(user.has_module_perms('auth'), True)
@ -62,7 +64,7 @@ class BackendTest(TestCase):
user.user_permissions.add(perm) user.user_permissions.add(perm)
user.save() user.save()
user = User.objects.get(username='test') user = User.objects.get(username='test')
self.assertEqual(user.get_all_permissions(), set([u'auth.test2', u'auth.test', u'auth.test3'])) self.assertEqual(user.get_all_permissions(), set(['auth.test2', 'auth.test', 'auth.test3']))
self.assertEqual(user.has_perm('test'), False) self.assertEqual(user.has_perm('test'), False)
self.assertEqual(user.has_perm('auth.test'), True) self.assertEqual(user.has_perm('auth.test'), True)
self.assertEqual(user.has_perms(['auth.test2', 'auth.test3']), True) self.assertEqual(user.has_perms(['auth.test2', 'auth.test3']), True)
@ -72,9 +74,9 @@ class BackendTest(TestCase):
group.save() group.save()
user.groups.add(group) user.groups.add(group)
user = User.objects.get(username='test') user = User.objects.get(username='test')
exp = set([u'auth.test2', u'auth.test', u'auth.test3', u'auth.test_group']) exp = set(['auth.test2', 'auth.test', 'auth.test3', 'auth.test_group'])
self.assertEqual(user.get_all_permissions(), exp) self.assertEqual(user.get_all_permissions(), exp)
self.assertEqual(user.get_group_permissions(), set([u'auth.test_group'])) self.assertEqual(user.get_group_permissions(), set(['auth.test_group']))
self.assertEqual(user.has_perms(['auth.test3', 'auth.test_group']), True) self.assertEqual(user.has_perms(['auth.test3', 'auth.test_group']), True)
user = AnonymousUser() user = AnonymousUser()

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
import os import os
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.auth.forms import (UserCreationForm, AuthenticationForm, from django.contrib.auth.forms import (UserCreationForm, AuthenticationForm,
@ -299,7 +301,7 @@ class PasswordResetFormTest(TestCase):
# potential case where contrib.sites is not installed. Refs #16412. # potential case where contrib.sites is not installed. Refs #16412.
form.save(domain_override='example.com') form.save(domain_override='example.com')
self.assertEqual(len(mail.outbox), 1) self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].subject, u'Custom password reset on example.com') self.assertEqual(mail.outbox[0].subject, 'Custom password reset on example.com')
def test_bug_5605(self): def test_bug_5605(self):
# bug #5605, preserve the case of the user name (before the @ in the # bug #5605, preserve the case of the user name (before the @ in the
@ -328,4 +330,4 @@ class PasswordResetFormTest(TestCase):
form = PasswordResetForm(data) form = PasswordResetForm(data)
self.assertFalse(form.is_valid()) self.assertFalse(form.is_valid())
self.assertEqual(form["email"].errors, self.assertEqual(form["email"].errors,
[_(u"The user account associated with this e-mail address cannot reset the password.")]) [_("The user account associated with this e-mail address cannot reset the password.")])

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
from django.conf.global_settings import PASSWORD_HASHERS as default_hashers from django.conf.global_settings import PASSWORD_HASHERS as default_hashers
from django.contrib.auth.hashers import (is_password_usable, from django.contrib.auth.hashers import (is_password_usable,
check_password, make_password, PBKDF2PasswordHasher, load_hashers, check_password, make_password, PBKDF2PasswordHasher, load_hashers,
@ -26,7 +28,7 @@ class TestUtilsHashPass(unittest.TestCase):
encoded = make_password('letmein') encoded = make_password('letmein')
self.assertTrue(encoded.startswith('pbkdf2_sha256$')) self.assertTrue(encoded.startswith('pbkdf2_sha256$'))
self.assertTrue(is_password_usable(encoded)) self.assertTrue(is_password_usable(encoded))
self.assertTrue(check_password(u'letmein', encoded)) self.assertTrue(check_password('letmein', encoded))
self.assertFalse(check_password('letmeinz', encoded)) self.assertFalse(check_password('letmeinz', encoded))
def test_pkbdf2(self): def test_pkbdf2(self):
@ -34,7 +36,7 @@ class TestUtilsHashPass(unittest.TestCase):
self.assertEqual(encoded, self.assertEqual(encoded,
'pbkdf2_sha256$10000$seasalt$FQCNpiZpTb0zub+HBsH6TOwyRxJ19FwvjbweatNmK/Y=') 'pbkdf2_sha256$10000$seasalt$FQCNpiZpTb0zub+HBsH6TOwyRxJ19FwvjbweatNmK/Y=')
self.assertTrue(is_password_usable(encoded)) self.assertTrue(is_password_usable(encoded))
self.assertTrue(check_password(u'letmein', encoded)) self.assertTrue(check_password('letmein', encoded))
self.assertFalse(check_password('letmeinz', encoded)) self.assertFalse(check_password('letmeinz', encoded))
self.assertEqual(identify_hasher(encoded).algorithm, "pbkdf2_sha256") self.assertEqual(identify_hasher(encoded).algorithm, "pbkdf2_sha256")
@ -43,7 +45,7 @@ class TestUtilsHashPass(unittest.TestCase):
self.assertEqual(encoded, self.assertEqual(encoded,
'sha1$seasalt$fec3530984afba6bade3347b7140d1a7da7da8c7') 'sha1$seasalt$fec3530984afba6bade3347b7140d1a7da7da8c7')
self.assertTrue(is_password_usable(encoded)) self.assertTrue(is_password_usable(encoded))
self.assertTrue(check_password(u'letmein', encoded)) self.assertTrue(check_password('letmein', encoded))
self.assertFalse(check_password('letmeinz', encoded)) self.assertFalse(check_password('letmeinz', encoded))
self.assertEqual(identify_hasher(encoded).algorithm, "sha1") self.assertEqual(identify_hasher(encoded).algorithm, "sha1")
@ -52,7 +54,7 @@ class TestUtilsHashPass(unittest.TestCase):
self.assertEqual(encoded, self.assertEqual(encoded,
'md5$seasalt$f5531bef9f3687d0ccf0f617f0e25573') 'md5$seasalt$f5531bef9f3687d0ccf0f617f0e25573')
self.assertTrue(is_password_usable(encoded)) self.assertTrue(is_password_usable(encoded))
self.assertTrue(check_password(u'letmein', encoded)) self.assertTrue(check_password('letmein', encoded))
self.assertFalse(check_password('letmeinz', encoded)) self.assertFalse(check_password('letmeinz', encoded))
self.assertEqual(identify_hasher(encoded).algorithm, "md5") self.assertEqual(identify_hasher(encoded).algorithm, "md5")
@ -60,7 +62,7 @@ class TestUtilsHashPass(unittest.TestCase):
encoded = make_password('letmein', 'seasalt', 'unsalted_md5') encoded = make_password('letmein', 'seasalt', 'unsalted_md5')
self.assertEqual(encoded, '0d107d09f5bbe40cade3de5c71e9e9b7') self.assertEqual(encoded, '0d107d09f5bbe40cade3de5c71e9e9b7')
self.assertTrue(is_password_usable(encoded)) self.assertTrue(is_password_usable(encoded))
self.assertTrue(check_password(u'letmein', encoded)) self.assertTrue(check_password('letmein', encoded))
self.assertFalse(check_password('letmeinz', encoded)) self.assertFalse(check_password('letmeinz', encoded))
self.assertEqual(identify_hasher(encoded).algorithm, "unsalted_md5") self.assertEqual(identify_hasher(encoded).algorithm, "unsalted_md5")
@ -69,7 +71,7 @@ class TestUtilsHashPass(unittest.TestCase):
encoded = make_password('letmein', 'ab', 'crypt') encoded = make_password('letmein', 'ab', 'crypt')
self.assertEqual(encoded, 'crypt$$abN/qM.L/H8EQ') self.assertEqual(encoded, 'crypt$$abN/qM.L/H8EQ')
self.assertTrue(is_password_usable(encoded)) self.assertTrue(is_password_usable(encoded))
self.assertTrue(check_password(u'letmein', encoded)) self.assertTrue(check_password('letmein', encoded))
self.assertFalse(check_password('letmeinz', encoded)) self.assertFalse(check_password('letmeinz', encoded))
self.assertEqual(identify_hasher(encoded).algorithm, "crypt") self.assertEqual(identify_hasher(encoded).algorithm, "crypt")
@ -78,7 +80,7 @@ class TestUtilsHashPass(unittest.TestCase):
encoded = make_password('letmein', hasher='bcrypt') encoded = make_password('letmein', hasher='bcrypt')
self.assertTrue(is_password_usable(encoded)) self.assertTrue(is_password_usable(encoded))
self.assertTrue(encoded.startswith('bcrypt$')) self.assertTrue(encoded.startswith('bcrypt$'))
self.assertTrue(check_password(u'letmein', encoded)) self.assertTrue(check_password('letmein', encoded))
self.assertFalse(check_password('letmeinz', encoded)) self.assertFalse(check_password('letmeinz', encoded))
self.assertEqual(identify_hasher(encoded).algorithm, "bcrypt") self.assertEqual(identify_hasher(encoded).algorithm, "bcrypt")
@ -88,7 +90,7 @@ class TestUtilsHashPass(unittest.TestCase):
self.assertFalse(check_password(None, encoded)) self.assertFalse(check_password(None, encoded))
self.assertFalse(check_password(UNUSABLE_PASSWORD, encoded)) self.assertFalse(check_password(UNUSABLE_PASSWORD, encoded))
self.assertFalse(check_password('', encoded)) self.assertFalse(check_password('', encoded))
self.assertFalse(check_password(u'letmein', encoded)) self.assertFalse(check_password('letmein', encoded))
self.assertFalse(check_password('letmeinz', encoded)) self.assertFalse(check_password('letmeinz', encoded))
self.assertRaises(ValueError, identify_hasher, encoded) self.assertRaises(ValueError, identify_hasher, encoded)

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
from StringIO import StringIO from StringIO import StringIO
from django.contrib.auth import models, management from django.contrib.auth import models, management
@ -15,19 +17,19 @@ class GetDefaultUsernameTestCase(TestCase):
management.get_system_username = self._getpass_getuser management.get_system_username = self._getpass_getuser
def test_simple(self): def test_simple(self):
management.get_system_username = lambda: u'joe' management.get_system_username = lambda: 'joe'
self.assertEqual(management.get_default_username(), 'joe') self.assertEqual(management.get_default_username(), 'joe')
def test_existing(self): def test_existing(self):
models.User.objects.create(username='joe') models.User.objects.create(username='joe')
management.get_system_username = lambda: u'joe' management.get_system_username = lambda: 'joe'
self.assertEqual(management.get_default_username(), '') self.assertEqual(management.get_default_username(), '')
self.assertEqual( self.assertEqual(
management.get_default_username(check_db=False), 'joe') management.get_default_username(check_db=False), 'joe')
def test_i18n(self): def test_i18n(self):
# 'Julia' with accented 'u': # 'Julia' with accented 'u':
management.get_system_username = lambda: u'J\xfalia' management.get_system_username = lambda: 'J\xfalia'
self.assertEqual(management.get_default_username(), 'julia') self.assertEqual(management.get_default_username(), 'julia')

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
from django.contrib import admin from django.contrib import admin
from django.contrib.comments.models import Comment from django.contrib.comments.models import Comment
from django.utils.translation import ugettext_lazy as _, ungettext from django.utils.translation import ugettext_lazy as _, ungettext
@ -62,8 +64,8 @@ class CommentsAdmin(admin.ModelAdmin):
action(request, comment) action(request, comment)
n_comments += 1 n_comments += 1
msg = ungettext(u'1 comment was successfully %(action)s.', msg = ungettext('1 comment was successfully %(action)s.',
u'%(count)s comments were successfully %(action)s.', '%(count)s comments were successfully %(action)s.',
n_comments) n_comments)
self.message_user(request, msg % {'count': n_comments, 'action': done_message(n_comments)}) self.message_user(request, msg % {'count': n_comments, 'action': done_message(n_comments)})

View File

@ -1,6 +1,7 @@
""" """
Classes allowing "generic" relations through ContentType and object-id fields. Classes allowing "generic" relations through ContentType and object-id fields.
""" """
from __future__ import unicode_literals
from collections import defaultdict from collections import defaultdict
from functools import partial from functools import partial
@ -131,7 +132,7 @@ class GenericForeignKey(object):
def __set__(self, instance, value): def __set__(self, instance, value):
if instance is None: if instance is None:
raise AttributeError(u"%s must be accessed via instance" % self.related.opts.object_name) raise AttributeError("%s must be accessed via instance" % self.related.opts.object_name)
ct = None ct = None
fk = None fk = None

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
import urllib import urllib
from django.db import models from django.db import models
@ -181,4 +183,4 @@ class ContentTypesTests(TestCase):
app_label = 'contenttypes', app_label = 'contenttypes',
model = 'OldModel', model = 'OldModel',
) )
self.assertEqual(unicode(ct), u'Old model') self.assertEqual(unicode(ct), 'Old model')

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
from django import http from django import http
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.contrib.sites.models import Site, get_current_site from django.contrib.sites.models import Site, get_current_site
@ -12,11 +14,11 @@ def shortcut(request, content_type_id, object_id):
try: try:
content_type = ContentType.objects.get(pk=content_type_id) content_type = ContentType.objects.get(pk=content_type_id)
if not content_type.model_class(): if not content_type.model_class():
raise http.Http404(_(u"Content type %(ct_id)s object has no associated model") % raise http.Http404(_("Content type %(ct_id)s object has no associated model") %
{'ct_id': content_type_id}) {'ct_id': content_type_id})
obj = content_type.get_object_for_this_type(pk=object_id) obj = content_type.get_object_for_this_type(pk=object_id)
except (ObjectDoesNotExist, ValueError): except (ObjectDoesNotExist, ValueError):
raise http.Http404(_(u"Content type %(ct_id)s object %(obj_id)s doesn't exist") % raise http.Http404(_("Content type %(ct_id)s object %(obj_id)s doesn't exist") %
{'ct_id': content_type_id, 'obj_id': object_id}) {'ct_id': content_type_id, 'obj_id': object_id})
try: try:

View File

@ -2,6 +2,7 @@
These classes are light wrappers around Django's database API that provide These classes are light wrappers around Django's database API that provide
convenience functionality and permalink functions for the databrowse app. convenience functionality and permalink functions for the databrowse app.
""" """
from __future__ import unicode_literals
from django.db import models from django.db import models
from django.utils import formats from django.utils import formats
@ -61,7 +62,7 @@ class EasyField(object):
self.model, self.field = easy_model, field self.model, self.field = easy_model, field
def __repr__(self): def __repr__(self):
return smart_str(u'<EasyField for %s.%s>' % (self.model.model._meta.object_name, self.field.name)) return smart_str('<EasyField for %s.%s>' % (self.model.model._meta.object_name, self.field.name))
def choices(self): def choices(self):
for value, label in self.field.choices: for value, label in self.field.choices:
@ -79,7 +80,7 @@ class EasyChoice(object):
self.value, self.label = value, label self.value, self.label = value, label
def __repr__(self): def __repr__(self):
return smart_str(u'<EasyChoice for %s.%s>' % (self.model.model._meta.object_name, self.field.name)) return smart_str('<EasyChoice for %s.%s>' % (self.model.model._meta.object_name, self.field.name))
def url(self): def url(self):
return mark_safe('%s%s/%s/%s/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name, self.field.field.name, iri_to_uri(self.value))) return mark_safe('%s%s/%s/%s/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name, self.field.field.name, iri_to_uri(self.value)))
@ -89,12 +90,12 @@ class EasyInstance(object):
self.model, self.instance = easy_model, instance self.model, self.instance = easy_model, instance
def __repr__(self): def __repr__(self):
return smart_str(u'<EasyInstance for %s (%s)>' % (self.model.model._meta.object_name, self.instance._get_pk_val())) return smart_str('<EasyInstance for %s (%s)>' % (self.model.model._meta.object_name, self.instance._get_pk_val()))
def __unicode__(self): def __unicode__(self):
val = smart_unicode(self.instance) val = smart_unicode(self.instance)
if len(val) > DISPLAY_SIZE: if len(val) > DISPLAY_SIZE:
return val[:DISPLAY_SIZE] + u'...' return val[:DISPLAY_SIZE] + '...'
return val return val
def __str__(self): def __str__(self):
@ -136,7 +137,7 @@ class EasyInstanceField(object):
self.raw_value = getattr(instance.instance, field.name) self.raw_value = getattr(instance.instance, field.name)
def __repr__(self): def __repr__(self):
return smart_str(u'<EasyInstanceField for %s.%s>' % (self.model.model._meta.object_name, self.field.name)) return smart_str('<EasyInstanceField for %s.%s>' % (self.model.model._meta.object_name, self.field.name))
def values(self): def values(self):
""" """

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
from django import http from django import http
from django.db import models from django.db import models
from django.contrib.databrowse.datastructures import EasyModel from django.contrib.databrowse.datastructures import EasyModel
@ -61,14 +63,14 @@ class CalendarPlugin(DatabrowsePlugin):
def model_index_html(self, request, model, site): def model_index_html(self, request, model, site):
fields = self.field_dict(model) fields = self.field_dict(model)
if not fields: if not fields:
return u'' return ''
return mark_safe(u'<p class="filter"><strong>View calendar by:</strong> %s</p>' % \ return mark_safe('<p class="filter"><strong>View calendar by:</strong> %s</p>' % \
u', '.join(['<a href="calendars/%s/">%s</a>' % (f.name, force_unicode(capfirst(f.verbose_name))) for f in fields.values()])) ', '.join(['<a href="calendars/%s/">%s</a>' % (f.name, force_unicode(capfirst(f.verbose_name))) for f in fields.values()]))
def urls(self, plugin_name, easy_instance_field): def urls(self, plugin_name, easy_instance_field):
if isinstance(easy_instance_field.field, models.DateField): if isinstance(easy_instance_field.field, models.DateField):
d = easy_instance_field.raw_value d = easy_instance_field.raw_value
return [mark_safe(u'%s%s/%s/%s/%s/%s/' % ( return [mark_safe('%s%s/%s/%s/%s/%s/' % (
easy_instance_field.model.url(), easy_instance_field.model.url(),
plugin_name, easy_instance_field.field.name, plugin_name, easy_instance_field.field.name,
str(d.year), str(d.year),

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
from django import http from django import http
from django.db import models from django.db import models
from django.contrib.databrowse.datastructures import EasyModel from django.contrib.databrowse.datastructures import EasyModel
@ -29,14 +31,14 @@ class FieldChoicePlugin(DatabrowsePlugin):
def model_index_html(self, request, model, site): def model_index_html(self, request, model, site):
fields = self.field_dict(model) fields = self.field_dict(model)
if not fields: if not fields:
return u'' return ''
return mark_safe(u'<p class="filter"><strong>View by:</strong> %s</p>' % \ return mark_safe('<p class="filter"><strong>View by:</strong> %s</p>' % \
u', '.join(['<a href="fields/%s/">%s</a>' % (f.name, force_unicode(capfirst(f.verbose_name))) for f in fields.values()])) ', '.join(['<a href="fields/%s/">%s</a>' % (f.name, force_unicode(capfirst(f.verbose_name))) for f in fields.values()]))
def urls(self, plugin_name, easy_instance_field): def urls(self, plugin_name, easy_instance_field):
if easy_instance_field.field in self.field_dict(easy_instance_field.model.model).values(): if easy_instance_field.field in self.field_dict(easy_instance_field.model.model).values():
field_value = smart_str(easy_instance_field.raw_value) field_value = smart_str(easy_instance_field.raw_value)
return [mark_safe(u'%s%s/%s/%s/' % ( return [mark_safe('%s%s/%s/%s/' % (
easy_instance_field.model.url(), easy_instance_field.model.url(),
plugin_name, easy_instance_field.field.name, plugin_name, easy_instance_field.field.name,
urllib.quote(field_value, safe='')))] urllib.quote(field_value, safe='')))]

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
from django import http from django import http
from django.db import models from django.db import models
from django.contrib.databrowse.datastructures import EasyModel from django.contrib.databrowse.datastructures import EasyModel
@ -61,7 +63,7 @@ class ModelDatabrowse(object):
def main_view(self, request): def main_view(self, request):
easy_model = EasyModel(self.site, self.model) easy_model = EasyModel(self.site, self.model)
html_snippets = mark_safe(u'\n'.join([p.model_index_html(request, self.model, self.site) for p in self.plugins.values()])) html_snippets = mark_safe('\n'.join([p.model_index_html(request, self.model, self.site) for p in self.plugins.values()]))
return render_to_response('databrowse/model_detail.html', { return render_to_response('databrowse/model_detail.html', {
'model': easy_model, 'model': easy_model,
'root_url': self.site.root_url, 'root_url': self.site.root_url,

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
from django.db import models from django.db import models
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -20,7 +22,7 @@ class FlatPage(models.Model):
ordering = ('url',) ordering = ('url',)
def __unicode__(self): def __unicode__(self):
return u"%s -- %s" % (self.url, self.title) return "%s -- %s" % (self.url, self.title)
def get_absolute_url(self): def get_absolute_url(self):
return self.url return self.url

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
from django.conf import settings from django.conf import settings
from django.contrib.flatpages.forms import FlatpageForm from django.contrib.flatpages.forms import FlatpageForm
from django.contrib.flatpages.models import FlatPage from django.contrib.flatpages.models import FlatPage
@ -60,7 +62,7 @@ class FlatpageAdminFormTests(TestCase):
self.assertEqual( self.assertEqual(
f.errors, f.errors,
{'__all__': [u'Flatpage with url /myflatpage1/ already exists for site example.com']}) {'__all__': ['Flatpage with url /myflatpage1/ already exists for site example.com']})
def test_flatpage_admin_form_edit(self): def test_flatpage_admin_form_edit(self):
""" """
@ -92,5 +94,5 @@ class FlatpageAdminFormTests(TestCase):
self.assertEqual( self.assertEqual(
f.errors, f.errors,
{'sites': [translation.ugettext(u'This field is required.')]}) {'sites': [translation.ugettext('This field is required.')]})

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
import os import os
import re import re
import warnings import warnings
@ -41,7 +43,7 @@ class PreviewTests(TestCase):
self.preview = preview.FormPreview(TestForm) self.preview = preview.FormPreview(TestForm)
input_template = '<input type="hidden" name="%s" value="%s" />' input_template = '<input type="hidden" name="%s" value="%s" />'
self.input = input_template % (self.preview.unused_name('stage'), "%d") self.input = input_template % (self.preview.unused_name('stage'), "%d")
self.test_data = {'field1':u'foo', 'field1_':u'asdf'} self.test_data = {'field1': 'foo', 'field1_': 'asdf'}
def test_unused_name(self): def test_unused_name(self):
""" """
@ -117,7 +119,7 @@ class PreviewTests(TestCase):
""" """
self.test_data.update({'stage':2}) self.test_data.update({'stage':2})
hash = self.preview.security_hash(None, TestForm(self.test_data)) hash = self.preview.security_hash(None, TestForm(self.test_data))
self.test_data.update({'hash':hash, 'bool1':u'False'}) self.test_data.update({'hash': hash, 'bool1': 'False'})
with warnings.catch_warnings(record=True): with warnings.catch_warnings(record=True):
response = self.client.post('/preview/', self.test_data) response = self.client.post('/preview/', self.test_data)
self.assertEqual(response.content, success_string) self.assertEqual(response.content, success_string)
@ -163,8 +165,8 @@ class FormHmacTests(unittest.TestCase):
leading/trailing whitespace so as to be friendly to broken browsers that leading/trailing whitespace so as to be friendly to broken browsers that
submit it (usually in textareas). submit it (usually in textareas).
""" """
f1 = HashTestForm({'name': u'joe', 'bio': u'Nothing notable.'}) f1 = HashTestForm({'name': 'joe', 'bio': 'Nothing notable.'})
f2 = HashTestForm({'name': u' joe', 'bio': u'Nothing notable. '}) f2 = HashTestForm({'name': ' joe', 'bio': 'Nothing notable. '})
hash1 = utils.form_hmac(f1) hash1 = utils.form_hmac(f1)
hash2 = utils.form_hmac(f2) hash2 = utils.form_hmac(f2)
self.assertEqual(hash1, hash2) self.assertEqual(hash1, hash2)
@ -266,10 +268,10 @@ class WizardTests(TestCase):
Form should advance if the hash is present and good, as calculated using Form should advance if the hash is present and good, as calculated using
current method. current method.
""" """
data = {"0-field": u"test", data = {"0-field": "test",
"1-field": u"test2", "1-field": "test2",
"hash_0": u"cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca", "hash_0": "cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca",
"wizard_step": u"1"} "wizard_step": "1"}
response = self.client.post('/wizard1/', data) response = self.client.post('/wizard1/', data)
self.assertEqual(2, response.context['step0']) self.assertEqual(2, response.context['step0'])
@ -291,18 +293,18 @@ class WizardTests(TestCase):
reached[0] = True reached[0] = True
wizard = WizardWithProcessStep([WizardPageOneForm]) wizard = WizardWithProcessStep([WizardPageOneForm])
data = {"0-field": u"test", data = {"0-field": "test",
"1-field": u"test2", "1-field": "test2",
"hash_0": u"cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca", "hash_0": "cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca",
"wizard_step": u"1"} "wizard_step": "1"}
wizard(DummyRequest(POST=data)) wizard(DummyRequest(POST=data))
self.assertTrue(reached[0]) self.assertTrue(reached[0])
data = {"0-field": u"test", data = {"0-field": "test",
"1-field": u"test2", "1-field": "test2",
"hash_0": "cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca", "hash_0": "cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca",
"hash_1": u"1e6f6315da42e62f33a30640ec7e007ad3fbf1a1", "hash_1": "1e6f6315da42e62f33a30640ec7e007ad3fbf1a1",
"wizard_step": u"2"} "wizard_step": "2"}
self.assertRaises(http.Http404, wizard, DummyRequest(POST=data)) self.assertRaises(http.Http404, wizard, DummyRequest(POST=data))
def test_14498(self): def test_14498(self):
@ -321,10 +323,10 @@ class WizardTests(TestCase):
wizard = WizardWithProcessStep([WizardPageOneForm, wizard = WizardWithProcessStep([WizardPageOneForm,
WizardPageTwoForm, WizardPageTwoForm,
WizardPageThreeForm]) WizardPageThreeForm])
data = {"0-field": u"test", data = {"0-field": "test",
"1-field": u"test2", "1-field": "test2",
"hash_0": u"cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca", "hash_0": "cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca",
"wizard_step": u"1"} "wizard_step": "1"}
wizard(DummyRequest(POST=data)) wizard(DummyRequest(POST=data))
self.assertTrue(reached[0]) self.assertTrue(reached[0])
@ -345,10 +347,10 @@ class WizardTests(TestCase):
wizard = Wizard([WizardPageOneForm, wizard = Wizard([WizardPageOneForm,
WizardPageTwoForm]) WizardPageTwoForm])
data = {"0-field": u"test", data = {"0-field": "test",
"1-field": u"test2", "1-field": "test2",
"hash_0": u"cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca", "hash_0": "cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca",
"wizard_step": u"1"} "wizard_step": "1"}
wizard(DummyRequest(POST=data)) wizard(DummyRequest(POST=data))
self.assertTrue(reached[0]) self.assertTrue(reached[0])
@ -371,10 +373,10 @@ class WizardTests(TestCase):
wizard = WizardWithProcessStep([WizardPageOneForm, wizard = WizardWithProcessStep([WizardPageOneForm,
WizardPageTwoForm, WizardPageTwoForm,
WizardPageThreeForm]) WizardPageThreeForm])
data = {"0-field": u"test", data = {"0-field": "test",
"1-field": u"test2", "1-field": "test2",
"hash_0": u"cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca", "hash_0": "cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca",
"wizard_step": u"1"} "wizard_step": "1"}
wizard(DummyRequest(POST=data)) wizard(DummyRequest(POST=data))
self.assertTrue(reached[0]) self.assertTrue(reached[0])

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
from django import forms, http from django import forms, http
from django.conf import settings from django.conf import settings
from django.test import TestCase from django.test import TestCase
@ -64,22 +66,22 @@ class TestWizard(WizardView):
class FormTests(TestCase): class FormTests(TestCase):
def test_form_init(self): def test_form_init(self):
testform = TestWizard.get_initkwargs([Step1, Step2]) testform = TestWizard.get_initkwargs([Step1, Step2])
self.assertEqual(testform['form_list'], {u'0': Step1, u'1': Step2}) self.assertEqual(testform['form_list'], {'0': Step1, '1': Step2})
testform = TestWizard.get_initkwargs([('start', Step1), ('step2', Step2)]) testform = TestWizard.get_initkwargs([('start', Step1), ('step2', Step2)])
self.assertEqual( self.assertEqual(
testform['form_list'], {u'start': Step1, u'step2': Step2}) testform['form_list'], {'start': Step1, 'step2': Step2})
testform = TestWizard.get_initkwargs([Step1, Step2, ('finish', Step3)]) testform = TestWizard.get_initkwargs([Step1, Step2, ('finish', Step3)])
self.assertEqual( self.assertEqual(
testform['form_list'], {u'0': Step1, u'1': Step2, u'finish': Step3}) testform['form_list'], {'0': Step1, '1': Step2, 'finish': Step3})
def test_first_step(self): def test_first_step(self):
request = get_request() request = get_request()
testform = TestWizard.as_view([Step1, Step2]) testform = TestWizard.as_view([Step1, Step2])
response, instance = testform(request) response, instance = testform(request)
self.assertEqual(instance.steps.current, u'0') self.assertEqual(instance.steps.current, '0')
testform = TestWizard.as_view([('start', Step1), ('step2', Step2)]) testform = TestWizard.as_view([('start', Step1), ('step2', Step2)])
response, instance = testform(request) response, instance = testform(request)

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.http import QueryDict from django.http import QueryDict
from django.test import TestCase from django.test import TestCase
@ -51,8 +53,8 @@ class NamedWizardTests(object):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['wizard']['steps'].current, 'form1') self.assertEqual(response.context['wizard']['steps'].current, 'form1')
self.assertEqual(response.context['wizard']['form'].errors, self.assertEqual(response.context['wizard']['form'].errors,
{'name': [u'This field is required.'], {'name': ['This field is required.'],
'user': [u'This field is required.']}) 'user': ['This field is required.']})
def test_form_post_success(self): def test_form_post_success(self):
response = self.client.post( response = self.client.post(
@ -150,10 +152,10 @@ class NamedWizardTests(object):
self.assertEqual(all_data[1]['file1'].read(), open(__file__, 'rb').read()) self.assertEqual(all_data[1]['file1'].read(), open(__file__, 'rb').read())
del all_data[1]['file1'] del all_data[1]['file1']
self.assertEqual(all_data, [ self.assertEqual(all_data, [
{'name': u'Pony', 'thirsty': True, 'user': self.testuser}, {'name': 'Pony', 'thirsty': True, 'user': self.testuser},
{'address1': u'123 Main St', 'address2': u'Djangoland'}, {'address1': '123 Main St', 'address2': 'Djangoland'},
{'random_crap': u'blah blah'}, {'random_crap': 'blah blah'},
[{'random_crap': u'blah blah'}, {'random_crap': u'blah blah'}]]) [{'random_crap': 'blah blah'}, {'random_crap': 'blah blah'}]])
def test_cleaned_data(self): def test_cleaned_data(self):
response = self.client.get( response = self.client.get(
@ -203,11 +205,11 @@ class NamedWizardTests(object):
del all_data['file1'] del all_data['file1']
self.assertEqual( self.assertEqual(
all_data, all_data,
{'name': u'Pony', 'thirsty': True, 'user': self.testuser, {'name': 'Pony', 'thirsty': True, 'user': self.testuser,
'address1': u'123 Main St', 'address2': u'Djangoland', 'address1': '123 Main St', 'address2': 'Djangoland',
'random_crap': u'blah blah', 'formset-form4': [ 'random_crap': 'blah blah', 'formset-form4': [
{'random_crap': u'blah blah'}, {'random_crap': 'blah blah'},
{'random_crap': u'blah blah'} {'random_crap': 'blah blah'}
]}) ]})
def test_manipulated_data(self): def test_manipulated_data(self):

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
import os import os
from django import forms from django import forms
@ -33,8 +35,8 @@ class WizardTests(object):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['wizard']['steps'].current, 'form1') self.assertEqual(response.context['wizard']['steps'].current, 'form1')
self.assertEqual(response.context['wizard']['form'].errors, self.assertEqual(response.context['wizard']['form'].errors,
{'name': [u'This field is required.'], {'name': ['This field is required.'],
'user': [u'This field is required.']}) 'user': ['This field is required.']})
def test_form_post_success(self): def test_form_post_success(self):
response = self.client.post(self.wizard_url, self.wizard_step_data[0]) response = self.client.post(self.wizard_url, self.wizard_step_data[0])
@ -96,11 +98,11 @@ class WizardTests(object):
self.assertEqual(all_data[1]['file1'].read(), open(__file__, 'rb').read()) self.assertEqual(all_data[1]['file1'].read(), open(__file__, 'rb').read())
del all_data[1]['file1'] del all_data[1]['file1']
self.assertEqual(all_data, [ self.assertEqual(all_data, [
{'name': u'Pony', 'thirsty': True, 'user': self.testuser}, {'name': 'Pony', 'thirsty': True, 'user': self.testuser},
{'address1': u'123 Main St', 'address2': u'Djangoland'}, {'address1': '123 Main St', 'address2': 'Djangoland'},
{'random_crap': u'blah blah'}, {'random_crap': 'blah blah'},
[{'random_crap': u'blah blah'}, [{'random_crap': 'blah blah'},
{'random_crap': u'blah blah'}]]) {'random_crap': 'blah blah'}]])
def test_cleaned_data(self): def test_cleaned_data(self):
response = self.client.get(self.wizard_url) response = self.client.get(self.wizard_url)
@ -124,11 +126,11 @@ class WizardTests(object):
self.assertEqual(all_data['file1'].read(), open(__file__, 'rb').read()) self.assertEqual(all_data['file1'].read(), open(__file__, 'rb').read())
del all_data['file1'] del all_data['file1']
self.assertEqual(all_data, { self.assertEqual(all_data, {
'name': u'Pony', 'thirsty': True, 'user': self.testuser, 'name': 'Pony', 'thirsty': True, 'user': self.testuser,
'address1': u'123 Main St', 'address2': u'Djangoland', 'address1': '123 Main St', 'address2': 'Djangoland',
'random_crap': u'blah blah', 'formset-form4': [ 'random_crap': 'blah blah', 'formset-form4': [
{'random_crap': u'blah blah'}, {'random_crap': 'blah blah'},
{'random_crap': u'blah blah'}]}) {'random_crap': 'blah blah'}]})
def test_manipulated_data(self): def test_manipulated_data(self):
response = self.client.get(self.wizard_url) response = self.client.get(self.wizard_url)

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
from django.contrib.syndication.views import Feed as BaseFeed from django.contrib.syndication.views import Feed as BaseFeed
from django.utils.feedgenerator import Atom1Feed, Rss201rev2Feed from django.utils.feedgenerator import Atom1Feed, Rss201rev2Feed
@ -13,7 +15,7 @@ class GeoFeedMixin(object):
a single white space. Given a tuple of coordinates, this will return a single white space. Given a tuple of coordinates, this will return
a unicode GeoRSS representation. a unicode GeoRSS representation.
""" """
return u' '.join([u'%f %f' % (coord[1], coord[0]) for coord in coords]) return ' '.join(['%f %f' % (coord[1], coord[0]) for coord in coords])
def add_georss_point(self, handler, coords, w3c_geo=False): def add_georss_point(self, handler, coords, w3c_geo=False):
""" """
@ -23,10 +25,10 @@ class GeoFeedMixin(object):
""" """
if w3c_geo: if w3c_geo:
lon, lat = coords[:2] lon, lat = coords[:2]
handler.addQuickElement(u'geo:lat', u'%f' % lat) handler.addQuickElement('geo:lat', '%f' % lat)
handler.addQuickElement(u'geo:lon', u'%f' % lon) handler.addQuickElement('geo:lon', '%f' % lon)
else: else:
handler.addQuickElement(u'georss:point', self.georss_coords((coords,))) handler.addQuickElement('georss:point', self.georss_coords((coords,)))
def add_georss_element(self, handler, item, w3c_geo=False): def add_georss_element(self, handler, item, w3c_geo=False):
""" """
@ -57,7 +59,7 @@ class GeoFeedMixin(object):
# If a GeoRSS box was given via tuple. # If a GeoRSS box was given via tuple.
if not box_coords is None: if not box_coords is None:
if w3c_geo: raise ValueError('Cannot use simple GeoRSS box in W3C Geo feeds.') if w3c_geo: raise ValueError('Cannot use simple GeoRSS box in W3C Geo feeds.')
handler.addQuickElement(u'georss:box', self.georss_coords(box_coords)) handler.addQuickElement('georss:box', self.georss_coords(box_coords))
else: else:
# Getting the lower-case geometry type. # Getting the lower-case geometry type.
gtype = str(geom.geom_type).lower() gtype = str(geom.geom_type).lower()
@ -68,10 +70,10 @@ class GeoFeedMixin(object):
# For formatting consistent w/the GeoRSS simple standard: # For formatting consistent w/the GeoRSS simple standard:
# http://georss.org/1.0#simple # http://georss.org/1.0#simple
if gtype in ('linestring', 'linearring'): if gtype in ('linestring', 'linearring'):
handler.addQuickElement(u'georss:line', self.georss_coords(geom.coords)) handler.addQuickElement('georss:line', self.georss_coords(geom.coords))
elif gtype in ('polygon',): elif gtype in ('polygon',):
# Only support the exterior ring. # Only support the exterior ring.
handler.addQuickElement(u'georss:polygon', self.georss_coords(geom[0].coords)) handler.addQuickElement('georss:polygon', self.georss_coords(geom[0].coords))
else: else:
raise ValueError('Geometry type "%s" not supported.' % geom.geom_type) raise ValueError('Geometry type "%s" not supported.' % geom.geom_type)
@ -79,7 +81,7 @@ class GeoFeedMixin(object):
class GeoRSSFeed(Rss201rev2Feed, GeoFeedMixin): class GeoRSSFeed(Rss201rev2Feed, GeoFeedMixin):
def rss_attributes(self): def rss_attributes(self):
attrs = super(GeoRSSFeed, self).rss_attributes() attrs = super(GeoRSSFeed, self).rss_attributes()
attrs[u'xmlns:georss'] = u'http://www.georss.org/georss' attrs['xmlns:georss'] = 'http://www.georss.org/georss'
return attrs return attrs
def add_item_elements(self, handler, item): def add_item_elements(self, handler, item):
@ -93,7 +95,7 @@ class GeoRSSFeed(Rss201rev2Feed, GeoFeedMixin):
class GeoAtom1Feed(Atom1Feed, GeoFeedMixin): class GeoAtom1Feed(Atom1Feed, GeoFeedMixin):
def root_attributes(self): def root_attributes(self):
attrs = super(GeoAtom1Feed, self).root_attributes() attrs = super(GeoAtom1Feed, self).root_attributes()
attrs[u'xmlns:georss'] = u'http://www.georss.org/georss' attrs['xmlns:georss'] = 'http://www.georss.org/georss'
return attrs return attrs
def add_item_elements(self, handler, item): def add_item_elements(self, handler, item):
@ -107,7 +109,7 @@ class GeoAtom1Feed(Atom1Feed, GeoFeedMixin):
class W3CGeoFeed(Rss201rev2Feed, GeoFeedMixin): class W3CGeoFeed(Rss201rev2Feed, GeoFeedMixin):
def rss_attributes(self): def rss_attributes(self):
attrs = super(W3CGeoFeed, self).rss_attributes() attrs = super(W3CGeoFeed, self).rss_attributes()
attrs[u'xmlns:geo'] = u'http://www.w3.org/2003/01/geo/wgs84_pos#' attrs['xmlns:geo'] = 'http://www.w3.org/2003/01/geo/wgs84_pos#'
return attrs return attrs
def add_item_elements(self, handler, item): def add_item_elements(self, handler, item):

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
from django import forms from django import forms
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -14,10 +16,10 @@ class GeometryField(forms.Field):
widget = forms.Textarea widget = forms.Textarea
default_error_messages = { default_error_messages = {
'no_geom' : _(u'No geometry value provided.'), 'no_geom' : _('No geometry value provided.'),
'invalid_geom' : _(u'Invalid geometry value.'), 'invalid_geom' : _('Invalid geometry value.'),
'invalid_geom_type' : _(u'Invalid geometry type.'), 'invalid_geom_type' : _('Invalid geometry type.'),
'transform_error' : _(u'An error occurred when transforming the geometry ' 'transform_error' : _('An error occurred when transforming the geometry '
'to the SRID of the geometry form field.'), 'to the SRID of the geometry form field.'),
} }

View File

@ -23,7 +23,7 @@ class EnvelopeTest(unittest.TestCase):
self.assertRaises(OGRException, Envelope, (0, 0, 5, 5, 3)) self.assertRaises(OGRException, Envelope, (0, 0, 5, 5, 3))
self.assertRaises(OGRException, Envelope, ()) self.assertRaises(OGRException, Envelope, ())
self.assertRaises(ValueError, Envelope, 0, 'a', 5, 5) self.assertRaises(ValueError, Envelope, 0, 'a', 5, 5)
self.assertRaises(TypeError, Envelope, u'foo') self.assertRaises(TypeError, Envelope, 'foo')
self.assertRaises(OGRException, Envelope, (1, 1, 0, 0)) self.assertRaises(OGRException, Envelope, (1, 1, 0, 0))
try: try:
Envelope(0, 0, 0, 0) Envelope(0, 0, 0, 0)

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
import os import os
from django.conf import settings from django.conf import settings
from django.contrib.gis.geos import GEOSGeometry from django.contrib.gis.geos import GEOSGeometry
@ -99,13 +101,13 @@ class GeoIPTest(unittest.TestCase):
"Testing that GeoIP strings are properly encoded, see #16553." "Testing that GeoIP strings are properly encoded, see #16553."
g = GeoIP() g = GeoIP()
d = g.city('62.224.93.23') d = g.city('62.224.93.23')
self.assertEqual(u'Sch\xf6mberg', d['city']) self.assertEqual('Schümberg', d['city'])
def test06_unicode_query(self): def test06_unicode_query(self):
"Testing that GeoIP accepts unicode string queries, see #17059." "Testing that GeoIP accepts unicode string queries, see #17059."
g = GeoIP() g = GeoIP()
d = g.country(u'whitehouse.gov') d = g.country('whitehouse.gov')
self.assertEqual(u'US', d['country_code']) self.assertEqual('US', d['country_code'])
def suite(): def suite():

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
from django.http import HttpResponse, Http404 from django.http import HttpResponse, Http404
from django.template import loader from django.template import loader
from django.contrib.sites.models import get_current_site from django.contrib.sites.models import get_current_site
@ -41,7 +43,7 @@ def sitemap(request, sitemaps, section=None):
maps, urls = [], [] maps, urls = [], []
if section is not None: if section is not None:
if section not in sitemaps: if section not in sitemaps:
raise Http404(_(u"No sitemap available for section: %r") % section) raise Http404(_("No sitemap available for section: %r") % section)
maps.append(sitemaps[section]) maps.append(sitemaps[section])
else: else:
maps = sitemaps.values() maps = sitemaps.values()
@ -55,9 +57,9 @@ def sitemap(request, sitemaps, section=None):
else: else:
urls.extend(site.get_urls(page=page, site=current_site)) urls.extend(site.get_urls(page=page, site=current_site))
except EmptyPage: except EmptyPage:
raise Http404(_(u"Page %s empty") % page) raise Http404(_("Page %s empty") % page)
except PageNotAnInteger: except PageNotAnInteger:
raise Http404(_(u"No page '%s'") % page) raise Http404(_("No page '%s'") % page)
xml = smart_str(loader.render_to_string('gis/sitemaps/geo_sitemap.xml', {'urlset': urls})) xml = smart_str(loader.render_to_string('gis/sitemaps/geo_sitemap.xml', {'urlset': urls}))
return HttpResponse(xml, content_type='application/xml') return HttpResponse(xml, content_type='application/xml')

View File

@ -44,7 +44,7 @@ class GeoFeedTest(TestCase):
# Incrementing through the feeds. # Incrementing through the feeds.
for feed in [feed1, feed2]: for feed in [feed1, feed2]:
# Ensuring the georss namespace was added to the <rss> element. # Ensuring the georss namespace was added to the <rss> element.
self.assertEqual(feed.getAttribute(u'xmlns:georss'), u'http://www.georss.org/georss') self.assertEqual(feed.getAttribute('xmlns:georss'), 'http://www.georss.org/georss')
chan = feed.getElementsByTagName('channel')[0] chan = feed.getElementsByTagName('channel')[0]
items = chan.getElementsByTagName('item') items = chan.getElementsByTagName('item')
self.assertEqual(len(items), City.objects.count()) self.assertEqual(len(items), City.objects.count())
@ -64,7 +64,7 @@ class GeoFeedTest(TestCase):
for feed in [feed1, feed2]: for feed in [feed1, feed2]:
# Ensuring the georsss namespace was added to the <feed> element. # Ensuring the georsss namespace was added to the <feed> element.
self.assertEqual(feed.getAttribute(u'xmlns:georss'), u'http://www.georss.org/georss') self.assertEqual(feed.getAttribute('xmlns:georss'), 'http://www.georss.org/georss')
entries = feed.getElementsByTagName('entry') entries = feed.getElementsByTagName('entry')
self.assertEqual(len(entries), City.objects.count()) self.assertEqual(len(entries), City.objects.count())
@ -77,7 +77,7 @@ class GeoFeedTest(TestCase):
doc = minidom.parseString(self.client.get('/feeds/w3cgeo1/').content) doc = minidom.parseString(self.client.get('/feeds/w3cgeo1/').content)
feed = doc.firstChild feed = doc.firstChild
# Ensuring the geo namespace was added to the <feed> element. # Ensuring the geo namespace was added to the <feed> element.
self.assertEqual(feed.getAttribute(u'xmlns:geo'), u'http://www.w3.org/2003/01/geo/wgs84_pos#') self.assertEqual(feed.getAttribute('xmlns:geo'), 'http://www.w3.org/2003/01/geo/wgs84_pos#')
chan = feed.getElementsByTagName('channel')[0] chan = feed.getElementsByTagName('channel')[0]
items = chan.getElementsByTagName('item') items = chan.getElementsByTagName('item')
self.assertEqual(len(items), City.objects.count()) self.assertEqual(len(items), City.objects.count())

View File

@ -34,7 +34,7 @@ class GeoSitemapTest(TestCase):
# Getting the geo index. # Getting the geo index.
doc = minidom.parseString(self.client.get('/sitemap.xml').content) doc = minidom.parseString(self.client.get('/sitemap.xml').content)
index = doc.firstChild index = doc.firstChild
self.assertEqual(index.getAttribute(u'xmlns'), u'http://www.sitemaps.org/schemas/sitemap/0.9') self.assertEqual(index.getAttribute('xmlns'), 'http://www.sitemaps.org/schemas/sitemap/0.9')
self.assertEqual(3, len(index.getElementsByTagName('sitemap'))) self.assertEqual(3, len(index.getElementsByTagName('sitemap')))
def test_geositemap_kml(self): def test_geositemap_kml(self):
@ -44,8 +44,8 @@ class GeoSitemapTest(TestCase):
# Ensuring the right sitemaps namespaces are present. # Ensuring the right sitemaps namespaces are present.
urlset = doc.firstChild urlset = doc.firstChild
self.assertEqual(urlset.getAttribute(u'xmlns'), u'http://www.sitemaps.org/schemas/sitemap/0.9') self.assertEqual(urlset.getAttribute('xmlns'), 'http://www.sitemaps.org/schemas/sitemap/0.9')
self.assertEqual(urlset.getAttribute(u'xmlns:geo'), u'http://www.google.com/geo/schemas/sitemap/1.0') self.assertEqual(urlset.getAttribute('xmlns:geo'), 'http://www.google.com/geo/schemas/sitemap/1.0')
urls = urlset.getElementsByTagName('url') urls = urlset.getElementsByTagName('url')
self.assertEqual(2, len(urls)) # Should only be 2 sitemaps. self.assertEqual(2, len(urls)) # Should only be 2 sitemaps.
@ -84,8 +84,8 @@ class GeoSitemapTest(TestCase):
# Ensuring the right sitemaps namespaces are present. # Ensuring the right sitemaps namespaces are present.
urlset = doc.firstChild urlset = doc.firstChild
self.assertEqual(urlset.getAttribute(u'xmlns'), u'http://www.sitemaps.org/schemas/sitemap/0.9') self.assertEqual(urlset.getAttribute('xmlns'), 'http://www.sitemaps.org/schemas/sitemap/0.9')
self.assertEqual(urlset.getAttribute(u'xmlns:geo'), u'http://www.google.com/geo/schemas/sitemap/1.0') self.assertEqual(urlset.getAttribute('xmlns:geo'), 'http://www.google.com/geo/schemas/sitemap/1.0')
# Making sure the correct number of feed URLs were included. # Making sure the correct number of feed URLs were included.
urls = urlset.getElementsByTagName('url') urls = urlset.getElementsByTagName('url')

View File

@ -1,10 +1,12 @@
from __future__ import unicode_literals
from django.http import Http404 from django.http import Http404
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
def feed(request, url, feed_dict=None): def feed(request, url, feed_dict=None):
"""Provided for backwards compatibility.""" """Provided for backwards compatibility."""
if not feed_dict: if not feed_dict:
raise Http404(_(u"No feeds are registered.")) raise Http404(_("No feeds are registered."))
try: try:
slug, param = url.split('/', 1) slug, param = url.split('/', 1)
@ -14,7 +16,7 @@ def feed(request, url, feed_dict=None):
try: try:
f = feed_dict[slug] f = feed_dict[slug]
except KeyError: except KeyError:
raise Http404(_(u"Slug %r isn't registered.") % slug) raise Http404(_("Slug %r isn't registered.") % slug)
instance = f() instance = f()
instance.feed_url = getattr(f, 'feed_url', None) or request.path instance.feed_url = getattr(f, 'feed_url', None) or request.path

View File

@ -1,3 +1,4 @@
from __future__ import unicode_literals
import re import re
from datetime import date, datetime, timedelta from datetime import date, datetime, timedelta
@ -23,8 +24,8 @@ def ordinal(value):
return value return value
suffixes = (_('th'), _('st'), _('nd'), _('rd'), _('th'), _('th'), _('th'), _('th'), _('th'), _('th')) suffixes = (_('th'), _('st'), _('nd'), _('rd'), _('th'), _('th'), _('th'), _('th'), _('th'), _('th'))
if value % 100 in (11, 12, 13): # special case if value % 100 in (11, 12, 13): # special case
return u"%d%s" % (value, suffixes[0]) return "%d%s" % (value, suffixes[0])
return u"%d%s" % (value, suffixes[value % 10]) return "%d%s" % (value, suffixes[value % 10])
@register.filter(is_safe=True) @register.filter(is_safe=True)
def intcomma(value, use_l10n=True): def intcomma(value, use_l10n=True):
@ -161,11 +162,11 @@ def naturalday(value, arg=None):
today = datetime.now(tzinfo).date() today = datetime.now(tzinfo).date()
delta = value - today delta = value - today
if delta.days == 0: if delta.days == 0:
return _(u'today') return _('today')
elif delta.days == 1: elif delta.days == 1:
return _(u'tomorrow') return _('tomorrow')
elif delta.days == -1: elif delta.days == -1:
return _(u'yesterday') return _('yesterday')
return defaultfilters.date(value, arg) return defaultfilters.date(value, arg)
@register.filter @register.filter
@ -185,20 +186,20 @@ def naturaltime(value):
'naturaltime', '%(delta)s ago' 'naturaltime', '%(delta)s ago'
) % {'delta': defaultfilters.timesince(value)} ) % {'delta': defaultfilters.timesince(value)}
elif delta.seconds == 0: elif delta.seconds == 0:
return _(u'now') return _('now')
elif delta.seconds < 60: elif delta.seconds < 60:
return ungettext( return ungettext(
u'a second ago', u'%(count)s seconds ago', delta.seconds 'a second ago', '%(count)s seconds ago', delta.seconds
) % {'count': delta.seconds} ) % {'count': delta.seconds}
elif delta.seconds // 60 < 60: elif delta.seconds // 60 < 60:
count = delta.seconds // 60 count = delta.seconds // 60
return ungettext( return ungettext(
u'a minute ago', u'%(count)s minutes ago', count 'a minute ago', '%(count)s minutes ago', count
) % {'count': count} ) % {'count': count}
else: else:
count = delta.seconds // 60 // 60 count = delta.seconds // 60 // 60
return ungettext( return ungettext(
u'an hour ago', u'%(count)s hours ago', count 'an hour ago', '%(count)s hours ago', count
) % {'count': count} ) % {'count': count}
else: else:
delta = value - now delta = value - now
@ -207,18 +208,18 @@ def naturaltime(value):
'naturaltime', '%(delta)s from now' 'naturaltime', '%(delta)s from now'
) % {'delta': defaultfilters.timeuntil(value)} ) % {'delta': defaultfilters.timeuntil(value)}
elif delta.seconds == 0: elif delta.seconds == 0:
return _(u'now') return _('now')
elif delta.seconds < 60: elif delta.seconds < 60:
return ungettext( return ungettext(
u'a second from now', u'%(count)s seconds from now', delta.seconds 'a second from now', '%(count)s seconds from now', delta.seconds
) % {'count': delta.seconds} ) % {'count': delta.seconds}
elif delta.seconds // 60 < 60: elif delta.seconds // 60 < 60:
count = delta.seconds // 60 count = delta.seconds // 60
return ungettext( return ungettext(
u'a minute from now', u'%(count)s minutes from now', count 'a minute from now', '%(count)s minutes from now', count
) % {'count': count} ) % {'count': count}
else: else:
count = delta.seconds // 60 // 60 count = delta.seconds // 60 // 60
return ungettext( return ungettext(
u'an hour from now', u'%(count)s hours from now', count 'an hour from now', '%(count)s hours from now', count
) % {'count': count} ) % {'count': count}

View File

@ -1,3 +1,4 @@
from __future__ import unicode_literals
import datetime import datetime
import new import new
@ -89,8 +90,8 @@ class HumanizeTests(TestCase):
def test_apnumber(self): def test_apnumber(self):
test_list = [str(x) for x in range(1, 11)] test_list = [str(x) for x in range(1, 11)]
test_list.append(None) test_list.append(None)
result_list = (u'one', u'two', u'three', u'four', u'five', u'six', result_list = ('one', 'two', 'three', 'four', 'five', 'six',
u'seven', u'eight', u'nine', u'10', None) 'seven', 'eight', 'nine', '10', None)
self.humanize_tester(test_list, result_list, 'apnumber') self.humanize_tester(test_list, result_list, 'apnumber')
@ -99,12 +100,12 @@ class HumanizeTests(TestCase):
yesterday = today - datetime.timedelta(days=1) yesterday = today - datetime.timedelta(days=1)
tomorrow = today + datetime.timedelta(days=1) tomorrow = today + datetime.timedelta(days=1)
someday = today - datetime.timedelta(days=10) someday = today - datetime.timedelta(days=10)
notdate = u"I'm not a date value" notdate = "I'm not a date value"
test_list = (today, yesterday, tomorrow, someday, notdate, None) test_list = (today, yesterday, tomorrow, someday, notdate, None)
someday_result = defaultfilters.date(someday) someday_result = defaultfilters.date(someday)
result_list = (_(u'today'), _(u'yesterday'), _(u'tomorrow'), result_list = (_('today'), _('yesterday'), _('tomorrow'),
someday_result, u"I'm not a date value", None) someday_result, "I'm not a date value", None)
self.humanize_tester(test_list, result_list, 'naturalday') self.humanize_tester(test_list, result_list, 'naturalday')
def test_naturalday_tz(self): def test_naturalday_tz(self):

View File

@ -7,30 +7,31 @@ http://www.argentina.gov.ar/argentina/portal/paginas.dhtml?pagina=425
This exists in this standalone file so that it's only imported into memory This exists in this standalone file so that it's only imported into memory
when explicitly needed. when explicitly needed.
""" """
from __future__ import unicode_literals
PROVINCE_CHOICES = ( PROVINCE_CHOICES = (
('B', u'Buenos Aires'), ('B', 'Buenos Aires'),
('K', u'Catamarca'), ('K', 'Catamarca'),
('H', u'Chaco'), ('H', 'Chaco'),
('U', u'Chubut'), ('U', 'Chubut'),
('C', u'Ciudad Autónoma de Buenos Aires'), ('C', 'Ciudad Autónoma de Buenos Aires'),
('X', u'Córdoba'), ('X', 'Córdoba'),
('W', u'Corrientes'), ('W', 'Corrientes'),
('E', u'Entre Ríos'), ('E', 'Entre Ríos'),
('P', u'Formosa'), ('P', 'Formosa'),
('Y', u'Jujuy'), ('Y', 'Jujuy'),
('L', u'La Pampa'), ('L', 'La Pampa'),
('F', u'La Rioja'), ('F', 'La Rioja'),
('M', u'Mendoza'), ('M', 'Mendoza'),
('N', u'Misiones'), ('N', 'Misiones'),
('Q', u'Neuquén'), ('Q', 'Neuquén'),
('R', u'Río Negro'), ('R', 'Río Negro'),
('A', u'Salta'), ('A', 'Salta'),
('J', u'San Juan'), ('J', 'San Juan'),
('D', u'San Luis'), ('D', 'San Luis'),
('Z', u'Santa Cruz'), ('Z', 'Santa Cruz'),
('S', u'Santa Fe'), ('S', 'Santa Fe'),
('G', u'Santiago del Estero'), ('G', 'Santiago del Estero'),
('V', u'Tierra del Fuego, Antártida e Islas del Atlántico Sur'), ('V', 'Tierra del Fuego, Antártida e Islas del Atlántico Sur'),
('T', u'Tucumán'), ('T', 'Tucumán'),
) )

View File

@ -3,7 +3,7 @@
AR-specific Form helpers. AR-specific Form helpers.
""" """
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
from django.contrib.localflavor.ar.ar_provinces import PROVINCE_CHOICES from django.contrib.localflavor.ar.ar_provinces import PROVINCE_CHOICES
from django.core.validators import EMPTY_VALUES from django.core.validators import EMPTY_VALUES
@ -37,11 +37,11 @@ class ARPostalCodeField(RegexField):
def clean(self, value): def clean(self, value):
value = super(ARPostalCodeField, self).clean(value) value = super(ARPostalCodeField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
if len(value) not in (4, 8): if len(value) not in (4, 8):
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])
if len(value) == 8: if len(value) == 8:
return u'%s%s%s' % (value[0].upper(), value[1:5], value[5:].upper()) return '%s%s%s' % (value[0].upper(), value[1:5], value[5:].upper())
return value return value
class ARDNIField(CharField): class ARDNIField(CharField):
@ -63,7 +63,7 @@ class ARDNIField(CharField):
""" """
value = super(ARDNIField, self).clean(value) value = super(ARDNIField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
if not value.isdigit(): if not value.isdigit():
value = value.replace('.', '') value = value.replace('.', '')
if not value.isdigit(): if not value.isdigit():
@ -94,7 +94,7 @@ class ARCUITField(RegexField):
""" """
value = super(ARCUITField, self).clean(value) value = super(ARCUITField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
value, cd = self._canon(value) value, cd = self._canon(value)
if self._calc_cd(value) != cd: if self._calc_cd(value) != cd:
raise ValidationError(self.error_messages['checksum']) raise ValidationError(self.error_messages['checksum'])
@ -113,5 +113,5 @@ class ARCUITField(RegexField):
if check_digit == None: if check_digit == None:
check_digit = cuit[-1] check_digit = cuit[-1]
cuit = cuit[:-1] cuit = cuit[:-1]
return u'%s-%s-%s' % (cuit[:2], cuit[2:], check_digit) return '%s-%s-%s' % (cuit[:2], cuit[2:], check_digit)

View File

@ -1,7 +1,7 @@
""" """
AT-specific Form helpers AT-specific Form helpers
""" """
from __future__ import unicode_literals
import re import re
from django.core.validators import EMPTY_VALUES from django.core.validators import EMPTY_VALUES
@ -47,13 +47,13 @@ class ATSocialSecurityNumberField(Field):
""" """
default_error_messages = { default_error_messages = {
'invalid': _(u'Enter a valid Austrian Social Security Number in XXXX XXXXXX format.'), 'invalid': _('Enter a valid Austrian Social Security Number in XXXX XXXXXX format.'),
} }
def clean(self, value): def clean(self, value):
value = super(ATSocialSecurityNumberField, self).clean(value) value = super(ATSocialSecurityNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u"" return ""
if not re_ssn.search(value): if not re_ssn.search(value):
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])
sqnr, date = value.split(" ") sqnr, date = value.split(" ")
@ -66,4 +66,4 @@ class ATSocialSecurityNumberField(Field):
res = res % 11 res = res % 11
if res != int(check): if res != int(check):
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])
return u'%s%s %s'%(sqnr, check, date,) return '%s%s %s'%(sqnr, check, date,)

View File

@ -2,7 +2,7 @@
Australian-specific Form helpers Australian-specific Form helpers
""" """
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
import re import re
@ -34,7 +34,7 @@ class AUPostCodeField(RegexField):
class AUPhoneNumberField(Field): class AUPhoneNumberField(Field):
"""Australian phone number field.""" """Australian phone number field."""
default_error_messages = { default_error_messages = {
'invalid': u'Phone numbers must contain 10 digits.', 'invalid': 'Phone numbers must contain 10 digits.',
} }
def clean(self, value): def clean(self, value):
@ -43,11 +43,11 @@ class AUPhoneNumberField(Field):
""" """
super(AUPhoneNumberField, self).clean(value) super(AUPhoneNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
value = re.sub('(\(|\)|\s+|-)', '', smart_unicode(value)) value = re.sub('(\(|\)|\s+|-)', '', smart_unicode(value))
phone_match = PHONE_DIGITS_RE.search(value) phone_match = PHONE_DIGITS_RE.search(value)
if phone_match: if phone_match:
return u'%s' % phone_match.group(1) return '%s' % phone_match.group(1)
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])

View File

@ -5,33 +5,34 @@ An alphabetical list of Brazilian states for use as `choices` in a formfield.
This exists in this standalone file so that it's only imported into memory This exists in this standalone file so that it's only imported into memory
when explicitly needed. when explicitly needed.
""" """
from __future__ import unicode_literals
STATE_CHOICES = ( STATE_CHOICES = (
('AC', 'Acre'), ('AC', 'Acre'),
('AL', 'Alagoas'), ('AL', 'Alagoas'),
('AP', u'Amapá'), ('AP', 'Amapá'),
('AM', 'Amazonas'), ('AM', 'Amazonas'),
('BA', 'Bahia'), ('BA', 'Bahia'),
('CE', u'Ceará'), ('CE', 'Ceará'),
('DF', 'Distrito Federal'), ('DF', 'Distrito Federal'),
('ES', u'Espírito Santo'), ('ES', 'Espírito Santo'),
('GO', u'Goiás'), ('GO', 'Goiás'),
('MA', u'Maranhão'), ('MA', 'Maranhão'),
('MT', 'Mato Grosso'), ('MT', 'Mato Grosso'),
('MS', 'Mato Grosso do Sul'), ('MS', 'Mato Grosso do Sul'),
('MG', 'Minas Gerais'), ('MG', 'Minas Gerais'),
('PA', u'Pará'), ('PA', 'Pará'),
('PB', u'Paraíba'), ('PB', 'Paraíba'),
('PR', u'Paraná'), ('PR', 'Paraná'),
('PE', 'Pernambuco'), ('PE', 'Pernambuco'),
('PI', u'Piauí'), ('PI', 'Piauí'),
('RJ', 'Rio de Janeiro'), ('RJ', 'Rio de Janeiro'),
('RN', 'Rio Grande do Norte'), ('RN', 'Rio Grande do Norte'),
('RS', 'Rio Grande do Sul'), ('RS', 'Rio Grande do Sul'),
('RO', u'Rondônia'), ('RO', 'Rondônia'),
('RR', 'Roraima'), ('RR', 'Roraima'),
('SC', 'Santa Catarina'), ('SC', 'Santa Catarina'),
('SP', u'São Paulo'), ('SP', 'São Paulo'),
('SE', 'Sergipe'), ('SE', 'Sergipe'),
('TO', 'Tocantins'), ('TO', 'Tocantins'),
) )

View File

@ -3,7 +3,7 @@
BR-specific Form helpers BR-specific Form helpers
""" """
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
import re import re
@ -34,11 +34,11 @@ class BRPhoneNumberField(Field):
def clean(self, value): def clean(self, value):
super(BRPhoneNumberField, self).clean(value) super(BRPhoneNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
value = re.sub('(\(|\)|\s+)', '', smart_unicode(value)) value = re.sub('(\(|\)|\s+)', '', smart_unicode(value))
m = phone_digits_re.search(value) m = phone_digits_re.search(value)
if m: if m:
return u'%s-%s-%s' % (m.group(1), m.group(2), m.group(3)) return '%s-%s-%s' % (m.group(1), m.group(2), m.group(3))
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])
class BRStateSelect(Select): class BRStateSelect(Select):
@ -55,7 +55,7 @@ class BRStateChoiceField(Field):
""" """
widget = Select widget = Select
default_error_messages = { default_error_messages = {
'invalid': _(u'Select a valid brazilian state. That state is not one of the available states.'), 'invalid': _('Select a valid brazilian state. That state is not one of the available states.'),
} }
def __init__(self, required=True, widget=None, label=None, def __init__(self, required=True, widget=None, label=None,
@ -67,9 +67,9 @@ class BRStateChoiceField(Field):
def clean(self, value): def clean(self, value):
value = super(BRStateChoiceField, self).clean(value) value = super(BRStateChoiceField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
value = u'' value = ''
value = smart_unicode(value) value = smart_unicode(value)
if value == u'': if value == '':
return value return value
valid_values = set([smart_unicode(k) for k, v in self.widget.choices]) valid_values = set([smart_unicode(k) for k, v in self.widget.choices])
if value not in valid_values: if value not in valid_values:
@ -105,7 +105,7 @@ class BRCPFField(CharField):
""" """
value = super(BRCPFField, self).clean(value) value = super(BRCPFField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
orig_value = value[:] orig_value = value[:]
if not value.isdigit(): if not value.isdigit():
value = re.sub("[-\.]", "", value) value = re.sub("[-\.]", "", value)
@ -142,7 +142,7 @@ class BRCNPJField(Field):
""" """
value = super(BRCNPJField, self).clean(value) value = super(BRCNPJField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
orig_value = value[:] orig_value = value[:]
if not value.isdigit(): if not value.isdigit():
value = re.sub("[-/\.]", "", value) value = re.sub("[-/\.]", "", value)

View File

@ -2,7 +2,7 @@
Canada-specific Form helpers Canada-specific Form helpers
""" """
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
import re import re
@ -26,7 +26,7 @@ class CAPostalCodeField(CharField):
http://www.canadapost.ca/tools/pg/manual/PGaddress-e.asp#1402170 http://www.canadapost.ca/tools/pg/manual/PGaddress-e.asp#1402170
""" """
default_error_messages = { default_error_messages = {
'invalid': _(u'Enter a postal code in the format XXX XXX.'), 'invalid': _('Enter a postal code in the format XXX XXX.'),
} }
postcode_regex = re.compile(r'^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ]) *(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$') postcode_regex = re.compile(r'^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ]) *(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$')
@ -34,7 +34,7 @@ class CAPostalCodeField(CharField):
def clean(self, value): def clean(self, value):
value = super(CAPostalCodeField, self).clean(value) value = super(CAPostalCodeField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
postcode = value.upper().strip() postcode = value.upper().strip()
m = self.postcode_regex.match(postcode) m = self.postcode_regex.match(postcode)
if not m: if not m:
@ -44,7 +44,7 @@ class CAPostalCodeField(CharField):
class CAPhoneNumberField(Field): class CAPhoneNumberField(Field):
"""Canadian phone number field.""" """Canadian phone number field."""
default_error_messages = { default_error_messages = {
'invalid': _(u'Phone numbers must be in XXX-XXX-XXXX format.'), 'invalid': _('Phone numbers must be in XXX-XXX-XXXX format.'),
} }
def clean(self, value): def clean(self, value):
@ -52,11 +52,11 @@ class CAPhoneNumberField(Field):
""" """
super(CAPhoneNumberField, self).clean(value) super(CAPhoneNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
value = re.sub('(\(|\)|\s+)', '', smart_unicode(value)) value = re.sub('(\(|\)|\s+)', '', smart_unicode(value))
m = phone_digits_re.search(value) m = phone_digits_re.search(value)
if m: if m:
return u'%s-%s-%s' % (m.group(1), m.group(2), m.group(3)) return '%s-%s-%s' % (m.group(1), m.group(2), m.group(3))
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])
class CAProvinceField(Field): class CAProvinceField(Field):
@ -66,13 +66,13 @@ class CAProvinceField(Field):
abbreviation for the given province. abbreviation for the given province.
""" """
default_error_messages = { default_error_messages = {
'invalid': _(u'Enter a Canadian province or territory.'), 'invalid': _('Enter a Canadian province or territory.'),
} }
def clean(self, value): def clean(self, value):
super(CAProvinceField, self).clean(value) super(CAProvinceField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
try: try:
value = value.strip().lower() value = value.strip().lower()
except AttributeError: except AttributeError:
@ -113,14 +113,14 @@ class CASocialInsuranceNumberField(Field):
def clean(self, value): def clean(self, value):
super(CASocialInsuranceNumberField, self).clean(value) super(CASocialInsuranceNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
match = re.match(sin_re, value) match = re.match(sin_re, value)
if not match: if not match:
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])
number = u'%s-%s-%s' % (match.group(1), match.group(2), match.group(3)) number = '%s-%s-%s' % (match.group(1), match.group(2), match.group(3))
check_number = u'%s%s%s' % (match.group(1), match.group(2), match.group(3)) check_number = '%s%s%s' % (match.group(1), match.group(2), match.group(3))
if not self.luhn_checksum_is_valid(check_number): if not self.luhn_checksum_is_valid(check_number):
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])
return number return number

View File

@ -2,7 +2,7 @@
Swiss-specific Form helpers Swiss-specific Form helpers
""" """
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
import re import re
@ -40,11 +40,11 @@ class CHPhoneNumberField(Field):
def clean(self, value): def clean(self, value):
super(CHPhoneNumberField, self).clean(value) super(CHPhoneNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
value = re.sub('(\.|\s|/|-)', '', smart_unicode(value)) value = re.sub('(\.|\s|/|-)', '', smart_unicode(value))
m = phone_digits_re.search(value) m = phone_digits_re.search(value)
if m: if m:
return u'%s %s %s %s' % (value[0:3], value[3:6], value[6:8], value[8:10]) return '%s %s %s %s' % (value[0:3], value[3:6], value[6:8], value[8:10])
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])
class CHStateSelect(Select): class CHStateSelect(Select):
@ -102,7 +102,7 @@ class CHIdentityCardNumberField(Field):
def clean(self, value): def clean(self, value):
super(CHIdentityCardNumberField, self).clean(value) super(CHIdentityCardNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
match = re.match(id_re, value) match = re.match(id_re, value)
if not match: if not match:
@ -118,5 +118,5 @@ class CHIdentityCardNumberField(Field):
if not self.has_valid_checksum(all_digits): if not self.has_valid_checksum(all_digits):
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])
return u'%s%s%s' % (idnumber, pos9, checksum) return '%s%s%s' % (idnumber, pos9, checksum)

View File

@ -5,21 +5,22 @@ A list of Chilean regions as `choices` in a formfield.
This exists in this standalone file so that it's only imported into memory This exists in this standalone file so that it's only imported into memory
when explicitly needed. when explicitly needed.
""" """
from __future__ import unicode_literals
REGION_CHOICES = ( REGION_CHOICES = (
('RM', u'Región Metropolitana de Santiago'), ('RM', 'Región Metropolitana de Santiago'),
('I', u'Región de Tarapacá'), ('I', 'Región de Tarapacá'),
('II', u'Región de Antofagasta'), ('II', 'Región de Antofagasta'),
('III', u'Región de Atacama'), ('III', 'Región de Atacama'),
('IV', u'Región de Coquimbo'), ('IV', 'Región de Coquimbo'),
('V', u'Región de Valparaíso'), ('V', 'Región de Valparaíso'),
('VI', u'Región del Libertador Bernardo O\'Higgins'), ('VI', 'Región del Libertador Bernardo O\'Higgins'),
('VII', u'Región del Maule'), ('VII', 'Región del Maule'),
('VIII',u'Región del Bío Bío'), ('VIII','Región del Bío Bío'),
('IX', u'Región de la Araucanía'), ('IX', 'Región de la Araucanía'),
('X', u'Región de los Lagos'), ('X', 'Región de los Lagos'),
('XI', u'Región de Aysén del General Carlos Ibáñez del Campo'), ('XI', 'Región de Aysén del General Carlos Ibáñez del Campo'),
('XII', u'Región de Magallanes y la Antártica Chilena'), ('XII', 'Región de Magallanes y la Antártica Chilena'),
('XIV', u'Región de Los Ríos'), ('XIV', 'Región de Los Ríos'),
('XV', u'Región de Arica-Parinacota'), ('XV', 'Región de Arica-Parinacota'),
) )

View File

@ -2,15 +2,15 @@
Chile specific form helpers. Chile specific form helpers.
""" """
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
from django.contrib.localflavor.cl.cl_regions import REGION_CHOICES
from django.core.validators import EMPTY_VALUES from django.core.validators import EMPTY_VALUES
from django.forms import ValidationError from django.forms import ValidationError
from django.forms.fields import RegexField, Select from django.forms.fields import RegexField, Select
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import smart_unicode from django.utils.encoding import smart_unicode
from .cl_regions import REGION_CHOICES
class CLRegionSelect(Select): class CLRegionSelect(Select):
""" """
@ -50,7 +50,7 @@ class CLRutField(RegexField):
""" """
super(CLRutField, self).clean(value) super(CLRutField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
rut, verificador = self._canonify(value) rut, verificador = self._canonify(value)
if self._algorithm(rut) == verificador: if self._algorithm(rut) == verificador:
return self._format(rut, verificador) return self._format(rut, verificador)
@ -68,7 +68,7 @@ class CLRutField(RegexField):
multi += 1 multi += 1
if multi == 8: if multi == 8:
multi = 2 multi = 2
return u'0123456789K0'[11 - suma % 11] return '0123456789K0'[11 - suma % 11]
def _canonify(self, rut): def _canonify(self, rut):
""" """
@ -93,5 +93,5 @@ class CLRutField(RegexField):
else: else:
new_dot = pos - 3 new_dot = pos - 3
code = code[:new_dot] + '.' + code[new_dot:] code = code[:new_dot] + '.' + code[new_dot:]
return u'%s-%s' % (code, verifier) return '%s-%s' % (code, verifier)

View File

@ -9,41 +9,41 @@ http://en.wikipedia.org/wiki/Province_%28China%29
http://en.wikipedia.org/wiki/Direct-controlled_municipality http://en.wikipedia.org/wiki/Direct-controlled_municipality
http://en.wikipedia.org/wiki/Autonomous_regions_of_China http://en.wikipedia.org/wiki/Autonomous_regions_of_China
""" """
from __future__ import unicode_literals
CN_PROVINCE_CHOICES = ( CN_PROVINCE_CHOICES = (
("anhui", u"安徽"), ("anhui", "安徽"),
("beijing", u"北京"), ("beijing", "北京"),
("chongqing", u"重庆"), ("chongqing", "重庆"),
("fujian", u"福建"), ("fujian", "福建"),
("gansu", u"甘肃"), ("gansu", "甘肃"),
("guangdong", u"广东"), ("guangdong", "广东"),
("guangxi", u"广西壮族自治区"), ("guangxi", "广西壮族自治区"),
("guizhou", u"贵州"), ("guizhou", "贵州"),
("hainan", u"海南"), ("hainan", "海南"),
("hebei", u"河北"), ("hebei", "河北"),
("heilongjiang", u"黑龙江"), ("heilongjiang", "黑龙江"),
("henan", u"河南"), ("henan", "河南"),
("hongkong", u"香港"), ("hongkong", "香港"),
("hubei", u"湖北"), ("hubei", "湖北"),
("hunan", u"湖南"), ("hunan", "湖南"),
("jiangsu", u"江苏"), ("jiangsu", "江苏"),
("jiangxi", u"江西"), ("jiangxi", "江西"),
("jilin", u"吉林"), ("jilin", "吉林"),
("liaoning", u"辽宁"), ("liaoning", "辽宁"),
("macao", u"澳门"), ("macao", "澳门"),
("neimongol", u"内蒙古自治区"), ("neimongol", "内蒙古自治区"),
("ningxia", u"宁夏回族自治区"), ("ningxia", "宁夏回族自治区"),
("qinghai", u"青海"), ("qinghai", "青海"),
("shaanxi", u"陕西"), ("shaanxi", "陕西"),
("shandong", u"山东"), ("shandong", "山东"),
("shanghai", u"上海"), ("shanghai", "上海"),
("shanxi", u"山西"), ("shanxi", "山西"),
("sichuan", u"四川"), ("sichuan", "四川"),
("taiwan", u"台湾"), ("taiwan", "台湾"),
("tianjin", u"天津"), ("tianjin", "天津"),
("xinjiang", u"新疆维吾尔自治区"), ("xinjiang", "新疆维吾尔自治区"),
("xizang", u"西藏自治区"), ("xizang", "西藏自治区"),
("yunnan", u"云南"), ("yunnan", "云南"),
("zhejiang", u"浙江"), ("zhejiang", "浙江"),
) )

View File

@ -3,7 +3,7 @@
""" """
Chinese-specific form helpers Chinese-specific form helpers
""" """
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
import re import re
@ -81,7 +81,7 @@ class CNPostCodeField(RegexField):
Valid code is XXXXXX where X is digit. Valid code is XXXXXX where X is digit.
""" """
default_error_messages = { default_error_messages = {
'invalid': _(u'Enter a post code in the format XXXXXX.'), 'invalid': _('Enter a post code in the format XXXXXX.'),
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -102,10 +102,10 @@ class CNIDCardField(CharField):
The checksum algorithm is described in GB11643-1999. The checksum algorithm is described in GB11643-1999.
""" """
default_error_messages = { default_error_messages = {
'invalid': _(u'ID Card Number consists of 15 or 18 digits.'), 'invalid': _('ID Card Number consists of 15 or 18 digits.'),
'checksum': _(u'Invalid ID Card Number: Wrong checksum'), 'checksum': _('Invalid ID Card Number: Wrong checksum'),
'birthday': _(u'Invalid ID Card Number: Wrong birthdate'), 'birthday': _('Invalid ID Card Number: Wrong birthdate'),
'location': _(u'Invalid ID Card Number: Wrong location code'), 'location': _('Invalid ID Card Number: Wrong location code'),
} }
def __init__(self, max_length=18, min_length=15, *args, **kwargs): def __init__(self, max_length=18, min_length=15, *args, **kwargs):
@ -119,7 +119,7 @@ class CNIDCardField(CharField):
# Check the length of the ID card number. # Check the length of the ID card number.
super(CNIDCardField, self).clean(value) super(CNIDCardField, self).clean(value)
if not value: if not value:
return u"" return ""
# Check whether this ID card number has valid format # Check whether this ID card number has valid format
if not re.match(ID_CARD_RE, value): if not re.match(ID_CARD_RE, value):
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])
@ -133,7 +133,7 @@ class CNIDCardField(CharField):
value = value.upper() value = value.upper()
if not self.has_valid_checksum(value): if not self.has_valid_checksum(value):
raise ValidationError(self.error_messages['checksum']) raise ValidationError(self.error_messages['checksum'])
return u'%s' % value return '%s' % value
def has_valid_birthday(self, value): def has_valid_birthday(self, value):
""" """
@ -190,7 +190,7 @@ class CNPhoneNumberField(RegexField):
010-55555555-35 010-55555555-35
""" """
default_error_messages = { default_error_messages = {
'invalid': _(u'Enter a valid phone number.'), 'invalid': _('Enter a valid phone number.'),
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -207,7 +207,7 @@ class CNCellNumberField(RegexField):
The length of the cell number should be 11. The length of the cell number should be 11.
""" """
default_error_messages = { default_error_messages = {
'invalid': _(u'Enter a valid cell number.'), 'invalid': _('Enter a valid cell number.'),
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):

View File

@ -6,39 +6,40 @@ formfield.
This exists in this standalone file so that it's only This exists in this standalone file so that it's only
imported into memory when explicitly needed. imported into memory when explicitly needed.
""" """
from __future__ import unicode_literals
DEPARTMENT_CHOICES = ( DEPARTMENT_CHOICES = (
('AMA', u'Amazonas'), ('AMA', 'Amazonas'),
('ANT', u'Antioquia'), ('ANT', 'Antioquia'),
('ARA', u'Arauca'), ('ARA', 'Arauca'),
('ATL', u'Atlántico'), ('ATL', 'Atlántico'),
('DC', u'Bogotá'), ('DC', 'Bogotá'),
('BOL', u'Bolívar'), ('BOL', 'Bolívar'),
('BOY', u'Boyacá'), ('BOY', 'Boyacá'),
('CAL', u'Caldas'), ('CAL', 'Caldas'),
('CAQ', u'Caquetá'), ('CAQ', 'Caquetá'),
('CAS', u'Casanare'), ('CAS', 'Casanare'),
('CAU', u'Cauca'), ('CAU', 'Cauca'),
('CES', u'Cesar'), ('CES', 'Cesar'),
('CHO', u'Chocó'), ('CHO', 'Chocó'),
('COR', u'Córdoba'), ('COR', 'Córdoba'),
('CUN', u'Cundinamarca'), ('CUN', 'Cundinamarca'),
('GUA', u'Guainía'), ('GUA', 'Guainía'),
('GUV', u'Guaviare'), ('GUV', 'Guaviare'),
('HUI', u'Huila'), ('HUI', 'Huila'),
('LAG', u'La Guajira'), ('LAG', 'La Guajira'),
('MAG', u'Magdalena'), ('MAG', 'Magdalena'),
('MET', u'Meta'), ('MET', 'Meta'),
('NAR', u'Nariño'), ('NAR', 'Nariño'),
('NSA', u'Norte de Santander'), ('NSA', 'Norte de Santander'),
('PUT', u'Putumayo'), ('PUT', 'Putumayo'),
('QUI', u'Quindío'), ('QUI', 'Quindío'),
('RIS', u'Risaralda'), ('RIS', 'Risaralda'),
('SAP', u'San Andrés and Providencia'), ('SAP', 'San Andrés and Providencia'),
('SAN', u'Santander'), ('SAN', 'Santander'),
('SUC', u'Sucre'), ('SUC', 'Sucre'),
('TOL', u'Tolima'), ('TOL', 'Tolima'),
('VAC', u'Valle del Cauca'), ('VAC', 'Valle del Cauca'),
('VAU', u'Vaupés'), ('VAU', 'Vaupés'),
('VID', u'Vichada'), ('VID', 'Vichada'),
) )

View File

@ -2,7 +2,7 @@
Czech-specific form helpers Czech-specific form helpers
""" """
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
import re import re
@ -29,7 +29,7 @@ class CZPostalCodeField(RegexField):
Valid form is XXXXX or XXX XX, where X represents integer. Valid form is XXXXX or XXX XX, where X represents integer.
""" """
default_error_messages = { default_error_messages = {
'invalid': _(u'Enter a postal code in the format XXXXX or XXX XX.'), 'invalid': _('Enter a postal code in the format XXXXX or XXX XX.'),
} }
def __init__(self, max_length=None, min_length=None, *args, **kwargs): def __init__(self, max_length=None, min_length=None, *args, **kwargs):
@ -49,15 +49,15 @@ class CZBirthNumberField(Field):
Czech birth number field. Czech birth number field.
""" """
default_error_messages = { default_error_messages = {
'invalid_format': _(u'Enter a birth number in the format XXXXXX/XXXX or XXXXXXXXXX.'), 'invalid_format': _('Enter a birth number in the format XXXXXX/XXXX or XXXXXXXXXX.'),
'invalid': _(u'Enter a valid birth number.'), 'invalid': _('Enter a valid birth number.'),
} }
def clean(self, value, gender=None): def clean(self, value, gender=None):
super(CZBirthNumberField, self).clean(value) super(CZBirthNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
match = re.match(birth_number, value) match = re.match(birth_number, value)
if not match: if not match:
@ -67,7 +67,7 @@ class CZBirthNumberField(Field):
# Three digits for verification number were used until 1. january 1954 # Three digits for verification number were used until 1. january 1954
if len(id) == 3: if len(id) == 3:
return u'%s' % value return '%s' % value
# Birth number is in format YYMMDD. Females have month value raised by 50. # Birth number is in format YYMMDD. Females have month value raised by 50.
# In case that all possible number are already used (for given date), # In case that all possible number are already used (for given date),
@ -90,7 +90,7 @@ class CZBirthNumberField(Field):
modulo = int(birth + id[:3]) % 11 modulo = int(birth + id[:3]) % 11
if (modulo == int(id[-1])) or (modulo == 10 and id[-1] == '0'): if (modulo == int(id[-1])) or (modulo == 10 and id[-1] == '0'):
return u'%s' % value return '%s' % value
else: else:
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])
@ -99,14 +99,14 @@ class CZICNumberField(Field):
Czech IC number field. Czech IC number field.
""" """
default_error_messages = { default_error_messages = {
'invalid': _(u'Enter a valid IC number.'), 'invalid': _('Enter a valid IC number.'),
} }
def clean(self, value): def clean(self, value):
super(CZICNumberField, self).clean(value) super(CZICNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
match = re.match(ic_number, value) match = re.match(ic_number, value)
if not match: if not match:
@ -130,7 +130,7 @@ class CZICNumberField(Field):
if (not remainder % 10 and check == 1) or \ if (not remainder % 10 and check == 1) or \
(remainder == 1 and check == 0) or \ (remainder == 1 and check == 0) or \
(check == (11 - remainder)): (check == (11 - remainder)):
return u'%s' % value return '%s' % value
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])

View File

@ -2,7 +2,7 @@
DE-specific Form helpers DE-specific Form helpers
""" """
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
import re import re
@ -68,7 +68,7 @@ class DEIdentityCardNumberField(Field):
def clean(self, value): def clean(self, value):
super(DEIdentityCardNumberField, self).clean(value) super(DEIdentityCardNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
match = re.match(id_re, value) match = re.match(id_re, value)
if not match: if not match:
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])
@ -80,9 +80,9 @@ class DEIdentityCardNumberField(Field):
if residence == '0000000000' or birthday == '0000000' or validity == '0000000': if residence == '0000000000' or birthday == '0000000' or validity == '0000000':
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])
all_digits = u"%s%s%s%s" % (residence, birthday, validity, checksum) all_digits = "%s%s%s%s" % (residence, birthday, validity, checksum)
if not self.has_valid_checksum(residence) or not self.has_valid_checksum(birthday) or \ if not self.has_valid_checksum(residence) or not self.has_valid_checksum(birthday) or \
not self.has_valid_checksum(validity) or not self.has_valid_checksum(all_digits): not self.has_valid_checksum(validity) or not self.has_valid_checksum(all_digits):
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])
return u'%s%s-%s-%s-%s' % (residence, origin, birthday, validity, checksum) return '%s%s-%s-%s-%s' % (residence, origin, birthday, validity, checksum)

View File

@ -4,6 +4,8 @@
# The *_FORMAT strings use the Django date format syntax, # The *_FORMAT strings use the Django date format syntax,
# see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
from __future__ import unicode_literals
DATE_FORMAT = 'j. F Y' DATE_FORMAT = 'j. F Y'
TIME_FORMAT = 'H:i:s' TIME_FORMAT = 'H:i:s'
DATETIME_FORMAT = 'j. F Y H:i:s' DATETIME_FORMAT = 'j. F Y H:i:s'
@ -39,5 +41,5 @@ DATETIME_INPUT_FORMATS = (
# For details, please refer to http://www.bk.admin.ch/dokumentation/sprachen/04915/05016/index.html?lang=de # For details, please refer to http://www.bk.admin.ch/dokumentation/sprachen/04915/05016/index.html?lang=de
# (in German) and the documentation # (in German) and the documentation
DECIMAL_SEPARATOR = ',' DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = u'\xa0' # non-breaking space THOUSAND_SEPARATOR = '\xa0' # non-breaking space
NUMBER_GROUPING = 3 NUMBER_GROUPING = 3

View File

@ -6,30 +6,31 @@ formfield.
This exists in this standalone file so that it's only This exists in this standalone file so that it's only
imported into memory when explicitly needed. imported into memory when explicitly needed.
""" """
from __future__ import unicode_literals
PROVINCE_CHOICES = ( PROVINCE_CHOICES = (
('A', u'Azuay'), ('A', 'Azuay'),
('B', u'Bolívar'), ('B', 'Bolívar'),
('F', u'Cañar'), ('F', 'Cañar'),
('C', u'Carchi'), ('C', 'Carchi'),
('H', u'Chimborazo'), ('H', 'Chimborazo'),
('X', u'Cotopaxi'), ('X', 'Cotopaxi'),
('O', u'El Oro'), ('O', 'El Oro'),
('E', u'Esmeraldas'), ('E', 'Esmeraldas'),
('W', u'Galápagos'), ('W', 'Galápagos'),
('G', u'Guayas'), ('G', 'Guayas'),
('I', u'Imbabura'), ('I', 'Imbabura'),
('L', u'Loja'), ('L', 'Loja'),
('R', u'Los Ríos'), ('R', 'Los Ríos'),
('M', u'Manabí'), ('M', 'Manabí'),
('S', u'Morona Santiago'), ('S', 'Morona Santiago'),
('N', u'Napo'), ('N', 'Napo'),
('D', u'Orellana'), ('D', 'Orellana'),
('Y', u'Pastaza'), ('Y', 'Pastaza'),
('P', u'Pichincha'), ('P', 'Pichincha'),
('SE', u'Santa Elena'), ('SE', 'Santa Elena'),
('SD', u'Santo Domingo de los Tsáchilas'), ('SD', 'Santo Domingo de los Tsáchilas'),
('U', u'Sucumbíos'), ('U', 'Sucumbíos'),
('T', u'Tungurahua'), ('T', 'Tungurahua'),
('Z', u'Zamora Chinchipe'), ('Z', 'Zamora Chinchipe'),
) )

View File

@ -91,7 +91,7 @@ class ESIdentityCardNumberField(RegexField):
def clean(self, value): def clean(self, value):
super(ESIdentityCardNumberField, self).clean(value) super(ESIdentityCardNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
nif_get_checksum = lambda d: self.nif_control[int(d)%23] nif_get_checksum = lambda d: self.nif_control[int(d)%23]
value = value.upper().replace(' ', '').replace('-', '') value = value.upper().replace(' ', '').replace('-', '')
@ -157,7 +157,7 @@ class ESCCCField(RegexField):
def clean(self, value): def clean(self, value):
super(ESCCCField, self).clean(value) super(ESCCCField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
control_str = [1, 2, 4, 8, 5, 10, 9, 7, 3, 6] control_str = [1, 2, 4, 8, 5, 10, 9, 7, 3, 6]
m = re.match(r'^(\d{4})[ -]?(\d{4})[ -]?(\d{2})[ -]?(\d{10})$', value) m = re.match(r'^(\d{4})[ -]?(\d{4})[ -]?(\d{2})[ -]?(\d{10})$', value)
entity, office, checksum, account = m.groups() entity, office, checksum, account = m.groups()

View File

@ -7,347 +7,349 @@ This exists in this standalone file so that it's only imported into memory
when explicitly needed. when explicitly needed.
""" """
from __future__ import unicode_literals
MUNICIPALITY_CHOICES = ( MUNICIPALITY_CHOICES = (
('akaa', u"Akaa"), ('akaa', "Akaa"),
('alajarvi', u"Alajärvi"), ('alajarvi', "Alajärvi"),
('alavieska', u"Alavieska"), ('alavieska', "Alavieska"),
('alavus', u"Alavus"), ('alavus', "Alavus"),
('artjarvi', u"Artjärvi"), ('artjarvi', "Artjärvi"),
('asikkala', u"Asikkala"), ('asikkala', "Asikkala"),
('askola', u"Askola"), ('askola', "Askola"),
('aura', u"Aura"), ('aura', "Aura"),
('brando', u"Brändö"), ('brando', "Brändö"),
('eckero', u"Eckerö"), ('eckero', "Eckerö"),
('enonkoski', u"Enonkoski"), ('enonkoski', "Enonkoski"),
('enontekio', u"Enontekiö"), ('enontekio', "Enontekiö"),
('espoo', u"Espoo"), ('espoo', "Espoo"),
('eura', u"Eura"), ('eura', "Eura"),
('eurajoki', u"Eurajoki"), ('eurajoki', "Eurajoki"),
('evijarvi', u"Evijärvi"), ('evijarvi', "Evijärvi"),
('finstrom', u"Finström"), ('finstrom', "Finström"),
('forssa', u"Forssa"), ('forssa', "Forssa"),
('foglo', u"Föglö"), ('foglo', "Föglö"),
('geta', u"Geta"), ('geta', "Geta"),
('haapajarvi', u"Haapajärvi"), ('haapajarvi', "Haapajärvi"),
('haapavesi', u"Haapavesi"), ('haapavesi', "Haapavesi"),
('hailuoto', u"Hailuoto"), ('hailuoto', "Hailuoto"),
('halsua', u"Halsua"), ('halsua', "Halsua"),
('hamina', u"Hamina"), ('hamina', "Hamina"),
('hammarland', u"Hammarland"), ('hammarland', "Hammarland"),
('hankasalmi', u"Hankasalmi"), ('hankasalmi', "Hankasalmi"),
('hanko', u"Hanko"), ('hanko', "Hanko"),
('harjavalta', u"Harjavalta"), ('harjavalta', "Harjavalta"),
('hartola', u"Hartola"), ('hartola', "Hartola"),
('hattula', u"Hattula"), ('hattula', "Hattula"),
('haukipudas', u"Haukipudas"), ('haukipudas', "Haukipudas"),
('hausjarvi', u"Hausjärvi"), ('hausjarvi', "Hausjärvi"),
('heinola', u"Heinola"), ('heinola', "Heinola"),
('heinavesi', u"Heinävesi"), ('heinavesi', "Heinävesi"),
('helsinki', u"Helsinki"), ('helsinki', "Helsinki"),
('hirvensalmi', u"Hirvensalmi"), ('hirvensalmi', "Hirvensalmi"),
('hollola', u"Hollola"), ('hollola', "Hollola"),
('honkajoki', u"Honkajoki"), ('honkajoki', "Honkajoki"),
('huittinen', u"Huittinen"), ('huittinen', "Huittinen"),
('humppila', u"Humppila"), ('humppila', "Humppila"),
('hyrynsalmi', u"Hyrynsalmi"), ('hyrynsalmi', "Hyrynsalmi"),
('hyvinkaa', u"Hyvinkää"), ('hyvinkaa', "Hyvinkää"),
('hameenkoski', u"Hämeenkoski"), ('hameenkoski', "Hämeenkoski"),
('hameenkyro', u"Hämeenkyrö"), ('hameenkyro', "Hämeenkyrö"),
('hameenlinna', u"Hämeenlinna"), ('hameenlinna', "Hämeenlinna"),
('ii', u"Ii"), ('ii', "Ii"),
('iisalmi', u"Iisalmi"), ('iisalmi', "Iisalmi"),
('iitti', u"Iitti"), ('iitti', "Iitti"),
('ikaalinen', u"Ikaalinen"), ('ikaalinen', "Ikaalinen"),
('ilmajoki', u"Ilmajoki"), ('ilmajoki', "Ilmajoki"),
('ilomantsi', u"Ilomantsi"), ('ilomantsi', "Ilomantsi"),
('imatra', u"Imatra"), ('imatra', "Imatra"),
('inari', u"Inari"), ('inari', "Inari"),
('inkoo', u"Inkoo"), ('inkoo', "Inkoo"),
('isojoki', u"Isojoki"), ('isojoki', "Isojoki"),
('isokyro', u"Isokyrö"), ('isokyro', "Isokyrö"),
('jalasjarvi', u"Jalasjärvi"), ('jalasjarvi', "Jalasjärvi"),
('janakkala', u"Janakkala"), ('janakkala', "Janakkala"),
('joensuu', u"Joensuu"), ('joensuu', "Joensuu"),
('jokioinen', u"Jokioinen"), ('jokioinen', "Jokioinen"),
('jomala', u"Jomala"), ('jomala', "Jomala"),
('joroinen', u"Joroinen"), ('joroinen', "Joroinen"),
('joutsa', u"Joutsa"), ('joutsa', "Joutsa"),
('juankoski', u"Juankoski"), ('juankoski', "Juankoski"),
('juuka', u"Juuka"), ('juuka', "Juuka"),
('juupajoki', u"Juupajoki"), ('juupajoki', "Juupajoki"),
('juva', u"Juva"), ('juva', "Juva"),
('jyvaskyla', u"Jyväskylä"), ('jyvaskyla', "Jyväskylä"),
('jamijarvi', u"Jämijärvi"), ('jamijarvi', "Jämijärvi"),
('jamsa', u"Jämsä"), ('jamsa', "Jämsä"),
('jarvenpaa', u"Järvenpää"), ('jarvenpaa', "Järvenpää"),
('kaarina', u"Kaarina"), ('kaarina', "Kaarina"),
('kaavi', u"Kaavi"), ('kaavi', "Kaavi"),
('kajaani', u"Kajaani"), ('kajaani', "Kajaani"),
('kalajoki', u"Kalajoki"), ('kalajoki', "Kalajoki"),
('kangasala', u"Kangasala"), ('kangasala', "Kangasala"),
('kangasniemi', u"Kangasniemi"), ('kangasniemi', "Kangasniemi"),
('kankaanpaa', u"Kankaanpää"), ('kankaanpaa', "Kankaanpää"),
('kannonkoski', u"Kannonkoski"), ('kannonkoski', "Kannonkoski"),
('kannus', u"Kannus"), ('kannus', "Kannus"),
('karijoki', u"Karijoki"), ('karijoki', "Karijoki"),
('karjalohja', u"Karjalohja"), ('karjalohja', "Karjalohja"),
('karkkila', u"Karkkila"), ('karkkila', "Karkkila"),
('karstula', u"Karstula"), ('karstula', "Karstula"),
('karttula', u"Karttula"), ('karttula', "Karttula"),
('karvia', u"Karvia"), ('karvia', "Karvia"),
('kaskinen', u"Kaskinen"), ('kaskinen', "Kaskinen"),
('kauhajoki', u"Kauhajoki"), ('kauhajoki', "Kauhajoki"),
('kauhava', u"Kauhava"), ('kauhava', "Kauhava"),
('kauniainen', u"Kauniainen"), ('kauniainen', "Kauniainen"),
('kaustinen', u"Kaustinen"), ('kaustinen', "Kaustinen"),
('keitele', u"Keitele"), ('keitele', "Keitele"),
('kemi', u"Kemi"), ('kemi', "Kemi"),
('kemijarvi', u"Kemijärvi"), ('kemijarvi', "Kemijärvi"),
('keminmaa', u"Keminmaa"), ('keminmaa', "Keminmaa"),
('kemionsaari', u"Kemiönsaari"), ('kemionsaari', "Kemiönsaari"),
('kempele', u"Kempele"), ('kempele', "Kempele"),
('kerava', u"Kerava"), ('kerava', "Kerava"),
('kerimaki', u"Kerimäki"), ('kerimaki', "Kerimäki"),
('kesalahti', u"Kesälahti"), ('kesalahti', "Kesälahti"),
('keuruu', u"Keuruu"), ('keuruu', "Keuruu"),
('kihnio', u"Kihniö"), ('kihnio', "Kihniö"),
('kiikoinen', u"Kiikoinen"), ('kiikoinen', "Kiikoinen"),
('kiiminki', u"Kiiminki"), ('kiiminki', "Kiiminki"),
('kinnula', u"Kinnula"), ('kinnula', "Kinnula"),
('kirkkonummi', u"Kirkkonummi"), ('kirkkonummi', "Kirkkonummi"),
('kitee', u"Kitee"), ('kitee', "Kitee"),
('kittila', u"Kittilä"), ('kittila', "Kittilä"),
('kiuruvesi', u"Kiuruvesi"), ('kiuruvesi', "Kiuruvesi"),
('kivijarvi', u"Kivijärvi"), ('kivijarvi', "Kivijärvi"),
('kokemaki', u"Kokemäki"), ('kokemaki', "Kokemäki"),
('kokkola', u"Kokkola"), ('kokkola', "Kokkola"),
('kolari', u"Kolari"), ('kolari', "Kolari"),
('konnevesi', u"Konnevesi"), ('konnevesi', "Konnevesi"),
('kontiolahti', u"Kontiolahti"), ('kontiolahti', "Kontiolahti"),
('korsnas', u"Korsnäs"), ('korsnas', "Korsnäs"),
('koskitl', u"Koski Tl"), ('koskitl', "Koski Tl"),
('kotka', u"Kotka"), ('kotka', "Kotka"),
('kouvola', u"Kouvola"), ('kouvola', "Kouvola"),
('kristiinankaupunki', u"Kristiinankaupunki"), ('kristiinankaupunki', "Kristiinankaupunki"),
('kruunupyy', u"Kruunupyy"), ('kruunupyy', "Kruunupyy"),
('kuhmalahti', u"Kuhmalahti"), ('kuhmalahti', "Kuhmalahti"),
('kuhmo', u"Kuhmo"), ('kuhmo', "Kuhmo"),
('kuhmoinen', u"Kuhmoinen"), ('kuhmoinen', "Kuhmoinen"),
('kumlinge', u"Kumlinge"), ('kumlinge', "Kumlinge"),
('kuopio', u"Kuopio"), ('kuopio', "Kuopio"),
('kuortane', u"Kuortane"), ('kuortane', "Kuortane"),
('kurikka', u"Kurikka"), ('kurikka', "Kurikka"),
('kustavi', u"Kustavi"), ('kustavi', "Kustavi"),
('kuusamo', u"Kuusamo"), ('kuusamo', "Kuusamo"),
('kylmakoski', u"Kylmäkoski"), ('kylmakoski', "Kylmäkoski"),
('kyyjarvi', u"Kyyjärvi"), ('kyyjarvi', "Kyyjärvi"),
('karkola', u"Kärkölä"), ('karkola', "Kärkölä"),
('karsamaki', u"Kärsämäki"), ('karsamaki', "Kärsämäki"),
('kokar', u"Kökar"), ('kokar', "Kökar"),
('koylio', u"Köyliö"), ('koylio', "Köyliö"),
('lahti', u"Lahti"), ('lahti', "Lahti"),
('laihia', u"Laihia"), ('laihia', "Laihia"),
('laitila', u"Laitila"), ('laitila', "Laitila"),
('lapinjarvi', u"Lapinjärvi"), ('lapinjarvi', "Lapinjärvi"),
('lapinlahti', u"Lapinlahti"), ('lapinlahti', "Lapinlahti"),
('lappajarvi', u"Lappajärvi"), ('lappajarvi', "Lappajärvi"),
('lappeenranta', u"Lappeenranta"), ('lappeenranta', "Lappeenranta"),
('lapua', u"Lapua"), ('lapua', "Lapua"),
('laukaa', u"Laukaa"), ('laukaa', "Laukaa"),
('lavia', u"Lavia"), ('lavia', "Lavia"),
('lemi', u"Lemi"), ('lemi', "Lemi"),
('lemland', u"Lemland"), ('lemland', "Lemland"),
('lempaala', u"Lempäälä"), ('lempaala', "Lempäälä"),
('leppavirta', u"Leppävirta"), ('leppavirta', "Leppävirta"),
('lestijarvi', u"Lestijärvi"), ('lestijarvi', "Lestijärvi"),
('lieksa', u"Lieksa"), ('lieksa', "Lieksa"),
('lieto', u"Lieto"), ('lieto', "Lieto"),
('liminka', u"Liminka"), ('liminka', "Liminka"),
('liperi', u"Liperi"), ('liperi', "Liperi"),
('lohja', u"Lohja"), ('lohja', "Lohja"),
('loimaa', u"Loimaa"), ('loimaa', "Loimaa"),
('loppi', u"Loppi"), ('loppi', "Loppi"),
('loviisa', u"Loviisa"), ('loviisa', "Loviisa"),
('luhanka', u"Luhanka"), ('luhanka', "Luhanka"),
('lumijoki', u"Lumijoki"), ('lumijoki', "Lumijoki"),
('lumparland', u"Lumparland"), ('lumparland', "Lumparland"),
('luoto', u"Luoto"), ('luoto', "Luoto"),
('luumaki', u"Luumäki"), ('luumaki', "Luumäki"),
('luvia', u"Luvia"), ('luvia', "Luvia"),
('lansi-turunmaa', u"Länsi-Turunmaa"), ('lansi-turunmaa', "Länsi-Turunmaa"),
('maalahti', u"Maalahti"), ('maalahti', "Maalahti"),
('maaninka', u"Maaninka"), ('maaninka', "Maaninka"),
('maarianhamina', u"Maarianhamina"), ('maarianhamina', "Maarianhamina"),
('marttila', u"Marttila"), ('marttila', "Marttila"),
('masku', u"Masku"), ('masku', "Masku"),
('merijarvi', u"Merijärvi"), ('merijarvi', "Merijärvi"),
('merikarvia', u"Merikarvia"), ('merikarvia', "Merikarvia"),
('miehikkala', u"Miehikkälä"), ('miehikkala', "Miehikkälä"),
('mikkeli', u"Mikkeli"), ('mikkeli', "Mikkeli"),
('muhos', u"Muhos"), ('muhos', "Muhos"),
('multia', u"Multia"), ('multia', "Multia"),
('muonio', u"Muonio"), ('muonio', "Muonio"),
('mustasaari', u"Mustasaari"), ('mustasaari', "Mustasaari"),
('muurame', u"Muurame"), ('muurame', "Muurame"),
('mynamaki', u"Mynämäki"), ('mynamaki', "Mynämäki"),
('myrskyla', u"Myrskylä"), ('myrskyla', "Myrskylä"),
('mantsala', u"Mäntsälä"), ('mantsala', "Mäntsälä"),
('mantta-vilppula', u"Mänttä-Vilppula"), ('mantta-vilppula', "Mänttä-Vilppula"),
('mantyharju', u"Mäntyharju"), ('mantyharju', "Mäntyharju"),
('naantali', u"Naantali"), ('naantali', "Naantali"),
('nakkila', u"Nakkila"), ('nakkila', "Nakkila"),
('nastola', u"Nastola"), ('nastola', "Nastola"),
('nilsia', u"Nilsiä"), ('nilsia', "Nilsiä"),
('nivala', u"Nivala"), ('nivala', "Nivala"),
('nokia', u"Nokia"), ('nokia', "Nokia"),
('nousiainen', u"Nousiainen"), ('nousiainen', "Nousiainen"),
('nummi-pusula', u"Nummi-Pusula"), ('nummi-pusula', "Nummi-Pusula"),
('nurmes', u"Nurmes"), ('nurmes', "Nurmes"),
('nurmijarvi', u"Nurmijärvi"), ('nurmijarvi', "Nurmijärvi"),
('narpio', u"Närpiö"), ('narpio', "Närpiö"),
('oravainen', u"Oravainen"), ('oravainen', "Oravainen"),
('orimattila', u"Orimattila"), ('orimattila', "Orimattila"),
('oripaa', u"Oripää"), ('oripaa', "Oripää"),
('orivesi', u"Orivesi"), ('orivesi', "Orivesi"),
('oulainen', u"Oulainen"), ('oulainen', "Oulainen"),
('oulu', u"Oulu"), ('oulu', "Oulu"),
('oulunsalo', u"Oulunsalo"), ('oulunsalo', "Oulunsalo"),
('outokumpu', u"Outokumpu"), ('outokumpu', "Outokumpu"),
('padasjoki', u"Padasjoki"), ('padasjoki', "Padasjoki"),
('paimio', u"Paimio"), ('paimio', "Paimio"),
('paltamo', u"Paltamo"), ('paltamo', "Paltamo"),
('parikkala', u"Parikkala"), ('parikkala', "Parikkala"),
('parkano', u"Parkano"), ('parkano', "Parkano"),
('pedersore', u"Pedersöre"), ('pedersore', "Pedersöre"),
('pelkosenniemi', u"Pelkosenniemi"), ('pelkosenniemi', "Pelkosenniemi"),
('pello', u"Pello"), ('pello', "Pello"),
('perho', u"Perho"), ('perho', "Perho"),
('pertunmaa', u"Pertunmaa"), ('pertunmaa', "Pertunmaa"),
('petajavesi', u"Petäjävesi"), ('petajavesi', "Petäjävesi"),
('pieksamaki', u"Pieksämäki"), ('pieksamaki', "Pieksämäki"),
('pielavesi', u"Pielavesi"), ('pielavesi', "Pielavesi"),
('pietarsaari', u"Pietarsaari"), ('pietarsaari', "Pietarsaari"),
('pihtipudas', u"Pihtipudas"), ('pihtipudas', "Pihtipudas"),
('pirkkala', u"Pirkkala"), ('pirkkala', "Pirkkala"),
('polvijarvi', u"Polvijärvi"), ('polvijarvi', "Polvijärvi"),
('pomarkku', u"Pomarkku"), ('pomarkku', "Pomarkku"),
('pori', u"Pori"), ('pori', "Pori"),
('pornainen', u"Pornainen"), ('pornainen', "Pornainen"),
('porvoo', u"Porvoo"), ('porvoo', "Porvoo"),
('posio', u"Posio"), ('posio', "Posio"),
('pudasjarvi', u"Pudasjärvi"), ('pudasjarvi', "Pudasjärvi"),
('pukkila', u"Pukkila"), ('pukkila', "Pukkila"),
('punkaharju', u"Punkaharju"), ('punkaharju', "Punkaharju"),
('punkalaidun', u"Punkalaidun"), ('punkalaidun', "Punkalaidun"),
('puolanka', u"Puolanka"), ('puolanka', "Puolanka"),
('puumala', u"Puumala"), ('puumala', "Puumala"),
('pyhtaa', u"Pyhtää"), ('pyhtaa', "Pyhtää"),
('pyhajoki', u"Pyhäjoki"), ('pyhajoki', "Pyhäjoki"),
('pyhajarvi', u"Pyhäjärvi"), ('pyhajarvi', "Pyhäjärvi"),
('pyhanta', u"Pyhäntä"), ('pyhanta', "Pyhäntä"),
('pyharanta', u"Pyhäranta"), ('pyharanta', "Pyhäranta"),
('palkane', u"Pälkäne"), ('palkane', "Pälkäne"),
('poytya', u"Pöytyä"), ('poytya', "Pöytyä"),
('raahe', u"Raahe"), ('raahe', "Raahe"),
('raasepori', u"Raasepori"), ('raasepori', "Raasepori"),
('raisio', u"Raisio"), ('raisio', "Raisio"),
('rantasalmi', u"Rantasalmi"), ('rantasalmi', "Rantasalmi"),
('ranua', u"Ranua"), ('ranua', "Ranua"),
('rauma', u"Rauma"), ('rauma', "Rauma"),
('rautalampi', u"Rautalampi"), ('rautalampi', "Rautalampi"),
('rautavaara', u"Rautavaara"), ('rautavaara', "Rautavaara"),
('rautjarvi', u"Rautjärvi"), ('rautjarvi', "Rautjärvi"),
('reisjarvi', u"Reisjärvi"), ('reisjarvi', "Reisjärvi"),
('riihimaki', u"Riihimäki"), ('riihimaki', "Riihimäki"),
('ristiina', u"Ristiina"), ('ristiina', "Ristiina"),
('ristijarvi', u"Ristijärvi"), ('ristijarvi', "Ristijärvi"),
('rovaniemi', u"Rovaniemi"), ('rovaniemi', "Rovaniemi"),
('ruokolahti', u"Ruokolahti"), ('ruokolahti', "Ruokolahti"),
('ruovesi', u"Ruovesi"), ('ruovesi', "Ruovesi"),
('rusko', u"Rusko"), ('rusko', "Rusko"),
('raakkyla', u"Rääkkylä"), ('raakkyla', "Rääkkylä"),
('saarijarvi', u"Saarijärvi"), ('saarijarvi', "Saarijärvi"),
('salla', u"Salla"), ('salla', "Salla"),
('salo', u"Salo"), ('salo', "Salo"),
('saltvik', u"Saltvik"), ('saltvik', "Saltvik"),
('sastamala', u"Sastamala"), ('sastamala', "Sastamala"),
('sauvo', u"Sauvo"), ('sauvo', "Sauvo"),
('savitaipale', u"Savitaipale"), ('savitaipale', "Savitaipale"),
('savonlinna', u"Savonlinna"), ('savonlinna', "Savonlinna"),
('savukoski', u"Savukoski"), ('savukoski', "Savukoski"),
('seinajoki', u"Seinäjoki"), ('seinajoki', "Seinäjoki"),
('sievi', u"Sievi"), ('sievi', "Sievi"),
('siikainen', u"Siikainen"), ('siikainen', "Siikainen"),
('siikajoki', u"Siikajoki"), ('siikajoki', "Siikajoki"),
('siikalatva', u"Siikalatva"), ('siikalatva', "Siikalatva"),
('siilinjarvi', u"Siilinjärvi"), ('siilinjarvi', "Siilinjärvi"),
('simo', u"Simo"), ('simo', "Simo"),
('sipoo', u"Sipoo"), ('sipoo', "Sipoo"),
('siuntio', u"Siuntio"), ('siuntio', "Siuntio"),
('sodankyla', u"Sodankylä"), ('sodankyla', "Sodankylä"),
('soini', u"Soini"), ('soini', "Soini"),
('somero', u"Somero"), ('somero', "Somero"),
('sonkajarvi', u"Sonkajärvi"), ('sonkajarvi', "Sonkajärvi"),
('sotkamo', u"Sotkamo"), ('sotkamo', "Sotkamo"),
('sottunga', u"Sottunga"), ('sottunga', "Sottunga"),
('sulkava', u"Sulkava"), ('sulkava', "Sulkava"),
('sund', u"Sund"), ('sund', "Sund"),
('suomenniemi', u"Suomenniemi"), ('suomenniemi', "Suomenniemi"),
('suomussalmi', u"Suomussalmi"), ('suomussalmi', "Suomussalmi"),
('suonenjoki', u"Suonenjoki"), ('suonenjoki', "Suonenjoki"),
('sysma', u"Sysmä"), ('sysma', "Sysmä"),
('sakyla', u"Säkylä"), ('sakyla', "Säkylä"),
('taipalsaari', u"Taipalsaari"), ('taipalsaari', "Taipalsaari"),
('taivalkoski', u"Taivalkoski"), ('taivalkoski', "Taivalkoski"),
('taivassalo', u"Taivassalo"), ('taivassalo', "Taivassalo"),
('tammela', u"Tammela"), ('tammela', "Tammela"),
('tampere', u"Tampere"), ('tampere', "Tampere"),
('tarvasjoki', u"Tarvasjoki"), ('tarvasjoki', "Tarvasjoki"),
('tervo', u"Tervo"), ('tervo', "Tervo"),
('tervola', u"Tervola"), ('tervola', "Tervola"),
('teuva', u"Teuva"), ('teuva', "Teuva"),
('tohmajarvi', u"Tohmajärvi"), ('tohmajarvi', "Tohmajärvi"),
('toholampi', u"Toholampi"), ('toholampi', "Toholampi"),
('toivakka', u"Toivakka"), ('toivakka', "Toivakka"),
('tornio', u"Tornio"), ('tornio', "Tornio"),
('turku', u"Turku"), ('turku', "Turku"),
('tuusniemi', u"Tuusniemi"), ('tuusniemi', "Tuusniemi"),
('tuusula', u"Tuusula"), ('tuusula', "Tuusula"),
('tyrnava', u"Tyrnävä"), ('tyrnava', "Tyrnävä"),
('toysa', u"Töysä"), ('toysa', "Töysä"),
('ulvila', u"Ulvila"), ('ulvila', "Ulvila"),
('urjala', u"Urjala"), ('urjala', "Urjala"),
('utajarvi', u"Utajärvi"), ('utajarvi', "Utajärvi"),
('utsjoki', u"Utsjoki"), ('utsjoki', "Utsjoki"),
('uurainen', u"Uurainen"), ('uurainen', "Uurainen"),
('uusikaarlepyy', u"Uusikaarlepyy"), ('uusikaarlepyy', "Uusikaarlepyy"),
('uusikaupunki', u"Uusikaupunki"), ('uusikaupunki', "Uusikaupunki"),
('vaala', u"Vaala"), ('vaala', "Vaala"),
('vaasa', u"Vaasa"), ('vaasa', "Vaasa"),
('valkeakoski', u"Valkeakoski"), ('valkeakoski', "Valkeakoski"),
('valtimo', u"Valtimo"), ('valtimo', "Valtimo"),
('vantaa', u"Vantaa"), ('vantaa', "Vantaa"),
('varkaus', u"Varkaus"), ('varkaus', "Varkaus"),
('varpaisjarvi', u"Varpaisjärvi"), ('varpaisjarvi', "Varpaisjärvi"),
('vehmaa', u"Vehmaa"), ('vehmaa', "Vehmaa"),
('vesanto', u"Vesanto"), ('vesanto', "Vesanto"),
('vesilahti', u"Vesilahti"), ('vesilahti', "Vesilahti"),
('veteli', u"Veteli"), ('veteli', "Veteli"),
('vierema', u"Vieremä"), ('vierema', "Vieremä"),
('vihanti', u"Vihanti"), ('vihanti', "Vihanti"),
('vihti', u"Vihti"), ('vihti', "Vihti"),
('viitasaari', u"Viitasaari"), ('viitasaari', "Viitasaari"),
('vimpeli', u"Vimpeli"), ('vimpeli', "Vimpeli"),
('virolahti', u"Virolahti"), ('virolahti', "Virolahti"),
('virrat', u"Virrat"), ('virrat', "Virrat"),
('vardo', u"Vårdö"), ('vardo', "Vårdö"),
('vahakyro', u"Vähäkyrö"), ('vahakyro', "Vähäkyrö"),
('voyri-maksamaa', u"Vöyri-Maksamaa"), ('voyri-maksamaa', "Vöyri-Maksamaa"),
('yli-ii', u"Yli-Ii"), ('yli-ii', "Yli-Ii"),
('ylitornio', u"Ylitornio"), ('ylitornio', "Ylitornio"),
('ylivieska', u"Ylivieska"), ('ylivieska', "Ylivieska"),
('ylojarvi', u"Ylöjärvi"), ('ylojarvi', "Ylöjärvi"),
('ypaja', u"Ypäjä"), ('ypaja', "Ypäjä"),
('ahtari', u"Ähtäri"), ('ahtari', "Ähtäri"),
('aanekoski', u"Äänekoski") ('aanekoski', "Äänekoski")
) )

View File

@ -2,7 +2,7 @@
FI-specific Form helpers FI-specific Form helpers
""" """
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
import re import re
@ -36,7 +36,7 @@ class FISocialSecurityNumber(Field):
def clean(self, value): def clean(self, value):
super(FISocialSecurityNumber, self).clean(value) super(FISocialSecurityNumber, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
checkmarks = "0123456789ABCDEFHJKLMNPRSTUVWXY" checkmarks = "0123456789ABCDEFHJKLMNPRSTUVWXY"
result = re.match(r"""^ result = re.match(r"""^
@ -51,5 +51,5 @@ class FISocialSecurityNumber(Field):
gd = result.groupdict() gd = result.groupdict()
checksum = int(gd['date'] + gd['serial']) checksum = int(gd['date'] + gd['serial'])
if checkmarks[checksum % len(checkmarks)] == gd['checksum'].upper(): if checkmarks[checksum % len(checkmarks)] == gd['checksum'].upper():
return u'%s' % value.upper() return '%s' % value.upper()
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])

View File

@ -1,7 +1,7 @@
""" """
FR-specific Form helpers FR-specific Form helpers
""" """
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
import re import re
@ -38,11 +38,11 @@ class FRPhoneNumberField(Field):
def clean(self, value): def clean(self, value):
super(FRPhoneNumberField, self).clean(value) super(FRPhoneNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
value = re.sub('(\.|\s)', '', smart_unicode(value)) value = re.sub('(\.|\s)', '', smart_unicode(value))
m = phone_digits_re.search(value) m = phone_digits_re.search(value)
if m: if m:
return u'%s %s %s %s %s' % (value[0:2], value[2:4], value[4:6], value[6:8], value[8:10]) return '%s %s %s %s %s' % (value[0:2], value[2:4], value[4:6], value[6:8], value[8:10])
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])
class FRDepartmentSelect(Select): class FRDepartmentSelect(Select):

View File

@ -1,117 +1,118 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# See the "Code officiel géographique" on the INSEE website <www.insee.fr>. # See the "Code officiel géographique" on the INSEE website <www.insee.fr>.
from __future__ import unicode_literals
DEPARTMENT_CHOICES = ( DEPARTMENT_CHOICES = (
# Metropolitan departments # Metropolitan departments
('01', u'01 - Ain'), ('01', '01 - Ain'),
('02', u'02 - Aisne'), ('02', '02 - Aisne'),
('03', u'03 - Allier'), ('03', '03 - Allier'),
('04', u'04 - Alpes-de-Haute-Provence'), ('04', '04 - Alpes-de-Haute-Provence'),
('05', u'05 - Hautes-Alpes'), ('05', '05 - Hautes-Alpes'),
('06', u'06 - Alpes-Maritimes'), ('06', '06 - Alpes-Maritimes'),
('07', u'07 - Ardèche'), ('07', '07 - Ardèche'),
('08', u'08 - Ardennes'), ('08', '08 - Ardennes'),
('09', u'09 - Ariège'), ('09', '09 - Ariège'),
('10', u'10 - Aube'), ('10', '10 - Aube'),
('11', u'11 - Aude'), ('11', '11 - Aude'),
('12', u'12 - Aveyron'), ('12', '12 - Aveyron'),
('13', u'13 - Bouches-du-Rhône'), ('13', '13 - Bouches-du-Rhône'),
('14', u'14 - Calvados'), ('14', '14 - Calvados'),
('15', u'15 - Cantal'), ('15', '15 - Cantal'),
('16', u'16 - Charente'), ('16', '16 - Charente'),
('17', u'17 - Charente-Maritime'), ('17', '17 - Charente-Maritime'),
('18', u'18 - Cher'), ('18', '18 - Cher'),
('19', u'19 - Corrèze'), ('19', '19 - Corrèze'),
('2A', u'2A - Corse-du-Sud'), ('2A', '2A - Corse-du-Sud'),
('2B', u'2B - Haute-Corse'), ('2B', '2B - Haute-Corse'),
('21', u'21 - Côte-d\'Or'), ('21', '21 - Côte-d\'Or'),
('22', u'22 - Côtes-d\'Armor'), ('22', '22 - Côtes-d\'Armor'),
('23', u'23 - Creuse'), ('23', '23 - Creuse'),
('24', u'24 - Dordogne'), ('24', '24 - Dordogne'),
('25', u'25 - Doubs'), ('25', '25 - Doubs'),
('26', u'26 - Drôme'), ('26', '26 - Drôme'),
('27', u'27 - Eure'), ('27', '27 - Eure'),
('28', u'28 - Eure-et-Loir'), ('28', '28 - Eure-et-Loir'),
('29', u'29 - Finistère'), ('29', '29 - Finistère'),
('30', u'30 - Gard'), ('30', '30 - Gard'),
('31', u'31 - Haute-Garonne'), ('31', '31 - Haute-Garonne'),
('32', u'32 - Gers'), ('32', '32 - Gers'),
('33', u'33 - Gironde'), ('33', '33 - Gironde'),
('34', u'34 - Hérault'), ('34', '34 - Hérault'),
('35', u'35 - Ille-et-Vilaine'), ('35', '35 - Ille-et-Vilaine'),
('36', u'36 - Indre'), ('36', '36 - Indre'),
('37', u'37 - Indre-et-Loire'), ('37', '37 - Indre-et-Loire'),
('38', u'38 - Isère'), ('38', '38 - Isère'),
('39', u'39 - Jura'), ('39', '39 - Jura'),
('40', u'40 - Landes'), ('40', '40 - Landes'),
('41', u'41 - Loir-et-Cher'), ('41', '41 - Loir-et-Cher'),
('42', u'42 - Loire'), ('42', '42 - Loire'),
('43', u'43 - Haute-Loire'), ('43', '43 - Haute-Loire'),
('44', u'44 - Loire-Atlantique'), ('44', '44 - Loire-Atlantique'),
('45', u'45 - Loiret'), ('45', '45 - Loiret'),
('46', u'46 - Lot'), ('46', '46 - Lot'),
('47', u'47 - Lot-et-Garonne'), ('47', '47 - Lot-et-Garonne'),
('48', u'48 - Lozère'), ('48', '48 - Lozère'),
('49', u'49 - Maine-et-Loire'), ('49', '49 - Maine-et-Loire'),
('50', u'50 - Manche'), ('50', '50 - Manche'),
('51', u'51 - Marne'), ('51', '51 - Marne'),
('52', u'52 - Haute-Marne'), ('52', '52 - Haute-Marne'),
('53', u'53 - Mayenne'), ('53', '53 - Mayenne'),
('54', u'54 - Meurthe-et-Moselle'), ('54', '54 - Meurthe-et-Moselle'),
('55', u'55 - Meuse'), ('55', '55 - Meuse'),
('56', u'56 - Morbihan'), ('56', '56 - Morbihan'),
('57', u'57 - Moselle'), ('57', '57 - Moselle'),
('58', u'58 - Nièvre'), ('58', '58 - Nièvre'),
('59', u'59 - Nord'), ('59', '59 - Nord'),
('60', u'60 - Oise'), ('60', '60 - Oise'),
('61', u'61 - Orne'), ('61', '61 - Orne'),
('62', u'62 - Pas-de-Calais'), ('62', '62 - Pas-de-Calais'),
('63', u'63 - Puy-de-Dôme'), ('63', '63 - Puy-de-Dôme'),
('64', u'64 - Pyrénées-Atlantiques'), ('64', '64 - Pyrénées-Atlantiques'),
('65', u'65 - Hautes-Pyrénées'), ('65', '65 - Hautes-Pyrénées'),
('66', u'66 - Pyrénées-Orientales'), ('66', '66 - Pyrénées-Orientales'),
('67', u'67 - Bas-Rhin'), ('67', '67 - Bas-Rhin'),
('68', u'68 - Haut-Rhin'), ('68', '68 - Haut-Rhin'),
('69', u'69 - Rhône'), ('69', '69 - Rhône'),
('70', u'70 - Haute-Saône'), ('70', '70 - Haute-Saône'),
('71', u'71 - Saône-et-Loire'), ('71', '71 - Saône-et-Loire'),
('72', u'72 - Sarthe'), ('72', '72 - Sarthe'),
('73', u'73 - Savoie'), ('73', '73 - Savoie'),
('74', u'74 - Haute-Savoie'), ('74', '74 - Haute-Savoie'),
('75', u'75 - Paris'), ('75', '75 - Paris'),
('76', u'76 - Seine-Maritime'), ('76', '76 - Seine-Maritime'),
('77', u'77 - Seine-et-Marne'), ('77', '77 - Seine-et-Marne'),
('78', u'78 - Yvelines'), ('78', '78 - Yvelines'),
('79', u'79 - Deux-Sèvres'), ('79', '79 - Deux-Sèvres'),
('80', u'80 - Somme'), ('80', '80 - Somme'),
('81', u'81 - Tarn'), ('81', '81 - Tarn'),
('82', u'82 - Tarn-et-Garonne'), ('82', '82 - Tarn-et-Garonne'),
('83', u'83 - Var'), ('83', '83 - Var'),
('84', u'84 - Vaucluse'), ('84', '84 - Vaucluse'),
('85', u'85 - Vendée'), ('85', '85 - Vendée'),
('86', u'86 - Vienne'), ('86', '86 - Vienne'),
('87', u'87 - Haute-Vienne'), ('87', '87 - Haute-Vienne'),
('88', u'88 - Vosges'), ('88', '88 - Vosges'),
('89', u'89 - Yonne'), ('89', '89 - Yonne'),
('90', u'90 - Territoire de Belfort'), ('90', '90 - Territoire de Belfort'),
('91', u'91 - Essonne'), ('91', '91 - Essonne'),
('92', u'92 - Hauts-de-Seine'), ('92', '92 - Hauts-de-Seine'),
('93', u'93 - Seine-Saint-Denis'), ('93', '93 - Seine-Saint-Denis'),
('94', u'94 - Val-de-Marne'), ('94', '94 - Val-de-Marne'),
('95', u'95 - Val-d\'Oise'), ('95', '95 - Val-d\'Oise'),
# Overseas departments, communities, and other territories # Overseas departments, communities, and other territories
('971', u'971 - Guadeloupe'), ('971', '971 - Guadeloupe'),
('972', u'972 - Martinique'), ('972', '972 - Martinique'),
('973', u'973 - Guyane'), ('973', '973 - Guyane'),
('974', u'974 - La Réunion'), ('974', '974 - La Réunion'),
('975', u'975 - Saint-Pierre-et-Miquelon'), ('975', '975 - Saint-Pierre-et-Miquelon'),
('976', u'976 - Mayotte'), ('976', '976 - Mayotte'),
('977', u'977 - Saint-Barthélemy'), ('977', '977 - Saint-Barthélemy'),
('978', u'978 - Saint-Martin'), ('978', '978 - Saint-Martin'),
('984', u'984 - Terres australes et antarctiques françaises'), ('984', '984 - Terres australes et antarctiques françaises'),
('986', u'986 - Wallis et Futuna'), ('986', '986 - Wallis et Futuna'),
('987', u'987 - Polynésie française'), ('987', '987 - Polynésie française'),
('988', u'988 - Nouvelle-Calédonie'), ('988', '988 - Nouvelle-Calédonie'),
('989', u'989 - Île de Clipperton'), ('989', '989 - Île de Clipperton'),
) )

View File

@ -2,7 +2,7 @@
GB-specific Form helpers GB-specific Form helpers
""" """
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
import re import re
@ -22,7 +22,7 @@ class GBPostcodeField(CharField):
The value is uppercased and a space added in the correct place, if required. The value is uppercased and a space added in the correct place, if required.
""" """
default_error_messages = { default_error_messages = {
'invalid': _(u'Enter a valid postcode.'), 'invalid': _('Enter a valid postcode.'),
} }
outcode_pattern = '[A-PR-UWYZ]([0-9]{1,2}|([A-HIK-Y][0-9](|[0-9]|[ABEHMNPRVWXY]))|[0-9][A-HJKSTUW])' outcode_pattern = '[A-PR-UWYZ]([0-9]{1,2}|([A-HIK-Y][0-9](|[0-9]|[ABEHMNPRVWXY]))|[0-9][A-HJKSTUW])'
incode_pattern = '[0-9][ABD-HJLNP-UW-Z]{2}' incode_pattern = '[0-9][ABD-HJLNP-UW-Z]{2}'
@ -31,7 +31,7 @@ class GBPostcodeField(CharField):
def clean(self, value): def clean(self, value):
value = super(GBPostcodeField, self).clean(value) value = super(GBPostcodeField, self).clean(value)
if value == u'': if value == '':
return value return value
postcode = value.upper().strip() postcode = value.upper().strip()
# Put a single space before the incode (second part). # Put a single space before the incode (second part).

View File

@ -1,7 +1,7 @@
""" """
Hong Kong specific Form helpers Hong Kong specific Form helpers
""" """
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
import re import re
@ -51,14 +51,14 @@ class HKPhoneNumberField(CharField):
super(HKPhoneNumberField, self).clean(value) super(HKPhoneNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
value = re.sub('(\(|\)|\s+|\+)', '', smart_unicode(value)) value = re.sub('(\(|\)|\s+|\+)', '', smart_unicode(value))
m = hk_phone_digits_re.search(value) m = hk_phone_digits_re.search(value)
if not m: if not m:
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])
value = u'%s-%s' % (m.group(1), m.group(2)) value = '%s-%s' % (m.group(1), m.group(2))
for special in hk_special_numbers: for special in hk_special_numbers:
if value.startswith(special): if value.startswith(special):
raise ValidationError(self.error_messages['disguise']) raise ValidationError(self.error_messages['disguise'])

View File

@ -2,7 +2,7 @@
""" """
HR-specific Form helpers HR-specific Form helpers
""" """
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
import re import re
@ -19,8 +19,8 @@ from django.utils.translation import ugettext_lazy as _
jmbg_re = re.compile(r'^(?P<dd>\d{2})(?P<mm>\d{2})(?P<yyy>\d{3})' + \ jmbg_re = re.compile(r'^(?P<dd>\d{2})(?P<mm>\d{2})(?P<yyy>\d{3})' + \
r'(?P<rr>\d{2})(?P<bbb>\d{3})(?P<k>\d{1})$') r'(?P<rr>\d{2})(?P<bbb>\d{3})(?P<k>\d{1})$')
oib_re = re.compile(r'^\d{11}$') oib_re = re.compile(r'^\d{11}$')
plate_re = re.compile(ur'^(?P<prefix>[A-ZČŠŽ]{2})' + \ plate_re = re.compile(r'^(?P<prefix>[A-ZČŠŽ]{2})' + \
ur'(?P<number>\d{3,4})(?P<suffix>[ABCDEFGHIJKLMNOPRSTUVZ]{1,2})$') r'(?P<number>\d{3,4})(?P<suffix>[ABCDEFGHIJKLMNOPRSTUVZ]{1,2})$')
postal_code_re = re.compile(r'^\d{5}$') postal_code_re = re.compile(r'^\d{5}$')
phone_re = re.compile(r'^(\+385|00385|0)(?P<prefix>\d{2})(?P<number>\d{6,7})$') phone_re = re.compile(r'^(\+385|00385|0)(?P<prefix>\d{2})(?P<number>\d{6,7})$')
jmbag_re = re.compile(r'^601983(?P<copy>\d{1})1(?P<jmbag>\d{10})(?P<k>\d{1})$') jmbag_re = re.compile(r'^601983(?P<copy>\d{1})1(?P<jmbag>\d{10})(?P<k>\d{1})$')
@ -79,7 +79,7 @@ class HRJMBGField(Field):
def clean(self, value): def clean(self, value):
super(HRJMBGField, self).clean(value) super(HRJMBGField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
value = value.strip() value = value.strip()
@ -110,7 +110,7 @@ class HRJMBGField(Field):
if not str(m) == k: if not str(m) == k:
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])
return u'%s' % (value, ) return '%s' % (value, )
class HROIBField(RegexField): class HROIBField(RegexField):
@ -130,7 +130,7 @@ class HROIBField(RegexField):
def clean(self, value): def clean(self, value):
super(HROIBField, self).clean(value) super(HROIBField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
return '%s' % (value, ) return '%s' % (value, )
@ -157,7 +157,7 @@ class HRLicensePlateField(Field):
def clean(self, value): def clean(self, value):
super(HRLicensePlateField, self).clean(value) super(HRLicensePlateField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
value = re.sub(r'[\s\-]+', '', smart_unicode(value.strip())).upper() value = re.sub(r'[\s\-]+', '', smart_unicode(value.strip())).upper()
@ -175,7 +175,7 @@ class HRLicensePlateField(Field):
if int(number) == 0: if int(number) == 0:
raise ValidationError(self.error_messages['number']) raise ValidationError(self.error_messages['number'])
return u'%s %s-%s' % (prefix,number,matches.group('suffix'), ) return '%s %s-%s' % (prefix,number,matches.group('suffix'), )
class HRPostalCodeField(Field): class HRPostalCodeField(Field):
@ -193,7 +193,7 @@ class HRPostalCodeField(Field):
def clean(self, value): def clean(self, value):
super(HRPostalCodeField, self).clean(value) super(HRPostalCodeField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
value = value.strip() value = value.strip()
if not postal_code_re.search(value): if not postal_code_re.search(value):
@ -223,7 +223,7 @@ class HRPhoneNumberField(Field):
def clean(self, value): def clean(self, value):
super(HRPhoneNumberField, self).clean(value) super(HRPhoneNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
value = re.sub(r'[\-\s\(\)]', '', smart_unicode(value)) value = re.sub(r'[\-\s\(\)]', '', smart_unicode(value))
@ -262,7 +262,7 @@ class HRJMBAGField(Field):
def clean(self, value): def clean(self, value):
super(HRJMBAGField, self).clean(value) super(HRJMBAGField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
value = re.sub(r'[\-\s]', '', value.strip()) value = re.sub(r'[\-\s]', '', value.strip())

View File

@ -6,30 +6,32 @@ Sources:
Croatia doesn't have official abbreviations for counties. Croatia doesn't have official abbreviations for counties.
The ones provided are in common use. The ones provided are in common use.
""" """
from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
HR_COUNTY_CHOICES = ( HR_COUNTY_CHOICES = (
('GZG', _('Grad Zagreb')), ('GZG', _('Grad Zagreb')),
(u'BBŽ', _(u'Bjelovarsko-bilogorska županija')), ('BBŽ', _('Bjelovarsko-bilogorska županija')),
(u'BPŽ', _(u'Brodsko-posavska županija')), ('BPŽ', _('Brodsko-posavska županija')),
(u'DNŽ', _(u'Dubrovačko-neretvanska županija')), ('DNŽ', _('Dubrovačko-neretvanska županija')),
(u'', _(u'Istarska županija')), ('', _('Istarska županija')),
(u'', _(u'Karlovačka županija')), ('', _('Karlovačka županija')),
(u'KKŽ', _(u'Koprivničko-križevačka županija')), ('KKŽ', _('Koprivničko-križevačka županija')),
(u'KZŽ', _(u'Krapinsko-zagorska županija')), ('KZŽ', _('Krapinsko-zagorska županija')),
(u'LSŽ', _(u'Ličko-senjska županija')), ('LSŽ', _('Ličko-senjska županija')),
(u'', _(u'Međimurska županija')), ('', _('Međimurska županija')),
(u'OBŽ', _(u'Osječko-baranjska županija')), ('OBŽ', _('Osječko-baranjska županija')),
(u'PSŽ', _(u'Požeško-slavonska županija')), ('PSŽ', _('Požeško-slavonska županija')),
(u'PGŽ', _(u'Primorsko-goranska županija')), ('PGŽ', _('Primorsko-goranska županija')),
(u'SMŽ', _(u'Sisačko-moslavačka županija')), ('SMŽ', _('Sisačko-moslavačka županija')),
(u'SDŽ', _(u'Splitsko-dalmatinska županija')), ('SDŽ', _('Splitsko-dalmatinska županija')),
(u'ŠKŽ', _(u'Šibensko-kninska županija')), ('ŠKŽ', _('Šibensko-kninska županija')),
(u'', _(u'Varaždinska županija')), ('', _('Varaždinska županija')),
(u'VPŽ', _(u'Virovitičko-podravska županija')), ('VPŽ', _('Virovitičko-podravska županija')),
(u'VSŽ', _(u'Vukovarsko-srijemska županija')), ('VSŽ', _('Vukovarsko-srijemska županija')),
(u'ZDŽ', _(u'Zadarska županija')), ('ZDŽ', _('Zadarska županija')),
(u'ZGŽ', _(u'Zagrebačka županija')), ('ZGŽ', _('Zagrebačka županija')),
) )
""" """
@ -42,7 +44,7 @@ Only common license plate prefixes are provided. Special cases and obsolete pref
HR_LICENSE_PLATE_PREFIX_CHOICES = ( HR_LICENSE_PLATE_PREFIX_CHOICES = (
('BJ', 'BJ'), ('BJ', 'BJ'),
('BM', 'BM'), ('BM', 'BM'),
(u'ČK', u'ČK'), ('ČK', 'ČK'),
('DA', 'DA'), ('DA', 'DA'),
('DE', 'DE'), ('DE', 'DE'),
('DJ', 'DJ'), ('DJ', 'DJ'),
@ -53,27 +55,27 @@ HR_LICENSE_PLATE_PREFIX_CHOICES = (
('KC', 'KC'), ('KC', 'KC'),
('KR', 'KR'), ('KR', 'KR'),
('KT', 'KT'), ('KT', 'KT'),
(u'', u''), ('', ''),
('MA', 'MA'), ('MA', 'MA'),
('NA', 'NA'), ('NA', 'NA'),
('NG', 'NG'), ('NG', 'NG'),
('OG', 'OG'), ('OG', 'OG'),
('OS', 'OS'), ('OS', 'OS'),
('PU', 'PU'), ('PU', 'PU'),
(u'', u''), ('', ''),
('RI', 'RI'), ('RI', 'RI'),
('SB', 'SB'), ('SB', 'SB'),
('SK', 'SK'), ('SK', 'SK'),
('SL', 'SL'), ('SL', 'SL'),
('ST', 'ST'), ('ST', 'ST'),
(u'ŠI', u'ŠI'), ('ŠI', 'ŠI'),
('VK', 'VK'), ('VK', 'VK'),
('VT', 'VT'), ('VT', 'VT'),
('VU', 'VU'), ('VU', 'VU'),
(u'', u''), ('', ''),
('ZD', 'ZD'), ('ZD', 'ZD'),
('ZG', 'ZG'), ('ZG', 'ZG'),
(u'ŽU', u'ŽU'), ('ŽU', 'ŽU'),
) )
""" """

View File

@ -2,7 +2,7 @@
ID-specific Form helpers ID-specific Form helpers
""" """
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
import re import re
import time import time
@ -34,7 +34,7 @@ class IDPostCodeField(Field):
def clean(self, value): def clean(self, value):
super(IDPostCodeField, self).clean(value) super(IDPostCodeField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
value = value.strip() value = value.strip()
if not postcode_re.search(value): if not postcode_re.search(value):
@ -47,7 +47,7 @@ class IDPostCodeField(Field):
if value[0] == '1' and value[4] != '0': if value[0] == '1' and value[4] != '0':
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])
return u'%s' % (value, ) return '%s' % (value, )
class IDProvinceSelect(Select): class IDProvinceSelect(Select):
@ -75,7 +75,7 @@ class IDPhoneNumberField(Field):
def clean(self, value): def clean(self, value):
super(IDPhoneNumberField, self).clean(value) super(IDPhoneNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
phone_number = re.sub(r'[\-\s\(\)]', '', smart_unicode(value)) phone_number = re.sub(r'[\-\s\(\)]', '', smart_unicode(value))
@ -117,7 +117,7 @@ class IDLicensePlateField(Field):
from django.contrib.localflavor.id.id_choices import LICENSE_PLATE_PREFIX_CHOICES from django.contrib.localflavor.id.id_choices import LICENSE_PLATE_PREFIX_CHOICES
super(IDLicensePlateField, self).clean(value) super(IDLicensePlateField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
plate_number = re.sub(r'\s+', ' ', plate_number = re.sub(r'\s+', ' ',
smart_unicode(value.strip())).upper() smart_unicode(value.strip())).upper()
@ -179,7 +179,7 @@ class IDNationalIdentityNumberField(Field):
def clean(self, value): def clean(self, value):
super(IDNationalIdentityNumberField, self).clean(value) super(IDNationalIdentityNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
value = re.sub(r'[\s.]', '', smart_unicode(value)) value = re.sub(r'[\s.]', '', smart_unicode(value))

View File

@ -1,6 +1,7 @@
""" """
Israeli-specific form helpers Israeli-specific form helpers
""" """
from __future__ import unicode_literals
import re import re
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
@ -28,7 +29,7 @@ class ILPostalCodeField(RegexField):
""" """
default_error_messages = { default_error_messages = {
'invalid': _(u'Enter a postal code in the format XXXXX'), 'invalid': _('Enter a postal code in the format XXXXX'),
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -47,14 +48,14 @@ class ILIDNumberField(Field):
""" """
default_error_messages = { default_error_messages = {
'invalid': _(u'Enter a valid ID number.'), 'invalid': _('Enter a valid ID number.'),
} }
def clean(self, value): def clean(self, value):
value = super(ILIDNumberField, self).clean(value) value = super(ILIDNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
match = id_number_re.match(value) match = id_number_re.match(value)
if not match: if not match:

View File

@ -2,7 +2,7 @@
India-specific Form helpers. India-specific Form helpers.
""" """
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
import re import re
@ -38,7 +38,7 @@ phone_digits_re = re.compile(r"""
class INZipCodeField(RegexField): class INZipCodeField(RegexField):
default_error_messages = { default_error_messages = {
'invalid': _(u'Enter a zip code in the format XXXXXX or XXX XXX.'), 'invalid': _('Enter a zip code in the format XXXXXX or XXX XXX.'),
} }
def __init__(self, max_length=None, min_length=None, *args, **kwargs): def __init__(self, max_length=None, min_length=None, *args, **kwargs):
@ -48,7 +48,7 @@ class INZipCodeField(RegexField):
def clean(self, value): def clean(self, value):
super(INZipCodeField, self).clean(value) super(INZipCodeField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
# Convert to "NNNNNN" if "NNN NNN" given # Convert to "NNNNNN" if "NNN NNN" given
value = re.sub(r'^(\d{3})\s(\d{3})$', r'\1\2', value) value = re.sub(r'^(\d{3})\s(\d{3})$', r'\1\2', value)
return value return value
@ -61,13 +61,13 @@ class INStateField(Field):
registration abbreviation for the given state or union territory registration abbreviation for the given state or union territory
""" """
default_error_messages = { default_error_messages = {
'invalid': _(u'Enter an Indian state or territory.'), 'invalid': _('Enter an Indian state or territory.'),
} }
def clean(self, value): def clean(self, value):
super(INStateField, self).clean(value) super(INStateField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
try: try:
value = value.strip().lower() value = value.strip().lower()
except AttributeError: except AttributeError:
@ -106,10 +106,10 @@ class INPhoneNumberField(CharField):
def clean(self, value): def clean(self, value):
super(INPhoneNumberField, self).clean(value) super(INPhoneNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
value = smart_unicode(value) value = smart_unicode(value)
m = phone_digits_re.match(value) m = phone_digits_re.match(value)
if m: if m:
return u'%s' % (value) return '%s' % (value)
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])

View File

@ -2,7 +2,7 @@
Iceland specific form helpers. Iceland specific form helpers.
""" """
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
from django.contrib.localflavor.is_.is_postalcodes import IS_POSTALCODES from django.contrib.localflavor.is_.is_postalcodes import IS_POSTALCODES
from django.core.validators import EMPTY_VALUES from django.core.validators import EMPTY_VALUES
@ -20,7 +20,7 @@ class ISIdNumberField(RegexField):
""" """
default_error_messages = { default_error_messages = {
'invalid': _('Enter a valid Icelandic identification number. The format is XXXXXX-XXXX.'), 'invalid': _('Enter a valid Icelandic identification number. The format is XXXXXX-XXXX.'),
'checksum': _(u'The Icelandic identification number is not valid.'), 'checksum': _('The Icelandic identification number is not valid.'),
} }
def __init__(self, max_length=11, min_length=10, *args, **kwargs): def __init__(self, max_length=11, min_length=10, *args, **kwargs):
@ -31,7 +31,7 @@ class ISIdNumberField(RegexField):
value = super(ISIdNumberField, self).clean(value) value = super(ISIdNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
value = self._canonify(value) value = self._canonify(value)
if self._validate(value): if self._validate(value):
@ -73,7 +73,7 @@ class ISPhoneNumberField(RegexField):
value = super(ISPhoneNumberField, self).clean(value) value = super(ISPhoneNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
return value.replace('-', '').replace(' ', '') return value.replace('-', '').replace(' ', '')

View File

@ -1,151 +1,152 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals
IS_POSTALCODES = ( IS_POSTALCODES = (
('101', u'101 Reykjavík'), ('101', '101 Reykjavík'),
('103', u'103 Reykjavík'), ('103', '103 Reykjavík'),
('104', u'104 Reykjavík'), ('104', '104 Reykjavík'),
('105', u'105 Reykjavík'), ('105', '105 Reykjavík'),
('107', u'107 Reykjavík'), ('107', '107 Reykjavík'),
('108', u'108 Reykjavík'), ('108', '108 Reykjavík'),
('109', u'109 Reykjavík'), ('109', '109 Reykjavík'),
('110', u'110 Reykjavík'), ('110', '110 Reykjavík'),
('111', u'111 Reykjavík'), ('111', '111 Reykjavík'),
('112', u'112 Reykjavík'), ('112', '112 Reykjavík'),
('113', u'113 Reykjavík'), ('113', '113 Reykjavík'),
('116', u'116 Kjalarnes'), ('116', '116 Kjalarnes'),
('121', u'121 Reykjavík'), ('121', '121 Reykjavík'),
('123', u'123 Reykjavík'), ('123', '123 Reykjavík'),
('124', u'124 Reykjavík'), ('124', '124 Reykjavík'),
('125', u'125 Reykjavík'), ('125', '125 Reykjavík'),
('127', u'127 Reykjavík'), ('127', '127 Reykjavík'),
('128', u'128 Reykjavík'), ('128', '128 Reykjavík'),
('129', u'129 Reykjavík'), ('129', '129 Reykjavík'),
('130', u'130 Reykjavík'), ('130', '130 Reykjavík'),
('132', u'132 Reykjavík'), ('132', '132 Reykjavík'),
('150', u'150 Reykjavík'), ('150', '150 Reykjavík'),
('155', u'155 Reykjavík'), ('155', '155 Reykjavík'),
('170', u'170 Seltjarnarnes'), ('170', '170 Seltjarnarnes'),
('172', u'172 Seltjarnarnes'), ('172', '172 Seltjarnarnes'),
('190', u'190 Vogar'), ('190', '190 Vogar'),
('200', u'200 Kópavogur'), ('200', '200 Kópavogur'),
('201', u'201 Kópavogur'), ('201', '201 Kópavogur'),
('202', u'202 Kópavogur'), ('202', '202 Kópavogur'),
('203', u'203 Kópavogur'), ('203', '203 Kópavogur'),
('210', u'210 Garðabær'), ('210', '210 Garðabær'),
('212', u'212 Garðabær'), ('212', '212 Garðabær'),
('220', u'220 Hafnarfjörður'), ('220', '220 Hafnarfjörður'),
('221', u'221 Hafnarfjörður'), ('221', '221 Hafnarfjörður'),
('222', u'222 Hafnarfjörður'), ('222', '222 Hafnarfjörður'),
('225', u'225 Álftanes'), ('225', '225 Álftanes'),
('230', u'230 Reykjanesbær'), ('230', '230 Reykjanesbær'),
('232', u'232 Reykjanesbær'), ('232', '232 Reykjanesbær'),
('233', u'233 Reykjanesbær'), ('233', '233 Reykjanesbær'),
('235', u'235 Keflavíkurflugvöllur'), ('235', '235 Keflavíkurflugvöllur'),
('240', u'240 Grindavík'), ('240', '240 Grindavík'),
('245', u'245 Sandgerði'), ('245', '245 Sandgerði'),
('250', u'250 Garður'), ('250', '250 Garður'),
('260', u'260 Reykjanesbær'), ('260', '260 Reykjanesbær'),
('270', u'270 Mosfellsbær'), ('270', '270 Mosfellsbær'),
('300', u'300 Akranes'), ('300', '300 Akranes'),
('301', u'301 Akranes'), ('301', '301 Akranes'),
('302', u'302 Akranes'), ('302', '302 Akranes'),
('310', u'310 Borgarnes'), ('310', '310 Borgarnes'),
('311', u'311 Borgarnes'), ('311', '311 Borgarnes'),
('320', u'320 Reykholt í Borgarfirði'), ('320', '320 Reykholt í Borgarfirði'),
('340', u'340 Stykkishólmur'), ('340', '340 Stykkishólmur'),
('345', u'345 Flatey á Breiðafirði'), ('345', '345 Flatey á Breiðafirði'),
('350', u'350 Grundarfjörður'), ('350', '350 Grundarfjörður'),
('355', u'355 Ólafsvík'), ('355', '355 Ólafsvík'),
('356', u'356 Snæfellsbær'), ('356', '356 Snæfellsbær'),
('360', u'360 Hellissandur'), ('360', '360 Hellissandur'),
('370', u'370 Búðardalur'), ('370', '370 Búðardalur'),
('371', u'371 Búðardalur'), ('371', '371 Búðardalur'),
('380', u'380 Reykhólahreppur'), ('380', '380 Reykhólahreppur'),
('400', u'400 Ísafjörður'), ('400', '400 Ísafjörður'),
('401', u'401 Ísafjörður'), ('401', '401 Ísafjörður'),
('410', u'410 Hnífsdalur'), ('410', '410 Hnífsdalur'),
('415', u'415 Bolungarvík'), ('415', '415 Bolungarvík'),
('420', u'420 Súðavík'), ('420', '420 Súðavík'),
('425', u'425 Flateyri'), ('425', '425 Flateyri'),
('430', u'430 Suðureyri'), ('430', '430 Suðureyri'),
('450', u'450 Patreksfjörður'), ('450', '450 Patreksfjörður'),
('451', u'451 Patreksfjörður'), ('451', '451 Patreksfjörður'),
('460', u'460 Tálknafjörður'), ('460', '460 Tálknafjörður'),
('465', u'465 Bíldudalur'), ('465', '465 Bíldudalur'),
('470', u'470 Þingeyri'), ('470', '470 Þingeyri'),
('471', u'471 Þingeyri'), ('471', '471 Þingeyri'),
('500', u'500 Staður'), ('500', '500 Staður'),
('510', u'510 Hólmavík'), ('510', '510 Hólmavík'),
('512', u'512 Hólmavík'), ('512', '512 Hólmavík'),
('520', u'520 Drangsnes'), ('520', '520 Drangsnes'),
('522', u'522 Kjörvogur'), ('522', '522 Kjörvogur'),
('523', u'523 Bær'), ('523', '523 Bær'),
('524', u'524 Norðurfjörður'), ('524', '524 Norðurfjörður'),
('530', u'530 Hvammstangi'), ('530', '530 Hvammstangi'),
('531', u'531 Hvammstangi'), ('531', '531 Hvammstangi'),
('540', u'540 Blönduós'), ('540', '540 Blönduós'),
('541', u'541 Blönduós'), ('541', '541 Blönduós'),
('545', u'545 Skagaströnd'), ('545', '545 Skagaströnd'),
('550', u'550 Sauðárkrókur'), ('550', '550 Sauðárkrókur'),
('551', u'551 Sauðárkrókur'), ('551', '551 Sauðárkrókur'),
('560', u'560 Varmahlíð'), ('560', '560 Varmahlíð'),
('565', u'565 Hofsós'), ('565', '565 Hofsós'),
('566', u'566 Hofsós'), ('566', '566 Hofsós'),
('570', u'570 Fljót'), ('570', '570 Fljót'),
('580', u'580 Siglufjörður'), ('580', '580 Siglufjörður'),
('600', u'600 Akureyri'), ('600', '600 Akureyri'),
('601', u'601 Akureyri'), ('601', '601 Akureyri'),
('602', u'602 Akureyri'), ('602', '602 Akureyri'),
('603', u'603 Akureyri'), ('603', '603 Akureyri'),
('610', u'610 Grenivík'), ('610', '610 Grenivík'),
('611', u'611 Grímsey'), ('611', '611 Grímsey'),
('620', u'620 Dalvík'), ('620', '620 Dalvík'),
('621', u'621 Dalvík'), ('621', '621 Dalvík'),
('625', u'625 Ólafsfjörður'), ('625', '625 Ólafsfjörður'),
('630', u'630 Hrísey'), ('630', '630 Hrísey'),
('640', u'640 Húsavík'), ('640', '640 Húsavík'),
('641', u'641 Húsavík'), ('641', '641 Húsavík'),
('645', u'645 Fosshóll'), ('645', '645 Fosshóll'),
('650', u'650 Laugar'), ('650', '650 Laugar'),
('660', u'660 Mývatn'), ('660', '660 Mývatn'),
('670', u'670 Kópasker'), ('670', '670 Kópasker'),
('671', u'671 Kópasker'), ('671', '671 Kópasker'),
('675', u'675 Raufarhöfn'), ('675', '675 Raufarhöfn'),
('680', u'680 Þórshöfn'), ('680', '680 Þórshöfn'),
('681', u'681 Þórshöfn'), ('681', '681 Þórshöfn'),
('685', u'685 Bakkafjörður'), ('685', '685 Bakkafjörður'),
('690', u'690 Vopnafjörður'), ('690', '690 Vopnafjörður'),
('700', u'700 Egilsstaðir'), ('700', '700 Egilsstaðir'),
('701', u'701 Egilsstaðir'), ('701', '701 Egilsstaðir'),
('710', u'710 Seyðisfjörður'), ('710', '710 Seyðisfjörður'),
('715', u'715 Mjóifjörður'), ('715', '715 Mjóifjörður'),
('720', u'720 Borgarfjörður eystri'), ('720', '720 Borgarfjörður eystri'),
('730', u'730 Reyðarfjörður'), ('730', '730 Reyðarfjörður'),
('735', u'735 Eskifjörður'), ('735', '735 Eskifjörður'),
('740', u'740 Neskaupstaður'), ('740', '740 Neskaupstaður'),
('750', u'750 Fáskrúðsfjörður'), ('750', '750 Fáskrúðsfjörður'),
('755', u'755 Stöðvarfjörður'), ('755', '755 Stöðvarfjörður'),
('760', u'760 Breiðdalsvík'), ('760', '760 Breiðdalsvík'),
('765', u'765 Djúpivogur'), ('765', '765 Djúpivogur'),
('780', u'780 Höfn í Hornafirði'), ('780', '780 Höfn í Hornafirði'),
('781', u'781 Höfn í Hornafirði'), ('781', '781 Höfn í Hornafirði'),
('785', u'785 Öræfi'), ('785', '785 Öræfi'),
('800', u'800 Selfoss'), ('800', '800 Selfoss'),
('801', u'801 Selfoss'), ('801', '801 Selfoss'),
('802', u'802 Selfoss'), ('802', '802 Selfoss'),
('810', u'810 Hveragerði'), ('810', '810 Hveragerði'),
('815', u'815 Þorlákshöfn'), ('815', '815 Þorlákshöfn'),
('820', u'820 Eyrarbakki'), ('820', '820 Eyrarbakki'),
('825', u'825 Stokkseyri'), ('825', '825 Stokkseyri'),
('840', u'840 Laugarvatn'), ('840', '840 Laugarvatn'),
('845', u'845 Flúðir'), ('845', '845 Flúðir'),
('850', u'850 Hella'), ('850', '850 Hella'),
('851', u'851 Hella'), ('851', '851 Hella'),
('860', u'860 Hvolsvöllur'), ('860', '860 Hvolsvöllur'),
('861', u'861 Hvolsvöllur'), ('861', '861 Hvolsvöllur'),
('870', u'870 Vík'), ('870', '870 Vík'),
('871', u'871 Vík'), ('871', '871 Vík'),
('880', u'880 Kirkjubæjarklaustur'), ('880', '880 Kirkjubæjarklaustur'),
('900', u'900 Vestmannaeyjar'), ('900', '900 Vestmannaeyjar'),
('902', u'902 Vestmannaeyjar') ('902', '902 Vestmannaeyjar')
) )

View File

@ -2,7 +2,7 @@
IT-specific Form helpers IT-specific Form helpers
""" """
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
import re import re
@ -45,7 +45,7 @@ class ITSocialSecurityNumberField(RegexField):
'Informazioni sulla codificazione delle persone fisiche'. 'Informazioni sulla codificazione delle persone fisiche'.
""" """
default_error_messages = { default_error_messages = {
'invalid': _(u'Enter a valid Social Security number.'), 'invalid': _('Enter a valid Social Security number.'),
} }
def __init__(self, max_length=None, min_length=None, *args, **kwargs): def __init__(self, max_length=None, min_length=None, *args, **kwargs):
@ -55,8 +55,8 @@ class ITSocialSecurityNumberField(RegexField):
def clean(self, value): def clean(self, value):
value = super(ITSocialSecurityNumberField, self).clean(value) value = super(ITSocialSecurityNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
value = re.sub('\s', u'', value).upper() value = re.sub('\s', '', value).upper()
try: try:
check_digit = ssn_check_digit(value) check_digit = ssn_check_digit(value)
except ValueError: except ValueError:
@ -70,13 +70,13 @@ class ITVatNumberField(Field):
A form field that validates Italian VAT numbers (partita IVA). A form field that validates Italian VAT numbers (partita IVA).
""" """
default_error_messages = { default_error_messages = {
'invalid': _(u'Enter a valid VAT number.'), 'invalid': _('Enter a valid VAT number.'),
} }
def clean(self, value): def clean(self, value):
value = super(ITVatNumberField, self).clean(value) value = super(ITVatNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
try: try:
vat_number = int(value) vat_number = int(value)
except ValueError: except ValueError:

View File

@ -1,4 +1,5 @@
# -*- coding: utf-8 -* # -*- coding: utf-8 -*
from __future__ import unicode_literals
PROVINCE_CHOICES = ( PROVINCE_CHOICES = (
('AG', 'Agrigento'), ('AG', 'Agrigento'),
@ -45,7 +46,7 @@ PROVINCE_CHOICES = (
('IM', 'Imperia'), ('IM', 'Imperia'),
('IS', 'Isernia'), ('IS', 'Isernia'),
('SP', 'La Spezia'), ('SP', 'La Spezia'),
('AQ', u'LAquila'), ('AQ', 'LAquila'),
('LT', 'Latina'), ('LT', 'Latina'),
('LE', 'Lecce'), ('LE', 'Lecce'),
('LC', 'Lecco'), ('LC', 'Lecco'),

View File

@ -1,4 +1,5 @@
# -*- coding: utf-8 -* # -*- coding: utf-8 -*
from __future__ import unicode_literals
REGION_CHOICES = ( REGION_CHOICES = (
('ABR', 'Abruzzo'), ('ABR', 'Abruzzo'),
@ -19,6 +20,6 @@ REGION_CHOICES = (
('TOS', 'Toscana'), ('TOS', 'Toscana'),
('TAA', 'Trentino-Alto Adige'), ('TAA', 'Trentino-Alto Adige'),
('UMB', 'Umbria'), ('UMB', 'Umbria'),
('VAO', u'Valle dAosta'), ('VAO', 'Valle dAosta'),
('VEN', 'Veneto'), ('VEN', 'Veneto'),
) )

View File

@ -1,4 +1,4 @@
from django.utils.encoding import smart_str, smart_unicode from django.utils.encoding import smart_unicode
def ssn_check_digit(value): def ssn_check_digit(value):
"Calculate Italian social security number check digit." "Calculate Italian social security number check digit."
@ -34,7 +34,7 @@ def ssn_check_digit(value):
def vat_number_check_digit(vat_number): def vat_number_check_digit(vat_number):
"Calculate Italian VAT number check digit." "Calculate Italian VAT number check digit."
normalized_vat_number = smart_str(vat_number).zfill(10) normalized_vat_number = smart_unicode(vat_number).zfill(10)
total = 0 total = 0
for i in range(0, 10, 2): for i in range(0, 10, 2):
total += int(normalized_vat_number[i]) total += int(normalized_vat_number[i])

View File

@ -1,6 +1,8 @@
""" """
Kuwait-specific Form helpers Kuwait-specific Form helpers
""" """
from __future__ import unicode_literals
import re import re
from datetime import date from datetime import date
@ -40,7 +42,7 @@ class KWCivilIDNumberField(Field):
def clean(self, value): def clean(self, value):
super(KWCivilIDNumberField, self).clean(value) super(KWCivilIDNumberField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
if not re.match(r'^\d{12}$', value): if not re.match(r'^\d{12}$', value):
raise ValidationError(self.error_messages['invalid']) raise ValidationError(self.error_messages['invalid'])

View File

@ -1,4 +1,4 @@
from __future__ import absolute_import from __future__ import absolute_import, unicode_literals
import datetime import datetime
@ -15,14 +15,14 @@ class MKIdentityCardNumberField(RegexField):
A Macedonian ID card number. Accepts both old and new format. A Macedonian ID card number. Accepts both old and new format.
""" """
default_error_messages = { default_error_messages = {
'invalid': _(u'Identity card numbers must contain' 'invalid': _('Identity card numbers must contain'
' either 4 to 7 digits or an uppercase letter and 7 digits.'), ' either 4 to 7 digits or an uppercase letter and 7 digits.'),
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
kwargs['min_length'] = None kwargs['min_length'] = None
kwargs['max_length'] = 8 kwargs['max_length'] = 8
regex = ur'(^[A-Z]{1}\d{7}$)|(^\d{4,7}$)' regex = r'(^[A-Z]{1}\d{7}$)|(^\d{4,7}$)'
super(MKIdentityCardNumberField, self).__init__(regex, *args, **kwargs) super(MKIdentityCardNumberField, self).__init__(regex, *args, **kwargs)
@ -54,9 +54,9 @@ class UMCNField(RegexField):
* The last digit of the UMCN passes a checksum test * The last digit of the UMCN passes a checksum test
""" """
default_error_messages = { default_error_messages = {
'invalid': _(u'This field should contain exactly 13 digits.'), 'invalid': _('This field should contain exactly 13 digits.'),
'date': _(u'The first 7 digits of the UMCN must represent a valid past date.'), 'date': _('The first 7 digits of the UMCN must represent a valid past date.'),
'checksum': _(u'The UMCN is not valid.'), 'checksum': _('The UMCN is not valid.'),
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -68,7 +68,7 @@ class UMCNField(RegexField):
value = super(UMCNField, self).clean(value) value = super(UMCNField, self).clean(value)
if value in EMPTY_VALUES: if value in EMPTY_VALUES:
return u'' return ''
if not self._validate_date_part(value): if not self._validate_date_part(value):
raise ValidationError(self.error_messages['date']) raise ValidationError(self.error_messages['date'])

View File

@ -2,91 +2,93 @@
""" """
Macedonian municipalities per the reorganization from 2004. Macedonian municipalities per the reorganization from 2004.
""" """
from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
MK_MUNICIPALITIES = ( MK_MUNICIPALITIES = (
('AD', _(u'Aerodrom')), ('AD', _('Aerodrom')),
('AR', _(u'Aračinovo')), ('AR', _('Aračinovo')),
('BR', _(u'Berovo')), ('BR', _('Berovo')),
('TL', _(u'Bitola')), ('TL', _('Bitola')),
('BG', _(u'Bogdanci')), ('BG', _('Bogdanci')),
('VJ', _(u'Bogovinje')), ('VJ', _('Bogovinje')),
('BS', _(u'Bosilovo')), ('BS', _('Bosilovo')),
('BN', _(u'Brvenica')), ('BN', _('Brvenica')),
('BU', _(u'Butel')), ('BU', _('Butel')),
('VA', _(u'Valandovo')), ('VA', _('Valandovo')),
('VL', _(u'Vasilevo')), ('VL', _('Vasilevo')),
('VV', _(u'Vevčani')), ('VV', _('Vevčani')),
('VE', _(u'Veles')), ('VE', _('Veles')),
('NI', _(u'Vinica')), ('NI', _('Vinica')),
('VC', _(u'Vraneštica')), ('VC', _('Vraneštica')),
('VH', _(u'Vrapčište')), ('VH', _('Vrapčište')),
('GB', _(u'Gazi Baba')), ('GB', _('Gazi Baba')),
('GV', _(u'Gevgelija')), ('GV', _('Gevgelija')),
('GT', _(u'Gostivar')), ('GT', _('Gostivar')),
('GR', _(u'Gradsko')), ('GR', _('Gradsko')),
('DB', _(u'Debar')), ('DB', _('Debar')),
('DA', _(u'Debarca')), ('DA', _('Debarca')),
('DL', _(u'Delčevo')), ('DL', _('Delčevo')),
('DK', _(u'Demir Kapija')), ('DK', _('Demir Kapija')),
('DM', _(u'Demir Hisar')), ('DM', _('Demir Hisar')),
('DE', _(u'Dolneni')), ('DE', _('Dolneni')),
('DR', _(u'Drugovo')), ('DR', _('Drugovo')),
('GP', _(u'Gjorče Petrov')), ('GP', _('Gjorče Petrov')),
('ZE', _(u'Želino')), ('ZE', _('Želino')),
('ZA', _(u'Zajas')), ('ZA', _('Zajas')),
('ZK', _(u'Zelenikovo')), ('ZK', _('Zelenikovo')),
('ZR', _(u'Zrnovci')), ('ZR', _('Zrnovci')),
('IL', _(u'Ilinden')), ('IL', _('Ilinden')),
('JG', _(u'Jegunovce')), ('JG', _('Jegunovce')),
('AV', _(u'Kavadarci')), ('AV', _('Kavadarci')),
('KB', _(u'Karbinci')), ('KB', _('Karbinci')),
('KX', _(u'Karpoš')), ('KX', _('Karpoš')),
('VD', _(u'Kisela Voda')), ('VD', _('Kisela Voda')),
('KH', _(u'Kičevo')), ('KH', _('Kičevo')),
('KN', _(u'Konče')), ('KN', _('Konče')),
('OC', _(u'Koćani')), ('OC', _('Koćani')),
('KY', _(u'Kratovo')), ('KY', _('Kratovo')),
('KZ', _(u'Kriva Palanka')), ('KZ', _('Kriva Palanka')),
('KG', _(u'Krivogaštani')), ('KG', _('Krivogaštani')),
('KS', _(u'Kruševo')), ('KS', _('Kruševo')),
('UM', _(u'Kumanovo')), ('UM', _('Kumanovo')),
('LI', _(u'Lipkovo')), ('LI', _('Lipkovo')),
('LO', _(u'Lozovo')), ('LO', _('Lozovo')),
('MR', _(u'Mavrovo i Rostuša')), ('MR', _('Mavrovo i Rostuša')),
('MK', _(u'Makedonska Kamenica')), ('MK', _('Makedonska Kamenica')),
('MD', _(u'Makedonski Brod')), ('MD', _('Makedonski Brod')),
('MG', _(u'Mogila')), ('MG', _('Mogila')),
('NG', _(u'Negotino')), ('NG', _('Negotino')),
('NV', _(u'Novaci')), ('NV', _('Novaci')),
('NS', _(u'Novo Selo')), ('NS', _('Novo Selo')),
('OS', _(u'Oslomej')), ('OS', _('Oslomej')),
('OD', _(u'Ohrid')), ('OD', _('Ohrid')),
('PE', _(u'Petrovec')), ('PE', _('Petrovec')),
('PH', _(u'Pehčevo')), ('PH', _('Pehčevo')),
('PN', _(u'Plasnica')), ('PN', _('Plasnica')),
('PP', _(u'Prilep')), ('PP', _('Prilep')),
('PT', _(u'Probištip')), ('PT', _('Probištip')),
('RV', _(u'Radoviš')), ('RV', _('Radoviš')),
('RN', _(u'Rankovce')), ('RN', _('Rankovce')),
('RE', _(u'Resen')), ('RE', _('Resen')),
('RO', _(u'Rosoman')), ('RO', _('Rosoman')),
('AJ', _(u'Saraj')), ('AJ', _('Saraj')),
('SL', _(u'Sveti Nikole')), ('SL', _('Sveti Nikole')),
('SS', _(u'Sopište')), ('SS', _('Sopište')),
('SD', _(u'Star Dojran')), ('SD', _('Star Dojran')),
('NA', _(u'Staro Nagoričane')), ('NA', _('Staro Nagoričane')),
('UG', _(u'Struga')), ('UG', _('Struga')),
('RU', _(u'Strumica')), ('RU', _('Strumica')),
('SU', _(u'Studeničani')), ('SU', _('Studeničani')),
('TR', _(u'Tearce')), ('TR', _('Tearce')),
('ET', _(u'Tetovo')), ('ET', _('Tetovo')),
('CE', _(u'Centar')), ('CE', _('Centar')),
('CZ', _(u'Centar-Župa')), ('CZ', _('Centar-Župa')),
('CI', _(u'Čair')), ('CI', _('Čair')),
('CA', _(u'Čaška')), ('CA', _('Čaška')),
('CH', _(u'Češinovo-Obleševo')), ('CH', _('Češinovo-Obleševo')),
('CS', _(u'Čučer-Sandevo')), ('CS', _('Čučer-Sandevo')),
('ST', _(u'Štip')), ('ST', _('Štip')),
('SO', _(u'Šuto Orizari')), ('SO', _('Šuto Orizari')),
) )

Some files were not shown because too many files have changed in this diff Show More