Projet

Général

Profil

0001-fields-review-item-field-to-get-back-to-previous-beh.patch

Frédéric Péters, 27 octobre 2015 15:01

Télécharger (9,7 ko)

Voir les différences:

Subject: [PATCH] fields: review item field to get back to previous behaviour
 (#8785)

In recent commits we tried to handle optional item field with an empty value
prepended to the list of options but while this allows the user to leave
optional fields uncompleted this is not the same behaviour we add.

Return to the previous behaviour.  The only way for an item field to be skipped
is now to be displayed as a <select> field with the hint put as the first
element.
 tests/test_datasource.py |   2 +-
 tests/test_fields.py     | 151 +++++++++++++++++++++++++++++++++++++----------
 wcs/fields.py            |  17 ++----
 wcs/qommon/form.py       |   2 +-
 4 files changed, 126 insertions(+), 46 deletions(-)
tests/test_datasource.py
211 211
    field.add_to_form(form)
212 212
    widget = form.get_widget('f1')
213 213
    assert widget is not None
214
    assert widget.options == [(None, '', 'None'), ('1', 'un', '1'), ('2', 'deux', '2')]
214
    assert widget.options == [('1', 'un', '1'), ('2', 'deux', '2')]
tests/test_fields.py
148 148
    assert fields.MapField().get_json_value('foobar') == None
149 149

  
150 150
def test_item_render():
151
    field = fields.ItemField(id='1', label='Foobar', items=['a', 'b', 'c'])
152
    form = Form()
153
    field.add_to_form(form)
154
    assert str(form.render()).count('<option') == 3
151
    items_kwargs = []
152
    items_kwargs.append({'items': ['a', 'b', 'c']})
153
    items_kwargs.append({'data_source': {
154
        'type': 'formula',
155
        'value': '''['a', 'b', 'c']'''}})
155 156

  
156
    field = fields.ItemField(id='1', label='Foobar', items=['a', 'b', 'c'],
157
            required=False)
158
    form = Form()
159
    field.add_to_form(form)
160
    assert str(form.render()).count('<option selected="selected" value="None"></option>') == 1 # None
161
    assert str(form.render()).count('<option') == 4 # 3 + None as first item
157
    for item_kwargs in items_kwargs:
158
        field = fields.ItemField(id='1', label='Foobar', **item_kwargs)
159
        form = Form()
160
        field.add_to_form(form)
161
        assert str(form.render()).count('<option') == 3
162 162

  
163
    field = fields.ItemField(id='1', label='Foobar', items=['a', 'b', 'c'],
164
            required=False, hint='Bla bla bla')
165
    form = Form()
166
    field.add_to_form(form)
167
    assert str(form.render()).count('<option value="">Bla bla bla</option>') == 1 # ---
168
    assert str(form.render()).count('<option') == 4
163
        field = fields.ItemField(id='1', label='Foobar', required=False,
164
                **item_kwargs)
165
        form = Form()
166
        field.add_to_form(form)
167
        assert str(form.render()).count('<option') == 3
169 168

  
170
    field = fields.ItemField(id='1', label='Foobar', items=['a', 'b', 'c'],
171
            required=True, hint='Bla bla bla')
172
    form = Form()
173
    field.add_to_form(form)
174
    assert str(form.render()).count('<option value="">Bla bla bla</option>') == 1 # ---
175
    assert str(form.render()).count('<option') == 4
169
        field = fields.ItemField(id='1', label='Foobar',
170
                required=False, hint='Bla bla bla', **item_kwargs)
171
        form = Form()
172
        field.add_to_form(form)
173
        assert str(form.render()).count('<option value="">Bla bla bla</option>') == 1 # ---
174
        assert str(form.render()).count('<option') == 4
176 175

  
177
    # without any item
178
    field = fields.ItemField(id='1', label='Foobar', items=[])
179
    form = Form()
180
    field.add_to_form(form)
181
    assert str(form.render()).count('<option') == 1
176
        field = fields.ItemField(id='1', label='Foobar',
177
                required=True, hint='Bla bla bla', **item_kwargs)
178
        form = Form()
179
        field.add_to_form(form)
180
        assert str(form.render()).count('<option value="">Bla bla bla</option>') == 1 # ---
181
        assert str(form.render()).count('<option') == 4
182

  
183
    items_kwargs = []
184
    items_kwargs.append({'items': None})
185
    items_kwargs.append({'items': []})
186
    items_kwargs.append({'data_source': {
187
        'type': 'formula',
188
        'value': '''[]'''}})
189
    for item_kwargs in items_kwargs:
190
        field = fields.ItemField(id='1', label='Foobar', **item_kwargs)
191
        form = Form()
192
        field.add_to_form(form)
193
        assert str(form.render()).count('<option') == 1
182 194

  
183
    # without any item and not being required
184
    field = fields.ItemField(id='1', label='Foobar', items=[], required=False)
185
    form = Form()
186
    field.add_to_form(form)
187
    assert str(form.render()).count('<option') == 1
195
        field = fields.ItemField(id='1', label='Foobar', required=False,
196
                **item_kwargs)
197
        form = Form()
198
        field.add_to_form(form)
199
        assert str(form.render()).count('<option') == 1
200

  
201
        field = fields.ItemField(id='1', label='Foobar',
202
                required=False, hint='Bla bla bla', **item_kwargs)
203
        form = Form()
204
        field.add_to_form(form)
205
        assert str(form.render()).count('<option value="">Bla bla bla</option>') == 1 # ---
206
        assert str(form.render()).count('<option') == 1
207

  
208
        field = fields.ItemField(id='1', label='Foobar',
209
                required=True, hint='Bla bla bla', **item_kwargs)
210
        form = Form()
211
        field.add_to_form(form)
212
        assert str(form.render()).count('<option value="">Bla bla bla</option>') == 1 # ---
213
        assert str(form.render()).count('<option') == 1
214

  
215
def test_item_render_as_radio():
216
    items_kwargs = []
217
    items_kwargs.append({'items': ['a', 'b', 'c']})
218
    items_kwargs.append({'data_source': {
219
        'type': 'formula',
220
        'value': '''['a', 'b', 'c']'''}})
221

  
222
    for item_kwargs in items_kwargs:
223
        field = fields.ItemField(id='1', label='Foobar', show_as_radio=True, **item_kwargs)
224
        form = Form()
225
        field.add_to_form(form)
226
        assert str(form.render()).count('"radio"') == 3
227

  
228
        field = fields.ItemField(id='1', label='Foobar', required=False,
229
                show_as_radio=True, **item_kwargs)
230
        form = Form()
231
        field.add_to_form(form)
232
        assert str(form.render()).count('"radio"') == 3
233

  
234
        field = fields.ItemField(id='1', label='Foobar',
235
                show_as_radio=True, required=False, hint='Bla bla bla', **item_kwargs)
236
        form = Form()
237
        field.add_to_form(form)
238
        assert str(form.render()).count('"radio"') == 3
239

  
240
        field = fields.ItemField(id='1', label='Foobar',
241
                show_as_radio=True, required=True, hint='Bla bla bla', **item_kwargs)
242
        form = Form()
243
        field.add_to_form(form)
244
        assert str(form.render()).count('"radio"') == 3
245

  
246
    items_kwargs = []
247
    items_kwargs.append({'items': None})
248
    items_kwargs.append({'items': []})
249
    items_kwargs.append({'data_source': {
250
        'type': 'formula',
251
        'value': '''[]'''}})
252
    for item_kwargs in items_kwargs:
253
        field = fields.ItemField(id='1', label='Foobar', show_as_radio=True, **item_kwargs)
254
        form = Form()
255
        field.add_to_form(form)
256
        assert str(form.render()).count('"radio"') == 1
257

  
258
        field = fields.ItemField(id='1', label='Foobar', required=False,
259
                show_as_radio=True, **item_kwargs)
260
        form = Form()
261
        field.add_to_form(form)
262
        assert str(form.render()).count('"radio"') == 1
263

  
264
        field = fields.ItemField(id='1', label='Foobar',
265
                show_as_radio=True, required=False, hint='Bla bla bla', **item_kwargs)
266
        form = Form()
267
        field.add_to_form(form)
268
        assert str(form.render()).count('"radio"') == 1
269

  
270
        field = fields.ItemField(id='1', label='Foobar',
271
                show_as_radio=True, required=True, hint='Bla bla bla', **item_kwargs)
272
        form = Form()
273
        field.add_to_form(form)
274
        assert str(form.render()).count('"radio"') == 1
wcs/fields.py
857 857
        WidgetField.__init__(self, **kwargs)
858 858

  
859 859
    def get_options(self):
860
        if not self.data_source:
861
            options = self.items[:]
862
        else:
863
            options = data_sources.get_items(self.data_source)
864
        if options and not self.required:
865
            if type(options[0]) is str:
866
                options[:0] = [None]
867
            elif len(options[0]) == 2:
868
                options[:0] = [(None, '')]
869
            elif len(options[0]) == 3:
870
                options[:0] = [(None, '', None)]
871
        return options
860
        if self.data_source:
861
            return data_sources.get_items(self.data_source)
862
        if self.items:
863
            return self.items[:]
864
        return []
872 865

  
873 866
    def perform_more_widget_changes(self, form, kwargs, edit = True):
874 867
        real_data_source = data_sources.get_real(self.data_source)
wcs/qommon/form.py
1366 1366
        if not self.separate_hint() and self.hint:
1367 1367
            r = htmltag('option', value='', selected=None)
1368 1368
            tags.append(r + htmlescape(self.hint) + htmltext('</option>'))
1369
            if not self.required:
1369
            if self.options[0][0] is None:
1370 1370
                # hint has been put as first element, skip the default empty
1371 1371
                # value.
1372 1372
                options = self.options[1:]
1373
-