Projet

Général

Profil

0001-variables-handle-filtering-lists-by-any-of-values-56.patch

Serghei Mihai (congés, retour 15/05), 05 octobre 2021 10:14

Télécharger (3,64 ko)

Voir les différences:

Subject: [PATCH] variables: handle filtering lists by any of values (#56089)

 tests/test_formdata.py | 24 ++++++++++++++++++++++--
 wcs/variables.py       | 10 +++++++---
 2 files changed, 29 insertions(+), 5 deletions(-)
tests/test_formdata.py
1603 1603
    formdef.fields = [
1604 1604
        fields.StringField(id='1', label='Test', type='string', varname='foo'),
1605 1605
        fields.StringField(id='2', label='key', type='string', varname='key'),
1606
        fields.ItemsField(id='3', label='Items', type='items', varname='items'),
1606 1607
    ]
1607 1608
    formdef.store()
1608 1609
    formdef.data_class().wipe()
1609 1610
    for i in range(6):
1610 1611
        formdata = formdef.data_class()()
1611
        formdata.data = {'1': 'bar', '2': str(i)}
1612
        formdata.data = {'1': 'bar', '2': str(i), '3': [str(i % 2), str(i % 3)]}
1612 1613
        formdata.just_created()
1613 1614
        formdata.store()
1614 1615
    for i in range(4):
1615 1616
        formdata = formdef.data_class()()
1616
        formdata.data = {'1': 'foo', '2': str(i + 6)}
1617
        formdata.data = {'1': 'foo', '2': str(i + 6), '3': [str(i)]}
1617 1618
        formdata.just_created()
1618 1619
        formdata.jump_status('finished')
1619 1620
        formdata.store()
......
1631 1632
    tmpl = Template('{{forms|objects:"foobarlazy"|filter_by:"foo"|filter_value:"bar"|count}}')
1632 1633
    assert tmpl.render(context) == '6'
1633 1634

  
1635
    # filter value by multiple valued field
1636
    tmpl = Template('{{forms|objects:"foobarlazy"|filter_by:"items"|filter_value:"3"|count}}')
1637
    assert tmpl.render(context) == '1'
1638

  
1639
    tmpl = Template('{{forms|objects:"foobarlazy"|filter_by:"items"|filter_value:"2"|count}}')
1640
    assert tmpl.render(context) == '3'
1641

  
1642
    tmpl = Template('{{forms|objects:"foobarlazy"|filter_by:"items"|filter_value:"1|2"|count}}')
1643
    assert tmpl.render(context) == '7'
1644

  
1645
    tmpl = Template('{{forms|objects:"foobarlazy"|filter_by:"items"|filter_value:"6"|count}}')
1646
    assert tmpl.render(context) == '0'
1647

  
1648
    tmpl = Template('{{forms|objects:"foobarlazy"|filter_by:"items"|exclude_value:"1|2"|count}}')
1649
    assert tmpl.render(context) == '3'
1650

  
1651
    tmpl = Template('{{forms|objects:"foobarlazy"|filter_by:"items"|exclude_value:"6"|count}}')
1652
    assert tmpl.render(context) == '10'
1653

  
1634 1654
    pub.custom_view_class.wipe()
1635 1655

  
1636 1656
    custom_view1 = pub.custom_view_class()
wcs/variables.py
25 25
from .formdef import FormDef
26 26
from .qommon import _, force_str, misc
27 27
from .qommon.evalutils import make_datetime
28
from .qommon.storage import Equal, NotEqual, Null, Or
28
from .qommon.storage import Equal, Intersects, Not, NotEqual, Null, Or
29 29
from .qommon.substitution import CompatibilityNamesDict
30 30
from .qommon.templatetags.qommon import parse_datetime
31 31

  
......
202 202
        from wcs import sql
203 203

  
204 204
        field_id = sql.get_field_id(field)
205
        if exclude:
206
            criterias = NotEqual(field_id, value, field=field)
205
        if isinstance(value, list):
206
            criterias = Intersects(field_id, value, field=field)
207 207
        else:
208 208
            criterias = Equal(field_id, value, field=field)
209

  
210
        if exclude:
211
            criterias = Not(criterias)
212

  
209 213
        return self._clone(self._criterias + [criterias])
210 214

  
211 215
    def apply_exclude_value(self, value):
212
-