misc: add absent/existing operators for file fields (#87242) #1253

Merged
fpeters merged 1 commits from wip/87242-file-filter into main 2024-03-29 08:31:17 +01:00
2 changed files with 33 additions and 2 deletions

View File

@ -4680,6 +4680,7 @@ def test_formdata_filtering_on_block_fields(pub):
fields.DateField(id='4', label='Date', varname='date'),
fields.EmailField(id='5', label='Email', varname='email'),
fields.TextField(id='6', label='Text', varname='text'),
fields.FileField(id='7', label='File', varname='file'),
]
block.store()
@ -4694,6 +4695,10 @@ def test_formdata_filtering_on_block_fields(pub):
data_class = formdef.data_class()
data_class.wipe()
upload = PicklableUpload('test.jpeg', 'image/jpeg')
with open(os.path.join(os.path.dirname(__file__), 'image-with-gps-data.jpeg'), 'rb') as fd:
upload.receive([fd.read()])
for i in range(14):
formdata = data_class()
formdata.data = {
@ -5023,6 +5028,10 @@ def test_formdata_filtering_on_block_fields(pub):
tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_text"|%s|count}}' % operator)
assert tmpl.render(context) == result
# file
tmpl = Template('{{forms|objects:"test"|filter_by:"blockdata_file"|absent|count}}')
assert tmpl.render(context) == '0'
def test_items_field_getlist(pub):
NamedDataSource.wipe()

View File

@ -330,6 +330,8 @@ class LazyFormDefObjectsManager:
return equality_operators + empty_operators
if field.key == 'email':
return equality_operators + in_operators + empty_operators + text_operators
if field.key == 'file':
return empty_operators
return None
def format_value(self, op, value, field):
@ -499,7 +501,17 @@ class LazyFormDefObjectsManager:
# check operator
for field in fields:
if field.key not in ['date', 'item', 'items', 'string', 'text', 'bool', 'email', 'numeric']:
if field.key not in [
'date',
'item',
'items',
'string',
'text',
'bool',
'email',
'numeric',
'file',
]:
continue
operators = self.get_field_allowed_operators(field) or []
if op not in [o[0] for o in operators]:
@ -540,7 +552,17 @@ class LazyFormDefObjectsManager:
else:
criteria_class = NotNull if exclude else Null
criteria = criteria_class(field_id)
elif field.key not in ['date', 'item', 'items', 'string', 'text', 'bool', 'email', 'numeric']:
elif field.key not in [
'date',
'item',
'items',
'string',
'text',
'bool',
'email',
'numeric',
'file',
]:
criteria_class = NotEqual if exclude else Equal
criteria = criteria_class(field_id, value, field=field)
else: