Commit 8fffd3f8 authored by Jérome Perrin's avatar Jérome Perrin

xhtml_style: fix rendering of standard_error_message when site title is not ASCII

When rendering error page, the default header_title is computed in global_definitions
and this is done by concatenating string:ERP5 (which is unicode) and the
title of the portal (which is an UTF-8 encoded string), which causes an
UnicodeDecodeError, because the portal title was decoded as ASCII.

Because header_title is usually an UTF-8 encoded string, also use an UTF-8
encoded string for 'ERP5' default value.
parent 9d9df4fe
Pipeline #14962 failed with stage
in 0 seconds
############################################################################## ##############################################################################
# # coding: utf-8
# Copyright (c) 2004, 2005, 2006 Nexedi SARL and Contributors. # Copyright (c) 2004, 2005, 2006 Nexedi SARL and Contributors.
# All Rights Reserved. # All Rights Reserved.
# Romain Courteaud <romain@nexedi.com> # Romain Courteaud <romain@nexedi.com>
...@@ -32,6 +32,7 @@ import httplib ...@@ -32,6 +32,7 @@ import httplib
import urlparse import urlparse
import base64 import base64
import urllib import urllib
import lxml.html
from AccessControl.SecurityManagement import newSecurityManager from AccessControl.SecurityManagement import newSecurityManager
from Testing import ZopeTestCase from Testing import ZopeTestCase
...@@ -647,6 +648,31 @@ class TestERP5Core(ERP5TypeTestCase, ZopeTestCase.Functional): ...@@ -647,6 +648,31 @@ class TestERP5Core(ERP5TypeTestCase, ZopeTestCase.Functional):
self.assertEqual(response.status, 401) self.assertEqual(response.status, 401)
self.assertEqual(response.getheader('WWW-Authenticate'), None) self.assertEqual(response.getheader('WWW-Authenticate'), None)
def test_non_ascii_site_title(self):
self.portal.setTitle('文字化け')
self.assertEqual(
lxml.html.fromstring(self.portal.view()).find('.//div[@id="breadcrumb"]/a').text,
u'文字化け')
self.assertEqual(
lxml.html.fromstring(
self.portal.person_module.view()
).find('.//div[@id="breadcrumb"]/a').text,
u'文字化け')
self.assertEqual(
lxml.html.fromstring(
self.portal.person_module.newContent(portal_type='Person').view()
).find('.//div[@id="breadcrumb"]/a').text,
u'文字化け')
def test_standard_error_message_non_ascii(self):
# regression test for error message when portal title is not ASCII
self.portal.setTitle('文字化け')
self.assertIn(
u'文字化け',
self.portal.standard_error_message(
error_type="MyErrorType",
error_message="my error message."))
def test_standardErrorMessageShouldNotRaiseUnauthorizeOnUnauthorizeDocument(self): def test_standardErrorMessageShouldNotRaiseUnauthorizeOnUnauthorizeDocument(self):
""" """
When trying to show the `standard_error_message` on a document that user When trying to show the `standard_error_message` on a document that user
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title <title
tal:define=" tal:define="
title title | string:ERP5; title title | python:'ERP5';
header_title header_title | nothing; header_title header_title | nothing;
" "
tal:content="python: header_title or '%s | %s' % (title, here.getPortalObject().title_or_id())" tal:content="python: header_title or '%s | %s' % (title, here.getPortalObject().title_or_id())"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment