inspect: display complex types on rendered templates (#49785)

This commit is contained in:
Thomas NOËL 2020-12-30 14:55:06 +01:00
parent b4cbc94b75
commit 770acecd23
3 changed files with 36 additions and 6 deletions

View File

@ -4083,15 +4083,21 @@ def test_inspect_page(pub, local_user):
create_environment(pub)
formdef = FormDef.get_by_urlname('form-title')
formdef.fields.append(fields.FileField(id='4', label='file field', type='file', varname='file'))
formdef.store()
formdata = [x for x in formdef.data_class().select() if x.status == 'wf-new'][0]
# temper with field 3 structured values
formdata.data['3_structured'] = {
'unicode': u'uné',
'str_but_non_utf8': b'\xed\xa0\x00', # not actually supposed to happen
'non_unicode_convertible': IHateUnicode(),
'very_long_string': '0' * 100000,
}
# add a PicklableUpload in field 4
upload = PicklableUpload('hello.txt', content_type='text/plain')
upload.receive([b'hello world'])
formdata.data['4'] = upload
formdata.user_id = local_user.id
formdata.store()
@ -4203,11 +4209,21 @@ def test_inspect_page(pub, local_user):
assert 'Template rendering' in resp.text
assert '<div class="test-tool-result-plain">form title</div>' in resp.text
assert 'HTML Source' not in resp.text
assert 'rendered as an object' not in resp.text
resp.form['template'] = '<p>{{ form_name }}</p>'
resp = resp.form.submit()
assert 'Template rendering' in resp.text
assert '<p>form title</p>' in resp.text
assert 'HTML Source' in resp.text
assert 'rendered as an object' not in resp.text
resp.form['template'] = '{{ form_var_file }}'
resp = resp.form.submit()
assert 'Template rendering' in resp.text
assert '<div class="test-tool-result-plain">hello.txt</div>' in resp.text
assert 'rendered as an object' in resp.text
assert '<div class="test-tool-result-plain">hello.txt (PicklableUpload)</div>' in resp.text
assert 'HTML Source' not in resp.text
resp.form['template'] = '{% for x in 1 %}ok{% endfor %}'
resp = resp.form.submit()
assert 'Failed to evaluate template' in resp.text

View File

@ -64,7 +64,7 @@ from wcs.formdata import FormData
from wcs.formdef import FormDef
from wcs.roles import logged_users_role, Role
from wcs.variables import LazyFieldVar
from wcs.workflows import get_role_translation, template_on_formdata
from wcs.workflows import get_role_translation, template_on_formdata, WorkflowStatusItem
from .submission import FormFillPage
@ -2947,7 +2947,14 @@ class FormBackOfficeStatusPage(FormStatusPage):
elif test_mode == 'template':
try:
template = form.get_widget('template').parse() or ''
result = template_on_formdata(self.filled, template, raises=True)
with get_publisher().complex_data():
result = WorkflowStatusItem.compute(
template,
raises=True,
record_errors=False,
allow_complex=True)
complex_result = get_publisher().get_cached_complex_data(result)
result = re.sub(r'[\uE000-\uF8FF]', '', result)
except Exception as exception:
r += htmltext('<div class="errornotice">')
r += htmltext('<p>%s</p>') % _('Failed to evaluate template')
@ -2964,6 +2971,10 @@ class FormBackOfficeStatusPage(FormStatusPage):
r += htmltext('<pre class="test-tool-result-plain">%s</pre>') % result
else:
r += htmltext('<div class="test-tool-result-plain">%s</div>') % result
if complex_result:
r += htmltext('<h3>%s</h3>') % _('Also rendered as an object:')
r += htmltext('<div class="test-tool-result-plain">%s (%s)</div>') % (
complex_result, complex_result.__class__.__name__)
r += htmltext('</div>')
elif test_mode == 'html_template':
try:

View File

@ -1965,7 +1965,8 @@ class WorkflowStatusItem(XmlSerialisable):
return {'type': expression_type, 'value': expression_value}
@classmethod
def compute(cls, var, render=True, raises=False, allow_complex=False, context=None, formdata=None, status_item=None):
def compute(cls, var, render=True, raises=False, record_errors=True, allow_complex=False,
context=None, formdata=None, status_item=None):
if not isinstance(var, six.string_types):
return var
@ -1997,7 +1998,8 @@ class WorkflowStatusItem(XmlSerialisable):
try:
return Template(expression['value'], raises=raises, autoescape=False).render(vars)
except TemplateError as e:
log_exception(e)
if record_errors:
log_exception(e)
if raises:
raise
return var
@ -2005,7 +2007,8 @@ class WorkflowStatusItem(XmlSerialisable):
try:
return eval(expression['value'], get_publisher().get_global_eval_dict(), vars)
except Exception as e:
log_exception(e)
if record_errors:
log_exception(e)
if raises:
raise
return var