summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Kaplan-Moss <jacob@jacobian.org>2009-05-08 09:51:05 +0000
committerJacob Kaplan-Moss <jacob@jacobian.org>2009-05-08 09:51:05 +0000
commit60cfd45107d33da6f655efe566d29190525c8f33 (patch)
treeadef1bc71efa8c38cb2374bfeeb798f7909fbc1a
parent59507753c7f098e98000459b2371becf0da18ff7 (diff)
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
-rw-r--r--django/utils/encoding.py11
-rw-r--r--django/utils/tzinfo.py14
2 files changed, 15 insertions, 10 deletions
diff --git a/django/utils/encoding.py b/django/utils/encoding.py
index 9388d67f4c..335f1a1551 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 58cfcd5d88..dc583465b2 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