workflows: compute formdata variables only once in odt (#18814)

This commit is contained in:
Thomas NOËL 2017-09-20 14:41:27 +02:00
parent 5cad6868d1
commit 64515ddef3
3 changed files with 25 additions and 7 deletions

View File

@ -2183,6 +2183,18 @@ def test_formdata_generated_document_odt_download(pub):
with open(os.path.join(os.path.dirname(__file__), 'template-out.odt')) as f:
assert_equal_zip(StringIO.StringIO(resp.body), f)
resp = login(get_app(pub), username='foo', password='foo').get(form_location)
resp = resp.form.submit('button_export_to')
resp = resp.follow() # $form/$id/create_doc
with mock.patch('wcs.wf.export_to_model.get_formdata_template_context') as get_context_1:
with mock.patch('wcs.workflows.get_formdata_template_context') as get_context_never:
get_context_1.return_value = {}
get_context_never.return_value = {}
resp = resp.follow() # $form/$id/create_doc/
# substitution variables are computed only one :
assert get_context_1.call_count == 1
assert get_context_never.call_count == 0
export_to.attach_to_history = True
wf.store()

View File

@ -40,7 +40,8 @@ import qommon
from wcs.fields import SubtitleField, TitleField, CommentField, PageField
from wcs.workflows import (WorkflowStatusItem, AttachmentEvolutionPart,
template_on_formdata, register_item_class)
template_on_formdata, register_item_class,
get_formdata_template_context, template_on_context)
from wcs.portfolio import has_portfolio, push_document
OO_TEXT_NS = 'urn:oasis:names:tc:opendocument:xmlns:text:1.0'
@ -405,7 +406,7 @@ class ExportToModel(WorkflowStatusItem):
'template: %s') % str(e))
def apply_od_template_to_formdata(self, formdata):
context_variables = get_publisher().substitutions.get_context_variables()
context = get_formdata_template_context(formdata)
def process_root(root, new_images):
# cache for keeping computed user-field-decl value around
@ -414,7 +415,7 @@ class ExportToModel(WorkflowStatusItem):
def process_text(t):
if isinstance(t, unicode):
t = t.encode(get_publisher().site_charset)
t = template_on_formdata(formdata, t)
t = template_on_context(context, t)
return unicode(t, get_publisher().site_charset)
for node in root.iter():
got_blank_lines = False

View File

@ -2205,15 +2205,20 @@ def template_on_formdata(formdata=None, template=None, process=None,
assert template is not None
if not '[' in template:
return template
context = get_formdata_template_context(formdata, process=process)
return template_on_context(context, template, process=process,
base_format=base_format)
ctx = get_formdata_template_context(formdata, process=process)
def template_on_context(context=None, template=None, process=None,
base_format=ezt.FORMAT_RAW):
assert template is not None
if not '[' in template:
return template
processor = ezt.Template(compress_whitespace=False)
processor.parse(template or '', base_format=base_format)
fd = StringIO()
processor.generate(fd, ctx)
processor.generate(fd, context)
return fd.getvalue()