Projet

Général

Profil

0001-misc-add-exclude_value-template-filter-53416.patch

Lauréline Guérin, 29 avril 2021 14:21

Télécharger (7,57 ko)

Voir les différences:

Subject: [PATCH] misc: add |exclude_value template filter (#53416)

 tests/test_formdata.py            | 43 +++++++++++++++++++++++++++++--
 wcs/qommon/templatetags/qommon.py |  7 +++++
 wcs/variables.py                  | 13 +++++++---
 3 files changed, 58 insertions(+), 5 deletions(-)
tests/test_formdata.py
1174 1174
    formdef.workflow = wf
1175 1175
    formdef.store()
1176 1176
    data_class = lazy_formdata._formdef.data_class()
1177
    for _ in range(6):
1177
    for i in range(6):
1178 1178
        formdata = data_class()
1179 1179
        formdata.data = {'0': 'bar', '1': True, 'bo1': 'plop1', '10': '3'}
1180
        if i == 5:
1181
            formdata.data['3'] = datetime.date(2018, 8, 31).timetuple()
1180 1182
        formdata.just_created()
1181 1183
        formdata.store()
1182 1184
    for _ in range(4):
......
1237 1239
        logged_error = pub.loggederror_class.select()[1]
1238 1240
        assert logged_error.summary == 'Invalid value "not a date" for filter "datefield"'
1239 1241

  
1242
    queryset = lazy_formdata.objects.filter_by('datefield').apply_exclude_value(
1243
        datetime.date(2018, 7, 31).timetuple()
1244
    )
1245
    assert queryset.count == 6
1246
    queryset = lazy_formdata.objects.filter_by('datefield').apply_exclude_value(datetime.date(2018, 7, 31))
1247
    assert queryset.count == 6
1248
    queryset = lazy_formdata.objects.filter_by('datefield').apply_exclude_value(
1249
        datetime.datetime(2018, 7, 31)
1250
    )
1251
    assert queryset.count == 6
1252
    queryset = lazy_formdata.objects.filter_by('datefield').apply_exclude_value('2018-07-31')
1253
    assert queryset.count == 6
1254
    queryset = lazy_formdata.objects.filter_by('datefield').apply_exclude_value('still not a date')
1255
    assert queryset.count == 0
1256
    if pub.is_using_postgresql():
1257
        assert pub.loggederror_class.count() == 3
1258
        logged_error = pub.loggederror_class.select()[2]
1259
        assert logged_error.summary == 'Invalid value "still not a date" for filter "datefield"'
1260

  
1240 1261
    queryset = lazy_formdata.objects.filter_by('boolfield').apply_filter_value(True)
1241 1262
    assert queryset.count == 6
1242 1263
    queryset = lazy_formdata.objects.filter_by('boolfield').apply_filter_value(1)
......
1247 1268
    assert queryset.count == 5
1248 1269
    queryset = lazy_formdata.objects.filter_by('boolfield').apply_filter_value(0)
1249 1270
    assert queryset.count == 5
1271
    queryset = lazy_formdata.objects.filter_by('boolfield').apply_exclude_value(0)
1272
    assert queryset.count == 6
1250 1273

  
1251 1274
    queryset = lazy_formdata.objects.filter_by('term1').apply_filter_value('3')
1252 1275
    assert queryset.count == 7
......
1254 1277
    assert queryset.count == 7
1255 1278
    queryset = lazy_formdata.objects.filter_by('term1').apply_filter_value('foobar')
1256 1279
    assert queryset.count == 0
1280
    queryset = lazy_formdata.objects.filter_by('term1').apply_exclude_value('3')
1281
    assert queryset.count == 4
1282
    queryset = lazy_formdata.objects.filter_by('term1').apply_exclude_value('foobar')
1283
    assert queryset.count == 11
1257 1284

  
1258 1285
    queryset = lazy_formdata.objects.filter_by('email').apply_filter_value('bar')
1259 1286
    assert queryset.count == 0
......
1310 1337
    assert tmpl.render(context) == '7'
1311 1338
    tmpl = Template('{{form_objects|filter_by:"foo_foo"|filter_value:"bar"|length}}')
1312 1339
    assert tmpl.render(context) == '7'
1340
    tmpl = Template('{{form_objects|filter_by:"foo_foo"|exclude_value:"bar"|count}}')
1341
    assert tmpl.render(context) == '4'
1342
    tmpl = Template('{{form_objects|filter_by:"foo_foo"|exclude_value:"bar"|length}}')
1343
    assert tmpl.render(context) == '4'
1313 1344

  
1314 1345
    pub.substitutions.feed(formdata)
1315 1346
    tmpl = Template('{{form_objects|filter_by:"foo_foo"|filter_value:form_var_foo_foo|count}}')
......
1320 1351
    assert tmpl.render(context) == '5'
1321 1352
    tmpl = Template('{{form_objects|filter_by:"term1"|filter_value:form_var_term1|count}}')
1322 1353
    assert tmpl.render(context) == '7'
1354
    tmpl = Template('{{form_objects|filter_by:"foo_foo"|exclude_value:form_var_foo_foo|count}}')
1355
    assert tmpl.render(context) == '4'
1356
    tmpl = Template('{{form_objects|filter_by:"datefield"|exclude_value:form_var_datefield|count}}')
1357
    assert tmpl.render(context) == '6'
1358
    tmpl = Template('{{form_objects|filter_by:"boolfield"|exclude_value:form_var_boolfield|count}}')
1359
    assert tmpl.render(context) == '6'
1360
    tmpl = Template('{{form_objects|filter_by:"term1"|exclude_value:form_var_term1|count}}')
1361
    assert tmpl.render(context) == '4'
1323 1362

  
1324 1363
    tmpl = Template('{{form.objects|exclude_self|filter_by:"foo_foo"|filter_value:form_var_foo_foo|count}}')
1325 1364
    assert tmpl.render(context) == '6'
......
1402 1441
    tmpl = Template('{% for v in form_objects|order_by:"id"|getlist:"foo_foo" %}{{ v }},{% endfor %}')
1403 1442
    assert tmpl.render(context) == 'bar,bar,bar,bar,bar,bar,bar,foo,foo,foo,foo,'
1404 1443
    tmpl = Template('{% for v in form_objects|order_by:"id"|getlist:"datefield" %}{{ v|date }},{% endfor %}')
1405
    assert tmpl.render(context) == '2018-07-31,,,,,,,2018-07-31,2018-07-31,2018-07-31,2018-07-31,'
1444
    assert tmpl.render(context) == '2018-07-31,,,,,,2018-08-31,2018-07-31,2018-07-31,2018-07-31,2018-07-31,'
1406 1445
    tmpl = Template('{% if "foo" in form_objects|getlist:"foo_foo" %}OK{% else %}KO{% endif%}')
1407 1446
    assert tmpl.render(context) == 'OK'
1408 1447
    tmpl = Template('{% if "fooooooooooooooo" in form_objects|getlist:"foo_foo" %}OK{% else %}KO{% endif%}')
wcs/qommon/templatetags/qommon.py
683 683
    return queryset.apply_filter_value(value)
684 684

  
685 685

  
686
@register.filter
687
def exclude_value(queryset, value):
688
    if hasattr(value, 'get_value'):
689
        value = value.get_value()  # unlazy
690
    return queryset.apply_exclude_value(value)
691

  
692

  
686 693
@register.filter
687 694
def count(queryset):
688 695
    if hasattr(queryset, 'get_value'):
wcs/variables.py
175 175
            if getattr(field, 'varname', None) == key:
176 176
                return field
177 177

  
178
    def apply_filter_value(self, value):
178
    def apply_filter_value(self, value, exclude=False):
179 179
        assert self.pending_attr
180 180

  
181 181
        field = self.get_field(self.pending_attr)
......
197 197

  
198 198
        from wcs import sql
199 199

  
200
        criteria = Equal(sql.get_field_id(field), value)
201
        return self._clone(self._criterias + [criteria])
200
        field_id = sql.get_field_id(field)
201
        if exclude:
202
            criterias = [Or([Null(field_id), NotEqual(field_id, value)])]
203
        else:
204
            criterias = [Equal(field_id, value)]
205
        return self._clone(self._criterias + criterias)
206

  
207
    def apply_exclude_value(self, value):
208
        return self.apply_filter_value(value, exclude=True)
202 209

  
203 210
    def getlist(self, key):
204 211
        return LazyList(self, key)
205
-