wf/export_to_model: allow only ezt syntax in rtf models (#20407)

This commit is contained in:
Thomas NOËL 2017-12-04 19:18:59 +01:00 committed by Frédéric Péters
parent d58f7e4fb2
commit c8f1d7aa6f
4 changed files with 25 additions and 7 deletions

View File

@ -2174,6 +2174,22 @@ def test_formdata_generated_document_download(pub):
assert resp.click('test.rtf', index=0).follow().body == 'HELLO WORLD'
assert resp.click('test.rtf', index=1).follow().body == 'HELLO NEW WORLD'
# use substitution variables on rtf: only ezt format is accepted
upload = QuixoteUpload('/foo/test.rtf', content_type='application/rtf')
upload.fp = StringIO.StringIO()
upload.fp.write('HELLO {{DJANGO}} WORLD [form_name]')
upload.fp.seek(0)
export_to.model_file = UploadedFile(pub.app_dir, None, upload)
wf.store()
resp = login(get_app(pub), username='foo', password='foo').get(form_location)
resp = resp.form.submit('button_export_to')
assert resp.location == form_location
resp = resp.follow()
assert resp.click('test.rtf', index=2).follow().body == 'HELLO {{DJANGO}} WORLD {\\uc1{test}}'
def test_formdata_generated_document_odt_download(pub):
create_user(pub)
wf = Workflow(name='status')

View File

@ -450,12 +450,12 @@ def ezt_raises(exception, on_parse=False):
class Template(object):
def __init__(self, value, raises=False, ezt_format=ezt.FORMAT_RAW):
def __init__(self, value, raises=False, ezt_format=ezt.FORMAT_RAW, ezt_only=False):
'''Guess kind of template (Django or ezt), and parse it'''
self.value = value
self.raises = raises
if '{{' in value or '{%' in value: # Django template
if ('{{' in value or '{%' in value) and not ezt_only: # Django template
self.render = self.django_render
try:
self.template = DjangoTemplate(value)

View File

@ -403,8 +403,10 @@ class ExportToModel(WorkflowStatusItem):
def apply_rtf_template_to_formdata(self, formdata):
try:
# force ezt_only=True because an RTF file may contain {{ characters
# and would be seen as a Django template
return StringIO(template_on_formdata(formdata, self.model_file.get_file().read(),
process=rtf_process))
process=rtf_process, ezt_only=True))
except TemplateError as e:
url = formdata.get_url()
get_logger().error('error in template for export to model [%s]: %s' % (url, str(e)))

View File

@ -2287,20 +2287,20 @@ def template_on_html_string(template):
def template_on_formdata(formdata=None, template=None, process=None,
ezt_format=ezt.FORMAT_RAW):
ezt_format=ezt.FORMAT_RAW, ezt_only=False):
assert template is not None
if not Template.is_template_string(template):
# no tags, no variables: don't even process formdata
return template
context = get_formdata_template_context(formdata, process=process)
return template_on_context(context, template, ezt_format=ezt_format)
return template_on_context(context, template, ezt_format=ezt_format, ezt_only=ezt_only)
def template_on_context(context=None, template=None, ezt_format=ezt.FORMAT_RAW):
def template_on_context(context=None, template=None, ezt_format=ezt.FORMAT_RAW, ezt_only=False):
assert template is not None
if not Template.is_template_string(template):
return template
return Template(template, ezt_format=ezt_format).render(context)
return Template(template, ezt_format=ezt_format, ezt_only=ezt_only).render(context)
class SendSMSWorkflowStatusItem(WorkflowStatusItem):