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 14:12

Télécharger (5,71 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     | 46 ++++++++++++++++++++++++++++++++++++++++++----
 wcs/fields.py            | 17 +++++------------
 wcs/qommon/form.py       |  2 +-
 4 files changed, 49 insertions(+), 18 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
157 157
            required=False)
158 158
    form = Form()
159 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
160
    assert str(form.render()).count('<option') == 3
162 161

  
163 162
    field = fields.ItemField(id='1', label='Foobar', items=['a', 'b', 'c'],
164 163
            required=False, hint='Bla bla bla')
......
175 174
    assert str(form.render()).count('<option') == 4
176 175

  
177 176
    # without any item
178
    field = fields.ItemField(id='1', label='Foobar', items=[])
177
    field = fields.ItemField(id='1', label='Foobar', items=None)
179 178
    form = Form()
180 179
    field.add_to_form(form)
181 180
    assert str(form.render()).count('<option') == 1
182 181

  
183 182
    # without any item and not being required
184
    field = fields.ItemField(id='1', label='Foobar', items=[], required=False)
183
    field = fields.ItemField(id='1', label='Foobar', items=None, required=False)
185 184
    form = Form()
186 185
    field.add_to_form(form)
187 186
    assert str(form.render()).count('<option') == 1
187

  
188
    # without any item but with an hint
189
    field = fields.ItemField(id='1', label='Foobar', items=None, hint='Bla bla bla')
190
    form = Form()
191
    field.add_to_form(form)
192
    assert str(form.render()).count('<option value="">Bla bla bla</option>') == 1 # ---
193
    assert str(form.render()).count('<option') == 1
194

  
195
def test_item_render_as_radio():
196
    field = fields.ItemField(id='1', label='Foobar', show_as_radio=True, items=['a', 'b', 'c'])
197
    form = Form()
198
    field.add_to_form(form)
199
    assert str(form.render()).count('"radio"') == 3
200

  
201
    field = fields.ItemField(id='1', label='Foobar', items=['a', 'b', 'c'],
202
            show_as_radio=True, required=False)
203
    form = Form()
204
    field.add_to_form(form)
205
    assert str(form.render()).count('"radio"') == 3
206

  
207
    field = fields.ItemField(id='1', label='Foobar', items=['a', 'b', 'c'],
208
            show_as_radio=True, required=False, hint='Bla bla bla')
209
    form = Form()
210
    field.add_to_form(form)
211
    assert str(form.render()).count('"radio"') == 3
212

  
213
    # without any item
214
    field = fields.ItemField(id='1', label='Foobar', items=None,
215
            show_as_radio=True)
216
    form = Form()
217
    field.add_to_form(form)
218
    assert str(form.render()).count('"radio"') == 1
219

  
220
    # without any item and not being required
221
    field = fields.ItemField(id='1', label='Foobar', items=None,
222
            required=False, show_as_radio=True)
223
    form = Form()
224
    field.add_to_form(form)
225
    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
-