variables: handle filtering lists by any of values (#56089)

This commit is contained in:
Serghei Mihai 2021-08-10 16:02:54 +02:00
parent e08efa3643
commit d59ee3cb65
2 changed files with 29 additions and 5 deletions

View File

@ -1603,17 +1603,18 @@ def test_lazy_global_forms(pub):
formdef.fields = [
fields.StringField(id='1', label='Test', type='string', varname='foo'),
fields.StringField(id='2', label='key', type='string', varname='key'),
fields.ItemsField(id='3', label='Items', type='items', varname='items'),
]
formdef.store()
formdef.data_class().wipe()
for i in range(6):
formdata = formdef.data_class()()
formdata.data = {'1': 'bar', '2': str(i)}
formdata.data = {'1': 'bar', '2': str(i), '3': [str(i % 2), str(i % 3)]}
formdata.just_created()
formdata.store()
for i in range(4):
formdata = formdef.data_class()()
formdata.data = {'1': 'foo', '2': str(i + 6)}
formdata.data = {'1': 'foo', '2': str(i + 6), '3': [str(i)]}
formdata.just_created()
formdata.jump_status('finished')
formdata.store()
@ -1631,6 +1632,25 @@ def test_lazy_global_forms(pub):
tmpl = Template('{{forms|objects:"foobarlazy"|filter_by:"foo"|filter_value:"bar"|count}}')
assert tmpl.render(context) == '6'
# filter value by multiple valued field
tmpl = Template('{{forms|objects:"foobarlazy"|filter_by:"items"|filter_value:"3"|count}}')
assert tmpl.render(context) == '1'
tmpl = Template('{{forms|objects:"foobarlazy"|filter_by:"items"|filter_value:"2"|count}}')
assert tmpl.render(context) == '3'
tmpl = Template('{{forms|objects:"foobarlazy"|filter_by:"items"|filter_value:"1|2"|count}}')
assert tmpl.render(context) == '7'
tmpl = Template('{{forms|objects:"foobarlazy"|filter_by:"items"|filter_value:"6"|count}}')
assert tmpl.render(context) == '0'
tmpl = Template('{{forms|objects:"foobarlazy"|filter_by:"items"|exclude_value:"1|2"|count}}')
assert tmpl.render(context) == '3'
tmpl = Template('{{forms|objects:"foobarlazy"|filter_by:"items"|exclude_value:"6"|count}}')
assert tmpl.render(context) == '10'
pub.custom_view_class.wipe()
custom_view1 = pub.custom_view_class()

View File

@ -25,7 +25,7 @@ from .carddef import CardDef
from .formdef import FormDef
from .qommon import _, force_str, misc
from .qommon.evalutils import make_datetime
from .qommon.storage import Equal, NotEqual, Null, Or
from .qommon.storage import Equal, Intersects, Not, NotEqual, Null, Or
from .qommon.substitution import CompatibilityNamesDict
from .qommon.templatetags.qommon import parse_datetime
@ -202,10 +202,14 @@ class LazyFormDefObjectsManager:
from wcs import sql
field_id = sql.get_field_id(field)
if exclude:
criterias = NotEqual(field_id, value, field=field)
if isinstance(value, list):
criterias = Intersects(field_id, value, field=field)
else:
criterias = Equal(field_id, value, field=field)
if exclude:
criterias = Not(criterias)
return self._clone(self._criterias + [criterias])
def apply_exclude_value(self, value):