fields: render template for title and subtitle (#36620)

This commit is contained in:
Lauréline Guérin 2019-10-03 11:42:52 +02:00
parent a437f81087
commit c835c345bd
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
4 changed files with 107 additions and 12 deletions

View File

@ -162,6 +162,39 @@ def test_title():
field.add_to_form(form)
assert '<h3 data-field-id="None" class="test">Foobar</h3>' in str(form.render())
# test for variable substitution
pub.substitutions.feed(MockSubstitutionVariables())
field = fields.TitleField(label='{{ bar }}')
form = Form(use_tokens=False)
field.add_to_form(form)
assert '<h3 data-field-id="None">Foobar</h3>' in str(form.render())
pub.substitutions.feed(MockSubstitutionVariables())
field = fields.TitleField(label='[bar]')
form = Form(use_tokens=False)
field.add_to_form(form)
assert '<h3 data-field-id="None">Foobar</h3>' in str(form.render())
# test for proper escaping of substitution variables
pub.substitutions.feed(MockSubstitutionVariables())
field = fields.TitleField(label='{{ foo }}')
form = Form(use_tokens=False)
field.add_to_form(form)
assert '<h3 data-field-id="None">1 &lt; 3</h3>' in str(form.render())
pub.substitutions.feed(MockSubstitutionVariables())
field = fields.TitleField(label='[foo]')
form = Form(use_tokens=False)
field.add_to_form(form)
assert '<h3 data-field-id="None">1 &lt; 3</h3>' in str(form.render())
# test for html content
field = fields.TitleField(label='<i>Foobar&eacute;</i>')
form = Form(use_tokens=False)
field.add_to_form(form)
assert '&lt;i&gt;Foobar&amp;eacute;&lt;/i&gt;' in str(form.render())
assert field.unhtmled_label == 'Foobaré'
def test_subtitle():
field = fields.SubtitleField(label='Foobar')
form = Form(use_tokens=False)
@ -173,6 +206,39 @@ def test_subtitle():
field.add_to_form(form)
assert '<h4 data-field-id="None" class="test">Foobar</h4>' in str(form.render())
# test for variable substitution
pub.substitutions.feed(MockSubstitutionVariables())
field = fields.SubtitleField(label='{{ bar }}')
form = Form(use_tokens=False)
field.add_to_form(form)
assert '<h4 data-field-id="None">Foobar</h4>' in str(form.render())
pub.substitutions.feed(MockSubstitutionVariables())
field = fields.SubtitleField(label='[bar]')
form = Form(use_tokens=False)
field.add_to_form(form)
assert '<h4 data-field-id="None">Foobar</h4>' in str(form.render())
# test for proper escaping of substitution variables
pub.substitutions.feed(MockSubstitutionVariables())
field = fields.SubtitleField(label='{{ foo }}')
form = Form(use_tokens=False)
field.add_to_form(form)
assert '<h4 data-field-id="None">1 &lt; 3</h4>' in str(form.render())
pub.substitutions.feed(MockSubstitutionVariables())
field = fields.SubtitleField(label='[foo]')
form = Form(use_tokens=False)
field.add_to_form(form)
assert '<h4 data-field-id="None">1 &lt; 3</h4>' in str(form.render())
# test for html content
field = fields.SubtitleField(label='<i>Foobar&eacute;</i>')
form = Form(use_tokens=False)
field.add_to_form(form)
assert '&lt;i&gt;Foobar&amp;eacute;&lt;/i&gt;' in str(form.render())
assert field.unhtmled_label == 'Foobaré'
def test_comment():
field = fields.CommentField(label='Foobar')
form = Form(use_tokens=False)

View File

@ -513,6 +513,33 @@ def test_form_multi_page(pub):
data = formdef.data_class().get(data_id)
assert data.data == {'1': 'foo', '3': 'bar'}
def test_form_multi_page_title_and_subtitle_as_template(pub):
formdef = create_formdef()
formdef.fields = [fields.PageField(id='0', label='1st page', type='page'),
fields.StringField(id='1', label='string', varname='foo'),
fields.PageField(id='2', label='2nd page', type='page'),
fields.TitleField(id='4', label='<i>title of second page {{ form_var_foo }}</i>',
type='title'),
fields.SubtitleField(id='5', label='<i>subtitle of second page {{ form_var_foo }}</i>',
type='subtitle'),
fields.StringField(id='3', label='string 2')]
formdef.store()
resp = get_app(pub).get('/test/')
formdef.data_class().wipe()
resp.form['f1'] = '35 < 42'
resp = resp.form.submit('submit')
resp.form['f3'] = 'bar'
resp = resp.form.submit('submit')
assert 'Check values then click submit.' in resp.body
resp = resp.form.submit('submit').follow()
assert 'The form has been recorded' in resp.body
expected_label = '&lt;i&gt;title of second page 35 &lt; 42&lt;/i&gt;'
assert '<div class="title "><h3>%s</h3></div>' % expected_label in resp.body
expected_label = '&lt;i&gt;subtitle of second page 35 &lt; 42&lt;/i&gt;'
assert '<div class="subtitle "><h4>%s</h4></div>' % expected_label in resp.body
def test_form_multi_page_condition(pub):
formdef = create_formdef()
formdef.fields = [fields.PageField(id='0', label='1st page', type='page'),

View File

@ -569,12 +569,19 @@ def register_field_class(klass):
class TitleField(Field):
key = 'title'
description = N_('Title')
html_tag = 'h3'
def add_to_form(self, form, value = None):
import wcs.workflows
extra_attributes = ' data-field-id="%s"' % self.id
if self.extra_css_class:
extra_attributes += ' class="%s"' % self.extra_css_class
widget = HtmlWidget(htmltext('<h3%s>%s</h3>' % (extra_attributes, self.label)))
title_markup = '<{html_tag}{extra_attributes}>%s</{html_tag}>'.format(
html_tag=self.html_tag,
extra_attributes=extra_attributes,
)
label = wcs.workflows.template_on_formdata(None, self.label, autoescape=False)
widget = HtmlWidget(htmltext(title_markup) % label)
form.widgets.append(widget)
return widget
add_to_view_form = add_to_form
@ -597,15 +604,7 @@ register_field_class(TitleField)
class SubtitleField(TitleField):
key = 'subtitle'
description = N_('Subtitle')
def add_to_form(self, form, value = None):
extra_attributes = ' data-field-id="%s"' % self.id
if self.extra_css_class:
extra_attributes += ' class="%s"' % self.extra_css_class
widget = HtmlWidget(htmltext('<h4%s>%s</h4>' % (extra_attributes, self.label)))
form.widgets.append(widget)
return widget
add_to_view_form = add_to_form
html_tag = 'h4'
register_field_class(SubtitleField)

View File

@ -384,6 +384,7 @@ class FormStatusPage(Directory, FormTemplateMixin):
return r.getvalue()
def display_fields(self, fields=None, form_url='', include_unset_required_fields=False):
import wcs.workflows
if fields is None:
fields = self.formdef.fields
r = TemplateIO(html=True)
@ -454,11 +455,13 @@ class FormStatusPage(Directory, FormTemplateMixin):
continue
if f.type == 'title':
r += htmltext('<div class="title %s"><h3>%s</h3></div>') % (f.extra_css_class or '', f.label)
label = wcs.workflows.template_on_formdata(None, f.label, autoescape=False)
r += htmltext('<div class="title %s"><h3>%s</h3></div>') % (f.extra_css_class or '', label)
continue
if f.type == 'subtitle':
r += htmltext('<div class="subtitle %s"><h4>%s</h4></div>') % (f.extra_css_class or '', f.label)
label = wcs.workflows.template_on_formdata(None, f.label, autoescape=False)
r += htmltext('<div class="subtitle %s"><h4>%s</h4></div>') % (f.extra_css_class or '', label)
continue
css_classes = ['field', 'field-type-%s' % f.key]