Projet

Général

Profil

0001-blocks-default_items-configuration-58450.patch

Lauréline Guérin, 29 novembre 2021 10:21

Télécharger (10,8 ko)

Voir les différences:

Subject: [PATCH] blocks: default_items configuration (#58450)

 tests/form_pages/test_block.py | 144 +++++++++++++++++++++++++++++++++
 wcs/blocks.py                  |  15 +++-
 wcs/fields.py                  |  17 +++-
 wcs/qommon/form.py             |   5 ++
 4 files changed, 177 insertions(+), 4 deletions(-)
tests/form_pages/test_block.py
895 895
    assert '>bar2<' in resp
896 896

  
897 897

  
898
def test_block_repeated_with_default(pub):
899
    FormDef.wipe()
900
    BlockDef.wipe()
901

  
902
    block = BlockDef()
903
    block.name = 'foobar'
904
    block.fields = [
905
        fields.StringField(id='123', required=True, label='Test', type='string'),
906
        fields.StringField(id='234', required=True, label='Test2', type='string'),
907
    ]
908
    block.store()
909

  
910
    formdef = FormDef()
911
    formdef.name = 'form title'
912
    formdef.fields = [
913
        fields.PageField(id='0', label='1st page', type='page'),
914
        fields.BlockField(
915
            id='1', label='test', type='block:foobar', default_items=2, max_items=3, hint='hintblock'
916
        ),
917
        fields.PageField(id='2', label='2nd page', type='page'),
918
    ]
919
    formdef.store()
920

  
921
    app = get_app(pub)
922
    resp = app.get(formdef.get_url())
923
    assert resp.text.count('>Test<') == 2
924
    assert resp.text.count('>hintblock<') == 1
925
    assert 'wcs-block-add-clicked' not in resp
926
    assert 'Add another' in resp
927
    assert resp.html.find('div', {'class': 'list-add'})
928
    resp = resp.form.submit('f1$add_element')
929
    assert resp.text.count('>Test<') == 3
930
    assert resp.text.count('>hintblock<') == 1
931
    assert resp.pyquery('.list-add').attr['style'] == 'display: none'
932

  
933
    formdef.fields[1].default_items = 3
934
    formdef.store()
935

  
936
    app = get_app(pub)
937
    resp = app.get(formdef.get_url())
938
    assert resp.text.count('>Test<') == 3
939
    assert resp.text.count('>hintblock<') == 1
940
    assert resp.pyquery('.list-add').attr['style'] == 'display: none'
941

  
942
    formdef.fields[1].default_items = 4
943
    formdef.store()
944
    app = get_app(pub)
945
    resp = app.get(formdef.get_url())
946
    assert resp.text.count('>Test<') == 3
947

  
948

  
898 949
def test_block_repeated_over_limit(pub):
899 950
    FormDef.wipe()
900 951
    BlockDef.wipe()
......
943 994
    assert 'Too many elements (maximum: 2)' in resp
944 995

  
945 996

  
997
def test_block_repeated_under_default(pub):
998
    FormDef.wipe()
999
    BlockDef.wipe()
1000

  
1001
    block = BlockDef()
1002
    block.name = 'foobar'
1003
    block.fields = [
1004
        fields.StringField(id='123', required=True, label='Test', type='string'),
1005
        fields.StringField(id='234', required=True, label='Test2', type='string'),
1006
    ]
1007
    block.store()
1008

  
1009
    formdef = FormDef()
1010
    formdef.name = 'form title'
1011
    formdef.fields = [
1012
        fields.PageField(id='0', label='1st page', type='page'),
1013
        fields.BlockField(
1014
            id='1', label='test', type='block:foobar', default_items=2, max_items=2, remove_button=True
1015
        ),
1016
        fields.PageField(id='2', label='2nd page', type='page'),
1017
        fields.BlockField(
1018
            id='3', label='test', type='block:foobar', default_items=2, max_items=2, remove_button=True
1019
        ),
1020
    ]
1021
    formdef.store()
1022
    formdef.data_class().wipe()
1023

  
1024
    app = get_app(pub)
1025
    resp = app.get(formdef.get_url())
1026
    assert resp.text.count('>Test<') == 2
1027

  
1028
    # fill items
1029
    resp.form['f1$element0$f123'] = 'foo1'
1030
    resp.form['f1$element0$f234'] = 'bar1'
1031
    resp.form['f1$element1$f123'] = 'foo2'
1032
    resp.form['f1$element1$f234'] = 'bar2'
1033

  
1034
    resp = resp.form.submit('submit')  # -> 2nd page
1035
    resp.form['f3$element0$f123'] = 'fooo1'
1036
    resp.form['f3$element0$f234'] = 'barr1'
1037
    resp.form['f3$element1$f123'] = 'fooo2'
1038
    resp.form['f3$element1$f234'] = 'barr2'
1039
    resp = resp.form.submit('submit')  # -> validation page
1040
    assert 'Check values then click submit.' in resp.text
1041
    assert resp.form['f1$element0$f123'].value == 'foo1'
1042
    assert resp.form['f1$element0$f234'].value == 'bar1'
1043
    assert resp.form['f1$element1$f123'].value == 'foo2'
1044
    assert resp.form['f1$element1$f234'].value == 'bar2'
1045
    assert resp.form['f3$element0$f123'].value == 'fooo1'
1046
    assert resp.form['f3$element0$f234'].value == 'barr1'
1047
    assert resp.form['f3$element1$f123'].value == 'fooo2'
1048
    assert resp.form['f3$element1$f234'].value == 'barr2'
1049

  
1050
    resp = resp.form.submit('previous')  # -> 2nd page
1051
    # simulate javascript removing of block elements from DOM
1052
    resp.form.field_order.remove(('f3$element0$f123', resp.form.fields['f3$element0$f123'][0]))
1053
    del resp.form.fields['f3$element0$f123']
1054
    resp.form.field_order.remove(('f3$element0$f234', resp.form.fields['f3$element0$f234'][0]))
1055
    del resp.form.fields['f3$element0$f234']
1056
    resp = resp.form.submit('previous')  # -> 1st page
1057
    # simulate javascript removing of block elements from DOM
1058
    resp.form.field_order.remove(('f1$element0$f123', resp.form.fields['f1$element0$f123'][0]))
1059
    del resp.form.fields['f1$element0$f123']
1060
    resp.form.field_order.remove(('f1$element0$f234', resp.form.fields['f1$element0$f234'][0]))
1061
    del resp.form.fields['f1$element0$f234']
1062

  
1063
    resp = resp.form.submit('submit')  # -> 2nd page
1064
    assert resp.form['f3$element0$f123'].value == 'fooo2'
1065
    assert resp.form['f3$element0$f234'].value == 'barr2'
1066
    assert 'f3$element1$f123' in resp.form.fields
1067
    assert 'f3$element1$f234' in resp.form.fields
1068
    resp = resp.form.submit('previous')  # -> 1st page
1069
    assert resp.form['f1$element0$f123'].value == 'foo2'
1070
    assert resp.form['f1$element0$f234'].value == 'bar2'
1071
    assert 'f1$element1$f123' in resp.form.fields
1072
    assert 'f1$element1$f234' in resp.form.fields
1073

  
1074
    resp = resp.form.submit('submit')  # -> 2nd page
1075
    resp = resp.form.submit('submit')  # -> validation page
1076
    assert resp.form['f1$element0$f123'].value == 'foo2'
1077
    assert resp.form['f1$element0$f234'].value == 'bar2'
1078
    assert 'f1$element1$f123' not in resp.form.fields
1079
    assert 'f1$element1$f234' not in resp.form.fields
1080
    assert resp.form['f3$element0$f123'].value == 'fooo2'
1081
    assert resp.form['f3$element0$f234'].value == 'barr2'
1082
    assert 'f3$element1$f123' not in resp.form.fields
1083
    assert 'f3$element1$f234' not in resp.form.fields
1084

  
1085
    resp = resp.form.submit('submit')  # -> submit
1086
    assert len(formdef.data_class().select()[0].data['1']['data']) == 1
1087
    assert len(formdef.data_class().select()[0].data['3']['data']) == 1
1088

  
1089

  
946 1090
def test_block_repeated_files(pub):
947 1091
    FormDef.wipe()
948 1092
    BlockDef.wipe()
wcs/blocks.py
245 245
    always_include_add_button = True
246 246

  
247 247
    def __init__(
248
        self, name, value=None, title=None, block=None, max_items=None, add_element_label=None, **kwargs
248
        self,
249
        name,
250
        value=None,
251
        title=None,
252
        block=None,
253
        default_items=None,
254
        max_items=None,
255
        add_element_label=None,
256
        **kwargs,
249 257
    ):
250 258
        self.block = block
251 259
        self.readonly = kwargs.get('readonly')
......
254 262
        element_values = None
255 263
        if value:
256 264
            element_values = value.get('data')
257
        if not max_items:
258
            max_items = 1
265
        max_items = max_items or 1
266
        default_items = min(default_items or 1, max_items)
259 267
        hint = kwargs.pop('hint', None)
260 268
        element_kwargs = {'block': self.block, 'render_br': False, 'remove_button': self.remove_button}
261 269
        element_kwargs.update(kwargs)
......
263 271
            name,
264 272
            value=element_values,
265 273
            title=title,
274
            default_items=default_items,
266 275
            max_items=max_items,
267 276
            element_type=BlockSubWidget,
268 277
            element_kwargs=element_kwargs,
wcs/fields.py
3323 3323
    allow_complex = True
3324 3324

  
3325 3325
    widget_class = BlockWidget
3326
    default_items = 1
3326 3327
    max_items = 1
3327
    extra_attributes = ['block', 'max_items', 'add_element_label', 'label_display', 'remove_button']
3328
    extra_attributes = [
3329
        'block',
3330
        'default_items',
3331
        'max_items',
3332
        'add_element_label',
3333
        'label_display',
3334
        'remove_button',
3335
    ]
3328 3336
    add_element_label = ''
3329 3337
    label_display = 'normal'
3330 3338
    remove_button = False
......
3346 3354
        super().fill_admin_form(form)
3347 3355
        if form.get_widget('prefill'):
3348 3356
            form.remove('prefill')
3357
        form.add(
3358
            IntWidget,
3359
            'default_items',
3360
            title=_('Number of items to display by default'),
3361
            value=self.default_items,
3362
        )
3349 3363
        form.add(IntWidget, 'max_items', title=_('Maximum number of items'), value=self.max_items)
3350 3364
        form.add(
3351 3365
            StringWidget, 'add_element_label', title=_('Label of "Add" button'), value=self.add_element_label
......
3366 3380

  
3367 3381
    def get_admin_attributes(self):
3368 3382
        return super().get_admin_attributes() + [
3383
            'default_items',
3369 3384
            'max_items',
3370 3385
            'add_element_label',
3371 3386
            'label_display',
wcs/qommon/form.py
1706 1706
        element_type=StringWidget,
1707 1707
        element_kwargs=None,
1708 1708
        add_element_label="Add row",
1709
        default_items=None,
1709 1710
        max_items=None,
1710 1711
        **kwargs,
1711 1712
    ):
......
1719 1720
        self.element_type = element_type
1720 1721
        self.element_kwargs = element_kwargs or {}
1721 1722
        self.element_names = []
1723
        self.default_items = default_items or 1
1722 1724
        self.max_items = max_items
1723 1725

  
1724 1726
        # Add element widgets for initial value
......
1752 1754
            if self.get('add_element') and (not max_items or current_len < max_items):
1753 1755
                # add an empty row
1754 1756
                self.add_element()
1757
            # Add elements until default_items
1758
            while len(self.element_names) < self.default_items:
1759
                self.add_element()
1755 1760

  
1756 1761
    def add_element(self, value=None, element_name=None):
1757 1762
        if element_name:
1758
-