Projet

Général

Profil

0001-fields-fix-live-prefill-for-item-fields-with-carddef.patch

Lauréline Guérin, 15 octobre 2021 11:12

Télécharger (5,71 ko)

Voir les différences:

Subject: [PATCH] fields: fix live prefill for item fields with carddef
 datasource (#57877)

 tests/form_pages/test_live.py        | 84 ++++++++++++++++++++++++++++
 wcs/forms/common.py                  |  6 ++
 wcs/qommon/static/js/qommon.forms.js |  7 ++-
 3 files changed, 96 insertions(+), 1 deletion(-)
tests/form_pages/test_live.py
799 799
    live_resp = app.post('/foo/live?modified_field_id=user', params=resp.form.submit_fields(), status=403)
800 800

  
801 801

  
802
def test_field_live_item_datasource_carddef_prefill(pub, http_requests):
803
    CardDef.wipe()
804

  
805
    carddef_related = CardDef()
806
    carddef_related.name = 'bar'
807
    carddef_related.digest_templates = {'default': '{{ form_var_bar }}'}
808
    carddef_related.fields = [
809
        fields.StringField(id='1', type='string', label='string', varname='bar'),
810
    ]
811
    carddef_related.store()
812
    carddef_related.data_class().wipe()
813
    for value in ['A', 'B', 'C']:
814
        carddata = carddef_related.data_class()()
815
        carddata.data = {
816
            '1': value,
817
        }
818
        carddata.just_created()
819
        carddata.store()
820

  
821
    carddef = CardDef()
822
    carddef.name = 'foo'
823
    carddef.digest_templates = {'default': '{{ form_var_foo }}'}
824
    carddef.fields = [
825
        fields.StringField(id='1', type='string', label='string', varname='foo'),
826
        fields.ItemField(
827
            type='item',
828
            id='2',
829
            varname='item',
830
            data_source={'type': 'carddef:bar'},
831
        ),
832
    ]
833
    carddef.store()
834
    carddef.data_class().wipe()
835
    carddata1 = carddef.data_class()()
836
    carddata1.data = {
837
        '1': 'bar',
838
        '2': '1',
839
        '2_display': 'A',
840
    }
841
    carddata1.just_created()
842
    carddata1.store()
843
    carddata2 = carddef.data_class()()
844
    carddata2.data = {
845
        '1': 'baz',
846
        '2': '2',
847
        '2_display': 'B',
848
    }
849
    carddata2.just_created()
850
    carddata2.store()
851

  
852
    FormDef.wipe()
853
    formdef = FormDef()
854
    formdef.name = 'Foo'
855
    formdef.fields = [
856
        fields.ItemField(
857
            type='item', id='1', label='foo', varname='foo', data_source={'type': 'carddef:foo'}
858
        ),
859
        fields.ItemField(
860
            type='item',
861
            id='2',
862
            label='item',
863
            varname='item',
864
            prefill={'type': 'string', 'value': '{{ form_var_foo_live_var_item }}'},
865
            data_source={'type': 'carddef:bar'},
866
        ),
867
    ]
868
    formdef.store()
869
    formdef.data_class().wipe()
870

  
871
    app = get_app(pub)
872
    resp = app.get('/foo/')
873
    assert resp.html.find('div', {'data-field-id': '1'}).attrs['data-live-source'] == 'true'
874
    assert resp.pyquery('#var_item.widget-prefilled')  # second field is marked as prefilled
875
    assert resp.form['f2'].value == '1'
876
    resp.form['f1'] = str(carddata2.id)
877
    live_resp = app.post('/foo/live?modified_field_id=1&prefilled_2=on', params=resp.form.submit_fields())
878
    assert live_resp.json['result']['2'] == {'visible': True, 'content': '2'}
879

  
880
    resp.form['f2'] = '3'  # manually changed -> widget-prefilled class will be removed
881
    resp.form['f1'] = str(carddata1.id)
882
    live_resp = app.post('/foo/live?modified_field_id=1', params=resp.form.submit_fields())
883
    assert live_resp.json['result']['2'] == {'visible': True}
884

  
885

  
802 886
def test_field_live_block_string_prefill(pub, http_requests):
803 887
    FormDef.wipe()
804 888
    BlockDef.wipe()
wcs/forms/common.py
798 798
                update_prefill = bool('prefilled_%s' % field.id in get_request().form)
799 799
                if update_prefill:
800 800
                    value = field.get_prefill_value()[0]
801
                    if field.key == 'item':
802
                        for option in field.get_options():
803
                            # get raw value from display value
804
                            if option[1] == value:
805
                                value = option[0]
806
                                break
801 807
                    entry['content'] = value
802 808
            elif field.prefill and field.prefill.get('type') == 'user':
803 809
                update_prefill = bool(get_request().form.get('modified_field_id') == 'user')
wcs/qommon/static/js/qommon.forms.js
477 477
                // replace comment content
478 478
                $widget.html(value.content);
479 479
              } else {
480
                // replace text input value
481 480
                if ($(widget).is('.widget-prefilled') || $(widget).is('.widget-readonly') || data.modified_field == 'user') {
481
                  // replace text input value
482 482
                  $(widget).find('input[type=text], input[type=tel], input[type=numeric], input[type=email], textarea').val(value.content);
483
                  // replace select value
484
                  $(widget).find('select').val(value.content);
485
                  // replace radio value
486
                  $(widget).find('input[type=radio]').prop('checked', false);
487
                  $(widget).find('input[type=radio][value="'+value.content+'"]').prop('checked', true);
483 488
                }
484 489
              }
485 490
            });
486
-