Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions src/rios/core/validation/form.py
Original file line number Diff line number Diff line change
Expand Up @@ -646,6 +646,7 @@ def _check_fields_covered(self, node, cstruct):
field['id']
for field in self.instrument['record']
])
hide_disable_targets = set()

form_fields = set()
for pidx, page in enumerate(cstruct['pages']):
Expand All @@ -666,6 +667,12 @@ def _check_fields_covered(self, node, cstruct):
)
form_fields.add(field_id)

for event in element['options'].get('events', []):
if event['action'] in ('hide', 'disable'):
hide_disable_targets.update(
event.get('targets', [field_id])
)

missing = instrument_fields - form_fields
if missing:
raise ValidationError(
Expand All @@ -684,6 +691,21 @@ def _check_fields_covered(self, node, cstruct):
)
)

required_fields = set([
field['id']
for field in self.instrument['record']
if field.get('required', False)
])
hidden_required_fields = required_fields & hide_disable_targets
if hidden_required_fields:
raise ValidationError(
node,
'There are required fields targetted by hide/disable events:'
' %s' % (
', '.join(sorted(hidden_required_fields)),
)
)

def _get_instrument_field_type(self, name, record=None):
record = record or self.instrument['record']
for field in record:
Expand Down
25 changes: 25 additions & 0 deletions tests/test_form_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -418,3 +418,28 @@ def test_wrong_standard_widget():
else:
assert False


def test_hiding_required_field_top_top():
instrument = deepcopy(INSTRUMENT)
instrument['record'][1]['required'] = True
validator = Form(instrument=instrument)
form = deepcopy(FORM)
form['pages'][1]['elements'][0]['options']['events'] = [{
'trigger': 'true()',
'action': 'hide',
'targets': ['boolean_field'],
}]
form['pages'][0]['elements'][5]['options']['events'] = [{
'trigger': 'true()',
'action': 'disable',
}]
try:
validator.deserialize(form)
except ValidationError as exc:
assert_validation_error(
exc,
{'': u'There are required fields targetted by hide/disable events: boolean_field, text_field'},
)
else:
assert False