Projet

Général

Profil

0001-general-add-support-for-using-templates-to-prefill-f.patch

Frédéric Péters, 27 mai 2018 10:30

Télécharger (6,51 ko)

Voir les différences:

Subject: [PATCH] general: add support for using templates to prefill fields
 (#24094)

 tests/test_admin_pages.py | 43 +++++++++++++++++++++++++++++++++++++++
 tests/test_form_pages.py  | 16 +++++++++++++++
 wcs/fields.py             | 18 ++++++++++++++++
 3 files changed, 77 insertions(+)
tests/test_admin_pages.py
1129 1129
    assert resp.body.index('<legend>Additional parameters</legend>') > \
1130 1130
            resp.body.index('<label for="form_data_source">Data Source</label>')
1131 1131

  
1132
def test_form_prefill_field(pub):
1133
    create_superuser(pub)
1134
    create_role()
1135

  
1136
    FormDef.wipe()
1137
    formdef = FormDef()
1138
    formdef.name = 'form title'
1139
    formdef.fields = [fields.StringField(id='1', label='1st field', type='string')]
1140
    formdef.store()
1141

  
1142
    app = login(get_app(pub))
1143

  
1144
    resp = app.get('/backoffice/forms/1/fields/1/')
1145
    resp.form['prefill$type'] = 'String'
1146
    resp.form['prefill$value_string'] = 'test'
1147
    resp = resp.form.submit('submit').follow()
1148
    assert FormDef.get(formdef.id).fields[0].prefill == {'type': 'string', 'value': 'test'}
1149

  
1150
    resp = app.get('/backoffice/forms/1/fields/1/')
1151
    resp.form['prefill$type'] = 'Formula (Python)'
1152
    resp.form['prefill$value_formula'] = 'True'
1153
    resp = resp.form.submit('submit').follow()
1154
    assert FormDef.get(formdef.id).fields[0].prefill == {'type': 'formula', 'value': 'True'}
1155

  
1156
    resp = app.get('/backoffice/forms/1/fields/1/')
1157
    resp.form['prefill$type'] = 'Template'
1158
    resp.form['prefill$value_template'] = '{{form_var_toto}}'
1159
    resp = resp.form.submit('submit').follow()
1160
    assert FormDef.get(formdef.id).fields[0].prefill == {'type': 'template', 'value': '{{form_var_toto}}'}
1161

  
1162
    # check error handling
1163
    resp = app.get('/backoffice/forms/1/fields/1/')
1164
    resp.form['prefill$type'] = 'Formula (Python)'
1165
    resp.form['prefill$value_formula'] = ':'
1166
    resp = resp.form.submit('submit')
1167
    assert 'invalid expression: unexpected EOF while parsing' in resp.body
1168

  
1169
    resp = app.get('/backoffice/forms/1/fields/1/')
1170
    resp.form['prefill$type'] = 'Template'
1171
    resp.form['prefill$value_template'] = '{% if %}'
1172
    resp = resp.form.submit('submit')
1173
    assert 'syntax error in Django template: Unexpected end of expression' in resp.body
1174

  
1132 1175
def test_form_edit_item_field(pub):
1133 1176
    create_superuser(pub)
1134 1177
    create_role()
tests/test_form_pages.py
88 88
    PasswordAccount.wipe()
89 89

  
90 90
    user = pub.user_class()
91
    user.name = 'User Name'
91 92
    user.email = 'foo@localhost'
92 93
    user.store()
93 94
    account = PasswordAccount(id='foo')
......
1806 1807
    assert 'widget-prefilled' in resp.body
1807 1808
    assert 'Value has been automatically prefilled.' in resp.body
1808 1809

  
1810
def test_form_page_template_prefill(pub):
1811
    user = create_user(pub)
1812
    formdef = create_formdef()
1813
    formdef.data_class().wipe()
1814
    formdef.fields = [
1815
        fields.StringField(id='0', label='string',
1816
            prefill={'type': 'template', 'value': '{{session_user_display_name}}'})]
1817
    formdef.store()
1818

  
1819
    app = login(get_app(pub), username='foo', password='foo')
1820
    resp = app.get('/test/')
1821
    assert resp.form['f0'].value == 'User Name'
1822
    assert 'widget-prefilled' in resp.body
1823
    assert 'Value has been automatically prefilled.' in resp.body
1824

  
1809 1825
def test_form_page_query_string_prefill(pub):
1810 1826
    user = create_user(pub)
1811 1827
    formdef = create_formdef()
wcs/fields.py
34 34
from qommon import evalutils
35 35
from qommon.form import *
36 36
from qommon.misc import localstrftime, strftime, date_format, ellipsize
37
from qommon.template import Template, TemplateError
37 38
from qommon import get_cfg, get_logger
38 39

  
39 40
import data_sources
......
50 51

  
51 52
        options = [('none', _('None')),
52 53
                ('string', _('String')),
54
                ('template', _('Template')),
53 55
                ('formula', _('Formula (Python)')),
54 56
                ('user', _('User Field')),
55 57
                ('geolocation', _('Geolocation')),]
......
74 76
                 value=value.get('value') if value.get('type') == 'string' else None,
75 77
                 attrs={'data-dynamic-display-child-of': 'prefill$type',
76 78
                        'data-dynamic-display-value': prefill_types.get('string')})
79
        self.add(StringWidget, 'value_template', size=80,
80
                 value=value.get('value') if value.get('type') == 'template' else None,
81
                 attrs={'data-dynamic-display-child-of': 'prefill$type',
82
                        'data-dynamic-display-value': prefill_types.get('template')})
77 83
        self.add(StringWidget, 'value_formula', size=80,
78 84
                 value=value.get('value') if value.get('type') == 'formula' else None,
79 85
                 attrs={'data-dynamic-display-child-of': 'prefill$type',
......
133 139
                compile(values.get('value', ''), '<string>', 'eval')
134 140
            except (SyntaxError, TypeError), e:
135 141
                self.set_error(_('invalid expression: %s') % e)
142
        if values and values['type'] == 'template' and values.get('value'):
143
            try:
144
                Template(values.get('value'), raises=True)
145
            except TemplateError as e:
146
                self.set_error(str(e))
136 147

  
137 148
    def render_content(self):
138 149
        r = TemplateIO(html=True)
......
296 307
        if t == 'string':
297 308
            return (self.prefill.get('value'), False)
298 309

  
310
        elif t == 'template':
311
            context = get_publisher().substitutions.get_context_variables()
312
            try:
313
                return (Template(self.prefill.get('value'), autoescape=False).render(context), False)
314
            except TemplateError:
315
                return (None, False)
316

  
299 317
        elif t == 'user' and user:
300 318
            x = self.prefill.get('value')
301 319
            if x == 'email':
302
-