misc: add force_str(), to encode in Python 2 (#36515)

This commit is contained in:
Frédéric Péters 2019-11-12 11:39:43 +01:00
parent 4b82f00c73
commit 8cf415e664
5 changed files with 30 additions and 14 deletions

View File

@ -19,6 +19,7 @@ import os
from threading import Lock
from contextlib import contextmanager
from django.utils import six
from django.utils.six.moves import configparser as ConfigParser
from quixote import get_publisher, get_request
@ -31,7 +32,7 @@ from django.template import loader, TemplateDoesNotExist
from django.template.response import TemplateResponse
from django.views.generic.base import TemplateView
from .qommon import template
from .qommon import force_str, template
from .qommon.publisher import get_cfg, set_publisher_class
from .publisher import WcsPublisher
from .qommon.http_request import HTTPRequest
@ -97,7 +98,7 @@ class CompatHTTPRequest(HTTPRequest):
self.django_request.quixote_request = self
self.response = None
request.environ['SCRIPT_NAME'] = str(request.environ['SCRIPT_NAME'])
request.environ['PATH_INFO'] = request.environ['PATH_INFO'].encode('utf-8')
request.environ['PATH_INFO'] = force_str(request.environ['PATH_INFO'])
self.environ = self.django_request.META
HTTPRequest.__init__(self, None, request.environ)
self.scheme = str(self.django_request.scheme)

View File

@ -19,6 +19,7 @@ import threading
import django.apps
from django.conf import settings
from django.utils import six
from django.utils.encoding import force_text
from django.utils.six.moves import configparser as ConfigParser
@ -29,17 +30,30 @@ try:
except ImportError:
lasso = None
# force_str: compatibility function to produce an encoded string in Python 2
# and a proper unicode string in Python 3
if six.PY2:
def force_str(s):
if isinstance(s, str):
return s
return s.encode('utf-8')
else:
force_str = force_text
def _(message):
pub = get_publisher()
if pub is None:
return message
return force_text(pub.gettext(str(message)), 'utf-8').encode(pub.site_charset)
return force_str(force_text(pub.gettext(str(message))))
def ngettext(*args):
pub = get_publisher()
if pub is None:
return message
return force_text(pub.ngettext(*args), 'utf-8').encode(pub.site_charset)
return force_str(force_text(pub.ngettext(*args)))
from .publisher import get_cfg, get_logger, get_publisher_class
from . import publisher

View File

@ -48,7 +48,7 @@ from django.utils.six.moves.urllib import parse as urlparse
from quixote import get_publisher, get_response, get_request
from quixote.html import htmltext
from . import _
from . import _, force_str
from . import get_cfg, get_logger, ezt
from .errors import ConnectionError
from .template import Template
@ -248,12 +248,11 @@ def site_encode(s):
s = force_text(s)
return s.encode(get_publisher().site_charset)
def ellipsize(s, length = 30):
if type(s) is not unicode:
s = force_text(s, get_publisher().site_charset, errors='replace')
if not s or len(s) < length:
return s.encode(get_publisher().site_charset)
return s[:length-5].encode(get_publisher().site_charset) + ' (...)'
def ellipsize(s, length=30):
s = force_text(s, get_publisher().site_charset, errors='replace')
if s and len(s) >= length:
s = s[:length-5] + ' (...)'
return force_str(s)
def get_month_name(month):
month_names = [_('January'), _('February'), _('March'), _('April'),

View File

@ -33,7 +33,7 @@ from quixote.directory import Directory
from quixote.util import StaticDirectory, StaticFile
from quixote.html import htmltext, htmlescape, TemplateIO
from . import ezt
from . import ezt, force_str
def get_template_from_script(filename):
@ -407,7 +407,8 @@ def decorate(body, response):
def render(template_name, context):
request = getattr(get_request(), 'django_request', None)
return htmltext(render_to_string(template_name, context, request=request).encode('utf-8'))
result = render_to_string(template_name, context, request=request)
return htmltext(force_str(result))
class QommonTemplateResponse(object):

View File

@ -20,6 +20,7 @@ import xml.etree.ElementTree as ET
from django.utils.encoding import force_text
from quixote import get_publisher
from . import force_str
from .misc import indent_xml
from .storage import StorableObject
@ -104,7 +105,7 @@ class XmlStorableObject(StorableObject):
return obj
def import_str_from_xml(self, element, charset):
return element.text.encode(charset)
return force_str(element.text)
def import_int_from_xml(self, element, charset):
return int(element.text)