Browse Source

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.
Claude Paroz 12 years ago
parent
commit
4a103086d5
100 changed files with 1372 additions and 1263 deletions
  1. 74 72
      django/conf/locale/__init__.py
  2. 2 1
      django/conf/locale/bg/formats.py
  3. 2 1
      django/conf/locale/cs/formats.py
  4. 2 2
      django/conf/locale/en/formats.py
  5. 2 1
      django/conf/locale/es_MX/formats.py
  6. 2 1
      django/conf/locale/et/formats.py
  7. 2 1
      django/conf/locale/fi/formats.py
  8. 2 1
      django/conf/locale/fr/formats.py
  9. 1 0
      django/conf/locale/he/formats.py
  10. 2 1
      django/conf/locale/hu/formats.py
  11. 1 0
      django/conf/locale/ja/formats.py
  12. 1 0
      django/conf/locale/km/formats.py
  13. 1 0
      django/conf/locale/ko/formats.py
  14. 2 1
      django/conf/locale/lv/formats.py
  15. 2 1
      django/conf/locale/nb/formats.py
  16. 2 1
      django/conf/locale/nn/formats.py
  17. 2 1
      django/conf/locale/pl/formats.py
  18. 1 0
      django/conf/locale/pt_BR/formats.py
  19. 2 1
      django/conf/locale/ru/formats.py
  20. 2 1
      django/conf/locale/sk/formats.py
  21. 2 1
      django/conf/locale/sv/formats.py
  22. 3 1
      django/conf/locale/uk/formats.py
  23. 1 0
      django/conf/locale/vi/formats.py
  24. 3 2
      django/contrib/admin/forms.py
  25. 10 8
      django/contrib/admin/helpers.py
  26. 3 1
      django/contrib/admin/models.py
  27. 10 8
      django/contrib/admin/templatetags/admin_list.py
  28. 4 2
      django/contrib/admin/util.py
  29. 19 17
      django/contrib/admin/widgets.py
  30. 4 4
      django/contrib/admindocs/tests/__init__.py
  31. 3 1
      django/contrib/auth/backends.py
  32. 2 0
      django/contrib/auth/hashers.py
  33. 5 3
      django/contrib/auth/management/__init__.py
  34. 4 2
      django/contrib/auth/models.py
  35. 6 4
      django/contrib/auth/tests/auth_backends.py
  36. 4 2
      django/contrib/auth/tests/forms.py
  37. 10 8
      django/contrib/auth/tests/hashers.py
  38. 5 3
      django/contrib/auth/tests/management.py
  39. 4 2
      django/contrib/comments/admin.py
  40. 2 1
      django/contrib/contenttypes/generic.py
  41. 3 1
      django/contrib/contenttypes/tests.py
  42. 4 2
      django/contrib/contenttypes/views.py
  43. 6 5
      django/contrib/databrowse/datastructures.py
  44. 6 4
      django/contrib/databrowse/plugins/calendars.py
  45. 6 4
      django/contrib/databrowse/plugins/fieldchoices.py
  46. 3 1
      django/contrib/databrowse/sites.py
  47. 3 1
      django/contrib/flatpages/models.py
  48. 4 2
      django/contrib/flatpages/tests/forms.py
  49. 30 28
      django/contrib/formtools/tests/__init__.py
  50. 6 4
      django/contrib/formtools/tests/wizard/forms.py
  51. 13 11
      django/contrib/formtools/tests/wizard/namedwizardtests/tests.py
  52. 14 12
      django/contrib/formtools/tests/wizard/wizardtests/tests.py
  53. 12 10
      django/contrib/gis/feeds.py
  54. 6 4
      django/contrib/gis/forms/fields.py
  55. 1 1
      django/contrib/gis/gdal/tests/test_envelope.py
  56. 5 3
      django/contrib/gis/geoip/tests.py
  57. 5 3
      django/contrib/gis/sitemaps/views.py
  58. 3 3
      django/contrib/gis/tests/geoapp/test_feeds.py
  59. 5 5
      django/contrib/gis/tests/geoapp/test_sitemaps.py
  60. 4 2
      django/contrib/gis/views.py
  61. 14 13
      django/contrib/humanize/templatetags/humanize.py
  62. 6 5
      django/contrib/humanize/tests.py
  63. 25 24
      django/contrib/localflavor/ar/ar_provinces.py
  64. 6 6
      django/contrib/localflavor/ar/forms.py
  65. 4 4
      django/contrib/localflavor/at/forms.py
  66. 4 4
      django/contrib/localflavor/au/forms.py
  67. 12 11
      django/contrib/localflavor/br/br_states.py
  68. 8 8
      django/contrib/localflavor/br/forms.py
  69. 11 11
      django/contrib/localflavor/ca/forms.py
  70. 5 5
      django/contrib/localflavor/ch/forms.py
  71. 16 15
      django/contrib/localflavor/cl/cl_regions.py
  72. 5 5
      django/contrib/localflavor/cl/forms.py
  73. 35 35
      django/contrib/localflavor/cn/cn_provinces.py
  74. 10 10
      django/contrib/localflavor/cn/forms.py
  75. 34 33
      django/contrib/localflavor/co/co_departments.py
  76. 10 10
      django/contrib/localflavor/cz/forms.py
  77. 4 4
      django/contrib/localflavor/de/forms.py
  78. 3 1
      django/contrib/localflavor/de_CH/formats.py
  79. 25 24
      django/contrib/localflavor/ec/ec_provinces.py
  80. 2 2
      django/contrib/localflavor/es/forms.py
  81. 345 343
      django/contrib/localflavor/fi/fi_municipalities.py
  82. 3 3
      django/contrib/localflavor/fi/forms.py
  83. 3 3
      django/contrib/localflavor/fr/forms.py
  84. 110 109
      django/contrib/localflavor/fr/fr_department.py
  85. 3 3
      django/contrib/localflavor/gb/forms.py
  86. 3 3
      django/contrib/localflavor/hk/forms.py
  87. 11 11
      django/contrib/localflavor/hr/forms.py
  88. 28 26
      django/contrib/localflavor/hr/hr_choices.py
  89. 6 6
      django/contrib/localflavor/id/forms.py
  90. 4 3
      django/contrib/localflavor/il/forms.py
  91. 7 7
      django/contrib/localflavor/in_/forms.py
  92. 4 4
      django/contrib/localflavor/is_/forms.py
  93. 148 147
      django/contrib/localflavor/is_/is_postalcodes.py
  94. 6 6
      django/contrib/localflavor/it/forms.py
  95. 2 1
      django/contrib/localflavor/it/it_province.py
  96. 2 1
      django/contrib/localflavor/it/it_region.py
  97. 2 2
      django/contrib/localflavor/it/util.py
  98. 3 1
      django/contrib/localflavor/kw/forms.py
  99. 7 7
      django/contrib/localflavor/mk/forms.py
  100. 86 84
      django/contrib/localflavor/mk/mk_choices.py

+ 74 - 72
django/conf/locale/__init__.py

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

+ 2 - 1
django/conf/locale/bg/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@@ -19,5 +20,5 @@ SHORT_DATE_FORMAT = 'd.m.Y'
 # TIME_INPUT_FORMATS = 
 # DATETIME_INPUT_FORMATS = 
 DECIMAL_SEPARATOR = ','
-THOUSAND_SEPARATOR = u' ' # Non-breaking space
+THOUSAND_SEPARATOR = ' ' # Non-breaking space
 # NUMBER_GROUPING = 

+ 2 - 1
django/conf/locale/cs/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@@ -33,5 +34,5 @@ DATETIME_INPUT_FORMATS = (
     '%Y-%m-%d',             # '2006-10-25'
 )
 DECIMAL_SEPARATOR = ','
-THOUSAND_SEPARATOR = u'\xa0' # non-breaking space
+THOUSAND_SEPARATOR = '\xa0' # non-breaking space
 NUMBER_GROUPING = 3

+ 2 - 2
django/conf/locale/en/formats.py

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

+ 2 - 1
django/conf/locale/es_MX/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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'
 TIME_FORMAT = 'H:i:s'
@@ -24,5 +25,5 @@ DATETIME_INPUT_FORMATS = (
     '%d/%m/%y %H:%M',
 )
 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

+ 2 - 1
django/conf/locale/et/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@@ -19,5 +20,5 @@ SHORT_DATE_FORMAT = 'd.m.Y'
 # TIME_INPUT_FORMATS = 
 # DATETIME_INPUT_FORMATS = 
 DECIMAL_SEPARATOR = ','
-THOUSAND_SEPARATOR = u' ' # Non-breaking space
+THOUSAND_SEPARATOR = ' ' # Non-breaking space
 # NUMBER_GROUPING = 

+ 2 - 1
django/conf/locale/fi/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@@ -19,5 +20,5 @@ SHORT_DATE_FORMAT = 'j.n.Y'
 # TIME_INPUT_FORMATS = 
 # DATETIME_INPUT_FORMATS = 
 DECIMAL_SEPARATOR = ','
-THOUSAND_SEPARATOR = u' ' # Non-breaking space
+THOUSAND_SEPARATOR = ' ' # Non-breaking space
 # NUMBER_GROUPING = 

+ 2 - 1
django/conf/locale/fr/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@@ -37,5 +38,5 @@ DATETIME_INPUT_FORMATS = (
     '%Y-%m-%d',             # '2006-10-25'
 )
 DECIMAL_SEPARATOR = ','
-THOUSAND_SEPARATOR = u'\xa0' # non-breaking space
+THOUSAND_SEPARATOR = '\xa0' # non-breaking space
 NUMBER_GROUPING = 3

+ 1 - 0
django/conf/locale/he/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date

+ 2 - 1
django/conf/locale/hu/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@@ -28,5 +29,5 @@ DATETIME_INPUT_FORMATS = (
     '%Y.%m.%d.',            # '2006.10.25.'
 )
 DECIMAL_SEPARATOR = ','
-THOUSAND_SEPARATOR = u' ' # Non-breaking space
+THOUSAND_SEPARATOR = ' ' # Non-breaking space
 NUMBER_GROUPING = 3

+ 1 - 0
django/conf/locale/ja/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date

+ 1 - 0
django/conf/locale/km/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date

+ 1 - 0
django/conf/locale/ko/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date

+ 2 - 1
django/conf/locale/lv/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@@ -37,5 +38,5 @@ DATETIME_INPUT_FORMATS = (
     '%d.%m.%y',              # '25.10.06'
 )
 DECIMAL_SEPARATOR = ','
-THOUSAND_SEPARATOR = u' ' # Non-breaking space
+THOUSAND_SEPARATOR = ' ' # Non-breaking space
 NUMBER_GROUPING = 3

+ 2 - 1
django/conf/locale/nb/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@@ -39,5 +40,5 @@ DATETIME_INPUT_FORMATS = (
     '%d.%m.%y',              # '25.10.06'
 )
 DECIMAL_SEPARATOR = ','
-THOUSAND_SEPARATOR = u'\xa0' # non-breaking space
+THOUSAND_SEPARATOR = '\xa0' # non-breaking space
 NUMBER_GROUPING = 3

+ 2 - 1
django/conf/locale/nn/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@@ -39,5 +40,5 @@ DATETIME_INPUT_FORMATS = (
     '%d.%m.%y',              # '25.10.06'
 )
 DECIMAL_SEPARATOR = ','
-THOUSAND_SEPARATOR = u'\xa0' # non-breaking space
+THOUSAND_SEPARATOR = '\xa0' # non-breaking space
 NUMBER_GROUPING = 3

+ 2 - 1
django/conf/locale/pl/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@@ -33,5 +34,5 @@ DATETIME_INPUT_FORMATS = (
     '%Y-%m-%d',             # '2006-10-25'
 )
 DECIMAL_SEPARATOR = ','
-THOUSAND_SEPARATOR = u' '
+THOUSAND_SEPARATOR = ' '
 NUMBER_GROUPING = 3

+ 1 - 0
django/conf/locale/pt_BR/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date

+ 2 - 1
django/conf/locale/ru/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@@ -36,5 +37,5 @@ DATETIME_INPUT_FORMATS = (
     '%Y-%m-%d',           # '2006-10-25'
 )
 DECIMAL_SEPARATOR = ','
-THOUSAND_SEPARATOR = u'\xa0' # non-breaking space
+THOUSAND_SEPARATOR = '\xa0' # non-breaking space
 NUMBER_GROUPING = 3

+ 2 - 1
django/conf/locale/sk/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@@ -33,5 +34,5 @@ DATETIME_INPUT_FORMATS = (
     '%Y-%m-%d',             # '2006-10-25'
 )
 DECIMAL_SEPARATOR = ','
-THOUSAND_SEPARATOR = u'\xa0' # non-breaking space
+THOUSAND_SEPARATOR = '\xa0' # non-breaking space
 NUMBER_GROUPING = 3

+ 2 - 1
django/conf/locale/sv/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
@@ -36,5 +37,5 @@ DATETIME_INPUT_FORMATS = (
     '%m/%d/%y',              # '10/25/06'
 )
 DECIMAL_SEPARATOR = ','
-THOUSAND_SEPARATOR = u'\xa0' # non-breaking space
+THOUSAND_SEPARATOR = '\xa0' # non-breaking space
 NUMBER_GROUPING = 3

+ 3 - 1
django/conf/locale/uk/formats.py

@@ -2,6 +2,8 @@
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
 DATE_FORMAT = 'j E Y р.'
@@ -19,5 +21,5 @@ SHORT_DATE_FORMAT = 'j M Y'
 # TIME_INPUT_FORMATS = 
 # DATETIME_INPUT_FORMATS = 
 DECIMAL_SEPARATOR = ','
-THOUSAND_SEPARATOR = u' '
+THOUSAND_SEPARATOR = ' '
 # NUMBER_GROUPING = 

+ 1 - 0
django/conf/locale/vi/formats.py

@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 # 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,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date

+ 3 - 2
django/contrib/admin/forms.py

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

+ 10 - 8
django/contrib/admin/helpers.py

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

+ 3 - 1
django/contrib/admin/models.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.db import models
 from django.contrib.contenttypes.models import ContentType
 from django.contrib.auth.models import User
@@ -64,5 +66,5 @@ class LogEntry(models.Model):
         This is relative to the Django admin index page.
         """
         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

+ 10 - 8
django/contrib/admin/templatetags/admin_list.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import datetime
 
 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.
     """
     if i == DOT:
-        return u'... '
+        return '... '
     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:
-        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')
 def pagination(cl):
@@ -163,7 +165,7 @@ def result_headers(cl):
 def _boolean_icon(field_val):
     icon_url = static('admin/img/icon-%s.gif' %
                       {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):
     """
@@ -179,7 +181,7 @@ def items_for_result(cl, result, form):
             result_repr = EMPTY_CHANGELIST_VALUE
         else:
             if f is None:
-                if field_name == u'action_checkbox':
+                if field_name == 'action_checkbox':
                     row_class = ' class="action-checkbox"'
                 allow_tags = getattr(attr, 'allow_tags', False)
                 boolean = getattr(attr, 'boolean', False)
@@ -220,7 +222,7 @@ def items_for_result(cl, result, form):
                 attr = pk
             value = result.serializable_value(attr)
             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))
         else:
             # 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))
             else:
                 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:
-        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):
     # Wrapper class used to return items in a list_editable

+ 4 - 2
django/contrib/admin/util.py

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

+ 19 - 17
django/contrib/admin/widgets.py

@@ -1,8 +1,10 @@
 """
 Form Widget classes specific to the Django admin site.
 """
+from __future__ import unicode_literals
 
 import copy
+
 from django import forms
 from django.contrib.admin.templatetags.admin_static import static
 from django.core.urlresolvers import reverse
@@ -39,12 +41,12 @@ class FilteredSelectMultiple(forms.SelectMultiple):
         if self.is_stacked:
             attrs['class'] += 'stacked'
         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
         # 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/')))
-        return mark_safe(u''.join(output))
+        return mark_safe(''.join(output))
 
 class AdminDateWidget(forms.DateInput):
 
@@ -83,24 +85,24 @@ class AdminSplitDateTime(forms.SplitDateTimeWidget):
         forms.MultiWidget.__init__(self, widgets, attrs)
 
     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]))
 
 class AdminRadioFieldRenderer(RadioFieldRenderer):
     def render(self):
         """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),
-            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):
     renderer = AdminRadioFieldRenderer
 
 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)
-    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)
 
 def url_params_from_lookup_dict(lookups):
@@ -113,7 +115,7 @@ def url_params_from_lookup_dict(lookups):
         items = []
         for k, v in lookups.items():
             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):
                 # See django.db.fields.BooleanField.get_prep_lookup
                 v = ('0', '1')[v]
@@ -148,21 +150,21 @@ class ForeignKeyRawIdWidget(forms.TextInput):
 
             params = self.url_parameters()
             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:
-                url = u''
+                url = ''
             if "class" not in attrs:
                 attrs['class'] = 'vForeignKeyRawIdAdminField' # The JavaScript code looks for this hook.
             # TODO: "lookup_id_" is hard-coded here. This should instead use
             # 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))
-            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')))
         output = [super(ForeignKeyRawIdWidget, self).render(name, value, attrs)] + extra
         if value:
             output.append(self.label_for_value(value))
-        return mark_safe(u''.join(output))
+        return mark_safe(''.join(output))
 
     def base_url_parameters(self):
         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)
             # TODO: "add_id_" is hard-coded here. This should instead use the
             # 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))
-            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')))
-        return mark_safe(u''.join(output))
+        return mark_safe(''.join(output))
 
     def build_attrs(self, extra_attrs=None, **kwargs):
         "Helper function for building an attribute dictionary."

+ 4 - 4
django/contrib/admindocs/tests/__init__.py

@@ -1,4 +1,4 @@
-from __future__ import absolute_import
+from __future__ import absolute_import, unicode_literals
 
 from django.contrib.admindocs import views
 from django.db.models import fields as builtin_fields
@@ -20,17 +20,17 @@ class TestFieldType(unittest.TestCase):
     def test_builtin_fields(self):
         self.assertEqual(
             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):
         self.assertEqual(
             views.get_readable_field_data_type(fields.CustomField()),
-            _(u'A custom field type')
+            _('A custom field type')
         )
         self.assertEqual(
             views.get_readable_field_data_type(fields.DescriptionLackingField()),
-            _(u'Field of type: %(field_type)s') % {
+            _('Field of type: %(field_type)s') % {
                 'field_type': 'DescriptionLackingField'
             }
         )

+ 3 - 1
django/contrib/auth/backends.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 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:
             return set()
         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))
         return user_obj._perm_cache
 

+ 2 - 0
django/contrib/auth/hashers.py

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

+ 5 - 3
django/contrib/auth/management/__init__.py

@@ -1,6 +1,8 @@
 """
 Creates permissions for all installed apps that need permissions.
 """
+from __future__ import unicode_literals
+
 import getpass
 import locale
 import unicodedata
@@ -10,14 +12,14 @@ from django.contrib.auth.models import User
 
 
 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):
     "Returns (codename, name) for all permissions in the given opts."
     perms = []
     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)
 
 
@@ -88,7 +90,7 @@ def get_system_username():
         # if there is no corresponding entry in the /etc/passwd file
         # (a very restricted chroot environment, for example).
         # UnicodeDecodeError - preventive treatment for non-latin Windows.
-        return u''
+        return ''
 
 
 def get_default_username(check_db=True):

+ 4 - 2
django/contrib/auth/models.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import urllib
 
 from django.core.exceptions import ImproperlyConfigured
@@ -76,7 +78,7 @@ class Permission(models.Model):
                     'codename')
 
     def __unicode__(self):
-        return u"%s | %s | %s" % (
+        return "%s | %s | %s" % (
             unicode(self.content_type.app_label),
             unicode(self.content_type),
             unicode(self.name))
@@ -285,7 +287,7 @@ class User(models.Model):
         """
         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()
 
     def set_password(self, raw_password):

+ 6 - 4
django/contrib/auth/tests/auth_backends.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.conf import settings
 from django.contrib.auth.models import User, Group, Permission, AnonymousUser
 from django.contrib.contenttypes.models import ContentType
@@ -51,7 +53,7 @@ class BackendTest(TestCase):
 
         # reloading user to purge the _perm_cache
         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.has_module_perms('Group'), False)
         self.assertEqual(user.has_module_perms('auth'), True)
@@ -62,7 +64,7 @@ class BackendTest(TestCase):
         user.user_permissions.add(perm)
         user.save()
         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('auth.test'), True)
         self.assertEqual(user.has_perms(['auth.test2', 'auth.test3']), True)
@@ -72,9 +74,9 @@ class BackendTest(TestCase):
         group.save()
         user.groups.add(group)
         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_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)
 
         user = AnonymousUser()

+ 4 - 2
django/contrib/auth/tests/forms.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import os
 from django.contrib.auth.models import User
 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.
             form.save(domain_override='example.com')
             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):
         # bug #5605, preserve the case of the user name (before the @ in the
@@ -328,4 +330,4 @@ class PasswordResetFormTest(TestCase):
         form = PasswordResetForm(data)
         self.assertFalse(form.is_valid())
         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.")])

+ 10 - 8
django/contrib/auth/tests/hashers.py

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

+ 5 - 3
django/contrib/auth/tests/management.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from StringIO import StringIO
 
 from django.contrib.auth import models, management
@@ -15,19 +17,19 @@ class GetDefaultUsernameTestCase(TestCase):
         management.get_system_username = self._getpass_getuser
 
     def test_simple(self):
-        management.get_system_username = lambda: u'joe'
+        management.get_system_username = lambda: 'joe'
         self.assertEqual(management.get_default_username(), 'joe')
 
     def test_existing(self):
         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(check_db=False), 'joe')
 
     def test_i18n(self):
         # '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')
 
 

+ 4 - 2
django/contrib/comments/admin.py

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

+ 2 - 1
django/contrib/contenttypes/generic.py

@@ -1,6 +1,7 @@
 """
 Classes allowing "generic" relations through ContentType and object-id fields.
 """
+from __future__ import unicode_literals
 
 from collections import defaultdict
 from functools import partial
@@ -131,7 +132,7 @@ class GenericForeignKey(object):
 
     def __set__(self, instance, value):
         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
         fk = None

+ 3 - 1
django/contrib/contenttypes/tests.py

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

+ 4 - 2
django/contrib/contenttypes/views.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django import http
 from django.contrib.contenttypes.models import ContentType
 from django.contrib.sites.models import Site, get_current_site
@@ -12,11 +14,11 @@ def shortcut(request, content_type_id, object_id):
     try:
         content_type = ContentType.objects.get(pk=content_type_id)
         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})
         obj = content_type.get_object_for_this_type(pk=object_id)
     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})
 
     try:

+ 6 - 5
django/contrib/databrowse/datastructures.py

@@ -2,6 +2,7 @@
 These classes are light wrappers around Django's database API that provide
 convenience functionality and permalink functions for the databrowse app.
 """
+from __future__ import unicode_literals
 
 from django.db import models
 from django.utils import formats
@@ -61,7 +62,7 @@ class EasyField(object):
         self.model, self.field = easy_model, field
 
     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):
         for value, label in self.field.choices:
