Projet

Général

Profil

0001-general-add-queryset-filter-on-form_number-52763.patch

Frédéric Péters, 12 avril 2021 18:36

Télécharger (4,64 ko)

Voir les différences:

Subject: [PATCH] general: add queryset filter on form_number (#52763)

(and fallbacks so |filter_by can be used with specialized filters)
 tests/test_formdata.py            | 27 +++++++++++++++++++++++++++
 wcs/qommon/templatetags/qommon.py |  5 +++++
 wcs/variables.py                  | 11 +++++++++++
 3 files changed, 43 insertions(+)
tests/test_formdata.py
1126 1126
        formdata.jump_status('finished')
1127 1127
        formdata.store()
1128 1128

  
1129
    finished_formdata = formdata
1130

  
1129 1131
    formdata = data_class()
1130 1132
    formdata.data = {'0': 'bar', 'bo1': 'plop1'}
1131 1133
    formdata.status = 'draft'
......
1280 1282
        .count
1281 1283
        == 1
1282 1284
    )
1285
    # alternative form, using filter_by/apply_filter_value
1286
    assert (
1287
        LazyFormData(formdata)
1288
        .objects.filter_by('form_user')
1289
        .apply_filter_value(lazy_formdata.user)
1290
        .filter_by('foo_foo')
1291
        .apply_filter_value('foo')
1292
        .count
1293
        == 1
1294
    )
1283 1295

  
1284 1296
    # test |current_user
1285 1297
    pub.get_request()._user = ()  # reset cache
......
1307 1319
    )
1308 1320
    assert LazyFormData(formdata).objects.filter_by_status('Finished').count == 4
1309 1321
    assert LazyFormData(formdata).objects.filter_by_status('Unknown').count == 0
1322
    # alternative form, using filter_by/apply_filter_value
1323
    assert LazyFormData(formdata).objects.filter_by('status').apply_filter_value('Finished').count == 4
1310 1324

  
1311 1325
    # test |pending
1312 1326
    context = pub.substitutions.get_context_variables(mode='lazy')
......
1317 1331
    assert LazyFormData(formdata).objects.pending().count == 7
1318 1332
    assert LazyFormData(formdata).objects.pending().filter_by('foo_foo').apply_filter_value('foo').count == 0
1319 1333

  
1334
    # test |filter_by_form_number
1335
    context = pub.substitutions.get_context_variables(mode='lazy')
1336
    tmpl = Template('{{form_objects|filter_by_form_number:"%s"|count}}' % finished_formdata.get_display_id())
1337
    assert tmpl.render(context) == '1'
1338
    tmpl = Template('{{form_objects|filter_by_form_number:"%s"|count}}' % 'invalid value')
1339
    assert tmpl.render(context) == '0'
1340
    # alternative form, using filter_by/apply_filter_value
1341
    tmpl = Template(
1342
        '{{form_objects|filter_by:"form_number"|filter_value:"%s"|count}}'
1343
        % finished_formdata.get_display_id()
1344
    )
1345
    assert tmpl.render(context) == '1'
1346

  
1320 1347
    # test |is_empty
1321 1348
    tmpl = Template('{{form_objects|pending|is_empty}}')
1322 1349
    assert tmpl.render(context) == 'False'
wcs/qommon/templatetags/qommon.py
639 639
    return queryset.filter_by_status(status)
640 640

  
641 641

  
642
@register.filter
643
def filter_by_form_number(queryset, form_number):
644
    return queryset.filter_by_form_number(form_number)
645

  
646

  
642 647
@register.filter
643 648
def pending(queryset):
644 649
    return queryset.pending()
wcs/variables.py
167 167
        qs.pending_attr = attribute
168 168
        return qs
169 169

  
170
    def filter_by_form_number(self, value):
171
        return self._clone(self._criterias + [Equal('id_display', str(value))])
172

  
170 173
    def get_field(self, key):
171 174
        for field in self._formdef.get_all_fields():
172 175
            if getattr(field, 'varname', None) == key:
......
177 180

  
178 181
        field = self.get_field(self.pending_attr)
179 182
        if field is None:
183
            # fallback to specialized filters for some attributes
184
            if self.pending_attr in ('status', 'form_status'):
185
                return self.filter_by_status(value)
186
            elif self.pending_attr in ('user', 'form_user'):
187
                return self.filter_by_user(value)
188
            elif self.pending_attr == 'form_number':
189
                return self.filter_by_form_number(value)
190

  
180 191
            get_publisher().record_error(
181 192
                _('Invalid filter "%s"') % self.pending_attr, formdata=self._formdata
182 193
            )
183
-