Projet

Général

Profil

0001-fields-render-template-for-title-and-subtitle-36620.patch

Lauréline Guérin, 04 octobre 2019 09:12

Télécharger (8,6 ko)

Voir les différences:

Subject: [PATCH] fields: render template for title and subtitle (#36620)

 tests/test_fields.py     | 66 ++++++++++++++++++++++++++++++++++++++++
 tests/test_form_pages.py | 27 ++++++++++++++++
 wcs/fields.py            | 19 ++++++------
 wcs/forms/common.py      |  7 +++--
 4 files changed, 107 insertions(+), 12 deletions(-)
tests/test_fields.py
162 162
    field.add_to_form(form)
163 163
    assert '<h3 data-field-id="None" class="test">Foobar</h3>' in str(form.render())
164 164

  
165
    # test for variable substitution
166
    pub.substitutions.feed(MockSubstitutionVariables())
167
    field = fields.TitleField(label='{{ bar }}')
168
    form = Form(use_tokens=False)
169
    field.add_to_form(form)
170
    assert '<h3 data-field-id="None">Foobar</h3>' in str(form.render())
171

  
172
    pub.substitutions.feed(MockSubstitutionVariables())
173
    field = fields.TitleField(label='[bar]')
174
    form = Form(use_tokens=False)
175
    field.add_to_form(form)
176
    assert '<h3 data-field-id="None">Foobar</h3>' in str(form.render())
177

  
178
    # test for proper escaping of substitution variables
179
    pub.substitutions.feed(MockSubstitutionVariables())
180
    field = fields.TitleField(label='{{ foo }}')
181
    form = Form(use_tokens=False)
182
    field.add_to_form(form)
183
    assert '<h3 data-field-id="None">1 &lt; 3</h3>' in str(form.render())
184

  
185
    pub.substitutions.feed(MockSubstitutionVariables())
186
    field = fields.TitleField(label='[foo]')
187
    form = Form(use_tokens=False)
188
    field.add_to_form(form)
189
    assert '<h3 data-field-id="None">1 &lt; 3</h3>' in str(form.render())
190

  
191
    # test for html content
192
    field = fields.TitleField(label='<i>Foobar&eacute;</i>')
193
    form = Form(use_tokens=False)
194
    field.add_to_form(form)
195
    assert '&lt;i&gt;Foobar&amp;eacute;&lt;/i&gt;' in str(form.render())
196
    assert field.unhtmled_label == 'Foobaré'
197

  
165 198
def test_subtitle():
166 199
    field = fields.SubtitleField(label='Foobar')
167 200
    form = Form(use_tokens=False)
......
173 206
    field.add_to_form(form)
174 207
    assert '<h4 data-field-id="None" class="test">Foobar</h4>' in str(form.render())
175 208

  
209
    # test for variable substitution
210
    pub.substitutions.feed(MockSubstitutionVariables())
211
    field = fields.SubtitleField(label='{{ bar }}')
212
    form = Form(use_tokens=False)
213
    field.add_to_form(form)
214
    assert '<h4 data-field-id="None">Foobar</h4>' in str(form.render())
215

  
216
    pub.substitutions.feed(MockSubstitutionVariables())
217
    field = fields.SubtitleField(label='[bar]')
218
    form = Form(use_tokens=False)
219
    field.add_to_form(form)
220
    assert '<h4 data-field-id="None">Foobar</h4>' in str(form.render())
221

  
222
    # test for proper escaping of substitution variables
223
    pub.substitutions.feed(MockSubstitutionVariables())
224
    field = fields.SubtitleField(label='{{ foo }}')
225
    form = Form(use_tokens=False)
226
    field.add_to_form(form)
227
    assert '<h4 data-field-id="None">1 &lt; 3</h4>' in str(form.render())
228

  
229
    pub.substitutions.feed(MockSubstitutionVariables())
230
    field = fields.SubtitleField(label='[foo]')
231
    form = Form(use_tokens=False)
232
    field.add_to_form(form)
233
    assert '<h4 data-field-id="None">1 &lt; 3</h4>' in str(form.render())
234

  
235
    # test for html content
236
    field = fields.SubtitleField(label='<i>Foobar&eacute;</i>')
237
    form = Form(use_tokens=False)
238
    field.add_to_form(form)
239
    assert '&lt;i&gt;Foobar&amp;eacute;&lt;/i&gt;' in str(form.render())
240
    assert field.unhtmled_label == 'Foobaré'
241

  
176 242
def test_comment():
177 243
    field = fields.CommentField(label='Foobar')
178 244
    form = Form(use_tokens=False)
tests/test_form_pages.py
513 513
        data = formdef.data_class().get(data_id)
514 514
        assert data.data == {'1': 'foo', '3': 'bar'}
515 515

  
516

  
517
def test_form_multi_page_title_and_subtitle_as_template(pub):
518
    formdef = create_formdef()
519
    formdef.fields = [fields.PageField(id='0', label='1st page', type='page'),
520
            fields.StringField(id='1', label='string', varname='foo'),
521
            fields.PageField(id='2', label='2nd page', type='page'),
522
            fields.TitleField(id='4', label='<i>title of second page {{ form_var_foo }}</i>',
523
                              type='title'),
524
            fields.SubtitleField(id='5', label='<i>subtitle of second page {{ form_var_foo }}</i>',
525
                                 type='subtitle'),
526
            fields.StringField(id='3', label='string 2')]
527
    formdef.store()
528
    resp = get_app(pub).get('/test/')
529
    formdef.data_class().wipe()
530
    resp.form['f1'] = '35 < 42'
531
    resp = resp.form.submit('submit')
532
    resp.form['f3'] = 'bar'
533
    resp = resp.form.submit('submit')
534
    assert 'Check values then click submit.' in resp.body
535
    resp = resp.form.submit('submit').follow()
536
    assert 'The form has been recorded' in resp.body
537
    expected_label = '&lt;i&gt;title of second page 35 &lt; 42&lt;/i&gt;'
538
    assert '<div class="title "><h3>%s</h3></div>' % expected_label in resp.body
539
    expected_label = '&lt;i&gt;subtitle of second page 35 &lt; 42&lt;/i&gt;'
540
    assert '<div class="subtitle "><h4>%s</h4></div>' % expected_label in resp.body
541

  
542

  
516 543
def test_form_multi_page_condition(pub):
517 544
    formdef = create_formdef()
518 545
    formdef.fields = [fields.PageField(id='0', label='1st page', type='page'),
wcs/fields.py
569 569
class TitleField(Field):
570 570
    key = 'title'
571 571
    description = N_('Title')
572
    html_tag = 'h3'
572 573

  
573 574
    def add_to_form(self, form, value = None):
575
        import wcs.workflows
574 576
        extra_attributes = ' data-field-id="%s"' % self.id
575 577
        if self.extra_css_class:
576 578
            extra_attributes += ' class="%s"' % self.extra_css_class
577
        widget = HtmlWidget(htmltext('<h3%s>%s</h3>' % (extra_attributes, self.label)))
579
        title_markup = '<{html_tag}{extra_attributes}>%s</{html_tag}>'.format(
580
            html_tag=self.html_tag,
581
            extra_attributes=extra_attributes,
582
        )
583
        label = wcs.workflows.template_on_formdata(None, self.label, autoescape=False)
584
        widget = HtmlWidget(htmltext(title_markup) % label)
578 585
        form.widgets.append(widget)
579 586
        return widget
580 587
    add_to_view_form = add_to_form
......
597 604
class SubtitleField(TitleField):
598 605
    key = 'subtitle'
599 606
    description = N_('Subtitle')
600

  
601
    def add_to_form(self, form, value = None):
602
        extra_attributes = ' data-field-id="%s"' % self.id
603
        if self.extra_css_class:
604
            extra_attributes += ' class="%s"' % self.extra_css_class
605
        widget = HtmlWidget(htmltext('<h4%s>%s</h4>' % (extra_attributes, self.label)))
606
        form.widgets.append(widget)
607
        return widget
608
    add_to_view_form = add_to_form
607
    html_tag = 'h4'
609 608

  
610 609
register_field_class(SubtitleField)
611 610

  
wcs/forms/common.py
384 384
        return r.getvalue()
385 385

  
386 386
    def display_fields(self, fields=None, form_url='', include_unset_required_fields=False):
387
        import wcs.workflows
387 388
        if fields is None:
388 389
            fields = self.formdef.fields
389 390
        r = TemplateIO(html=True)
......
454 455
                continue
455 456

  
456 457
            if f.type == 'title':
457
                r += htmltext('<div class="title %s"><h3>%s</h3></div>') % (f.extra_css_class or '', f.label)
458
                label = wcs.workflows.template_on_formdata(None, f.label, autoescape=False)
459
                r += htmltext('<div class="title %s"><h3>%s</h3></div>') % (f.extra_css_class or '', label)
458 460
                continue
459 461

  
460 462
            if f.type == 'subtitle':
461
                r += htmltext('<div class="subtitle %s"><h4>%s</h4></div>') % (f.extra_css_class or '', f.label)
463
                label = wcs.workflows.template_on_formdata(None, f.label, autoescape=False)
464
                r += htmltext('<div class="subtitle %s"><h4>%s</h4></div>') % (f.extra_css_class or '', label)
462 465
                continue
463 466

  
464 467
            css_classes = ['field', 'field-type-%s' % f.key]
465
-