Projet

Général

Profil

0001-formdef-new-digest_templates-field-45633.patch

Lauréline Guérin, 25 juin 2021 10:48

Télécharger (29,3 ko)

Voir les différences:

Subject: [PATCH 1/4] formdef: new digest_templates field (#45633)

 tests/admin_pages/test_card.py             | 14 +++++-----
 tests/admin_pages/test_datasource.py       |  2 +-
 tests/admin_pages/test_form.py             |  6 ++---
 tests/api/test_carddef.py                  |  8 ++++--
 tests/api/test_custom_view.py              |  2 +-
 tests/api/test_formdata.py                 |  4 ++-
 tests/api/test_user.py                     |  2 +-
 tests/backoffice_pages/test_all.py         |  6 ++---
 tests/backoffice_pages/test_carddata.py    |  6 ++---
 tests/backoffice_pages/test_custom_view.py |  2 +-
 tests/form_pages/test_all.py               | 12 ++++-----
 tests/test_carddef.py                      |  2 +-
 tests/test_formdata.py                     | 12 ++++-----
 tests/test_formdef_import.py               |  6 ++---
 tests/test_workflows.py                    |  6 ++---
 wcs/admin/forms.py                         | 21 ++++++++++-----
 wcs/backoffice/cards.py                    |  2 +-
 wcs/backoffice/management.py               |  2 +-
 wcs/carddef.py                             |  2 +-
 wcs/formdata.py                            |  2 +-
 wcs/formdef.py                             | 31 ++++++++++++++++++++--
 21 files changed, 96 insertions(+), 54 deletions(-)
tests/admin_pages/test_card.py
215 215
    resp = resp.follow()
216 216
    assert_option_display(resp, 'Templates', 'Custom')
217 217
    carddef = CardDef.get(carddef.id)
218
    assert carddef.digest_template == 'X{{form_var_test}}Y'
218
    assert carddef.digest_templates['default'] == 'X{{form_var_test}}Y'
219 219
    assert carddef.lateral_template is None
220 220
    assert carddef.submission_lateral_template is None
221 221
    assert 'Existing cards will be updated in the background.' in resp.text
......
226 226
    resp = resp.form.submit().follow()
227 227
    assert_option_display(resp, 'Templates', 'Custom')
228 228
    carddef = CardDef.get(carddef.id)
229
    assert carddef.digest_template == 'X{{form_var_test}}Y'
229
    assert carddef.digest_templates['default'] == 'X{{form_var_test}}Y'
230 230
    assert carddef.lateral_template == 'X{{form_var_test}}Y'
231 231
    assert carddef.submission_lateral_template == 'X{{form_var_test}}YZ'
232 232
    assert 'Existing cards will be updated in the background.' not in resp.text
......
241 241
    carddef.fields = [
242 242
        fields.StringField(id='1', label='Test', type='string', varname='foo'),
243 243
    ]
244
    carddef.digest_template = 'X{{ form_var_foo }}Y'
244
    carddef.digest_templates = {'default': 'X{{ form_var_foo }}Y'}
245 245
    carddef.store()
246 246
    carddata = carddef.data_class()()
247 247
    carddata.data = {'1': 'bar'}
......
263 263
    resp.form['digest_template'] = ''
264 264
    resp = resp.form.submit().follow()
265 265
    carddef = CardDef.get(carddef.id)
266
    assert carddef.digest_template is None
266
    assert carddef.digest_templates['default'] is None
267 267
    assert 'Existing cards will be updated in the background.' in resp.text
268 268

  
269 269
    # afterjobs are actually run synchronously during tests; we don't have
270 270
    # to wait to check the digest has been updated:
271 271
    assert carddef.data_class().get(carddata.id).digest == 'XbarY'
272 272

  
273
    carddef.digest_template = '{{ form_var_foo }}'
273
    carddef.digest_templates = {'default': '{{ form_var_foo }}'}
274 274
    carddef.store()
275 275

  
276 276
    # a formdef using the carddef as datasource
......
286 286
    resp = resp.form.submit()
287 287
    assert 'Can not empty digest template: this card model is used as data source in some forms.' in resp.text
288 288
    carddef = CardDef.get(carddef.id)
289
    assert carddef.digest_template is not None
289
    assert carddef.digest_templates['default'] is not None
290 290

  
291 291
    # error: not stored, and no after jobs
292 292
    resp = app.get('/backoffice/cards/%s/' % carddef.id)
......
369 369
    ]
370 370
    carddef.backoffice_submission_roles = user.roles
371 371
    carddef.workflow_roles = {'_editor': user.roles[0]}
372
    carddef.digest_template = '{{ form_var_foo }}'
372
    carddef.digest_templates = {'default': '{{ form_var_foo }}'}
373 373
    carddef.store()
374 374
    carddef.data_class().wipe()
375 375

  
tests/admin_pages/test_datasource.py
72 72
    carddef = CardDef()
73 73
    carddef.name = 'foo'
74 74
    carddef.fields = []
75
    carddef.digest_template = 'foo bar'
75
    carddef.digest_templates = {'default': 'foo bar'}
76 76
    carddef.store()
77 77

  
78 78
    custom_view = pub.custom_view_class()
tests/admin_pages/test_form.py
901 901
    resp = resp.follow()
902 902
    assert_option_display(resp, 'Templates', 'Custom')
903 903
    formdef = FormDef.get(formdef.id)
904
    assert formdef.digest_template == 'X{{form_var_test}}Y'
904
    assert formdef.digest_templates['default'] == 'X{{form_var_test}}Y'
905 905
    assert formdef.lateral_template is None
906 906
    assert formdef.submission_lateral_template is None
907 907

  
......
916 916
    resp = resp.form.submit().follow()
917 917
    assert_option_display(resp, 'Templates', 'Custom')
918 918
    formdef = FormDef.get(formdef.id)
919
    assert formdef.digest_template == 'X{{form_var_test}}Y'
919
    assert formdef.digest_templates['default'] == 'X{{form_var_test}}Y'
920 920
    assert formdef.lateral_template == 'X{{form_var_test}}Y'
921 921
    assert formdef.submission_lateral_template == 'X{{form_var_test}}YZ'
922 922
    assert 'Existing forms will be updated in the background.' not in resp.text
......
1699 1699
        (u'python', False, u'Python Expression'),
1700 1700
    ]
1701 1701

  
1702
    carddef.digest_template = 'plop'
1702
    carddef.digest_templates = {'default': 'plop'}
1703 1703
    carddef.store()
1704 1704

  
1705 1705
    resp = app.get('/backoffice/forms/1/fields/1/')
tests/api/test_carddef.py
84 84
    carddef.name = 'test'
85 85
    carddef.fields = [fields.StringField(id='0', label='foobar', varname='foo')]
86 86
    carddef.workflow_roles = {'_viewer': role.id}
87
    carddef.digest_template = 'bla {{ form_var_foo }} xxx'
87
    carddef.digest_templates = {'default': 'bla {{ form_var_foo }} xxx'}
88 88
    carddef.store()
89 89

  
90 90
    carddef.data_class().wipe()
......
177 177
    local_user.roles = [role.id]
178 178
    local_user.store()
179 179

  
180
    ApiAccess.wipe()
180 181
    access = ApiAccess()
181 182
    access.name = 'test'
182 183
    access.access_identifier = 'test'
......
218 219
    ]
219 220
    carddef.workflow_roles = {'_viewer': role.id}
220 221
    carddef.backoffice_submission_roles = [role.id]
221
    carddef.digest_template = 'bla {{ form_var_foo }} xxx'
222
    carddef.digest_templates = {'default': 'bla {{ form_var_foo }} xxx'}
222 223
    carddef.store()
223 224

  
224 225
    carddef.data_class().wipe()
......
275 276
    formdata.just_created()
276 277
    formdata.store()
277 278

  
279
    ApiAccess.wipe()
278 280
    access = ApiAccess()
279 281
    access.name = 'test'
280 282
    access.access_identifier = 'test'
......
326 328
    formdata.just_created()
327 329
    formdata.store()
328 330

  
331
    ApiAccess.wipe()
329 332
    access = ApiAccess()
330 333
    access.name = 'test'
331 334
    access.access_identifier = 'test'
......
369 372
    local_user.roles = [role.id]
370 373
    local_user.store()
371 374

  
375
    ApiAccess.wipe()
372 376
    access = ApiAccess()
373 377
    access.name = 'test'
374 378
    access.access_identifier = 'test'
tests/api/test_custom_view.py
78 78
    carddef.name = 'test'
79 79
    carddef.fields = [fields.StringField(id='0', label='foobar', varname='foo')]
80 80
    carddef.workflow_roles = {'_viewer': role.id}
81
    carddef.digest_template = 'bla {{ form_var_foo }} xxx'
81
    carddef.digest_templates = {'default': 'bla {{ form_var_foo }} xxx'}
82 82
    carddef.geolocations = {'base': 'Location'}
83 83
    carddef.store()
84 84

  
tests/api/test_formdata.py
109 109
        fields.StringField(id='0', label='foobar', varname='foobar'),
110 110
        fields.StringField(id='1', label='foobar2', varname='foobar2'),
111 111
    ]
112
    formdef.digest_template = 'plöp {{ form_var_foobar }} plÔp'
112
    formdef.digest_templates = {'default': 'plöp {{ form_var_foobar }} plÔp'}
113 113
    formdef.store()
114 114

  
115 115
    data_class = formdef.data_class()
......
857 857
        formdata.store()
858 858

  
859 859
    # check normal API behaviour: get all data
860
    ApiAccess.wipe()
860 861
    access = ApiAccess()
861 862
    access.name = 'test'
862 863
    access.access_identifier = 'test'
......
1166 1167
    app = get_app(pub)
1167 1168

  
1168 1169
    if user == 'api-access':
1170
        ApiAccess.wipe()
1169 1171
        access = ApiAccess()
1170 1172
        access.name = 'test'
1171 1173
        access.access_identifier = 'test'
tests/api/test_user.py
289 289
    assert len(resp.json['data']) == 1
290 290

  
291 291
    # check digest is part of contents
292
    formdef.digest_template = 'XYZ'
292
    formdef.digest_templates = {'default': 'XYZ'}
293 293
    formdef.data_class().get(formdata.id).store()
294 294
    assert formdef.data_class().get(formdata.id).digest == 'XYZ'
295 295
    resp = get_app(pub).get(sign_uri('/api/user/forms', user=local_user))
tests/backoffice_pages/test_all.py
765 765
    ]
766 766
    carddef.backoffice_submission_roles = user.roles
767 767
    carddef.workflow_roles = {'_editor': user.roles[0]}
768
    carddef.digest_template = 'card {{form_var_foo}}'
768
    carddef.digest_templates = {'default': 'card {{ form_var_foo }}'}
769 769
    carddef.store()
770 770
    carddef.data_class().wipe()
771 771

  
......
3056 3056
    formdata = formdef.data_class().get(
3057 3057
        re.findall(r'data-link="(.*?)"', app.get('/backoffice/management/listing').text)[0].split('/')[-2]
3058 3058
    )
3059
    formdata.formdef.digest_template = 'digest of number <{{form_number}}>'
3059
    formdata.formdef.digest_templates = {'default': 'digest of number <{{form_number}}>'}
3060 3060
    formdata.store()
3061 3061
    assert formdata.get(formdata.id).digest
3062 3062
    resp = app.get('/backoffice/management/listing')
......
3522 3522
    # check there's nothing in the sidebar
3523 3523
    assert '/user-pending-forms' not in resp.text
3524 3524

  
3525
    number31.formdef.digest_template = 'digest of number {{form_number}}'
3525
    number31.formdef.digest_templates = {'default': 'digest of number {{form_number}}'}
3526 3526
    number31.user_id = user.id
3527 3527
    number31.store()
3528 3528
    resp = app.get('/backoffice/management/form-title/%s/' % number31.id)
tests/backoffice_pages/test_carddata.py
213 213
    ]
214 214
    carddef.backoffice_submission_roles = user.roles
215 215
    carddef.workflow_roles = {'_editor': user.roles[0]}
