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

TextDocument: lazily convert substitution mapping to unicode

This way, the substitution mapping method can return a dynamic mapping,
the only requirement is to implement __getitem__
parent 80a67fd8
Pipeline #7903 failed with stage
in 0 seconds
......@@ -97,13 +97,15 @@ class TextDocument(CachedConvertableMixin, BaseConvertableFileMixin, TextContent
if is_str:
text = text.decode('utf-8')
unicode_mapping = {}
for k, v in mapping.iteritems():
if isinstance(v, str):
v = v.decode('utf-8')
elif not isinstance(v, unicode):
v = str(v).decode('utf-8')
unicode_mapping[k] = v
class UnicodeMapping:
def __getitem__(self, item):
v = mapping[item]
if isinstance(v, str):
v = v.decode('utf-8')
elif not isinstance(v, unicode):
v = str(v).decode('utf-8')
return v
unicode_mapping = UnicodeMapping()
if safe_substitute:
text = Template(text).safe_substitute(unicode_mapping)
......
......@@ -27,7 +27,7 @@
#
##############################################################################
import textwrap
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from Products.ERP5Type.tests.utils import createZODBPythonScript
......@@ -174,3 +174,28 @@ class TestNotificationMessageModule(ERP5TypeTestCase):
self.assertRaises(KeyError, doc.convert, 'txt', safe_substitute=False)
self.assertRaises(KeyError, doc.convert, 'html', safe_substitute=False)
self.assertRaises(KeyError, doc.asSubjectText, safe_substitute=False)
def test_substitution_lazy_dict(self):
"""Substitution script just needs to return an object implementing
__getitem__ protocol.
"""
module = self.portal.notification_message_module
createZODBPythonScript(
self.portal, 'NotificationMessage_getDummySubstitionMapping', '**kw',
textwrap.dedent(
'''\
class DynamicDict:
def __getitem__(self, key):
return "(dynamic key: %s)" % key
return DynamicDict()
'''))
doc = module.newContent(
portal_type='Notification Message',
content_type='text/plain',
text_content='substitution text: ${a}',
text_content_substitution_mapping_method_id='NotificationMessage_getDummySubstitionMapping'
)
mime, text = doc.convert('txt')
self.assertEqual('text/plain', mime)
self.assertEqual('substitution text: (dynamic key: a)', text)
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