inspect: display complex types on rendered templates (#49785)
This commit is contained in:
parent
b4cbc94b75
commit
770acecd23
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue