diff --git a/tests/test_formdata.py b/tests/test_formdata.py index b1a408de9..f8ca11440 100644 --- a/tests/test_formdata.py +++ b/tests/test_formdata.py @@ -1997,6 +1997,31 @@ def test_lazy_formdata_queryset_filter_non_unique_varname(pub, variable_test_dat assert tmpl.render(context) == '1' +def test_filter_on_page_field(pub): + pub.loggederror_class.wipe() + + FormDef.wipe() + formdef = FormDef() + formdef.name = 'test' + formdef.fields = [ + fields.PageField(id='1', label='Page', varname='page'), + ] + formdef.store() + + data_class = formdef.data_class() + formdata = data_class() + formdata.just_created() + formdata.store() + + context = pub.substitutions.get_context_variables(mode='lazy') + + tmpl = Template('{{forms|objects:"test"|filter_by:"page"|filter_value:"100"}}') + tmpl.render(context) + assert pub.loggederror_class.count() == 1 + logged_error = pub.loggederror_class.select()[0] + assert logged_error.summary == 'Invalid filter "page"' + + def test_numeric_filter_on_string(pub): FormDef.wipe() formdef = FormDef() diff --git a/wcs/formdef.py b/wcs/formdef.py index 430405b24..e7b71a1e9 100644 --- a/wcs/formdef.py +++ b/wcs/formdef.py @@ -576,9 +576,11 @@ class FormDef(StorableObject): def get_all_fields(self): return (self.fields or []) + self.workflow.get_backoffice_fields() - def iter_fields(self, include_block_fields=False, with_backoffice_fields=True): + def iter_fields(self, include_block_fields=False, with_backoffice_fields=True, with_no_data_fields=True): def _iter_fields(fields, block_field=None): for field in fields: + if with_no_data_fields is False and field.is_no_data_field: + continue # add contextual_id/contextual_varname attributes # they are id/varname for normal fields # but in case of blocks they are concatenation of block id/varname + field id/varname diff --git a/wcs/variables.py b/wcs/variables.py index 45d5813eb..7083d98a2 100644 --- a/wcs/variables.py +++ b/wcs/variables.py @@ -270,7 +270,7 @@ class LazyFormDefObjectsManager: return self._clone(self._criterias + [self._formdef.get_by_id_criteria(str(value))]) def get_fields(self, key): - for field in self._formdef.iter_fields(include_block_fields=True): + for field in self._formdef.iter_fields(include_block_fields=True, with_no_data_fields=False): if getattr(field, 'block_field', None): if field.key == 'items': # not yet