@@ -79,7 +80,7 @@ class EasyChoice(object):
         self.value, self.label = value, label
 
     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):
         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
 
     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):
         val = smart_unicode(self.instance)
         if len(val) > DISPLAY_SIZE:
-            return val[:DISPLAY_SIZE] + u'...'
+            return val[:DISPLAY_SIZE] + '...'
         return val
 
     def __str__(self):
@@ -136,7 +137,7 @@ class EasyInstanceField(object):
         self.raw_value = getattr(instance.instance, field.name)
 
     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):
         """

+ 6 - 4
django/contrib/databrowse/plugins/calendars.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django import http
 from django.db import models
 from django.contrib.databrowse.datastructures import EasyModel
@@ -61,14 +63,14 @@ class CalendarPlugin(DatabrowsePlugin):
     def model_index_html(self, request, model, site):
         fields = self.field_dict(model)
         if not fields:
-            return u''
-        return mark_safe(u'<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()]))
+            return ''
+        return mark_safe('<p class="filter"><strong>View calendar by:</strong> %s</p>' % \
+            ', '.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):
         if isinstance(easy_instance_field.field, models.DateField):
             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(),
                 plugin_name, easy_instance_field.field.name,
                 str(d.year),

+ 6 - 4
django/contrib/databrowse/plugins/fieldchoices.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django import http
 from django.db import models
 from django.contrib.databrowse.datastructures import EasyModel
@@ -29,14 +31,14 @@ class FieldChoicePlugin(DatabrowsePlugin):
     def model_index_html(self, request, model, site):
         fields = self.field_dict(model)
         if not fields:
-            return u''
-        return mark_safe(u'<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()]))
+            return ''
+        return mark_safe('<p class="filter"><strong>View by:</strong> %s</p>' % \
+            ', '.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):
         if easy_instance_field.field in self.field_dict(easy_instance_field.model.model).values():
             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(),
                 plugin_name, easy_instance_field.field.name,
                 urllib.quote(field_value, safe='')))]

+ 3 - 1
django/contrib/databrowse/sites.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django import http
 from django.db import models
 from django.contrib.databrowse.datastructures import EasyModel
@@ -61,7 +63,7 @@ class ModelDatabrowse(object):
 
     def main_view(self, request):
         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', {
             'model': easy_model,
             'root_url': self.site.root_url,

+ 3 - 1
django/contrib/flatpages/models.py

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

+ 4 - 2
django/contrib/flatpages/tests/forms.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.conf import settings
 from django.contrib.flatpages.forms import FlatpageForm
 from django.contrib.flatpages.models import FlatPage
@@ -60,7 +62,7 @@ class FlatpageAdminFormTests(TestCase):
 
         self.assertEqual(
             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):
         """
@@ -92,5 +94,5 @@ class FlatpageAdminFormTests(TestCase):
 
         self.assertEqual(
             f.errors,
-            {'sites': [translation.ugettext(u'This field is required.')]})
+            {'sites': [translation.ugettext('This field is required.')]})
 

+ 30 - 28
django/contrib/formtools/tests/__init__.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 import os
 import re
 import warnings
@@ -41,7 +43,7 @@ class PreviewTests(TestCase):
         self.preview = preview.FormPreview(TestForm)
         input_template = '<input type="hidden" name="%s" value="%s" />'
         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):
         """
@@ -117,7 +119,7 @@ class PreviewTests(TestCase):
         """
         self.test_data.update({'stage':2})
         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):
             response = self.client.post('/preview/', self.test_data)
             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
         submit it (usually in textareas).
         """
-        f1 = HashTestForm({'name': u'joe', 'bio': u'Nothing notable.'})
-        f2 = HashTestForm({'name': u'  joe', 'bio': u'Nothing notable.  '})
+        f1 = HashTestForm({'name': 'joe', 'bio': 'Nothing notable.'})
+        f2 = HashTestForm({'name': '  joe', 'bio': 'Nothing notable.  '})
         hash1 = utils.form_hmac(f1)
         hash2 = utils.form_hmac(f2)
         self.assertEqual(hash1, hash2)
@@ -266,10 +268,10 @@ class WizardTests(TestCase):
         Form should advance if the hash is present and good, as calculated using
         current method.
         """
-        data = {"0-field": u"test",
-                "1-field": u"test2",
-                "hash_0": u"cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca",
-                "wizard_step": u"1"}
+        data = {"0-field": "test",
+                "1-field": "test2",
+                "hash_0": "cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca",
+                "wizard_step": "1"}
         response = self.client.post('/wizard1/', data)
         self.assertEqual(2, response.context['step0'])
 
@@ -291,18 +293,18 @@ class WizardTests(TestCase):
                     reached[0] = True
 
         wizard = WizardWithProcessStep([WizardPageOneForm])
-        data = {"0-field": u"test",
-                "1-field": u"test2",
-                "hash_0": u"cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca",
-                "wizard_step": u"1"}
+        data = {"0-field": "test",
+                "1-field": "test2",
+                "hash_0": "cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca",
+                "wizard_step": "1"}
         wizard(DummyRequest(POST=data))
         self.assertTrue(reached[0])
 
-        data = {"0-field": u"test",
-                "1-field": u"test2",
+        data = {"0-field": "test",
+                "1-field": "test2",
                 "hash_0": "cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca",
-                "hash_1": u"1e6f6315da42e62f33a30640ec7e007ad3fbf1a1",
-                "wizard_step": u"2"}
+                "hash_1": "1e6f6315da42e62f33a30640ec7e007ad3fbf1a1",
+                "wizard_step": "2"}
         self.assertRaises(http.Http404, wizard, DummyRequest(POST=data))
 
     def test_14498(self):
@@ -321,10 +323,10 @@ class WizardTests(TestCase):
         wizard = WizardWithProcessStep([WizardPageOneForm,
                                         WizardPageTwoForm,
                                         WizardPageThreeForm])
-        data = {"0-field": u"test",
-                "1-field": u"test2",
-                "hash_0": u"cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca",
-                "wizard_step": u"1"}
+        data = {"0-field": "test",
+                "1-field": "test2",
+                "hash_0": "cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca",
+                "wizard_step": "1"}
         wizard(DummyRequest(POST=data))
         self.assertTrue(reached[0])
 
@@ -345,10 +347,10 @@ class WizardTests(TestCase):
         wizard = Wizard([WizardPageOneForm,
                          WizardPageTwoForm])
 
-        data = {"0-field": u"test",
-                "1-field": u"test2",
-                "hash_0": u"cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca",
-                "wizard_step": u"1"}
+        data = {"0-field": "test",
+                "1-field": "test2",
+                "hash_0": "cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca",
+                "wizard_step": "1"}
         wizard(DummyRequest(POST=data))
         self.assertTrue(reached[0])
 
@@ -371,10 +373,10 @@ class WizardTests(TestCase):
         wizard = WizardWithProcessStep([WizardPageOneForm,
                                         WizardPageTwoForm,
                                         WizardPageThreeForm])
-        data = {"0-field": u"test",
-                "1-field": u"test2",
-                "hash_0": u"cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca",
-                "wizard_step": u"1"}
+        data = {"0-field": "test",
+                "1-field": "test2",
+                "hash_0": "cd13b1db3e8f55174bc5745a1b1a53408d4fd1ca",
+                "wizard_step": "1"}
         wizard(DummyRequest(POST=data))
         self.assertTrue(reached[0])
 

+ 6 - 4
django/contrib/formtools/tests/wizard/forms.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django import forms, http
 from django.conf import settings
 from django.test import TestCase
@@ -64,22 +66,22 @@ class TestWizard(WizardView):
 class FormTests(TestCase):
     def test_form_init(self):
         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)])
         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)])
         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):
         request = get_request()
 
         testform = TestWizard.as_view([Step1, Step2])
         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)])
         response, instance = testform(request)

+ 13 - 11
django/contrib/formtools/tests/wizard/namedwizardtests/tests.py

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

+ 14 - 12
django/contrib/formtools/tests/wizard/wizardtests/tests.py

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

+ 12 - 10
django/contrib/gis/feeds.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.contrib.syndication.views import Feed as BaseFeed
 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 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):
         """
@@ -23,10 +25,10 @@ class GeoFeedMixin(object):
         """
         if w3c_geo:
             lon, lat = coords[:2]
-            handler.addQuickElement(u'geo:lat', u'%f' % lat)
-            handler.addQuickElement(u'geo:lon', u'%f' % lon)
+            handler.addQuickElement('geo:lat', '%f' % lat)
+            handler.addQuickElement('geo:lon', '%f' % lon)
         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):
         """
@@ -57,7 +59,7 @@ class GeoFeedMixin(object):
                 # If a GeoRSS box was given via tuple.
                 if not box_coords is None:
                     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:
                 # Getting the lower-case geometry type.
                 gtype = str(geom.geom_type).lower()
@@ -68,10 +70,10 @@ class GeoFeedMixin(object):
                     # For formatting consistent w/the GeoRSS simple standard:
                     # http://georss.org/1.0#simple
                     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',):
                         # 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:
                         raise ValueError('Geometry type "%s" not supported.' % geom.geom_type)
 
@@ -79,7 +81,7 @@ class GeoFeedMixin(object):
 class GeoRSSFeed(Rss201rev2Feed, GeoFeedMixin):
     def rss_attributes(self):
         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
 
     def add_item_elements(self, handler, item):
@@ -93,7 +95,7 @@ class GeoRSSFeed(Rss201rev2Feed, GeoFeedMixin):
 class GeoAtom1Feed(Atom1Feed, GeoFeedMixin):
     def root_attributes(self):
         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
 
     def add_item_elements(self, handler, item):
@@ -107,7 +109,7 @@ class GeoAtom1Feed(Atom1Feed, GeoFeedMixin):
 class W3CGeoFeed(Rss201rev2Feed, GeoFeedMixin):
     def rss_attributes(self):
         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
 
     def add_item_elements(self, handler, item):

+ 6 - 4
django/contrib/gis/forms/fields.py

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

+ 1 - 1
django/contrib/gis/gdal/tests/test_envelope.py

@@ -23,7 +23,7 @@ class EnvelopeTest(unittest.TestCase):
         self.assertRaises(OGRException, Envelope, (0, 0, 5, 5, 3))
         self.assertRaises(OGRException, Envelope, ())
         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))
         try:
             Envelope(0, 0, 0, 0)

+ 5 - 3
django/contrib/gis/geoip/tests.py

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

+ 5 - 3
django/contrib/gis/sitemaps/views.py

@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+
 from django.http import HttpResponse, Http404
 from django.template import loader
 from django.contrib.sites.models import get_current_site
@@ -41,7 +43,7 @@ def sitemap(request, sitemaps, section=None):
     maps, urls = [], []
     if section is not None:
         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])
     else:
         maps = sitemaps.values()
@@ -55,9 +57,9 @@ def sitemap(request, sitemaps, section=None):
             else:
                 urls.extend(site.get_urls(page=page, site=current_site))
         except EmptyPage:
-            raise Http404(_(u"Page %s empty") % page)
+            raise Http404(_("Page %s empty") % page)
         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}))
     return HttpResponse(xml, content_type='application/xml')
 

+ 3 - 3
django/contrib/gis/tests/geoapp/test_feeds.py

@@ -44,7 +44,7 @@ class GeoFeedTest(TestCase):
         # Incrementing through the feeds.
         for feed in [feed1, feed2]:
             # 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]
             items = chan.getElementsByTagName('item')
             self.assertEqual(len(items), City.objects.count())
@@ -64,7 +64,7 @@ class GeoFeedTest(TestCase):
 
         for feed in [feed1, feed2]:
             # 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')
             self.assertEqual(len(entries), City.objects.count())
 
@@ -77,7 +77,7 @@ class GeoFeedTest(TestCase):
         doc = minidom.parseString(self.client.get('/feeds/w3cgeo1/').content)
         feed = doc.firstChild
         # 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]
         items = chan.getElementsByTagName('item')
         self.assertEqual(len(items), City.objects.count())

+ 5 - 5
django/contrib/gis/tests/geoapp/test_sitemaps.py

@@ -34,7 +34,7 @@ class GeoSitemapTest(TestCase):
         # Getting the geo index.
         doc = minidom.parseString(self.client.get('/sitemap.xml').content)
         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')))
 
     def test_geositemap_kml(self):
@@ -44,8 +44,8 @@ class GeoSitemapTest(TestCase):
 
             # Ensuring the right sitemaps namespaces are present.
             urlset = doc.firstChild
-            self.assertEqual(urlset.getAttribute(u'xmlns'), u'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'), 'http://www.sitemaps.org/schemas/sitemap/0.9')
+            self.assertEqual(urlset.getAttribute('xmlns:geo'), 'http://www.google.com/geo/schemas/sitemap/1.0')
 
             urls = urlset.getElementsByTagName('url')
             self.assertEqual(2, len(urls)) # Should only be 2 sitemaps.
@@ -84,8 +84,8 @@ class GeoSitemapTest(TestCase):
 
         # Ensuring the right sitemaps namespaces are present.
         urlset = doc.firstChild
-        self.assertEqual(urlset.getAttribute(u'xmlns'), u'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'), 'http://www.sitemaps.org/schemas/sitemap/0.9')
+        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.
         urls = urlset.getElementsByTagName('url')

+ 4 - 2
django/contrib/gis/views.py

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

+ 14 - 13
django/contrib/humanize/templatetags/humanize.py

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

+ 6 - 5
django/contrib/humanize/tests.py

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

+ 25 - 24
django/contrib/localflavor/ar/ar_provinces.py

@@ -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
 when explicitly needed.
 """
+from __future__ import unicode_literals
 
 PROVINCE_CHOICES = (
-    ('B', u'Buenos Aires'),
-    ('K', u'Catamarca'),
-    ('H', u'Chaco'),
-    ('U', u'Chubut'),
-    ('C', u'Ciudad Autónoma de Buenos Aires'),
-    ('X', u'Córdoba'),
-    ('W', u'Corrientes'),
-    ('E', u'Entre Ríos'),
-    ('P', u'Formosa'),
-    ('Y', u'Jujuy'),
-    ('L', u'La Pampa'),
-    ('F', u'La Rioja'),
-    ('M', u'Mendoza'),
-    ('N', u'Misiones'),
-    ('Q', u'Neuquén'),
-    ('R', u'Río Negro'),
-    ('A', u'Salta'),
-    ('J', u'San Juan'),
-    ('D', u'San Luis'),
-    ('Z', u'Santa Cruz'),
-    ('S', u'Santa Fe'),
-    ('G', u'Santiago del Estero'),
-    ('V', u'Tierra del Fuego, Antártida e Islas del Atlántico Sur'),
-    ('T', u'Tucumán'),
+    ('B', 'Buenos Aires'),
+    ('K', 'Catamarca'),
+    ('H', 'Chaco'),
+    ('U', 'Chubut'),
+    ('C', 'Ciudad Autónoma de Buenos Aires'),
+    ('X', 'Córdoba'),
+    ('W', 'Corrientes'),
+    ('E', 'Entre Ríos'),
+    ('P', 'Formosa'),
+    ('Y', 'Jujuy'),
+    ('L', 'La Pampa'),
+    ('F', 'La Rioja'),
+    ('M', 'Mendoza'),
+    ('N', 'Misiones'),
+    ('Q', 'Neuquén'),
+    ('R', 'Río Negro'),
+    ('A', 'Salta'),
+    ('J', 'San Juan'),
+    ('D', 'San Luis'),
+    ('Z', 'Santa Cruz'),
+    ('S', 'Santa Fe'),
+    ('G', 'Santiago del Estero'),
+    ('V', 'Tierra del Fuego, Antártida e Islas del Atlántico Sur'),
+    ('T', 'Tucumán'),
 )

+ 6 - 6
django/contrib/localflavor/ar/forms.py

@@ -3,7 +3,7 @@
 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.core.validators import EMPTY_VALUES
@@ -37,11 +37,11 @@ class ARPostalCodeField(RegexField):
     def clean(self, value):
         value = super(ARPostalCodeField, self).clean(value)
         if value in EMPTY_VALUES:
-            return u''
+            return ''
         if len(value) not in (4, 8):
             raise ValidationError(self.error_messages['invalid'])
         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
 
 class ARDNIField(CharField):
@@ -63,7 +63,7 @@ class ARDNIField(CharField):
         """
         value = super(ARDNIField, self).clean(value)
         if value in EMPTY_VALUES:
-            return u''
+            return ''
         if not value.isdigit():
             value = value.replace('.', '')
         if not value.isdigit():
@@ -94,7 +94,7 @@ class ARCUITField(RegexField):
         """
         value = super(ARCUITField, self).clean(value)
         if value in EMPTY_VALUES:
-            return u''
+            return ''
         value, cd = self._canon(value)
         if self._calc_cd(value) != cd:
             raise ValidationError(self.error_messages['checksum'])
@@ -113,5 +113,5 @@ class ARCUITField(RegexField):
         if check_digit == None:
             check_digit = 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)
 

+ 4 - 4
django/contrib/localflavor/at/forms.py

@@ -1,7 +1,7 @@
 """
 AT-specific Form helpers
 """
-
+from __future__ import unicode_literals
 import re
 
 from django.core.validators import EMPTY_VALUES
@@ -47,13 +47,13 @@ class ATSocialSecurityNumberField(Field):
     """
 
     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):
         value = super(ATSocialSecurityNumberField, self).clean(value)
         if value in EMPTY_VALUES:
-            return u""
+            return ""
         if not re_ssn.search(value):
             raise ValidationError(self.error_messages['invalid'])
         sqnr, date = value.split(" ")
@@ -66,4 +66,4 @@ class ATSocialSecurityNumberField(Field):
         res = res % 11
         if res != int(check):
            raise ValidationError(self.error_messages['invalid'])
-        return u'%s%s %s'%(sqnr, check, date,)
+        return '%s%s %s'%(sqnr, check, date,)

+ 4 - 4
django/contrib/localflavor/au/forms.py

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

+ 12 - 11
django/contrib/localflavor/br/br_states.py

@@ -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
 when explicitly needed.
 """
+from __future__ import unicode_literals
 
 STATE_CHOICES = (
     ('AC', 'Acre'),
     ('AL', 'Alagoas'),
-    ('AP', u'Amapá'),
+    ('AP', 'Amapá'),
     ('AM', 'Amazonas'),
     ('BA', 'Bahia'),
-    ('CE', u'Ceará'),
+    ('CE', 'Ceará'),
     ('DF', 'Distrito Federal'),
-    ('ES', u'Espírito Santo'),
-    ('GO', u'Goiás'),
-    ('MA', u'Maranhão'),
+    ('ES', 'Espírito Santo'),
+    ('GO', 'Goiás'),
+    ('MA', 'Maranhão'),
     ('MT', 'Mato Grosso'),
     ('MS', 'Mato Grosso do Sul'),
     ('MG', 'Minas Gerais'),
-    ('PA', u'Pará'),
-    ('PB', u'Paraíba'),
-    ('PR', u'Paraná'),
+    ('PA', 'Pará'),
+    ('PB', 'Paraíba'),
+    ('PR', 'Paraná'),
     ('PE', 'Pernambuco'),
-    ('PI', u'Piauí'),
+    ('PI', 'Piauí'),
     ('RJ', 'Rio de Janeiro'),
     ('RN', 'Rio Grande do Norte'),
     ('RS', 'Rio Grande do Sul'),
-    ('RO', u'Rondônia'),
+    ('RO', 'Rondônia'),
     ('RR', 'Roraima'),
     ('SC', 'Santa Catarina'),
-    ('SP', u'São Paulo'),
+    ('SP', 'São Paulo'),
     ('SE', 'Sergipe'),
     ('TO', 'Tocantins'),
 )

+ 8 - 8
django/contrib/localflavor/br/forms.py

@@ -3,7 +3,7 @@
 BR-specific Form helpers
 """
 
-from __future__ import absolute_import
+from __future__ import absolute_import, unicode_literals
 
 import re
 
@@ -34,11 +34,11 @@ class BRPhoneNumberField(Field):
     def clean(self, value):
         super(BRPhoneNumberField, self).clean(value)
         if value in EMPTY_VALUES:
-            return u''
+            return ''
         value = re.sub('(\(|\)|\s+)', '', smart_unicode(value))
         m = phone_digits_re.search(value)
         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'])
 
 class BRStateSelect(Select):
@@ -55,7 +55,7 @@ class BRStateChoiceField(Field):
     """
     widget = Select
     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,
@@ -67,9 +67,9 @@ class BRStateChoiceField(Field):
     def clean(self, value):
         value = super(BRStateChoiceField, self).clean(value)
         if value in EMPTY_VALUES:
-            value = u''
+            value = ''
         value = smart_unicode(value)
-        if value == u'':
+        if value == '':
             return value
         valid_values = set([smart_unicode(k) for k, v in self.widget.choices])
         if value not in valid_values:
@@ -105,7 +105,7 @@ class BRCPFField(CharField):
         """
         value = super(BRCPFField, self).clean(value)
         if value in EMPTY_VALUES:
-            return u''
+            return ''
         orig_value = value[:]
         if not value.isdigit():
             value = re.sub("[-\.]", "", value)
@@ -142,7 +142,7 @@ class BRCNPJField(Field):
         """
         value = super(BRCNPJField, self).clean(value)
         if value in EMPTY_VALUES:
-            return u''
+            return ''
         orig_value = value[:]
         if not value.isdigit():
             value = re.sub("[-/\.]", "", value)

+ 11 - 11
django/contrib/localflavor/ca/forms.py

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

+ 5 - 5
django/contrib/localflavor/ch/forms.py

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

+ 16 - 15
django/contrib/localflavor/cl/cl_regions.py

@@ -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
 when explicitly needed.
 """
+from __future__ import unicode_literals
 
 REGION_CHOICES = (
-    ('RM',  u'Región Metropolitana de Santiago'),
-    ('I',   u'Región de Tarapacá'),
-    ('II',  u'Región de Antofagasta'),
-    ('III', u'Región de Atacama'),
-    ('IV',  u'Región de Coquimbo'),
-    ('V',   u'Región de Valparaíso'),
-    ('VI',  u'Región del Libertador Bernardo O\'Higgins'),
-    ('VII', u'Región del Maule'),
-    ('VIII',u'Región del Bío Bío'),
-    ('IX',  u'Región de la Araucanía'),
-    ('X',   u'Región de los Lagos'),
-    ('XI',  u'Región de Aysén del General Carlos Ibáñez del Campo'),
-    ('XII', u'Región de Magallanes y la Antártica Chilena'),
-    ('XIV', u'Región de Los Ríos'),
-    ('XV',  u'Región de Arica-Parinacota'),
+    ('RM',  'Región Metropolitana de Santiago'),
+    ('I',   'Región de Tarapacá'),
+    ('II',  'Región de Antofagasta'),
+    ('III', 'Región de Atacama'),
+    ('IV',  'Región de Coquimbo'),
+    ('V',   'Región de Valparaíso'),
+    ('VI',  'Región del Libertador Bernardo O\'Higgins'),
+    ('VII', 'Región del Maule'),
+    ('VIII','Región del Bío Bío'),
+    ('IX',  'Región de la Araucanía'),
+    ('X',   'Región de los Lagos'),
+    ('XI',  'Región de Aysén del General Carlos Ibáñez del Campo'),
+    ('XII', 'Región de Magallanes y la Antártica Chilena'),
+    ('XIV', 'Región de Los Ríos'),
+    ('XV',  'Región de Arica-Parinacota'),
 )

+ 5 - 5
django/contrib/localflavor/cl/forms.py

@@ -2,15 +2,15 @@
 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.forms import ValidationError
 from django.forms.fields import RegexField, Select
 from django.utils.translation import ugettext_lazy as _
 from django.utils.encoding import smart_unicode
 
+from .cl_regions import REGION_CHOICES
 
 class CLRegionSelect(Select):
     """
@@ -50,7 +50,7 @@ class CLRutField(RegexField):
         """
         super(CLRutField, self).clean(value)
         if value in EMPTY_VALUES:
-            return u''
+            return ''
         rut, verificador = self._canonify(value)
         if self._algorithm(rut) == verificador:
             return self._format(rut, verificador)
@@ -68,7 +68,7 @@ class CLRutField(RegexField):
             multi += 1
             if multi == 8:
                 multi = 2
-        return u'0123456789K0'[11 - suma % 11]
+        return '0123456789K0'[11 - suma % 11]
 
     def _canonify(self, rut):
         """
@@ -93,5 +93,5 @@ class CLRutField(RegexField):
             else:
                 new_dot = pos - 3
             code = code[:new_dot] + '.' + code[new_dot:]
-        return u'%s-%s' % (code, verifier)
+        return '%s-%s' % (code, verifier)
 

+ 35 - 35
django/contrib/localflavor/cn/cn_provinces.py

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

+ 10 - 10
django/contrib/localflavor/cn/forms.py

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

+ 34 - 33
django/contrib/localflavor/co/co_departments.py

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

+ 10 - 10
django/contrib/localflavor/cz/forms.py

@@ -2,7 +2,7 @@
 Czech-specific form helpers
 """
 
-from __future__ import absolute_import
+from __future__ import absolute_import, unicode_literals
 
 import re
 
@@ -29,7 +29,7 @@ class CZPostalCodeField(RegexField):
     Valid form is XXXXX or XXX XX, where X represents integer.
     """
     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):
@@ -49,15 +49,15 @@ class CZBirthNumberField(Field):
     Czech birth number field.
     """
     default_error_messages = {
-        'invalid_format': _(u'Enter a birth number in the format XXXXXX/XXXX or XXXXXXXXXX.'),
-        'invalid': _(u'Enter a valid birth number.'),
+        'invalid_format': _('Enter a birth number in the format XXXXXX/XXXX or XXXXXXXXXX.'),
+        'invalid': _('Enter a valid birth number.'),
     }
 
     def clean(self, value, gender=None):
         super(CZBirthNumberField, self).clean(value)
 
         if value in EMPTY_VALUES:
-            return u''
+            return ''
 
         match = re.match(birth_number, value)
         if not match:
@@ -67,7 +67,7 @@ class CZBirthNumberField(Field):
 
         # Three digits for verification number were used until 1. january 1954
         if len(id) == 3:
-            return u'%s' % value
+            return '%s' % value
 
         # 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),
@@ -90,7 +90,7 @@ class CZBirthNumberField(Field):
         modulo = int(birth + id[:3]) % 11
 
         if (modulo == int(id[-1])) or (modulo == 10 and id[-1] == '0'):
-            return u'%s' % value
+            return '%s' % value
         else:
             raise ValidationError(self.error_messages['invalid'])
 
@@ -99,14 +99,14 @@ class CZICNumberField(Field):
     Czech IC number field.
     """
     default_error_messages = {
-        'invalid': _(u'Enter a valid IC number.'),
+        'invalid': _('Enter a valid IC number.'),
     }
 
     def clean(self, value):
         super(CZICNumberField, self).clean(value)
 
         if value in EMPTY_VALUES:
-            return u''
+            return ''
 
         match = re.match(ic_number, value)
         if not match:
@@ -130,7 +130,7 @@ class CZICNumberField(Field):
         if (not remainder % 10 and check == 1) or \
         (remainder == 1 and check == 0) or \
         (check == (11 - remainder)):
-            return u'%s' % value
+            return '%s' % value
 
         raise ValidationError(self.error_messages['invalid'])
 

+ 4 - 4
django/contrib/localflavor/de/forms.py

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

+ 3 - 1
django/contrib/localflavor/de_CH/formats.py

@@ -4,6 +4,8 @@
 
 # The *_FORMAT strings use the Django date format syntax,
 # see http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
+from __future__ import unicode_literals
+
 DATE_FORMAT = 'j. F Y'
 TIME_FORMAT = '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
 # (in German) and the documentation
 DECIMAL_SEPARATOR = ','
-THOUSAND_SEPARATOR = u'\xa0' # non-breaking space
+THOUSAND_SEPARATOR = '\xa0' # non-breaking space
 NUMBER_GROUPING = 3

+ 25 - 24
django/contrib/localflavor/ec/ec_provinces.py

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

