Replaced some smart_xxx by force_xxx equivalent

smart_str/smart_text should only be used when a potential lazy
string should be preserved in the result of the function call.
This commit is contained in:
Claude Paroz 2012-08-29 22:40:51 +02:00
parent 36df198e4b
commit ae88e73fa6
17 changed files with 56 additions and 56 deletions

View File

@ -7,7 +7,7 @@ from __future__ import unicode_literals
from django.db import models from django.db import models
from django.utils import formats from django.utils import formats
from django.utils.text import capfirst from django.utils.text import capfirst
from django.utils.encoding import smart_text, smart_str, iri_to_uri from django.utils.encoding import smart_text, force_str, iri_to_uri
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from django.utils.encoding import python_2_unicode_compatible from django.utils.encoding import python_2_unicode_compatible
@ -23,7 +23,7 @@ class EasyModel(object):
self.verbose_name_plural = model._meta.verbose_name_plural self.verbose_name_plural = model._meta.verbose_name_plural
def __repr__(self): def __repr__(self):
return smart_str('<EasyModel for %s>' % self.model._meta.object_name) return force_str('<EasyModel for %s>' % self.model._meta.object_name)
def model_databrowse(self): def model_databrowse(self):
"Returns the ModelDatabrowse class for this model." "Returns the ModelDatabrowse class for this model."
@ -62,7 +62,7 @@ class EasyField(object):
self.model, self.field = easy_model, field self.model, self.field = easy_model, field
def __repr__(self): def __repr__(self):
return smart_str('<EasyField for %s.%s>' % (self.model.model._meta.object_name, self.field.name)) return force_str('<EasyField for %s.%s>' % (self.model.model._meta.object_name, self.field.name))
def choices(self): def choices(self):
for value, label in self.field.choices: for value, label in self.field.choices:
@ -80,7 +80,7 @@ class EasyChoice(object):
self.value, self.label = value, label self.value, self.label = value, label
def __repr__(self): def __repr__(self):
return smart_str('<EasyChoice for %s.%s>' % (self.model.model._meta.object_name, self.field.name)) return force_str('<EasyChoice for %s.%s>' % (self.model.model._meta.object_name, self.field.name))
def url(self): def url(self):
return '%s%s/%s/%s/%s/' % (self.model.site.root_url, self.model.model._meta.app_label, self.model.model._meta.module_name, self.field.field.name, iri_to_uri(self.value)) return '%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))
@ -91,7 +91,7 @@ class EasyInstance(object):
self.model, self.instance = easy_model, instance self.model, self.instance = easy_model, instance
def __repr__(self): def __repr__(self):
return smart_str('<EasyInstance for %s (%s)>' % (self.model.model._meta.object_name, self.instance._get_pk_val())) return force_str('<EasyInstance for %s (%s)>' % (self.model.model._meta.object_name, self.instance._get_pk_val()))
def __str__(self): def __str__(self):
val = smart_text(self.instance) val = smart_text(self.instance)
@ -135,7 +135,7 @@ class EasyInstanceField(object):
self.raw_value = getattr(instance.instance, field.name) self.raw_value = getattr(instance.instance, field.name)
def __repr__(self): def __repr__(self):
return smart_str('<EasyInstanceField for %s.%s>' % (self.model.model._meta.object_name, self.field.name)) return force_str('<EasyInstanceField for %s.%s>' % (self.model.model._meta.object_name, self.field.name))
def values(self): def values(self):
""" """

View File

@ -6,7 +6,7 @@ from threading import local
from django.core.cache.backends.base import BaseCache, InvalidCacheBackendError from django.core.cache.backends.base import BaseCache, InvalidCacheBackendError
from django.utils import six from django.utils import six
from django.utils.encoding import smart_str from django.utils.encoding import force_str
class BaseMemcachedCache(BaseCache): class BaseMemcachedCache(BaseCache):
def __init__(self, server, params, library, value_not_found_exception): def __init__(self, server, params, library, value_not_found_exception):
@ -53,7 +53,7 @@ class BaseMemcachedCache(BaseCache):
def make_key(self, key, version=None): def make_key(self, key, version=None):
# Python 2 memcache requires the key to be a byte string. # Python 2 memcache requires the key to be a byte string.
return smart_str(super(BaseMemcachedCache, self).make_key(key, version)) return force_str(super(BaseMemcachedCache, self).make_key(key, version))
def add(self, key, value, timeout=0, version=None): def add(self, key, value, timeout=0, version=None):
key = self.make_key(key, version=version) key = self.make_key(key, version=version)

View File

@ -8,7 +8,7 @@ from io import BytesIO
from django.conf import settings from django.conf import settings
from django.core.files.base import File from django.core.files.base import File
from django.core.files import temp as tempfile from django.core.files import temp as tempfile
from django.utils.encoding import smart_str from django.utils.encoding import force_str
__all__ = ('UploadedFile', 'TemporaryUploadedFile', 'InMemoryUploadedFile', __all__ = ('UploadedFile', 'TemporaryUploadedFile', 'InMemoryUploadedFile',
'SimpleUploadedFile') 'SimpleUploadedFile')
@ -30,7 +30,7 @@ class UploadedFile(File):
self.charset = charset self.charset = charset
def __repr__(self): def __repr__(self):
return smart_str("<%s: %s (%s)>" % ( return force_str("<%s: %s (%s)>" % (
self.__class__.__name__, self.name, self.content_type)) self.__class__.__name__, self.name, self.content_type))
def _get_name(self): def _get_name(self):

View File

@ -9,7 +9,7 @@ from django.core import signals
from django.core.handlers import base from django.core.handlers import base
from django.core.urlresolvers import set_script_prefix from django.core.urlresolvers import set_script_prefix
from django.utils import datastructures from django.utils import datastructures
from django.utils.encoding import force_text, smart_str, iri_to_uri from django.utils.encoding import force_str, force_text, iri_to_uri
from django.utils.log import getLogger from django.utils.log import getLogger
logger = getLogger('django.request') logger = getLogger('django.request')
@ -246,5 +246,5 @@ class WSGIHandler(base.BaseHandler):
response_headers = [(str(k), str(v)) for k, v in response.items()] response_headers = [(str(k), str(v)) for k, v in response.items()]
for c in response.cookies.values(): for c in response.cookies.values():
response_headers.append((str('Set-Cookie'), str(c.output(header='')))) response_headers.append((str('Set-Cookie'), str(c.output(header=''))))
start_response(smart_str(status), response_headers) start_response(force_str(status), response_headers)
return response return response

View File

@ -12,7 +12,7 @@ import traceback
import django import django
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.core.management.color import color_style from django.core.management.color import color_style
from django.utils.encoding import smart_str from django.utils.encoding import force_str
from django.utils.six import StringIO from django.utils.six import StringIO
@ -65,7 +65,7 @@ class OutputWrapper(object):
msg += ending msg += ending
style_func = [f for f in (style_func, self.style_func, lambda x:x) style_func = [f for f in (style_func, self.style_func, lambda x:x)
if f is not None][0] if f is not None][0]
self._out.write(smart_str(style_func(msg))) self._out.write(force_str(style_func(msg)))
class BaseCommand(object): class BaseCommand(object):

View File

@ -1,7 +1,7 @@
import sys import sys
from django.core.management.color import color_style from django.core.management.color import color_style
from django.utils.encoding import smart_str from django.utils.encoding import force_str
from django.utils.itercompat import is_iterable from django.utils.itercompat import is_iterable
from django.utils import six from django.utils import six
@ -13,7 +13,7 @@ class ModelErrorCollection:
def add(self, context, error): def add(self, context, error):
self.errors.append((context, error)) self.errors.append((context, error))
self.outfile.write(self.style.ERROR(smart_str("%s: %s\n" % (context, error)))) self.outfile.write(self.style.ERROR(force_str("%s: %s\n" % (context, error))))
def get_validation_errors(outfile, app=None): def get_validation_errors(outfile, app=None):
""" """

View File

