Projet

Général

Profil

0002-fields-display-ItemsField-using-ul-on-summary-page-i.patch

Emmanuel Cazenave, 04 mars 2021 13:44

Télécharger (3,61 ko)

Voir les différences:

Subject: [PATCH 2/3] fields: display ItemsField using <ul> on summary page if
 possible (#44123)

 tests/test_fields.py | 39 +++++++++++++++++++++++++++++++++++++++
 wcs/fields.py        | 23 +++++++++++++++++++++++
 2 files changed, 62 insertions(+)
tests/test_fields.py
155 155
    assert field.get_options() == [('1', 'foo', '1'), ('2', 'bar', '2')]
156 156
    assert field.get_options() == [('1', 'foo', '1'), ('2', 'bar', '2')]  # twice for cached behaviour
157 157

  
158
    # if labels are available, display using <ul>
159
    field = fields.ItemsField()
160
    view_value = field.get_view_value('a, b', value_id=['1', '2'], labels=['a', 'b'])
161
    elems = BeautifulSoup(str(view_value)).find('ul').find_all('li')
162
    assert len(elems) == 2
163
    assert elems[0].text == 'a'
164
    assert elems[1].text == 'b'
165

  
166

  
167
def test_items_get_value_info():
168
    # no data source : labels are available
169
    field = fields.ItemsField(id='1', items=['a', 'b', 'c'])
170
    assert field.get_value_info({'1': ['un', 'deux'], '1_display': 'un, deux'}) == (
171
        'un, deux',
172
        {'value_id': ['un', 'deux'], 'labels': ['un', 'deux']},
173
    )
174

  
175
    # data source with structured : labels are available
176
    field = fields.ItemsField(id='1')
177
    field.data_source = {'type': 'formula', 'value': '''[('1', 'un'), ('2', 'deux')]'''}
178
    assert field.get_value_info(
179
        {
180
            '1': ['un', 'deux'],
181
            '1_display': 'un, deux',
182
            '1_structured': [{'id': '1', 'text': 'un'}, {'id': '2', 'text': 'deux'}],
183
        }
184
    ) == (
185
        'un, deux',
186
        {'value_id': ['un', 'deux'], 'labels': ['un', 'deux']},
187
    )
188

  
189
    # data source with no strucured : no labels
190
    field = fields.ItemsField(id='1')
191
    field.data_source = {'type': 'formula', 'value': '''[('1', 'un'), ('2', 'deux')]'''}
192
    assert field.get_value_info({'1': ['un', 'deux'], '1_display': 'un, deux'}) == (
193
        'un, deux',
194
        {'value_id': ['un', 'deux'], 'labels': []},
195
    )
196

  
158 197

  
159 198
def test_password():
160 199
    assert fields.PasswordField().get_view_value('xxx') == '●' * 8
wcs/fields.py
2224 2224
        except TypeError:
2225 2225
            raise ValueError('invalid data for items type (%r)' % value)
2226 2226

  
2227
    def get_value_info(self, data):
2228
        value, value_details = super().get_value_info(data)
2229
        labels = []
2230
        if not self.data_source:
2231
            value_id = value_details.get('value_id')
2232
            if value_id:
2233
                labels = value_id.copy()
2234
        else:
2235
            structured_values = self.get_structured_value(data)
2236
            if structured_values:
2237
                labels = [x['text'] for x in structured_values]
2238
        value_details['labels'] = labels
2239
        return (value, value_details)
2240

  
2227 2241
    def get_view_value(self, value, **kwargs):
2242
        if kwargs.get('labels'):
2243
            # summary page and labels are available
2244
            r = TemplateIO(html=True)
2245
            r += htmltext('<ul>')
2246
            for x in kwargs['labels']:
2247
                r += htmltext('<li>%s</li>' % x)
2248
            r += htmltext('</ul>')
2249
            return r.getvalue()
2250

  
2228 2251
        if type(value) is str:  # == display_value
2229 2252
            return value
2230 2253
        if value:
2231
-