+ 2 - 2
django/contrib/localflavor/es/forms.py

@@ -91,7 +91,7 @@ class ESIdentityCardNumberField(RegexField):
     def clean(self, value):
         super(ESIdentityCardNumberField, self).clean(value)
         if value in EMPTY_VALUES:
-            return u''
+            return ''
         nif_get_checksum = lambda d: self.nif_control[int(d)%23]
 
         value = value.upper().replace(' ', '').replace('-', '')
@@ -157,7 +157,7 @@ class ESCCCField(RegexField):
     def clean(self, value):
         super(ESCCCField, self).clean(value)
         if value in EMPTY_VALUES:
-            return u''
+            return ''
         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)
         entity, office, checksum, account = m.groups()

+ 345 - 343
django/contrib/localflavor/fi/fi_municipalities.py

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

+ 3 - 3
django/contrib/localflavor/fi/forms.py

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

+ 3 - 3
django/contrib/localflavor/fr/forms.py

@@ -1,7 +1,7 @@
 """
 FR-specific Form helpers
 """
-from __future__ import absolute_import
+from __future__ import absolute_import, unicode_literals
 
 import re
 
@@ -38,11 +38,11 @@ class FRPhoneNumberField(Field):
     def clean(self, value):
         super(FRPhoneNumberField, self).clean(value)
         if value in EMPTY_VALUES:
-            return u''
+            return ''
         value = re.sub('(\.|\s)', '', smart_unicode(value))
         m = phone_digits_re.search(value)
         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'])
 
 class FRDepartmentSelect(Select):

+ 110 - 109
django/contrib/localflavor/fr/fr_department.py

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

+ 3 - 3
django/contrib/localflavor/gb/forms.py

@@ -2,7 +2,7 @@
 GB-specific Form helpers
 """
 
-from __future__ import absolute_import
+from __future__ import absolute_import, unicode_literals
 
 import re
 
@@ -22,7 +22,7 @@ class GBPostcodeField(CharField):
     The value is uppercased and a space added in the correct place, if required.
     """
     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])'
     incode_pattern = '[0-9][ABD-HJLNP-UW-Z]{2}'
@@ -31,7 +31,7 @@ class GBPostcodeField(CharField):
 
     def clean(self, value):
         value = super(GBPostcodeField, self).clean(value)
-        if value == u'':
+        if value == '':
             return value
         postcode = value.upper().strip()
         # Put a single space before the incode (second part).

+ 3 - 3
django/contrib/localflavor/hk/forms.py

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

+ 11 - 11
django/contrib/localflavor/hr/forms.py

@@ -2,7 +2,7 @@
 """
 HR-specific Form helpers
 """
-from __future__ import absolute_import
+from __future__ import absolute_import, unicode_literals
 
 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})' + \
             r'(?P<rr>\d{2})(?P<bbb>\d{3})(?P<k>\d{1})$')
 oib_re = re.compile(r'^\d{11}$')
-plate_re = re.compile(ur'^(?P<prefix>[A-ZČŠŽ]{2})' + \
-            ur'(?P<number>\d{3,4})(?P<suffix>[ABCDEFGHIJKLMNOPRSTUVZ]{1,2})$')
+plate_re = re.compile(r'^(?P<prefix>[A-ZČŠŽ]{2})' + \
+            r'(?P<number>\d{3,4})(?P<suffix>[ABCDEFGHIJKLMNOPRSTUVZ]{1,2})$')
 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})$')
 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):
         super(HRJMBGField, self).clean(value)
         if value in EMPTY_VALUES:
-            return u''
+            return ''
 
         value = value.strip()
 
@@ -110,7 +110,7 @@ class HRJMBGField(Field):
         if not str(m) == k:
             raise ValidationError(self.error_messages['invalid'])
 
-        return u'%s' % (value, )
+        return '%s' % (value, )
 
 
 class HROIBField(RegexField):
@@ -130,7 +130,7 @@ class HROIBField(RegexField):
     def clean(self, value):
         super(HROIBField, self).clean(value)
         if value in EMPTY_VALUES:
-            return u''
+            return ''
 
         return '%s' % (value, )
 
@@ -157,7 +157,7 @@ class HRLicensePlateField(Field):
     def clean(self, value):
         super(HRLicensePlateField, self).clean(value)
         if value in EMPTY_VALUES:
-            return u''
+            return ''
 
         value = re.sub(r'[\s\-]+', '', smart_unicode(value.strip())).upper()
 
@@ -175,7 +175,7 @@ class HRLicensePlateField(Field):
         if int(number) == 0:
             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):
@@ -193,7 +193,7 @@ class HRPostalCodeField(Field):
     def clean(self, value):
         super(HRPostalCodeField, self).clean(value)
         if value in EMPTY_VALUES:
-            return u''
+            return ''
 
         value = value.strip()
         if not postal_code_re.search(value):
@@ -223,7 +223,7 @@ class HRPhoneNumberField(Field):
     def clean(self, value):
         super(HRPhoneNumberField, self).clean(value)
         if value in EMPTY_VALUES:
-            return u''
+            return ''
 
         value = re.sub(r'[\-\s\(\)]', '', smart_unicode(value))
 
@@ -262,7 +262,7 @@ class HRJMBAGField(Field):
     def clean(self, value):
         super(HRJMBAGField, self).clean(value)
         if value in EMPTY_VALUES:
-            return u''
+            return ''
 
         value = re.sub(r'[\-\s]', '', value.strip())
 

+ 28 - 26
django/contrib/localflavor/hr/hr_choices.py

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

+ 6 - 6
django/contrib/localflavor/id/forms.py

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

+ 4 - 3
django/contrib/localflavor/il/forms.py

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

+ 7 - 7
django/contrib/localflavor/in_/forms.py

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

+ 4 - 4
django/contrib/localflavor/is_/forms.py

@@ -2,7 +2,7 @@
 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.core.validators import EMPTY_VALUES
@@ -20,7 +20,7 @@ class ISIdNumberField(RegexField):
     """
     default_error_messages = {
         '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):
@@ -31,7 +31,7 @@ class ISIdNumberField(RegexField):
         value = super(ISIdNumberField, self).clean(value)
 
         if value in EMPTY_VALUES:
-            return u''
+            return ''
 
         value = self._canonify(value)
         if self._validate(value):
@@ -73,7 +73,7 @@ class ISPhoneNumberField(RegexField):
         value = super(ISPhoneNumberField, self).clean(value)
 
         if value in EMPTY_VALUES:
-            return u''
+            return ''
 
         return value.replace('-', '').replace(' ', '')
 

+ 148 - 147
django/contrib/localflavor/is_/is_postalcodes.py

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

+ 6 - 6
django/contrib/localflavor/it/forms.py

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

+ 2 - 1
django/contrib/localflavor/it/it_province.py

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

+ 2 - 1
django/contrib/localflavor/it/it_region.py

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

+ 2 - 2
django/contrib/localflavor/it/util.py

@@ -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):
     "Calculate Italian social security number check digit."
@@ -34,7 +34,7 @@ def ssn_check_digit(value):
 
 def vat_number_check_digit(vat_number):
     "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
     for i in range(0, 10, 2):
         total += int(normalized_vat_number[i])

+ 3 - 1
django/contrib/localflavor/kw/forms.py

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

+ 7 - 7
django/contrib/localflavor/mk/forms.py

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

+ 86 - 84
django/contrib/localflavor/mk/mk_choices.py

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

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