@ -14,7 +14,7 @@ from threading import local
from django.http import Http404 from django.http import Http404
from django.core.exceptions import ImproperlyConfigured, ViewDoesNotExist from django.core.exceptions import ImproperlyConfigured, ViewDoesNotExist
from django.utils.datastructures import MultiValueDict from django.utils.datastructures import MultiValueDict
from django.utils.encoding import iri_to_uri, force_text, smart_str from django.utils.encoding import force_str, force_text, iri_to_uri
from django.utils.functional import memoize, lazy from django.utils.functional import memoize, lazy
from django.utils.importlib import import_module from django.utils.importlib import import_module
from django.utils.module_loading import module_has_submodule from django.utils.module_loading import module_has_submodule
@ -195,7 +195,7 @@ class RegexURLPattern(LocaleRegexProvider):
self.name = name self.name = name
def __repr__(self): def __repr__(self):
return smart_str('<%s %s %s>' % (self.__class__.__name__, self.name, self.regex.pattern)) return force_str('<%s %s %s>' % (self.__class__.__name__, self.name, self.regex.pattern))
def add_prefix(self, prefix): def add_prefix(self, prefix):
""" """
@ -245,7 +245,7 @@ class RegexURLResolver(LocaleRegexProvider):
self._app_dict = {} self._app_dict = {}
def __repr__(self): def __repr__(self):
return smart_str('<%s %s (%s:%s) %s>' % ( return force_str('<%s %s (%s:%s) %s>' % (
self.__class__.__name__, self.urlconf_name, self.app_name, self.__class__.__name__, self.urlconf_name, self.app_name,
self.namespace, self.regex.pattern)) self.namespace, self.regex.pattern))

View File

@ -8,7 +8,7 @@ except ImportError: # Python 2
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import smart_text from django.utils.encoding import force_text
from django.utils.ipv6 import is_valid_ipv6_address from django.utils.ipv6 import is_valid_ipv6_address
from django.utils import six from django.utils import six
@ -36,7 +36,7 @@ class RegexValidator(object):
""" """
Validates that the input matches the regular expression. Validates that the input matches the regular expression.
""" """
if not self.regex.search(smart_text(value)): if not self.regex.search(force_text(value)):
raise ValidationError(self.message, code=self.code) raise ValidationError(self.message, code=self.code)
class URLValidator(RegexValidator): class URLValidator(RegexValidator):
@ -55,7 +55,7 @@ class URLValidator(RegexValidator):
except ValidationError as e: except ValidationError as e:
# Trivial case failed. Try for possible IDN domain # Trivial case failed. Try for possible IDN domain
if value: if value:
value = smart_text(value) value = force_text(value)
scheme, netloc, path, query, fragment = urlsplit(value) scheme, netloc, path, query, fragment = urlsplit(value)
try: try:
netloc = netloc.encode('idna').decode('ascii') # IDN -> ACE netloc = netloc.encode('idna').decode('ascii') # IDN -> ACE

View File

@ -609,7 +609,7 @@ class BaseDatabaseOperations(object):
exists for database backends to provide a better implementation exists for database backends to provide a better implementation
according to their own quoting schemes. according to their own quoting schemes.
""" """
from django.utils.encoding import smart_text, force_text from django.utils.encoding import force_text
# Convert params to contain Unicode values. # Convert params to contain Unicode values.
to_unicode = lambda s: force_text(s, strings_only=True, errors='replace') to_unicode = lambda s: force_text(s, strings_only=True, errors='replace')
@ -618,7 +618,7 @@ class BaseDatabaseOperations(object):
else: else:
u_params = dict([(to_unicode(k), to_unicode(v)) for k, v in params.items()]) u_params = dict([(to_unicode(k), to_unicode(v)) for k, v in params.items()])
return smart_text(sql) % u_params return force_text(sql) % u_params
def last_insert_id(self, cursor, table_name, pk_name): def last_insert_id(self, cursor, table_name, pk_name):
""" """
@ -802,8 +802,8 @@ class BaseDatabaseOperations(object):
def prep_for_like_query(self, x): def prep_for_like_query(self, x):
"""Prepares a value for use in a LIKE query.""" """Prepares a value for use in a LIKE query."""
from django.utils.encoding import smart_text from django.utils.encoding import force_text
return smart_text(x).replace("\\", "\\\\").replace("%", "\%").replace("_", "\_") return force_text(x).replace("\\", "\\\\").replace("%", "\%").replace("_", "\_")
# Same as prep_for_like_query(), but called for "iexact" matches, which # Same as prep_for_like_query(), but called for "iexact" matches, which
# need not necessarily be implemented using "LIKE" in the backend. # need not necessarily be implemented using "LIKE" in the backend.

