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
This commit is contained in:
Jacob Kaplan-Moss 2009-05-08 09:51:05 +00:00
parent 59507753c7
commit 60cfd45107
2 changed files with 15 additions and 10 deletions

View File

@ -1,6 +1,8 @@
import types import types
import urllib import urllib
import locale
import datetime import datetime
import codecs
from django.utils.functional import Promise from django.utils.functional import Promise
@ -136,3 +138,12 @@ def iri_to_uri(iri):
return iri return iri
return urllib.quote(smart_str(iri), safe='/#%[]=:;$&()+,!?*') 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'

View File

@ -1,15 +1,8 @@
"Implementation of tzinfo classes for use with datetime.datetime." "Implementation of tzinfo classes for use with datetime.datetime."
import locale
import time import time
from datetime import timedelta, tzinfo from datetime import timedelta, tzinfo
from django.utils.encoding import smart_unicode from django.utils.encoding import smart_unicode, smart_str, DEFAULT_LOCALE_ENCODING
try:
DEFAULT_ENCODING = locale.getdefaultlocale()[1] or 'ascii'
except:
# Any problems at all determining the locale and we fallback. See #5846.
DEFAULT_ENCODING = 'ascii'
class FixedOffset(tzinfo): class FixedOffset(tzinfo):
"Fixed offset in minutes east from UTC." "Fixed offset in minutes east from UTC."
@ -41,7 +34,7 @@ class LocalTimezone(tzinfo):
self._tzname = self.tzname(dt) self._tzname = self.tzname(dt)
def __repr__(self): def __repr__(self):
return self._tzname return smart_str(self._tzname)
def utcoffset(self, dt): def utcoffset(self, dt):
if self._isdst(dt): if self._isdst(dt):
@ -57,7 +50,8 @@ class LocalTimezone(tzinfo):
def tzname(self, dt): def tzname(self, dt):
try: try:
return smart_unicode(time.tzname[self._isdst(dt)], DEFAULT_ENCODING) return smart_unicode(time.tzname[self._isdst(dt)],
DEFAULT_LOCALE_ENCODING)
except UnicodeDecodeError: except UnicodeDecodeError:
return None return None