Commit c498e74e authored by Jérome Perrin's avatar Jérome Perrin

Fix translation in deferred style

Backport nexedi/erp5!611

To fix problem reported as [Reports in French even with English selected for the UI](https://www.erp5.com/project_section/capago-project/forum/Reports-in-French-even-with-English-selected-for-the-UI-2iRze6Od6s)


/reviewed-on https://lab.nexedi.com/nexedi/erp5-capago/merge_requests/18
parents 5272b32a 8a0cbb71
...@@ -20,22 +20,9 @@ if person_value.getDefaultEmailText('') in ('', None): ...@@ -20,22 +20,9 @@ if person_value.getDefaultEmailText('') in ('', None):
return context.Base_redirect('view', keep_items=dict( return context.Base_redirect('view', keep_items=dict(
portal_status_message=translateString( portal_status_message=translateString(
"You haven't defined your email address"))) "You haven't defined your email address")))
# save request parameters # save request parameters
# XXX we exclude some reserved names in a very ad hoc way request_form = portal.ERP5Site_filterRequestForDeferredStyle(request)
request_form = {}
for k, v in request.form.items():
if k not in ('TraversalRequestNameStack', 'AUTHENTICATED_USER', 'URL',
'SERVER_URL', 'AUTHENTICATION_PATH', 'USER_PREF_LANGUAGES', 'PARENTS',
'PUBLISHED', 'AcceptLanguage', 'AcceptCharset', 'RESPONSE',
'ACTUAL_URL'):
# XXX proxy fields stores a cache in request.other that cannot be pickled
if str(k).startswith('field__proxyfield'):
continue
# Remove FileUpload parameters
elif getattr(v, 'headers', ''):
continue
request_form[k] = v
localizer_language = portal.Localizer.get_selected_language() localizer_language = portal.Localizer.get_selected_language()
......
...@@ -22,22 +22,10 @@ format = request.get('format', '') ...@@ -22,22 +22,10 @@ format = request.get('format', '')
skin_name = request['deferred_portal_skin'] skin_name = request['deferred_portal_skin']
# save request parameters (after calling the report_method which may tweak the # save request parameters (after calling the report_method which may tweak the
# request). XXX we exclude some reserved names in a very ad hoc way # request).
request_other = {} request_other = portal.ERP5Site_filterRequestForDeferredStyle(request)
for k, v in request.items():
if k not in ('TraversalRequestNameStack', 'AUTHENTICATED_USER', 'URL',
'SERVER_URL', 'AUTHENTICATION_PATH', 'USER_PREF_LANGUAGES', 'PARENTS',
'PUBLISHED', 'AcceptLanguage', 'AcceptCharset', 'RESPONSE', 'SESSION',
'ACTUAL_URL'):
# XXX proxy fields stores a cache in request.other that cannot be pickled
if same_type(k, '') and k.startswith('field__proxyfield'):
continue
# Remove FileUpload parameters
elif getattr(v, 'headers', ''):
continue
request_other[k] = v
localizer_language = portal.Localizer.get_selected_language()
context.activate(activity="SQLQueue", tag=tag, after_tag=after_tag, context.activate(activity="SQLQueue", tag=tag, after_tag=after_tag,
priority=priority).Base_computeReportSection( priority=priority).Base_computeReportSection(
...@@ -47,7 +35,8 @@ context.activate(activity="SQLQueue", tag=tag, after_tag=after_tag, ...@@ -47,7 +35,8 @@ context.activate(activity="SQLQueue", tag=tag, after_tag=after_tag,
tag=tag, tag=tag,
skin_name=skin_name, skin_name=skin_name,
format=format, format=format,
priority=priority, priority=priority,
localizer_language=localizer_language,
**kw) **kw)
context.activate(activity='SQLQueue', after_tag=tag).getTitle() context.activate(activity='SQLQueue', after_tag=tag).getTitle()
......
portal = context.getPortalObject() portal = context.getPortalObject()
N_ = portal.Base_translateString
form = context.restrictedTraverse(form) form = context.restrictedTraverse(form)
request = container.REQUEST request = container.REQUEST
request.other.update(request_other) request.other.update(request_other)
if form.meta_type == 'ERP5 Report': with portal.Localizer.translationContext(localizer_language):
report_section_list = getattr(context, form.report_method)() if form.meta_type == 'ERP5 Report':
elif form.meta_type == 'ERP5 Form': report_section_list = getattr(context, form.report_method)()
report_section_list = [] elif form.meta_type == 'ERP5 Form':
for field in form.get_fields(): report_section_list = []
if field.getRecursiveTemplateField().meta_type == 'ReportBox': for field in form.get_fields():
report_section_list.extend(field.render()) if field.getRecursiveTemplateField().meta_type == 'ReportBox':
else: report_section_list.extend(field.render())
raise ValueError, 'form meta_type (%r) unknown' %(form.meta_type,) else:
raise ValueError, 'form meta_type (%r) unknown' %(form.meta_type,)
report_title = portal.Base_translateString((form.getProperty('title')))
# Rebuild request_other as report section can have modify request content # Rebuild request_other as report section can have modify request content
request_other = {} request_other = portal.ERP5Site_filterRequestForDeferredStyle(request)
for k, v in request.items():
if k not in ('TraversalRequestNameStack', 'AUTHENTICATED_USER', 'URL',
'SERVER_URL', 'AUTHENTICATION_PATH', 'USER_PREF_LANGUAGES', 'PARENTS',
'PUBLISHED', 'AcceptLanguage', 'AcceptCharset', 'RESPONSE', 'SESSION',
'ACTUAL_URL'):
# XXX proxy fields stores a cache in request.other that cannot be pickled
if same_type(k, '') and str(k).startswith('field__proxyfield'):
continue
# Remove FileUpload parameters
elif getattr(v, 'headers', ''):
continue
request_other[k] = v
localizer_language = portal.Localizer.get_selected_language()
active_process = portal.portal_activities.newActiveProcess() active_process = portal.portal_activities.newActiveProcess()
for idx, report_section in enumerate(report_section_list): for idx, report_section in enumerate(report_section_list):
...@@ -57,7 +46,7 @@ activity_context.activate(activity='SQLQueue', after_tag=tag, priority=priority) ...@@ -57,7 +46,7 @@ activity_context.activate(activity='SQLQueue', after_tag=tag, priority=priority)
active_process_url=active_process.getRelativeUrl(), active_process_url=active_process.getRelativeUrl(),
skin_name=skin_name, skin_name=skin_name,
localizer_language=localizer_language, localizer_language=localizer_language,
title=N_(form.getProperty('title')), title=report_title,
request_other=request_other, request_other=request_other,
form_path=form.getPhysicalPath(), form_path=form.getPhysicalPath(),
user_name=user_name, user_name=user_name,
......
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
</item> </item>
<item> <item>
<key> <string>_params</string> </key> <key> <string>_params</string> </key>
<value> <string>form, request_other, user_name, tag, skin_name, format, priority, **kw</string> </value> <value> <string>form, request_other, user_name, tag, skin_name, format, priority, localizer_language, **kw</string> </value>
</item> </item>
<item> <item>
<key> <string>_proxy_roles</string> </key> <key> <string>_proxy_roles</string> </key>
......
request_other = {}
for k, v in request.other.items() + request.form.items():
if k not in ('TraversalRequestNameStack', 'AUTHENTICATED_USER', 'URL',
'SERVER_URL', 'AUTHENTICATION_PATH', 'USER_PREF_LANGUAGES', 'PARENTS',
'PUBLISHED', 'AcceptLanguage', 'AcceptCharset', 'RESPONSE', 'SESSION',
'ACTUAL_URL', 'HTTP_COOKIE'):
# XXX proxy fields stores a cache in request.other that cannot be pickled
if same_type(k, '') and k.startswith('field__proxyfield'):
continue
# Remove FileUpload parameters
elif getattr(v, 'headers', ''):
continue
request_other[k] = v
return request_other
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>request</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>ERP5Site_filterRequestForDeferredStyle</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -51,8 +51,11 @@ class TestDeferredStyle(ERP5TypeTestCase, ZopeTestCase.Functional): ...@@ -51,8 +51,11 @@ class TestDeferredStyle(ERP5TypeTestCase, ZopeTestCase.Functional):
def getBusinessTemplateList(self): def getBusinessTemplateList(self):
return ('erp5_core_proxy_field_legacy', return ('erp5_core_proxy_field_legacy',
'erp5_base', 'erp5_ods_style', 'erp5_base',
'erp5_odt_style', 'erp5_deferred_style',) 'erp5_ods_style',
'erp5_odt_style',
'erp5_deferred_style',
'erp5_l10n_fr',)
def afterSetUp(self): def afterSetUp(self):
self.login() self.login()
...@@ -148,6 +151,63 @@ class TestDeferredStyle(ERP5TypeTestCase, ZopeTestCase.Functional): ...@@ -148,6 +151,63 @@ class TestDeferredStyle(ERP5TypeTestCase, ZopeTestCase.Functional):
else: else:
self.fail('Attachment not found in email\n%s' % message_text) self.fail('Attachment not found in email\n%s' % message_text)
def test_lang_negociation(self):
# User's Accept-Language header is honored in reports.
self.loginAsUser('bob')
self.portal.changeSkin('Deferred')
response = self.publish(
'/%s/person_module/pers/Base_viewHistory?deferred_portal_skin=%s'
% (self.portal.getId(), self.skin),
'%s:%s' % (self.username, self.password),
extra={
'HTTP_ACCEPT_LANGUAGE': 'fr;q=0.9,en;q=0.8',
})
self.tic()
mail_message = email.message_from_string(self.portal.MailHost._last_message[2])
# mail subject is translated
self.assertEqual('Historique', mail_message['subject'])
# content is translated
part, = [x for x in mail_message.walk() if x.get_content_type() == self.content_type]
self.assertIn(
'Historique',
self.portal.portal_transforms.convertTo(
'text/plain',
part.get_payload(decode=True),
context=self.portal,
mimetype=self.content_type).getData())
def test_lang_negociation_cookie(self):
# User's LOCALIZER_LANGUAGE cookie is honored in reports and have priority over Accept-Language
self.loginAsUser('bob')
self.portal.changeSkin('Deferred')
response = self.publish(
'/%s/person_module/pers/Base_viewHistory?deferred_portal_skin=%s'
% (self.portal.getId(), self.skin),
'%s:%s' % (self.username, self.password),
# user has configured preferred language to english
extra={
'HTTP_ACCEPT_LANGUAGE': 'en;q=0.9,fr;q=0.8',
},
# but has forced to french in a Localizer cookie
env={
'HTTP_COOKIE': 'LOCALIZER_LANGUAGE="fr"',
})
self.tic()
mail_message = email.message_from_string(self.portal.MailHost._last_message[2])
# mail subject is translated
self.assertEqual('Historique', mail_message['subject'])
# content is translated
mail_message = email.message_from_string(self.portal.MailHost._last_message[2])
part, = [x for x in mail_message.walk() if x.get_content_type() == self.content_type]
self.assertIn(
'Historique',
self.portal.portal_transforms.convertTo(
'text/plain',
part.get_payload(decode=True),
context=self.portal,
mimetype=self.content_type).getData())
class TestODSDeferredStyle(TestDeferredStyle): class TestODSDeferredStyle(TestDeferredStyle):
skin = 'ODS' skin = 'ODS'
......
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