general: add queryset filter on form_number (#52763)

(and fallbacks so |filter_by can be used with specialized filters)
This commit is contained in:
Frédéric Péters 2021-04-12 15:57:59 +02:00
parent e5f06accdb
commit 750007984a
3 changed files with 17 additions and 0 deletions

View File

@ -1144,6 +1144,8 @@ def test_lazy_formdata_queryset_filter(pub, variable_test_data):
formdata.jump_status('finished')
formdata.store()
finished_formdata = formdata
formdata = data_class()
formdata.data = {'0': 'bar', 'bo1': 'plop1'}
formdata.status = 'draft'
@ -1335,6 +1337,13 @@ def test_lazy_formdata_queryset_filter(pub, variable_test_data):
assert LazyFormData(formdata).objects.pending().count == 7
assert LazyFormData(formdata).objects.pending().filter_by('foo_foo').apply_filter_value('foo').count == 0
# test |filter_by_number
context = pub.substitutions.get_context_variables(mode='lazy')
tmpl = Template('{{form_objects|filter_by_number:"%s"|count}}' % finished_formdata.get_display_id())
assert tmpl.render(context) == '1'
tmpl = Template('{{form_objects|filter_by_number:"%s"|count}}' % 'invalid value')
assert tmpl.render(context) == '0'
# test |is_empty
tmpl = Template('{{form_objects|pending|is_empty}}')
assert tmpl.render(context) == 'False'

View File

@ -639,6 +639,11 @@ def filter_by_status(queryset, status):
return queryset.filter_by_status(status)
@register.filter
def filter_by_number(queryset, form_number):
return queryset.filter_by_number(form_number)
@register.filter
def pending(queryset):
return queryset.pending()

View File

@ -167,6 +167,9 @@ class LazyFormDefObjectsManager:
qs.pending_attr = attribute
return qs
def filter_by_number(self, value):
return self._clone(self._criterias + [Equal('id_display', str(value))])
def get_field(self, key):
for field in self._formdef.get_all_fields():
if getattr(field, 'varname', None) == key: