Only run the form validation stuff if we have a form.

If there is a default value, use it, regardless of whether the form is hidden (this is how the front end works)
  (accomplished by moving the hide_epxression check -> continue stuff below the set default_value code)
This commit is contained in:
Dan 2022-03-08 18:13:54 -05:00
parent b03e24bbf4
commit 26eeb2912a
3 changed files with 26 additions and 12 deletions

View File

@ -199,16 +199,17 @@ class WorkflowService(object):
task, task,
add_docs_and_forms=True) # Assure we try to process the documentation, and raise those errors. add_docs_and_forms=True) # Assure we try to process the documentation, and raise those errors.
# make sure forms have a form key # make sure forms have a form key
if hasattr(task_api, 'form') and task_api.form is not None and task_api.form.key == '': if hasattr(task_api, 'form') and task_api.form is not None:
raise ApiError(code='missing_form_key', if task_api.form.key == '':
raise ApiError(code='missing_form_key',
message='Forms must include a Form Key.', message='Forms must include a Form Key.',
task_id=task.id, task_id=task.id,
task_name=task.get_name()) task_name=task.get_name())
WorkflowService.populate_form_with_random_data(task, task_api, required_only)
if not WorkflowService.validate_form(task, task_api):
# In the process of completing the form, it is possible for fields to become required
# based on later fields. Re-run the validation to assure we complete the forms correctly.
WorkflowService.populate_form_with_random_data(task, task_api, required_only) WorkflowService.populate_form_with_random_data(task, task_api, required_only)
if not WorkflowService.validate_form(task, task_api):
# In the process of completing the form, it is possible for fields to become required
# based on later fields. Re-run the validation to assure we complete the forms correctly.
WorkflowService.populate_form_with_random_data(task, task_api, required_only)
processor.complete_task(task) processor.complete_task(task)
if test_until == task.task_spec.name: if test_until == task.task_spec.name:
@ -315,11 +316,6 @@ class WorkflowService(object):
# task_id='task.id', # task_id='task.id',
# task_name=task.get_name()) # task_name=task.get_name())
# If the field is hidden it should not produce a value.
if field.has_property(Task.FIELD_PROP_HIDE_EXPRESSION):
if WorkflowService.evaluate_property(Task.FIELD_PROP_HIDE_EXPRESSION, field, task):
continue
# If we have a default_value, try to set the default # If we have a default_value, try to set the default
if field.default_value: if field.default_value:
try: try:
@ -334,6 +330,10 @@ class WorkflowService(object):
else: else:
form_data[field.id] = None form_data[field.id] = None
# If the field is hidden it should not produce a value.
if field.has_property(Task.FIELD_PROP_HIDE_EXPRESSION):
if WorkflowService.evaluate_property(Task.FIELD_PROP_HIDE_EXPRESSION, field, task):
continue
# If we are only populating required fields, and this isn't required. stop here. # If we are only populating required fields, and this isn't required. stop here.
if required_only: if required_only:

View File

@ -23,6 +23,11 @@
<camunda:property id="required_expression" value="not boolean_field" /> <camunda:property id="required_expression" value="not boolean_field" />
</camunda:properties> </camunda:properties>
</camunda:formField> </camunda:formField>
<camunda:formField id="always_set" type="string" defaultValue="&#34;always&#34;">
<camunda:properties>
<camunda:property id="hide_expression" value="True" />
</camunda:properties>
</camunda:formField>
</camunda:formData> </camunda:formData>
</bpmn:extensionElements> </bpmn:extensionElements>
<bpmn:incoming>SequenceFlow_0lvudp8</bpmn:incoming> <bpmn:incoming>SequenceFlow_0lvudp8</bpmn:incoming>
@ -39,6 +44,11 @@ if boolean_field:
result = required_if_true result = required_if_true
else: else:
result = required_if_false result = required_if_false
# Note that hidden fields with a default
# value should always exist.
if not always_set == "always":
should_never_get_here
</bpmn:script> </bpmn:script>
</bpmn:scriptTask> </bpmn:scriptTask>
</bpmn:process> </bpmn:process>

View File

@ -177,7 +177,11 @@ class TestWorkflowSpecValidation(BaseTest):
def test_fields_required_based_on_later_fields_correctly_populates(self): def test_fields_required_based_on_later_fields_correctly_populates(self):
"""Say you have a form, where the first field is required only if the """Say you have a form, where the first field is required only if the
SECOND field is checked true. This assures such a case will validate and SECOND field is checked true. This assures such a case will validate and
that the variables that should exist (because they are required) do exist.""" that the variables that should exist (because they are required) do exist.
As a bonus test, we also assert that a default field is always present
regardless of it's hidden status.
"""
self.load_test_spec('empty_workflow', master_spec=True) self.load_test_spec('empty_workflow', master_spec=True)
self.create_reference_document() self.create_reference_document()
errors = self.validate_workflow("required_expressions") errors = self.validate_workflow("required_expressions")