workflows: compute formdata variables only once in odt (#18814)
This commit is contained in:
parent
5cad6868d1
commit
64515ddef3
|
@ -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()
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue