Projet

Général

Profil

0001-fields-change-list-show-as-radio-option-into-a-displ.patch

Frédéric Péters, 19 mars 2019 11:23

Télécharger (11,5 ko)

Voir les différences:

Subject: [PATCH] fields: change list "show as radio" option into a "display
 mode" option (#31539)

 tests/test_backoffice_pages.py |  2 +-
 tests/test_fields.py           | 24 ++++++++++++------------
 tests/test_form_pages.py       |  6 +++---
 tests/test_formdef_import.py   | 32 ++++++++++++++++++++++++++++++++
 wcs/fields.py                  | 32 +++++++++++++++++++++++++++-----
 5 files changed, 75 insertions(+), 21 deletions(-)
tests/test_backoffice_pages.py
3543 3543
            fields.ItemField(
3544 3544
                id='2', label='Test2', type='item',
3545 3545
                prefill={'type': 'string', 'value': ''},
3546
                show_as_radio=True,
3546
                display_mode='radio',
3547 3547
                varname='radio',
3548 3548
                items=['a', 'b', 'c'], required=True))
3549 3549
    status.items.append(display_form)
tests/test_fields.py
278 278
        'value': '''['aa', 'ab', 'ac']'''}})
279 279

  
280 280
    for item_kwargs in items_kwargs:
281
        field = fields.ItemField(id='1', label='Foobar', show_as_radio=True, **item_kwargs)
281
        field = fields.ItemField(id='1', label='Foobar', display_mode='radio', **item_kwargs)
282 282
        form = Form(use_tokens=False)
283 283
        field.add_to_form(form)
284 284
        assert str(form.render()).count('"radio"') == 3
285 285

  
286 286
        field = fields.ItemField(id='1', label='Foobar', required=False,
287
                show_as_radio=True, **item_kwargs)
287
                display_mode='radio', **item_kwargs)
288 288
        form = Form(use_tokens=False)
289 289
        field.add_to_form(form)
290 290
        assert str(form.render()).count('"radio"') == 3
291 291

  
292 292
        field = fields.ItemField(id='1', label='Foobar',
293
                show_as_radio=True, required=False, hint='Bla bla bla', **item_kwargs)
293
                display_mode='radio', required=False, hint='Bla bla bla', **item_kwargs)
294 294
        form = Form(use_tokens=False)
295 295
        field.add_to_form(form)
296 296
        assert str(form.render()).count('"radio"') == 3
297 297

  
298 298
        field = fields.ItemField(id='1', label='Foobar',
299
                show_as_radio=True, required=True, hint='Bla bla bla', **item_kwargs)
299
                display_mode='radio', required=True, hint='Bla bla bla', **item_kwargs)
300 300
        form = Form(use_tokens=False)
301 301
        field.add_to_form(form)
302 302
        assert str(form.render()).count('"radio"') == 3
......
308 308
        'type': 'formula',
309 309
        'value': '''[]'''}})
310 310
    for item_kwargs in items_kwargs:
311
        field = fields.ItemField(id='1', label='Foobar', show_as_radio=True, **item_kwargs)
311
        field = fields.ItemField(id='1', label='Foobar', display_mode='radio', **item_kwargs)
312 312
        form = Form(use_tokens=False)
313 313
        field.add_to_form(form)
314 314
        assert str(form.render()).count('"radio"') == 1
315 315

  
316 316
        field = fields.ItemField(id='1', label='Foobar', required=False,
317
                show_as_radio=True, **item_kwargs)
317
                display_mode='radio', **item_kwargs)
318 318
        form = Form(use_tokens=False)
319 319
        field.add_to_form(form)
320 320
        assert str(form.render()).count('"radio"') == 1
321 321

  
322 322
        field = fields.ItemField(id='1', label='Foobar',
323
                show_as_radio=True, required=False, hint='Bla bla bla', **item_kwargs)
323
                display_mode='radio', required=False, hint='Bla bla bla', **item_kwargs)
324 324
        form = Form(use_tokens=False)
325 325
        field.add_to_form(form)
326 326
        assert str(form.render()).count('"radio"') == 1
327 327

  
328 328
        field = fields.ItemField(id='1', label='Foobar',
329
                show_as_radio=True, required=True, hint='Bla bla bla', **item_kwargs)
329
                display_mode='radio', required=True, hint='Bla bla bla', **item_kwargs)
330 330
        form = Form(use_tokens=False)
331 331
        field.add_to_form(form)
332 332
        assert str(form.render()).count('"radio"') == 1
333 333

  
334 334
def test_item_radio_lengths():
335
    field = fields.ItemField(id='1', label='Foobar', show_as_radio=True,
335
    field = fields.ItemField(id='1', label='Foobar', display_mode='radio',
336 336
            items=['aa', 'ab', 'ac'])
337 337
    form = Form(use_tokens=False)
338 338
    field.add_to_form(form)
339 339
    form.render()
340 340
    assert str(form.widgets[-1].render()).count('<br') == 0
341 341

  
342
    field = fields.ItemField(id='1', label='Foobar', show_as_radio=True,
342
    field = fields.ItemField(id='1', label='Foobar', display_mode='radio',
343 343
            items=['aa'*30, 'ab', 'ac'])
344 344
    form = Form(use_tokens=False)
345 345
    field.add_to_form(form)
346 346
    form.render()
347 347
    assert str(form.widgets[-1].render()).count('<br') == 2
348 348

  
349
    field = fields.ItemField(id='1', label='Foobar', show_as_radio=True,
349
    field = fields.ItemField(id='1', label='Foobar', display_mode='radio',
350 350
            items=['aa', 'ab'*30, 'ac'])
351 351
    form = Form(use_tokens=False)
352 352
    field.add_to_form(form)
353 353
    form.render()
354 354
    assert str(form.widgets[-1].render()).count('<br') == 2
355 355

  
356
    field = fields.ItemField(id='1', label='Foobar', show_as_radio=True,
356
    field = fields.ItemField(id='1', label='Foobar', display_mode='radio',
357 357
            items=['aa', 'ab', 'ac', 'ad'])
358 358
    form = Form(use_tokens=False)
359 359
    field.add_to_form(form)
tests/test_form_pages.py
4611 4611
    formdef.data_class().wipe()
4612 4612
    formdef.fields = [fields.ItemField(id='0', label='item', type='item',
4613 4613
        items=['bar@localhost', 'foo@localhost', 'baz@localhost'],
4614
        show_as_radio=True,
4614
        display_mode='radio',
4615 4615
        prefill={'type': 'user', 'value': 'email'})]
4616 4616
    formdef.store()
4617 4617

  
......
4699 4699

  
4700 4700
    formdef.data_class().wipe()
4701 4701
    formdef.fields = [fields.ItemField(id='0', label='string', type='item',
4702
        data_source=ds, show_as_radio=True, display_disabled_items=True)]
4702
        data_source=ds, display_mode='radio', display_disabled_items=True)]
4703 4703
    formdef.store()
4704 4704

  
4705 4705
    with mock.patch('qommon.misc.urlopen') as urlopen:
......
5651 5651
        fields.PageField(id='0', label='1st page', type='page'),
5652 5652
        fields.ItemField(type='item', id='1', label='Bar',
5653 5653
            items=['oui', 'non'],
5654
            show_as_radio=True,
5654
            display_mode='radio',
5655 5655
            required=True, varname='bar'),
5656 5656
        fields.ItemField(type='item', id='2', label='Foo', size='40',
5657 5657
            required=True,
tests/test_formdef_import.py
111 111
    assert f2.fields[3].minimum_date == formdef.fields[3].minimum_date
112 112
    assert f2.fields[4].items == formdef.fields[4].items
113 113

  
114
def test_item_radio():
115
    formdef = FormDef()
116
    formdef.name = 'Blah'
117
    formdef.fields = [
118
        fields.ItemField(
119
            type='item',
120
            label='Bar',
121
            items=['foo', 'bar', 'baz'],
122
            list_mode='radio',
123
            id='1',
124
        ),
125
    ]
126

  
127
    # test new mode
128
    assert_json_import_export_works(formdef, include_id=True)
129

  
130
    # test conversion of legacy show_as_radio attribute
131
    formdef_xml = formdef.export_to_xml(include_id=True)
132
    field = formdef_xml.findall('fields/field')[0]
133
    ET.SubElement(field, 'show_as_radio').text = 'True'
134
    field.remove(field.find('display_mode'))
135
    fd2 = FormDef.import_from_xml_tree(formdef_xml, include_id=True)
136
    assert fd2.fields[0].display_mode == 'radio'
137

  
138
    # test conversion of legacy show_as_radio attribute
139
    formdef_xml = formdef.export_to_xml(include_id=True)
140
    field = formdef_xml.findall('fields/field')[0]
141
    ET.SubElement(field, 'show_as_radio').text = 'False'
142
    field.remove(field.find('display_mode'))
143
    fd2 = FormDef.import_from_xml_tree(formdef_xml, include_id=True)
144
    assert fd2.fields[0].display_mode == 'list'
145

  
114 146
def test_include_id():
115 147
    formdef = FormDef()
116 148
    formdef.name = 'Blah'
wcs/fields.py
1189 1189
    description = N_('List')
1190 1190

  
1191 1191
    items = []
1192
    show_as_radio = False
1192
    show_as_radio = None
1193 1193
    anonymise = False
1194 1194
    widget_class = SingleSelectHintWidget
1195 1195
    data_source = {}
1196 1196
    in_filters = False
1197 1197
    display_disabled_items = False
1198
    display_mode = 'list'
1198 1199

  
1199 1200
    def __init__(self, **kwargs):
1200 1201
        self.items = []
1201 1202
        WidgetField.__init__(self, **kwargs)
1202 1203

  
1204
    def migrate(self):
1205
        changed = super(ItemField, self).migrate()
1206
        if isinstance(getattr(self, 'show_as_radio', None), bool):
1207
            if self.show_as_radio:
1208
                self.display_mode = 'radio'
1209
            else:
1210
                self.display_mode = 'list'
1211
            self.show_as_radio = None
1212
            changed = True
1213
        return changed
1214

  
1215
    def init_with_xml(self, element, charset, include_id=False):
1216
        super(ItemField, self).init_with_xml(element, charset, include_id=include_id)
1217
        if getattr(element.find('show_as_radio'), 'text', None) == 'True':
1218
            self.display_mode = 'radio'
1219

  
1203 1220
    def get_options(self, mode=None):
1204 1221
        if self.data_source:
1205 1222
            return [x[:3] for x in data_sources.get_items(self.data_source, mode=mode)]
......
1223 1240
            kwargs['options'] = self.get_options()
1224 1241
        if not kwargs.get('options'):
1225 1242
            kwargs['options'] = [(None, '---')]
1226
        if self.show_as_radio:
1243
        if self.display_mode == 'radio':
1227 1244
            self.widget_class = RadiobuttonsWidget
1228 1245
            if type(kwargs['options'][0]) is str:
1229 1246
                first_items = [x for x in kwargs['options'][:3]]
......
1322 1339
        WidgetField.fill_admin_form(self, form)
1323 1340
        form.add(CheckboxWidget, 'in_filters', title=_('Display in default filters'),
1324 1341
                value=self.in_filters, advanced=True)
1325
        form.add(CheckboxWidget, 'show_as_radio', title = _('Show as radio buttons'),
1326
                value = self.show_as_radio)
1342
        options = [('list', _('List')),
1343
                   ('radio', _('Radio buttons')),
1344
                  ]
1345
        form.add(RadiobuttonsWidget, 'display_mode',
1346
                title=_('Display Mode'),
1347
                options=options,
1348
                value=self.display_mode)
1327 1349
        form.add(WidgetList, 'items', title = _('Items'), element_type = StringWidget,
1328 1350
                value = self.items, required = False,
1329 1351
                element_kwargs = {'render_br': False, 'size': 50},
......
1341 1363

  
1342 1364
    def get_admin_attributes(self):
1343 1365
        return WidgetField.get_admin_attributes(self) + ['items',
1344
                'show_as_radio', 'data_source', 'in_filters', 'anonymise',
1366
                'display_mode', 'data_source', 'in_filters', 'anonymise',
1345 1367
                'display_disabled_items']
1346 1368

  
1347 1369
    def check_admin_form(self, form):
1348
-