Projet

Général

Profil

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

Frédéric Péters, 02 juin 2018 12:23

Télécharger (5,46 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  | 15 ++++++++++++++
 wcs/fields.py             | 16 ++++++++++++++-
 3 files changed, 73 insertions(+), 1 deletion(-)
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'] = 'String'
1158
    resp.form['prefill$value_string'] = '{{form_var_toto}}'
1159
    resp = resp.form.submit('submit').follow()
1160
    assert FormDef.get(formdef.id).fields[0].prefill == {'type': 'string', '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'] = 'String'
1171
    resp.form['prefill$value_string'] = '{% 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')
......
1887 1888
    assert resp.forms[0]['f0'].value == 'HELLO WORLD'
1888 1889
    assert 'widget-prefilled' in resp.body
1889 1890

  
1891
def test_form_page_template_prefill(pub):
1892
    user = create_user(pub)
1893
    formdef = create_formdef()
1894
    formdef.data_class().wipe()
1895
    formdef.fields = [
1896
        fields.StringField(id='0', label='string',
1897
            prefill={'type': 'string', 'value': '{{session_user_display_name}}'})]
1898
    formdef.store()
1899

  
1900
    app = login(get_app(pub), username='foo', password='foo')
1901
    resp = app.get('/test/')
1902
    assert resp.form['f0'].value == 'User Name'
1903
    assert 'widget-prefilled' in resp.body
1904

  
1890 1905
def test_form_page_query_string_prefill(pub):
1891 1906
    user = create_user(pub)
1892 1907
    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
......
133 134
                compile(values.get('value', ''), '<string>', 'eval')
134 135
            except (SyntaxError, TypeError), e:
135 136
                self.set_error(_('invalid expression: %s') % e)
137
        if values and values['type'] == 'string' and Template.is_template_string(values.get('value')):
138
            try:
139
                Template(values.get('value'), raises=True)
140
            except TemplateError as e:
141
                self.set_error(str(e))
136 142

  
137 143
    def render_content(self):
138 144
        r = TemplateIO(html=True)
......
294 300
        #     (that will therefore be marked as readonly etc.)
295 301
        t = self.prefill.get('type')
296 302
        if t == 'string':
297
            return (self.prefill.get('value'), False)
303
            value = self.prefill.get('value')
304
            if not Template.is_template_string(value):
305
                return (value, False)
306

  
307
            context = get_publisher().substitutions.get_context_variables()
308
            try:
309
                return (Template(value, autoescape=False).render(context), False)
310
            except TemplateError:
311
                return (None, False)
298 312

  
299 313
        elif t == 'user' and user:
300 314
            x = self.prefill.get('value')
301
-