misc: add |exclude_value template filter (#53416)

This commit is contained in:
Lauréline Guérin 2021-04-29 14:20:32 +02:00
parent 74e8a0630c
commit 86550e9259
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 64 additions and 5 deletions

View File

@ -1174,9 +1174,11 @@ def test_lazy_formdata_queryset_filter(pub, variable_test_data):
formdef.workflow = wf
formdef.store()
data_class = lazy_formdata._formdef.data_class()
for _ in range(6):
for i in range(6):
formdata = data_class()
formdata.data = {'0': 'bar', '1': True, 'bo1': 'plop1', '10': '3'}
if i == 5:
formdata.data['3'] = datetime.date(2018, 8, 31).timetuple()
formdata.just_created()
formdata.store()
for _ in range(4):
@ -1237,6 +1239,27 @@ def test_lazy_formdata_queryset_filter(pub, variable_test_data):
logged_error = pub.loggederror_class.select()[1]
assert logged_error.summary == 'Invalid value "not a date" for filter "datefield"'
if pub.is_using_postgresql():
queryset = lazy_formdata.objects.filter_by('datefield').apply_exclude_value(
datetime.date(2018, 7, 31).timetuple()
)
assert queryset.count == 1
queryset = lazy_formdata.objects.filter_by('datefield').apply_exclude_value(
datetime.date(2018, 7, 31)
)
assert queryset.count == 1
queryset = lazy_formdata.objects.filter_by('datefield').apply_exclude_value(
datetime.datetime(2018, 7, 31)
)
assert queryset.count == 1
queryset = lazy_formdata.objects.filter_by('datefield').apply_exclude_value('2018-07-31')
assert queryset.count == 1
queryset = lazy_formdata.objects.filter_by('datefield').apply_exclude_value('still not a date')
assert queryset.count == 0
assert pub.loggederror_class.count() == 3
logged_error = pub.loggederror_class.select()[2]
assert logged_error.summary == 'Invalid value "still not a date" for filter "datefield"'
queryset = lazy_formdata.objects.filter_by('boolfield').apply_filter_value(True)
assert queryset.count == 6
queryset = lazy_formdata.objects.filter_by('boolfield').apply_filter_value(1)
@ -1247,6 +1270,9 @@ def test_lazy_formdata_queryset_filter(pub, variable_test_data):
assert queryset.count == 5
queryset = lazy_formdata.objects.filter_by('boolfield').apply_filter_value(0)
assert queryset.count == 5
if pub.is_using_postgresql():
queryset = lazy_formdata.objects.filter_by('boolfield').apply_exclude_value(0)
assert queryset.count == 6
queryset = lazy_formdata.objects.filter_by('term1').apply_filter_value('3')
assert queryset.count == 7
@ -1254,6 +1280,11 @@ def test_lazy_formdata_queryset_filter(pub, variable_test_data):
assert queryset.count == 7
queryset = lazy_formdata.objects.filter_by('term1').apply_filter_value('foobar')
assert queryset.count == 0
if pub.is_using_postgresql():
queryset = lazy_formdata.objects.filter_by('term1').apply_exclude_value('3')
assert queryset.count == 4
queryset = lazy_formdata.objects.filter_by('term1').apply_exclude_value('foobar')
assert queryset.count == 11
queryset = lazy_formdata.objects.filter_by('email').apply_filter_value('bar')
assert queryset.count == 0
@ -1310,6 +1341,11 @@ def test_lazy_formdata_queryset_filter(pub, variable_test_data):
assert tmpl.render(context) == '7'
tmpl = Template('{{form_objects|filter_by:"foo_foo"|filter_value:"bar"|length}}')
assert tmpl.render(context) == '7'
if pub.is_using_postgresql():
tmpl = Template('{{form_objects|filter_by:"foo_foo"|exclude_value:"bar"|count}}')
assert tmpl.render(context) == '4'
tmpl = Template('{{form_objects|filter_by:"foo_foo"|exclude_value:"bar"|length}}')
assert tmpl.render(context) == '4'
pub.substitutions.feed(formdata)
tmpl = Template('{{form_objects|filter_by:"foo_foo"|filter_value:form_var_foo_foo|count}}')
@ -1320,6 +1356,15 @@ def test_lazy_formdata_queryset_filter(pub, variable_test_data):
assert tmpl.render(context) == '5'
tmpl = Template('{{form_objects|filter_by:"term1"|filter_value:form_var_term1|count}}')
assert tmpl.render(context) == '7'
if pub.is_using_postgresql():
tmpl = Template('{{form_objects|filter_by:"foo_foo"|exclude_value:form_var_foo_foo|count}}')
assert tmpl.render(context) == '4'
tmpl = Template('{{form_objects|filter_by:"datefield"|exclude_value:form_var_datefield|count}}')
assert tmpl.render(context) == '1'
tmpl = Template('{{form_objects|filter_by:"boolfield"|exclude_value:form_var_boolfield|count}}')
assert tmpl.render(context) == '6'
tmpl = Template('{{form_objects|filter_by:"term1"|exclude_value:form_var_term1|count}}')
assert tmpl.render(context) == '4'
tmpl = Template('{{form.objects|exclude_self|filter_by:"foo_foo"|filter_value:form_var_foo_foo|count}}')
assert tmpl.render(context) == '6'
@ -1402,7 +1447,7 @@ def test_lazy_formdata_queryset_filter(pub, variable_test_data):
tmpl = Template('{% for v in form_objects|order_by:"id"|getlist:"foo_foo" %}{{ v }},{% endfor %}')
assert tmpl.render(context) == 'bar,bar,bar,bar,bar,bar,bar,foo,foo,foo,foo,'
tmpl = Template('{% for v in form_objects|order_by:"id"|getlist:"datefield" %}{{ v|date }},{% endfor %}')
assert tmpl.render(context) == '2018-07-31,,,,,,,2018-07-31,2018-07-31,2018-07-31,2018-07-31,'
assert tmpl.render(context) == '2018-07-31,,,,,,2018-08-31,2018-07-31,2018-07-31,2018-07-31,2018-07-31,'
tmpl = Template('{% if "foo" in form_objects|getlist:"foo_foo" %}OK{% else %}KO{% endif%}')
assert tmpl.render(context) == 'OK'
tmpl = Template('{% if "fooooooooooooooo" in form_objects|getlist:"foo_foo" %}OK{% else %}KO{% endif%}')

View File

@ -683,6 +683,13 @@ def filter_value(queryset, value):
return queryset.apply_filter_value(value)
@register.filter
def exclude_value(queryset, value):
if hasattr(value, 'get_value'):
value = value.get_value() # unlazy
return queryset.apply_exclude_value(value)
@register.filter
def count(queryset):
if hasattr(queryset, 'get_value'):

View File

@ -175,7 +175,7 @@ class LazyFormDefObjectsManager:
if getattr(field, 'varname', None) == key:
return field
def apply_filter_value(self, value):
def apply_filter_value(self, value, exclude=False):
assert self.pending_attr
field = self.get_field(self.pending_attr)
@ -197,8 +197,15 @@ class LazyFormDefObjectsManager:
from wcs import sql
criteria = Equal(sql.get_field_id(field), value)
return self._clone(self._criterias + [criteria])
field_id = sql.get_field_id(field)
if exclude:
criterias = NotEqual(field_id, value)
else:
criterias = Equal(field_id, value)
return self._clone(self._criterias + [criterias])
def apply_exclude_value(self, value):
return self.apply_filter_value(value, exclude=True)
def getlist(self, key):
return LazyList(self, key)