Projet

Général

Profil

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

Lauréline Guérin, 06 mai 2021 14:39

Télécharger (7,83 ko)

Voir les différences:

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

 tests/test_formdata.py            | 49 +++++++++++++++++++++++++++++--
 wcs/qommon/templatetags/qommon.py |  7 +++++
 wcs/variables.py                  | 13 ++++++--
 3 files changed, 64 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
    if pub.is_using_postgresql():
1243
        queryset = lazy_formdata.objects.filter_by('datefield').apply_exclude_value(
1244
            datetime.date(2018, 7, 31).timetuple()
1245
        )
1246
        assert queryset.count == 1
1247
        queryset = lazy_formdata.objects.filter_by('datefield').apply_exclude_value(
1248
            datetime.date(2018, 7, 31)
1249
        )
1250
        assert queryset.count == 1
1251
        queryset = lazy_formdata.objects.filter_by('datefield').apply_exclude_value(
1252
            datetime.datetime(2018, 7, 31)
1253
        )
1254
        assert queryset.count == 1
1255
        queryset = lazy_formdata.objects.filter_by('datefield').apply_exclude_value('2018-07-31')
1256
        assert queryset.count == 1
1257
        queryset = lazy_formdata.objects.filter_by('datefield').apply_exclude_value('still not a date')
1258
        assert queryset.count == 0
1259
        assert pub.loggederror_class.count() == 3
1260
        logged_error = pub.loggederror_class.select()[2]
1261
        assert logged_error.summary == 'Invalid value "still not a date" for filter "datefield"'
1262

  
1240 1263
    queryset = lazy_formdata.objects.filter_by('boolfield').apply_filter_value(True)
1241 1264
    assert queryset.count == 6
1242 1265
    queryset = lazy_formdata.objects.filter_by('boolfield').apply_filter_value(1)
......
1247 1270
    assert queryset.count == 5
1248 1271
    queryset = lazy_formdata.objects.filter_by('boolfield').apply_filter_value(0)
1249 1272
    assert queryset.count == 5
1273
    if pub.is_using_postgresql():
1274
        queryset = lazy_formdata.objects.filter_by('boolfield').apply_exclude_value(0)
1275
        assert queryset.count == 6
1250 1276

  
1251 1277
    queryset = lazy_formdata.objects.filter_by('term1').apply_filter_value('3')
1252 1278
    assert queryset.count == 7
......
1254 1280
    assert queryset.count == 7
1255 1281
    queryset = lazy_formdata.objects.filter_by('term1').apply_filter_value('foobar')
1256 1282
    assert queryset.count == 0
1283
    if pub.is_using_postgresql():
1284
        queryset = lazy_formdata.objects.filter_by('term1').apply_exclude_value('3')
1285
        assert queryset.count == 4
1286
        queryset = lazy_formdata.objects.filter_by('term1').apply_exclude_value('foobar')
1287
        assert queryset.count == 11
1257 1288

  
1258 1289
    queryset = lazy_formdata.objects.filter_by('email').apply_filter_value('bar')
1259 1290
    assert queryset.count == 0
......
1310 1341
    assert tmpl.render(context) == '7'
1311 1342
    tmpl = Template('{{form_objects|filter_by:"foo_foo"|filter_value:"bar"|length}}')
1312 1343
    assert tmpl.render(context) == '7'
1344
    if pub.is_using_postgresql():
1345
        tmpl = Template('{{form_objects|filter_by:"foo_foo"|exclude_value:"bar"|count}}')
1346
        assert tmpl.render(context) == '4'
1347
        tmpl = Template('{{form_objects|filter_by:"foo_foo"|exclude_value:"bar"|length}}')
1348
        assert tmpl.render(context) == '4'
1313 1349

  
1314 1350
    pub.substitutions.feed(formdata)
1315 1351
    tmpl = Template('{{form_objects|filter_by:"foo_foo"|filter_value:form_var_foo_foo|count}}')
......
1320 1356
    assert tmpl.render(context) == '5'
1321 1357
    tmpl = Template('{{form_objects|filter_by:"term1"|filter_value:form_var_term1|count}}')
1322 1358
    assert tmpl.render(context) == '7'
1359
    if pub.is_using_postgresql():
1360
        tmpl = Template('{{form_objects|filter_by:"foo_foo"|exclude_value:form_var_foo_foo|count}}')
1361
        assert tmpl.render(context) == '4'
1362
        tmpl = Template('{{form_objects|filter_by:"datefield"|exclude_value:form_var_datefield|count}}')
1363
        assert tmpl.render(context) == '1'
1364
        tmpl = Template('{{form_objects|filter_by:"boolfield"|exclude_value:form_var_boolfield|count}}')
1365
        assert tmpl.render(context) == '6'
1366
        tmpl = Template('{{form_objects|filter_by:"term1"|exclude_value:form_var_term1|count}}')
1367
        assert tmpl.render(context) == '4'
1323 1368

  
1324 1369
    tmpl = Template('{{form.objects|exclude_self|filter_by:"foo_foo"|filter_value:form_var_foo_foo|count}}')
1325 1370
    assert tmpl.render(context) == '6'
......
1402 1447
    tmpl = Template('{% for v in form_objects|order_by:"id"|getlist:"foo_foo" %}{{ v }},{% endfor %}')
1403 1448
    assert tmpl.render(context) == 'bar,bar,bar,bar,bar,bar,bar,foo,foo,foo,foo,'
1404 1449
    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,'
1450
    assert tmpl.render(context) == '2018-07-31,,,,,,2018-08-31,2018-07-31,2018-07-31,2018-07-31,2018-07-31,'
1406 1451
    tmpl = Template('{% if "foo" in form_objects|getlist:"foo_foo" %}OK{% else %}KO{% endif%}')
1407 1452
    assert tmpl.render(context) == 'OK'
1408 1453
    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 = 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
-