216
    carddef.digest_template = 'card {{form_var_foo}}'
216
    carddef.digest_templates = {'default': 'card {{ form_var_foo }}'}
217 217
    carddef.store()
218 218
    carddef.data_class().wipe()
219 219

  
......
519 519
    carddef.backoffice_submission_roles = user.roles
520 520
    carddef.workflow_id = workflow.id
521 521
    carddef.workflow_roles = {'_editor': user.roles[0]}
522
    carddef.digest_template = 'card {{form_var_foo}}'
522
    carddef.digest_templates = {'default': 'card {{ form_var_foo }}'}
523 523
    carddef.store()
524 524
    carddef.data_class().wipe()
525 525

  
......
550 550
    ]
551 551
    carddef.backoffice_submission_roles = user.roles
552 552
    carddef.workflow_roles = {'_editor': user.roles[0]}
553
    carddef.digest_template = 'card {{form_var_foo}}'
553
    carddef.digest_templates = {'default': 'card {{ form_var_foo }}'}
554 554
    carddef.store()
555 555
    carddef.data_class().wipe()
556 556

  
tests/backoffice_pages/test_custom_view.py
767 767
        fields.StringField(id='1', label='Test', type='string', varname='foo'),
768 768
    ]
769 769
    carddef.backoffice_submission_roles = user.roles
770
    carddef.digest_template = '{{ form_var_foo }}'
770
    carddef.digest_templates = {'default': '{{ form_var_foo }}'}
771 771
    carddef.store()
772 772
    carddef.data_class().wipe()
773 773

  
tests/form_pages/test_all.py
5312 5312

  
5313 5313
    carddef = CardDef()
5314 5314
    carddef.name = 'items'
5315
    carddef.digest_template = '{{form_var_name}}'
5315
    carddef.digest_templates = {'default': '{{form_var_name}}'}
5316 5316
    carddef.fields = [
5317 5317
        fields.StringField(id='0', label='string', varname='name'),
5318 5318
        fields.StringField(id='1', label='string', varname='attr'),
......
5364 5364
    CardDef.wipe()
5365 5365
    carddef = CardDef()
5366 5366
    carddef.name = 'items'
5367
    carddef.digest_template = '{{form_var_attr}}'
5367
    carddef.digest_templates = {'default': '{{form_var_name}}'}
5368 5368
    carddef.workflow_roles = {'_editor': user.roles[0]}
5369 5369
    carddef.fields = [
5370 5370
        fields.ItemField(id='0', type='item', label='item', varname='item', items=['foo', 'bar', 'baz']),
......
5443 5443
    CardDef.wipe()
5444 5444
    carddef = CardDef()
5445 5445
    carddef.name = 'items'
5446
    carddef.digest_template = '{{form_var_attr}}'
5446
    carddef.digest_templates = {'default': '{{form_var_attr}}'}
5447 5447
    carddef.workflow_roles = {'_editor': user.roles[0]}
5448 5448
    carddef.fields = [
5449 5449
        fields.ItemField(id='0', type='item', label='item', varname='item', items=['foo', 'bar', 'baz']),
......
5557 5557
    CardDef.wipe()
5558 5558
    carddef = CardDef()
5559 5559
    carddef.name = 'items'
5560
    carddef.digest_template = '{{form_var_name}}'
5560
    carddef.digest_templates = {'default': '{{form_var_name}}'}
5561 5561
    carddef.fields = [
5562 5562
        fields.StringField(id='0', label='string', varname='name'),
5563 5563
        fields.StringField(id='1', label='string', varname='attr'),
......
6145 6145

  
6146 6146
    carddef = CardDef()
6147 6147
    carddef.name = 'items'
6148
    carddef.digest_template = '{{form_var_name}}'
6148
    carddef.digest_templates = {'default': '{{form_var_name}}'}
6149 6149
    carddef.fields = [
6150 6150
        fields.StringField(id='0', label='string', varname='name'),
6151 6151
        fields.StringField(id='1', label='string', varname='attr'),
......
7992 7992
def test_backoffice_fields_set_from_live(pub):
7993 7993
    carddef = CardDef()
7994 7994
    carddef.name = 'items'
7995
    carddef.digest_template = '{{form_var_name}}'
7995
    carddef.digest_templates = {'default': '{{form_var_name}}'}
7996 7996
    carddef.fields = [
7997 7997
        fields.StringField(id='0', label='string', varname='name'),
7998 7998
        fields.StringField(id='1', label='string', varname='attr'),
tests/test_carddef.py
338 338
    carddef.fields = [
339 339
        StringField(id='1', label='Test', type='string', varname='foo'),
340 340
    ]
341
    carddef.digest_template = '{{ form_var_foo }}'
341
    carddef.digest_templates = {'default': '{{ form_var_foo }}'}
342 342
    carddef.store()
343 343
    carddef.data_class().wipe()
344 344

  
tests/test_formdata.py
934 934
    CardDef.wipe()
935 935
    carddef = CardDef()
936 936
    carddef.name = 'items'
937
    carddef.digest_template = '{{form_var_name}}'
937
    carddef.digest_templates = {'default': '{{form_var_name}}'}
938 938
    carddef.fields = [
939 939
        fields.StringField(id='0', label='string', varname='name'),
940 940
        fields.StringField(id='1', label='string', varname='attr'),
......
2304 2304
    formdef.name = 'foobar'
2305 2305
    formdef.url_name = 'foobar'
2306 2306
    formdef.fields = [fields.DateField(id='0', label='date', varname='date')]
2307
    formdef.digest_template = 'plop {{ form_var_date }} plop'
2307
    formdef.digest_templates = {'default': 'plop {{ form_var_date }} plop'}
2308 2308
    formdef.store()
2309 2309

  
2310 2310
    formdata = formdef.data_class()()
......
2319 2319
    formdata.store()
2320 2320
    assert formdef.data_class().get(formdata.id).digest == 'plop 12/05/2015 plop'
2321 2321

  
2322
    formdef.digest_template = 'plop {{ form_var_date|date:"Y" }} plop'
2322
    formdef.digest_templates = {'default': 'plop {{ form_var_date|date:"Y" }} plop'}
2323 2323
    formdef.store()
2324 2324
    formdata = formdef.data_class()()
2325 2325
    formdata.data = {'0': time.strptime('2015-05-12', '%Y-%m-%d')}
2326 2326
    formdata.store()
2327 2327
    assert formdef.data_class().get(formdata.id).digest == 'plop 2015 plop'
2328 2328

  
2329
    formdef.digest_template = 'plop {{ form_var_date_raw|date:"Y" }} plop'
2329
    formdef.digest_templates = {'default': 'plop {{ form_var_date_raw|date:"Y" }} plop'}
2330 2330
    formdef.store()
2331 2331
    formdata = formdef.data_class()()
2332 2332
    formdata.data = {'0': time.strptime('2015-05-12', '%Y-%m-%d')}
2333 2333
    formdata.store()
2334 2334
    assert formdef.data_class().get(formdata.id).digest == 'plop 2015 plop'
2335 2335

  
2336
    formdef.digest_template = 'plop {{ form_var_date|date:"Y" }} plop'
2336
    formdef.digest_templates = {'default': 'plop {{ form_var_date|date:"Y" }} plop'}
2337 2337
    formdef.store()
2338 2338
    formdata = formdef.data_class()()
2339 2339
    formdata.data = {'0': None}
......
2341 2341
    assert formdef.data_class().get(formdata.id).digest == 'plop  plop'
2342 2342

  
2343 2343
    # check there's no crash when an invaliad variable is given
2344
    formdef.digest_template = 'plop {{ blah|date:"Y" }} plop'
2344
    formdef.digest_templates = {'default': 'plop {{ blah|date:"Y" }} plop'}
2345 2345
    formdef.store()
2346 2346
    formdata = formdef.data_class()()
2347 2347
    formdata.data = {'0': time.strptime('2015-05-12', '%Y-%m-%d')}
tests/test_formdef_import.py
671 671
    assert f2.fields[0].validation == {'type': 'regex', 'value': '\\d'}
672 672

  
673 673

  
674
def test_digest_template():
674
def test_digest_templates():
675 675
    formdef = FormDef()
676 676
    formdef.name = 'Foo'
677 677
    formdef.fields = []
678
    formdef.digest_template = '{{form_number}}'
678
    formdef.digest_templates = {'default': '{{form_number}}', 'custom-view:foo-bar': 'plop'}
679 679
    f2 = assert_xml_import_export_works(formdef)
680
    assert f2.digest_template == formdef.digest_template
680
    assert f2.digest_templates == formdef.digest_templates
681 681

  
682 682

  
683 683
def test_field_prefill():
tests/test_workflows.py
4827 4827

  
4828 4828
    carddef = CardDef()
4829 4829
    carddef.name = 'items'
4830
    carddef.digest_template = '{{form_var_name}}'
4830
    carddef.digest_templates = {'default': '{{form_var_name}}'}
4831 4831
    carddef.fields = [
4832 4832
        StringField(id='0', label='string', varname='name'),
4833 4833
        StringField(id='1', label='string', varname='attr'),
......
6335 6335
    carddef.fields = [
6336 6336
        StringField(id='0', label='string', varname='card_string'),
6337 6337
    ]
6338
    carddef.digest_template = '{{ form_var_card_string }}'
6338
    carddef.digest_templates = {'default': '{{ form_var_card_string }}'}
6339 6339
    carddef.workflow = carddef_wf
6340 6340
    carddef.store()
6341 6341

  
......
6725 6725
        StringField(id='1', label='Last Name', varname='last_name'),
6726 6726
        ItemField(id='2', label='Profession', type='item', varname='profession', data_source=datasource),
6727 6727
    ]
6728
    carddef.digest_template = '{{ form_var_first_name }} {{ form_var_last_name }}'
6728
    carddef.digest_templates = {'default': '{{ form_var_first_name }} {{ form_var_last_name }}'}
6729 6729
    carddef.store()
6730 6730

  
6731 6731
    carddata = carddef.data_class()()
wcs/admin/forms.py
382 382
    def templates(self):
383 383
        form = Form(enctype='multipart/form-data')
384 384
        form.add(
385
            StringWidget, 'digest_template', title=_('Digest'), value=self.formdef.digest_template, size=50
385
            StringWidget,
386
            'digest_template',
387
            title=_('Digest'),
388
            value=self.formdef.default_digest_template,
389
            size=50,
386 390
        )
387 391
        form.add(
388 392
            WysiwygTextWidget,
......
464 468
                            self.formdef.geolocations = None
465 469
                    else:
466 470
                        new_value = widget.parse()
467
                        if getattr(self.formdef, attr, None) != new_value:
468
                            if attr == 'digest_template':
471
                        if attr == 'digest_template':
472
                            if self.formdef.default_digest_template != new_value:
469 473
                                self.changed = True
470
                            setattr(self.formdef, attr, new_value)
474
                                if not self.formdef.digest_templates:
475
                                    self.formdef.digest_templates = {}
476
                                self.formdef.digest_templates['default'] = new_value
477
                        else:
478
                            if getattr(self.formdef, attr, None) != new_value:
479
                                setattr(self.formdef, attr, new_value)
471 480
            if not form.has_errors():
472 481
                self.formdef.store(comment=_('Changed "%s" parameters') % title)
473 482
                return redirect('..')
......
789 798
            )
790 799

  
791 800
        if (
792
            self.formdef.digest_template
801
            self.formdef.default_digest_template
793 802
            or self.formdef.lateral_template
794 803
            or self.formdef.submission_lateral_template
795 804
        ):
......
1914 1923
            try:
1915 1924
                formdef = self.formdef_class.import_from_xml(fp)
1916 1925
                get_session().message = ('info', str(self.import_success_message))
1917
            except FormdefImportRecoverableError as e:
1926
            except FormdefImportRecoverableError:
1918 1927
                fp.seek(0)
1919 1928
                formdef = self.formdef_class.import_from_xml(fp, fix_on_error=True)
1920 1929
                get_session().message = ('info', str(self.import_error_message))
wcs/backoffice/cards.py
166 166
        )
167 167

  
168 168
        if (
169
            self.formdef.digest_template
169
            self.formdef.default_digest_template
170 170
            or self.formdef.lateral_template
171 171
            or self.formdef.submission_lateral_template
172 172
        ):
wcs/backoffice/management.py
1659 1659
                ('any', _('to any users'), 'any'),
1660 1660
            ]
1661 1661

  
1662
            if isinstance(self.formdef, CardDef) and self.formdef.digest_template:
1662
            if isinstance(self.formdef, CardDef) and self.formdef.default_digest_template:
1663 1663
                options.append(('datasource', _('as data source'), 'datasource'))
1664 1664

  
1665 1665
            form.add(
wcs/carddef.py
158 158
    def get_carddefs_as_data_source(cls):
159 159
        carddefs_by_id = {}
160 160
        for carddef in cls.select(lightweight=True, ignore_errors=True, order_by='name'):
161
            if not carddef.digest_template:
161
            if not carddef.default_digest_template:
162 162
                continue
163 163
            data_source_id = 'carddef:%s' % carddef.url_name
164 164
            carddefs_by_id[carddef.id] = carddef
wcs/formdata.py
423 423
        self.evolution = [evo]
424 424

  
425 425
    def set_auto_fields(self, *args, **kwargs):
426
        fields = {'digest': self.formdef.digest_template}
426
        fields = {'digest': self.formdef.default_digest_template}
427 427
        if not self.id_display:
428 428
            # only set id_display once as it may have been set automatically
429 429
            # by interpreting a webservice response.
wcs/formdef.py
115 115
    skip_from_360_view = False
116 116
    include_download_all_button = False
117 117
    appearance_keywords = None
118
    digest_template = None
118
    digest_templates = None
119 119
    lateral_template = None
120 120
    submission_lateral_template = None
121 121
    drafts_lifespan = None
......
142 142
        'internal_identifier',
143 143
        'disabled_redirection',
144 144
        'appearance_keywords',
145
        'digest_template',
146 145
        'lateral_template',
147 146
        'submission_lateral_template',
148 147
        'drafts_lifespan',
......
227 226
            del self.__dict__['receiver_id']
228 227
            changed = True
229 228

  
229
        if 'digest_template' in self.__dict__:
230
            # migration from a simple template to templates
231
            if not self.digest_templates:
232
                self.digest_templates = {}
233
            self.digest_templates['default'] = self.__dict__['digest_template']
234
            del self.__dict__['digest_template']
235
            changed = True
236

  
230 237
        if not self.table_name and get_publisher().has_site_option('postgresql'):
231 238
            from . import sql
232 239

  
......
431 438

  
432 439
            sql.do_formdef_tables(self, rebuild_views=True, rebuild_global_views=True)
433 440

  
441
    @property
442
    def default_digest_template(self):
443
        return (self.digest_templates or {}).get('default')
444

  
434 445
    def get_category(self):
435 446
        if self.category_id:
436 447
            try:
......
1067 1078
            for auth_context in self.required_authentication_contexts:
1068 1079
                ET.SubElement(element, 'method').text = force_text(auth_context)
1069 1080

  
1081
        if self.digest_templates:
1082
            digest_templates = ET.SubElement(root, 'digest_templates')
1083
            for key, value in self.digest_templates.items():
1084
                if not value:
1085
                    continue
1086
                sub = ET.SubElement(digest_templates, 'template')
1087
                sub.attrib['key'] = key
1088
                sub.text = value
1070 1089
        return root
1071 1090

  
1072 1091
    @classmethod
......
1262 1281
            for child in node:
1263 1282
                formdef.required_authentication_contexts.append(str(child.text))
1264 1283

  
1284
        if tree.find('digest_templates') is not None:
1285
            digest_templates_node = tree.find('digest_templates')
1286
            formdef.digest_templates = {}
1287
            for child in digest_templates_node:
1288
                key = child.attrib['key']
1289
                value = xml_node_text(child)
1290
                formdef.digest_templates[key] = value
1291

  
1265 1292
        if check_datasources:
1266 1293
            # check if datasources are defined
1267 1294
            unknown_datasources = set()
1268
-