Projet

Général

Profil

0001-fields-add-check-on-value-receive-to-prefill-items-f.patch

Frédéric Péters, 05 juillet 2022 13:33

Télécharger (5,82 ko)

Voir les différences:

Subject: [PATCH] fields: add check on value receive to prefill items fields
 (#66995)

 tests/form_pages/test_all.py | 76 ++++++++++++++++++++++++++----------
 wcs/fields.py                |  9 ++++-
 2 files changed, 64 insertions(+), 21 deletions(-)
tests/form_pages/test_all.py
3664 3664

  
3665 3665

  
3666 3666
def test_form_page_template_prefill_items_field(pub):
3667
    BlockDef.wipe()
3667 3668
    create_user(pub)
3669

  
3670
    block = BlockDef()
3671
    block.name = 'foobar'
3672
    block.fields = [
3673
        fields.StringField(id='123', required=True, label='Test', type='string', varname='test'),
3674
    ]
3675
    block.store()
3676

  
3668 3677
    formdef = create_formdef()
3669 3678
    formdef.data_class().wipe()
3670 3679
    formdef.fields = [
......
3673 3682
            label='items',
3674 3683
            items=['foo', 'bar', 'baz'],
3675 3684
            prefill={'type': 'string', 'value': 'foo,baz'},
3676
        )
3685
        ),
3686
        fields.FileField(id='1', label='file', type='file', varname='file'),
3687
        fields.BlockField(id='2', label='test', type='block:foobar', varname='foobar'),
3677 3688
    ]
3678 3689
    formdef.store()
3679 3690

  
......
3685 3696
    resp.form['f0$element1'].checked = True
3686 3697
    resp.form['f0$element2'].checked = False
3687 3698
    assert 'widget-prefilled' in resp.text
3699
    resp.form['f1$file'] = Upload('test.txt', b'foobar', 'text/plain')
3700
    resp.form['f2$element0$f123'] = 'plop'
3688 3701
    resp = resp.form.submit('submit')
3689 3702
    resp = resp.form.submit('submit')
3690 3703
    assert formdef.data_class().count() == 1
3691 3704

  
3692 3705
    # check with remote json
3693 3706
    ds = {'type': 'json', 'value': 'http://remote.example.net/json'}
3694
    formdef.fields = [
3695
        fields.ItemsField(
3696
            id='0',
3697
            label='items',
3698
            data_source=ds,
3699
            display_disabled_items=True,
3700
            prefill={'type': 'string', 'value': 'foo,baz'},
3701
        )
3702
    ]
3707
    formdef.fields[0] = fields.ItemsField(
3708
        id='0',
3709
        label='items',
3710
        data_source=ds,
3711
        display_disabled_items=True,
3712
        prefill={'type': 'string', 'value': 'foo,baz'},
3713
    )
3703 3714
    formdef.store()
3704 3715

  
3705 3716
    with mock.patch('wcs.qommon.misc.urlopen') as urlopen:
......
3717 3728
        assert resp.form['f0$elementbaz'].checked
3718 3729

  
3719 3730
        # check with template returning a complex data
3720
        formdef.fields = [
3721
            fields.ItemsField(
3722
                id='0',
3723
                varname='items',
3724
                label='items',
3725
                data_source=ds,
3726
                display_disabled_items=True,
3727
                prefill={'type': 'string', 'value': '{{form_objects|first|get:"form_var_items_raw"}}'},
3728
            )
3729
        ]
3731
        formdef.fields[0] = fields.ItemsField(
3732
            id='0',
3733
            varname='items',
3734
            label='items',
3735
            data_source=ds,
3736
            display_disabled_items=True,
3737
            prefill={'type': 'string', 'value': '{{form_objects|first|get:"form_var_items_raw"}}'},
3738
        )
3730 3739
        formdef.store()
3731 3740

  
3732 3741
        # it will use foo,bar as selected in the first part of this test
......
3735 3744
        assert resp.form['f0$elementbar'].checked
3736 3745
        assert not resp.form['f0$elementbaz'].checked
3737 3746

  
3747
        # check with complex data of wrong type
3748
        for invalid_prefill_value in [
3749
            {'type': 'string', 'value': '{{form_objects|first|get:"form_var_file_raw"}}'},
3750
            {'type': 'string', 'value': '{{form_objects|first|get:"form_var_foobar"}}'},
3751
            {'type': 'formula', 'value': '[{"a": "foo", "b": "baz"}]'},
3752
        ]:
3753
            formdef.fields[0] = fields.ItemsField(
3754
                id='0',
3755
                varname='items',
3756
                label='items',
3757
                data_source=ds,
3758
                display_disabled_items=True,
3759
                prefill=invalid_prefill_value,
3760
            )
3761
            formdef.store()
3762

  
3763
            resp = get_app(pub).get('/test/')
3764
            assert not resp.form['f0$elementfoo'].checked
3765
            assert not resp.form['f0$elementbar'].checked
3766
            assert not resp.form['f0$elementbaz'].checked
3767

  
3768
            if pub.is_using_postgresql():
3769
                assert pub.loggederror_class.count() == 1
3770
                logged_error = pub.loggederror_class.select()[0]
3771
                assert logged_error.summary == 'Invalid value for items prefill on field "items"'
3772
                pub.loggederror_class.wipe()
3773

  
3738 3774

  
3739 3775
def test_form_page_changing_prefill(pub):
3740 3776
    formdef = create_formdef()
wcs/fields.py
2561 2561
        self.check_items_admin_form(form)
2562 2562

  
2563 2563
    def get_prefill_value(self, user=None, force_string=True):
2564
        return super().get_prefill_value(user=user, force_string=False)
2564
        value, explicit_lock = super().get_prefill_value(user=user, force_string=False)
2565
        if not isinstance(value, (str, tuple, list)) or not all(isinstance(x, (int, str)) for x in value):
2566
            get_publisher().record_error(
2567
                _('Invalid value for items prefill on field "%s"') % self.label,
2568
                formdef=getattr(self, 'formdef', None),
2569
            )
2570
            return (None, explicit_lock)
2571
        return (value, explicit_lock)
2565 2572

  
2566 2573
    def convert_value_to_str(self, value):
2567 2574
        return value
2568
-