View File

@ -23,7 +23,7 @@ from django.db.models import signals
from django.db.models.loading import register_models, get_model from django.db.models.loading import register_models, get_model
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.utils.functional import curry from django.utils.functional import curry
from django.utils.encoding import smart_str, force_text from django.utils.encoding import force_str, force_text
from django.utils import six from django.utils import six
from django.utils.text import get_text_list, capfirst from django.utils.text import get_text_list, capfirst
@ -404,7 +404,7 @@ class Model(six.with_metaclass(ModelBase, object)):
u = six.text_type(self) u = six.text_type(self)
except (UnicodeEncodeError, UnicodeDecodeError): except (UnicodeEncodeError, UnicodeDecodeError):
u = '[Bad Unicode data]' u = '[Bad Unicode data]'
return smart_str('<%s: %s>' % (self.__class__.__name__, u)) return force_str('<%s: %s>' % (self.__class__.__name__, u))
def __str__(self): def __str__(self):
if not six.PY3 and hasattr(self, '__unicode__'): if not six.PY3 and hasattr(self, '__unicode__'):

View File

@ -8,7 +8,7 @@ from django.core.files.base import File
from django.core.files.storage import default_storage from django.core.files.storage import default_storage
from django.core.files.images import ImageFile from django.core.files.images import ImageFile
from django.db.models import signals from django.db.models import signals
from django.utils.encoding import force_text, smart_str from django.utils.encoding import force_str, force_text
from django.utils import six from django.utils import six
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -280,7 +280,7 @@ class FileField(Field):
setattr(cls, self.name, self.descriptor_class(self)) setattr(cls, self.name, self.descriptor_class(self))
def get_directory_name(self): def get_directory_name(self):
return os.path.normpath(force_text(datetime.datetime.now().strftime(smart_str(self.upload_to)))) return os.path.normpath(force_text(datetime.datetime.now().strftime(force_str(self.upload_to))))
def get_filename(self, filename): def get_filename(self, filename):
return os.path.normpath(self.storage.get_valid_name(os.path.basename(filename))) return os.path.normpath(self.storage.get_valid_name(os.path.basename(filename)))

View File

@ -61,14 +61,14 @@ else:
if not _cookie_allows_colon_in_names: if not _cookie_allows_colon_in_names:
def load(self, rawdata): def load(self, rawdata):
self.bad_cookies = set() self.bad_cookies = set()
super(SimpleCookie, self).load(smart_str(rawdata)) super(SimpleCookie, self).load(force_str(rawdata))
for key in self.bad_cookies: for key in self.bad_cookies:
del self[key] del self[key]
# override private __set() method: # override private __set() method:
# (needed for using our Morsel, and for laxness with CookieError # (needed for using our Morsel, and for laxness with CookieError
def _BaseCookie__set(self, key, real_value, coded_value): def _BaseCookie__set(self, key, real_value, coded_value):
key = smart_str(key) key = force_str(key)
try: try:
M = self.get(key, Morsel()) M = self.get(key, Morsel())
M.set(key, real_value, coded_value) M.set(key, real_value, coded_value)
@ -85,7 +85,7 @@ from django.core.files import uploadhandler
from django.http.multipartparser import MultiPartParser from django.http.multipartparser import MultiPartParser
from django.http.utils import * from django.http.utils import *
from django.utils.datastructures import MultiValueDict, ImmutableList from django.utils.datastructures import MultiValueDict, ImmutableList
from django.utils.encoding import force_bytes, force_text, smart_str, iri_to_uri from django.utils.encoding import force_bytes, force_str, force_text, iri_to_uri
from django.utils.http import cookie_date from django.utils.http import cookie_date
from django.utils import six from django.utils import six
from django.utils import timezone from django.utils import timezone
@ -137,7 +137,7 @@ def build_request_repr(request, path_override=None, GET_override=None,
except Exception: except Exception:
meta = '<could not parse>' meta = '<could not parse>'
path = path_override if path_override is not None else request.path path = path_override if path_override is not None else request.path
return smart_str('<%s\npath:%s,\nGET:%s,\nPOST:%s,\nCOOKIES:%s,\nMETA:%s>' % return force_str('<%s\npath:%s,\nGET:%s,\nPOST:%s,\nCOOKIES:%s,\nMETA:%s>' %
(request.__class__.__name__, (request.__class__.__name__,
path, path,
six.text_type(get), six.text_type(get),

View File

@ -11,7 +11,7 @@ from django.utils.importlib import import_module
from django.utils.itercompat import is_iterable from django.utils.itercompat import is_iterable
from django.utils.text import (smart_split, unescape_string_literal, from django.utils.text import (smart_split, unescape_string_literal,
get_text_list) get_text_list)
from django.utils.encoding import smart_text, force_text, smart_str from django.utils.encoding import force_str, force_text
from django.utils.translation import ugettext_lazy, pgettext_lazy from django.utils.translation import ugettext_lazy, pgettext_lazy
from django.utils.safestring import (SafeData, EscapeData, mark_safe, from django.utils.safestring import (SafeData, EscapeData, mark_safe,
mark_for_escaping) mark_for_escaping)
@ -116,7 +116,7 @@ class Template(object):
def __init__(self, template_string, origin=None, def __init__(self, template_string, origin=None,
name='<Unknown Template>'): name='<Unknown Template>'):
try: try:
template_string = smart_text(template_string) template_string = force_text(template_string)
except UnicodeDecodeError: except UnicodeDecodeError:
raise TemplateEncodingError("Templates can only be constructed " raise TemplateEncodingError("Templates can only be constructed "
"from unicode or UTF-8 strings.") "from unicode or UTF-8 strings.")
@ -848,7 +848,7 @@ class TextNode(Node):
self.s = s self.s = s
def __repr__(self): def __repr__(self):
return "<Text Node: '%s'>" % smart_str(self.s[:25], 'ascii', return force_str("<Text Node: '%s'>" % self.s[:25], 'ascii',
errors='replace') errors='replace')
def render(self, context): def render(self, context):

View File

@ -4,7 +4,7 @@ import datetime
from django.conf import settings from django.conf import settings
from django.utils import dateformat, numberformat, datetime_safe from django.utils import dateformat, numberformat, datetime_safe
from django.utils.importlib import import_module from django.utils.importlib import import_module
from django.utils.encoding import smart_str from django.utils.encoding import force_str
from django.utils.functional import lazy from django.utils.functional import lazy
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.utils import six from django.utils import six
@ -66,7 +66,7 @@ def get_format(format_type, lang=None, use_l10n=None):
If use_l10n is provided and is not None, that will force the value to If use_l10n is provided and is not None, that will force the value to
be localized (or not), overriding the value of settings.USE_L10N. be localized (or not), overriding the value of settings.USE_L10N.
""" """
format_type = smart_str(format_type) format_type = force_str(format_type)
if use_l10n or (use_l10n is None and settings.USE_L10N): if use_l10n or (use_l10n is None and settings.USE_L10N):
if lang is None: if lang is None:
lang = get_language() lang = get_language()
@ -160,14 +160,14 @@ def localize_input(value, default=None):
return number_format(value) return number_format(value)
elif isinstance(value, datetime.datetime): elif isinstance(value, datetime.datetime):
value = datetime_safe.new_datetime(value) value = datetime_safe.new_datetime(value)
format = smart_str(default or get_format('DATETIME_INPUT_FORMATS')[0]) format = force_str(default or get_format('DATETIME_INPUT_FORMATS')[0])
return value.strftime(format) return value.strftime(format)
elif isinstance(value, datetime.date): elif isinstance(value, datetime.date):
value = datetime_safe.new_date(value) value = datetime_safe.new_date(value)
format = smart_str(default or get_format('DATE_INPUT_FORMATS')[0]) format = force_str(default or get_format('DATE_INPUT_FORMATS')[0])
return value.strftime(format) return value.strftime(format)
elif isinstance(value, datetime.time): elif isinstance(value, datetime.time):
format = smart_str(default or get_format('TIME_INPUT_FORMATS')[0]) format = force_str(default or get_format('TIME_INPUT_FORMATS')[0])
return value.strftime(format) return value.strftime(format)
return value return value

View File

@ -15,7 +15,7 @@ except ImportError: # Python 2
from email.utils import formatdate from email.utils import formatdate
from django.utils.datastructures import MultiValueDict from django.utils.datastructures import MultiValueDict
from django.utils.encoding import force_text, smart_str from django.utils.encoding import force_str, force_text
from django.utils.functional import allow_lazy from django.utils.functional import allow_lazy
from django.utils import six from django.utils import six
@ -39,7 +39,7 @@ def urlquote(url, safe='/'):
can safely be used as part of an argument to a subsequent iri_to_uri() call can safely be used as part of an argument to a subsequent iri_to_uri() call
without double-quoting occurring. without double-quoting occurring.
""" """
return force_text(urllib_parse.quote(smart_str(url), smart_str(safe))) return force_text(urllib_parse.quote(force_str(url), force_str(safe)))
urlquote = allow_lazy(urlquote, six.text_type) urlquote = allow_lazy(urlquote, six.text_type)
def urlquote_plus(url, safe=''): def urlquote_plus(url, safe=''):
@ -49,7 +49,7 @@ def urlquote_plus(url, safe=''):
returned string can safely be used as part of an argument to a subsequent returned string can safely be used as part of an argument to a subsequent
iri_to_uri() call without double-quoting occurring. iri_to_uri() call without double-quoting occurring.
""" """
return force_text(urllib_parse.quote_plus(smart_str(url), smart_str(safe))) return force_text(urllib_parse.quote_plus(force_str(url), force_str(safe)))
urlquote_plus = allow_lazy(urlquote_plus, six.text_type) urlquote_plus = allow_lazy(urlquote_plus, six.text_type)
def urlunquote(quoted_url): def urlunquote(quoted_url):
@ -57,7 +57,7 @@ def urlunquote(quoted_url):
A wrapper for Python's urllib.unquote() function that can operate on A wrapper for Python's urllib.unquote() function that can operate on
the result of django.utils.http.urlquote(). the result of django.utils.http.urlquote().
""" """
return force_text(urllib_parse.unquote(smart_str(quoted_url))) return force_text(urllib_parse.unquote(force_str(quoted_url)))
urlunquote = allow_lazy(urlunquote, six.text_type) urlunquote = allow_lazy(urlunquote, six.text_type)
def urlunquote_plus(quoted_url): def urlunquote_plus(quoted_url):
@ -65,7 +65,7 @@ def urlunquote_plus(quoted_url):
A wrapper for Python's urllib.unquote_plus() function that can operate on A wrapper for Python's urllib.unquote_plus() function that can operate on
the result of django.utils.http.urlquote_plus(). the result of django.utils.http.urlquote_plus().
""" """
return force_text(urllib_parse.unquote_plus(smart_str(quoted_url))) return force_text(urllib_parse.unquote_plus(force_str(quoted_url)))
urlunquote_plus = allow_lazy(urlunquote_plus, six.text_type) urlunquote_plus = allow_lazy(urlunquote_plus, six.text_type)
def urlencode(query, doseq=0): def urlencode(query, doseq=0):
@ -79,8 +79,8 @@ def urlencode(query, doseq=0):
elif hasattr(query, 'items'): elif hasattr(query, 'items'):
query = query.items() query = query.items()
return urllib_parse.urlencode( return urllib_parse.urlencode(
[(smart_str(k), [(force_str(k),
[smart_str(i) for i in v] if isinstance(v, (list,tuple)) else smart_str(v)) [force_str(i) for i in v] if isinstance(v, (list,tuple)) else force_str(v))
for k, v in query], for k, v in query],
doseq) doseq)

View File

@ -9,7 +9,7 @@ import gettext as gettext_module
from threading import local from threading import local
from django.utils.importlib import import_module from django.utils.importlib import import_module
from django.utils.encoding import smart_str, smart_text from django.utils.encoding import force_str, force_text
from django.utils.safestring import mark_safe, SafeData from django.utils.safestring import mark_safe, SafeData
from django.utils import six from django.utils import six
from django.utils.six import StringIO from django.utils.six import StringIO
@ -454,7 +454,7 @@ def templatize(src, origin=None):
from django.conf import settings from django.conf import settings
from django.template import (Lexer, TOKEN_TEXT, TOKEN_VAR, TOKEN_BLOCK, from django.template import (Lexer, TOKEN_TEXT, TOKEN_VAR, TOKEN_BLOCK,
TOKEN_COMMENT, TRANSLATOR_COMMENT_MARK) TOKEN_COMMENT, TRANSLATOR_COMMENT_MARK)
src = smart_text(src, settings.FILE_CHARSET) src = force_text(src, settings.FILE_CHARSET)
out = StringIO() out = StringIO()
message_context = None message_context = None
intrans = False intrans = False
@ -469,7 +469,7 @@ def templatize(src, origin=None):
content = ''.join(comment) content = ''.join(comment)
translators_comment_start = None translators_comment_start = None
for lineno, line in enumerate(content.splitlines(True)): for lineno, line in enumerate(content.splitlines(True)):
if line.lstrip().startswith(smart_text(TRANSLATOR_COMMENT_MARK)): if line.lstrip().startswith(TRANSLATOR_COMMENT_MARK):
translators_comment_start = lineno translators_comment_start = lineno
for lineno, line in enumerate(content.splitlines(True)): for lineno, line in enumerate(content.splitlines(True)):
if translators_comment_start is not None and lineno >= translators_comment_start: if translators_comment_start is not None and lineno >= translators_comment_start:
@ -584,7 +584,7 @@ def templatize(src, origin=None):
out.write(' # %s' % t.contents) out.write(' # %s' % t.contents)
else: else:
out.write(blankout(t.contents, 'X')) out.write(blankout(t.contents, 'X'))
return smart_str(out.getvalue()) return force_str(out.getvalue())
def parse_accept_lang_header(lang_string): def parse_accept_lang_header(lang_string):
""" """

View File

@ -5,7 +5,7 @@ from __future__ import unicode_literals
import time import time
from datetime import timedelta, tzinfo from datetime import timedelta, tzinfo
from django.utils.encoding import smart_text, smart_str, DEFAULT_LOCALE_ENCODING from django.utils.encoding import force_str, force_text, DEFAULT_LOCALE_ENCODING
# Python's doc say: "A tzinfo subclass must have an __init__() method that can # Python's doc say: "A tzinfo subclass must have an __init__() method that can
# be called with no arguments". FixedOffset and LocalTimezone don't honor this # be called with no arguments". FixedOffset and LocalTimezone don't honor this
@ -53,7 +53,7 @@ class LocalTimezone(tzinfo):
self._tzname = self.tzname(dt) self._tzname = self.tzname(dt)
def __repr__(self): def __repr__(self):
return smart_str(self._tzname) return force_str(self._tzname)
def __getinitargs__(self): def __getinitargs__(self):
return self.__dt, return self.__dt,
@ -72,7 +72,7 @@ class LocalTimezone(tzinfo):
def tzname(self, dt): def tzname(self, dt):
try: try:
return smart_text(time.tzname[self._isdst(dt)], return force_text(time.tzname[self._isdst(dt)],
DEFAULT_LOCALE_ENCODING) DEFAULT_LOCALE_ENCODING)
except UnicodeDecodeError: except UnicodeDecodeError:
return None return None