Projet

Général

Profil

0001-forms-keep-block-fields-as-parsed-when-prefilling-50.patch

Frédéric Péters, 25 janvier 2021 23:08

Télécharger (7,98 ko)

Voir les différences:

Subject: [PATCH] forms: keep block fields as parsed when prefilling (#50530)

 tests/form_pages/test_block.py | 143 +++++++++++++++++++++++++--------
 wcs/forms/root.py              |   5 ++
 2 files changed, 116 insertions(+), 32 deletions(-)
tests/form_pages/test_block.py
397 397
    ]
398 398
    block.store()
399 399

  
400
    block2 = BlockDef()
401
    block2.name = 'foobar2'
402
    block2.fields = [
403
        fields.StringField(
404
            id='123', required=True, label='Test', type='string'),
405
    ]
406
    block2.store()
407

  
400 408
    formdef = FormDef()
401 409
    formdef.name = 'form title'
402 410
    formdef.fields = [
......
404 412
        fields.StringField(id='1', label='string', varname='foo'),
405 413
        fields.PageField(id='2', label='2nd page', type='page'),
406 414
        fields.BlockField(id='3', label='test', type='block:foobar'),
415
        fields.BlockField(id='4', label='test', type='block:foobar2'),
416
    ]
417
    formdef.store()
418

  
419
    for i in range(2):
420
        if i == 1:
421
            # second pass, add another prefilled field in second block
422
            block2.fields.append(
423
                fields.StringField(
424
                    id='124', required=True, label='Test', type='string',
425
                    prefill={'type': 'string', 'value': '{{ form_var_foo }} World'})
426
            )
427
            block2.store()
428

  
429
        formdef.data_class().wipe()
430

  
431
        app = get_app(pub)
432
        resp = app.get(formdef.get_url())
433
        resp.form['f1'] = 'Hello'
434
        resp = resp.form.submit('submit')  # -> 2nd page
435
        assert not resp.pyquery('#form_error_f3')  # not marked as error
436
        assert not resp.pyquery('#form_error_f4')  # ...
437
        assert '>required field<' not in resp
438
        assert resp.form['f3$element0$f123'].value == 'Hello World'
439
        assert resp.form['f4$element0$f123'].value == ''
440
        resp.form['f4$element0$f123'] = 'plop'
441
        resp = resp.form.submit('submit')  # -> validation page
442
        resp = resp.form.submit('submit')  # -> end page
443
        resp = resp.follow()
444

  
445
        formdata = formdef.data_class().select()[0]
446
        assert formdata.data['3']['data'][0]['123'] == 'Hello World'
447
        if i == 1:
448
            assert formdata.data['4']['data'][0]['124'] == 'Hello World'
449

  
450
        # check unmodified prefilled field
451
        app = get_app(pub)
452
        resp = app.get(formdef.get_url())
453
        resp.form['f1'] = 'Hello'
454
        resp = resp.form.submit('submit')  # -> 2nd page
455
        assert resp.form['f3$element0$f123'].value == 'Hello World'
456
        resp.form['f4$element0$f123'] = 'plop'
457
        resp = resp.form.submit('submit')  # -> validation page
458
        resp = resp.form.submit('previous')  # -> 2nd page
459
        resp = resp.form.submit('previous')  # -> 1st page
460
        resp.form['f1'] = 'Test'
461
        resp = resp.form.submit('submit')  # -> 2nd page
462
        assert resp.form['f3$element0$f123'].value == 'Test World'
463

  
464
        # check modified prefilled field
465
        app = get_app(pub)
466
        resp = app.get(formdef.get_url())
467
        resp.form['f1'] = 'Hello'
468
        resp = resp.form.submit('submit')  # -> 2nd page
469
        assert resp.form['f3$element0$f123'].value == 'Hello World'
470
        resp.form['f3$element0$f123'] = 'Foobar'
471
        resp.form['f4$element0$f123'] = 'plop'
472
        resp = resp.form.submit('submit')  # -> validation page
473
        resp = resp.form.submit('previous')  # -> 2nd page
474
        resp = resp.form.submit('previous')  # -> 1st page
475
        resp.form['f1'] = 'Test'
476
        resp = resp.form.submit('submit')  # -> 2nd page
477
        assert resp.form['f3$element0$f123'].value == 'Foobar'
478

  
479

  
480
def test_block_prefill_and_required(pub, blocks_feature):
481
    FormDef.wipe()
482
    BlockDef.wipe()
483

  
484
    block = BlockDef()
485
    block.name = 'foobar'
486
    block.fields = [
487
        fields.StringField(
488
            id='123', required=True, label='Test', type='string',
489
            prefill={'type': 'string', 'value': 'World'}),
490
    ]
491
    block.store()
492

  
493
    block2 = BlockDef()
494
    block2.name = 'foobar2'
495
    block2.fields = [
496
        fields.StringField(id='123', required=True, label='Test', type='string'),
497
        fields.BoolField(id='234', required=True, label='Test2', type='bool'),
498
    ]
499
    block2.store()
500

  
501
    formdef = FormDef()
502
    formdef.name = 'form title'
503
    formdef.fields = [
504
        fields.ItemField(
505
            id='1', required=True, label='Test2', type='item', items=['Foo', 'Bar']),
506
        fields.BlockField(id='2', label='test', type='block:foobar'),
507
        fields.BlockField(id='3', label='test', type='block:foobar2'),
407 508
    ]
408 509
    formdef.store()
510

  
409 511
    formdef.data_class().wipe()
410 512

  
411 513
    app = get_app(pub)
412 514
    resp = app.get(formdef.get_url())
413
    resp.form['f1'] = 'Hello'
414
    resp = resp.form.submit('submit')  # -> 2nd page
415
    assert not resp.pyquery('#form_error_f3')  # not marked as error
416
    assert resp.form['f3$element0$f123'].value == 'Hello World'
515
    assert '>required field<' not in resp
516
    assert resp.form['f2$element0$f123'].value == 'World'
517
    resp.form['f3$element0$f123'] = 'Hello'
518
    resp = resp.form.submit('submit')  # -> same page, error displyed
519
    assert resp.text.count('>required field<') == 1
520
    resp.form['f3$element0$f234'].checked = True
417 521
    resp = resp.form.submit('submit')  # -> validation page
418 522
    resp = resp.form.submit('submit')  # -> end page
419 523
    resp = resp.follow()
420 524

  
421 525
    formdata = formdef.data_class().select()[0]
422
    assert formdata.data['3']['data'][0]['123'] == 'Hello World'
423

  
424
    # check unmodified prefilled field
425
    app = get_app(pub)
426
    resp = app.get(formdef.get_url())
427
    resp.form['f1'] = 'Hello'
428
    resp = resp.form.submit('submit')  # -> 2nd page
429
    assert resp.form['f3$element0$f123'].value == 'Hello World'
430
    resp = resp.form.submit('submit')  # -> validation page
431
    resp = resp.form.submit('previous')  # -> 2nd page
432
    resp = resp.form.submit('previous')  # -> 1st page
433
    resp.form['f1'] = 'Test'
434
    resp = resp.form.submit('submit')  # -> 2nd page
435
    assert resp.form['f3$element0$f123'].value == 'Test World'
436

  
437
    # check modified prefilled field
438
    app = get_app(pub)
439
    resp = app.get(formdef.get_url())
440
    resp.form['f1'] = 'Hello'
441
    resp = resp.form.submit('submit')  # -> 2nd page
442
    assert resp.form['f3$element0$f123'].value == 'Hello World'
443
    resp.form['f3$element0$f123'] = 'Foobar'
444
    resp = resp.form.submit('submit')  # -> validation page
445
    resp = resp.form.submit('previous')  # -> 2nd page
446
    resp = resp.form.submit('previous')  # -> 1st page
447
    resp.form['f1'] = 'Test'
448
    resp = resp.form.submit('submit')  # -> 2nd page
449
    assert resp.form['f3$element0$f123'].value == 'Foobar'
526
    assert formdata.data['2']['data'][0]['123'] == 'World'
527
    assert formdata.data['3']['data'][0]['123'] == 'Hello'
528
    assert formdata.data['3']['data'][0]['234'] is True
450 529

  
451 530

  
452 531
def test_block_locked_prefill(pub, blocks_feature):
wcs/forms/root.py
372 372
            if not prefilled and widget:
373 373
                widget.clear_error()
374 374
                widget._parsed = False
375
                if block or field.key == 'block':
376
                    # keep block outer & inner widgets as _parsed to avoid
377
                    # later display of "required value" message that should
378
                    # only happen when pages are submitted.
379
                    widget._parsed = True
375 380

  
376 381
            if v is not None:
377 382
                # store computed value, it will be used to compare with
378
-