From 60cfd45107d33da6f655efe566d29190525c8f33 Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Fri, 8 May 2009 09:51:05 +0000 Subject: [PATCH] Fixed #10335: handle system locals unknown to Python in timezone name handling. Thanks, mitsuhiko. git-svn-id: http://code.djangoproject.com/svn/django/trunk@10703 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/utils/encoding.py | 11 +++++++++++ django/utils/tzinfo.py | 14 ++++---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/django/utils/encoding.py b/django/utils/encoding.py index 9388d67f4c8..335f1a15511 100644 --- a/django/utils/encoding.py +++ b/django/utils/encoding.py @@ -1,6 +1,8 @@ import types import urllib +import locale import datetime +import codecs from django.utils.functional import Promise @@ -136,3 +138,12 @@ def iri_to_uri(iri): return iri return urllib.quote(smart_str(iri), safe='/#%[]=:;$&()+,!?*') + +# The encoding of the default system locale but falls back to the +# given fallback encoding if the encoding is unsupported by python or could +# not be determined. See tickets #10335 and #5846 +try: + DEFAULT_LOCALE_ENCODING = locale.getdefaultlocale()[1] or 'ascii' + codecs.lookup(DEFAULT_LOCALE_ENCODING) +except: + DEFAULT_LOCALE_ENCODING = 'ascii' diff --git a/django/utils/tzinfo.py b/django/utils/tzinfo.py index 58cfcd5d88a..dc583465b2f 100644 --- a/django/utils/tzinfo.py +++ b/django/utils/tzinfo.py @@ -1,15 +1,8 @@ "Implementation of tzinfo classes for use with datetime.datetime." -import locale import time from datetime import timedelta, tzinfo -from django.utils.encoding import smart_unicode - -try: - DEFAULT_ENCODING = locale.getdefaultlocale()[1] or 'ascii' -except: - # Any problems at all determining the locale and we fallback. See #5846. - DEFAULT_ENCODING = 'ascii' +from django.utils.encoding import smart_unicode, smart_str, DEFAULT_LOCALE_ENCODING class FixedOffset(tzinfo): "Fixed offset in minutes east from UTC." @@ -41,7 +34,7 @@ class LocalTimezone(tzinfo): self._tzname = self.tzname(dt) def __repr__(self): - return self._tzname + return smart_str(self._tzname) def utcoffset(self, dt): if self._isdst(dt): @@ -57,7 +50,8 @@ class LocalTimezone(tzinfo): def tzname(self, dt): try: - return smart_unicode(time.tzname[self._isdst(dt)], DEFAULT_ENCODING) + return smart_unicode(time.tzname[self._isdst(dt)], + DEFAULT_LOCALE_ENCODING) except UnicodeDecodeError: return None