fields: render template for title and subtitle (#36620)
This commit is contained in:
parent
a437f81087
commit
c835c345bd
|
@ -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 < 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 < 3</h3>' in str(form.render())
|
||||
|
||||
# test for html content
|
||||
field = fields.TitleField(label='<i>Foobaré</i>')
|
||||
form = Form(use_tokens=False)
|
||||
field.add_to_form(form)
|
||||
assert '<i>Foobar&eacute;</i>' 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 < 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 < 3</h4>' in str(form.render())
|
||||
|
||||
# test for html content
|
||||
field = fields.SubtitleField(label='<i>Foobaré</i>')
|
||||
form = Form(use_tokens=False)
|
||||
field.add_to_form(form)
|
||||
assert '<i>Foobar&eacute;</i>' in str(form.render())
|
||||
assert field.unhtmled_label == 'Foobaré'
|
||||
|
||||
def test_comment():
|
||||
field = fields.CommentField(label='Foobar')
|
||||
form = Form(use_tokens=False)
|
||||
|
|
|
@ -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 = '<i>title of second page 35 < 42</i>'
|
||||
assert '<div class="title "><h3>%s</h3></div>' % expected_label in resp.body
|
||||
expected_label = '<i>subtitle of second page 35 < 42</i>'
|
||||
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'),
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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]
|
||||
|
|
Loading…
Reference in New Issue