diff --git a/crc/services/workflow_service.py b/crc/services/workflow_service.py index 8d450756..dce8118f 100644 --- a/crc/services/workflow_service.py +++ b/crc/services/workflow_service.py @@ -159,8 +159,12 @@ class WorkflowService(object): if WorkflowService.evaluate_property(Task.FIELD_PROP_HIDE_EXPRESSION, field, task): continue - # If there is a default value, set it. - if hasattr(field,'default_value') and field.default_value: + # A task should only have default_value **or** value expression, not both. + if field.has_property(Task.FIELD_PROP_VALUE_EXPRESSION) and (hasattr(field, 'default_value') and field.default_value): + raise ApiError(code='default value and value_expression', + message='This task has both a default_value and value_expression. Please fix this to only have one or the other.') + # If we have a default_value or value_expression, try to set the default + if field.has_property(Task.FIELD_PROP_VALUE_EXPRESSION) or (hasattr(field, 'default_value') and field.default_value): form_data[field.id] = WorkflowService.get_default_value(field, task) # If we are only populating required fields, and this isn't required. stop here. @@ -494,6 +498,9 @@ class WorkflowService(object): task.form = spiff_task.task_spec.form for i, field in enumerate(task.form.fields): task.form.fields[i] = WorkflowService.process_options(spiff_task, field) + # If there is a default value, set it. + if field.id not in task.data and WorkflowService.get_default_value(field, spiff_task) is not None: + task.data[field.id] = WorkflowService.get_default_value(field, spiff_task) task.documentation = WorkflowService._process_documentation(spiff_task) # All ready tasks should have a valid name, and this can be computed for diff --git a/tests/data/enum_value_expression/Decision_Value_Expression.dmn b/tests/data/enum_value_expression/Decision_Value_Expression.dmn new file mode 100644 index 00000000..11c7beba --- /dev/null +++ b/tests/data/enum_value_expression/Decision_Value_Expression.dmn @@ -0,0 +1,40 @@ + + + + + + + + + + user_input + + + + + + True + + + 'black' + + + + + False + + + 'white' + + + + + + + + 'grey' + + + + + diff --git a/tests/data/enum_value_expression/enum_value_expression.bpmn b/tests/data/enum_value_expression/enum_value_expression.bpmn new file mode 100644 index 00000000..083cc65d --- /dev/null +++ b/tests/data/enum_value_expression/enum_value_expression.bpmn @@ -0,0 +1,95 @@ + + + + + Flow_02xzhf3 + + + + + + + + + + + Flow_02xzhf3 + Flow_0d46qnz + + + Flow_0d46qnz + Flow_1d7sv9v + + + <h1>Hello {{ lookup_output }}</h1> + + + + + + + + + + + + + + Flow_1d7sv9v + Flow_01x96w8 + + + + <h1>Hello</h1> +<div>You picked {{ color_select.label }}</div> + Flow_01x96w8 + Flow_05tzoiy + + + Flow_05tzoiy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/enum_value_expression_fail/Decision_Value_Expression.dmn b/tests/data/enum_value_expression_fail/Decision_Value_Expression.dmn new file mode 100644 index 00000000..11c7beba --- /dev/null +++ b/tests/data/enum_value_expression_fail/Decision_Value_Expression.dmn @@ -0,0 +1,40 @@ + + + + + + + + + + user_input + + + + + + True + + + 'black' + + + + + False + + + 'white' + + + + + + + + 'grey' + + + + + diff --git a/tests/data/enum_value_expression_fail/enum_value_expression_fail.bpmn b/tests/data/enum_value_expression_fail/enum_value_expression_fail.bpmn new file mode 100644 index 00000000..ddbfc613 --- /dev/null +++ b/tests/data/enum_value_expression_fail/enum_value_expression_fail.bpmn @@ -0,0 +1,95 @@ + + + + + Flow_02xzhf3 + + + + + + + + + + + Flow_02xzhf3 + Flow_0d46qnz + + + Flow_0d46qnz + Flow_1d7sv9v + + + <h1>Hello {{ lookup_output }}</h1> + + + + + + + + + + + + + + Flow_1d7sv9v + Flow_01x96w8 + + + + <h1>Hello</h1> +<div>You picked {{ color_select.label }}</div> + Flow_01x96w8 + Flow_05tzoiy + + + Flow_05tzoiy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/workflow/test_workflow_enum_default_value_expression.py b/tests/workflow/test_workflow_enum_default_value_expression.py new file mode 100644 index 00000000..00c2abf6 --- /dev/null +++ b/tests/workflow/test_workflow_enum_default_value_expression.py @@ -0,0 +1,46 @@ +from tests.base_test import BaseTest +import json + + +class TestWorkflowEnumDefault(BaseTest): + + def test_enum_default_from_value_expression(self): + workflow = self.create_workflow('enum_value_expression') + + first_task = self.get_workflow_api(workflow).next_task + self.assertEqual('Activity_UserInput', first_task.name) + workflow_api = self.get_workflow_api(workflow) + + result = self.complete_form(workflow_api, first_task, {'user_input': True}) + self.assertIn('user_input', result.next_task.data) + self.assertEqual(True, result.next_task.data['user_input']) + self.assertIn('lookup_output', result.next_task.data) + self.assertEqual('black', result.next_task.data['lookup_output']) + + workflow_api = self.get_workflow_api(workflow) + self.assertEqual('Activity_PickColor', self.get_workflow_api(workflow_api).next_task.name) + self.assertEqual({'value': 'black', 'label': 'Black'}, workflow_api.next_task.data['color_select']) + + # + workflow = self.create_workflow('enum_value_expression') + + first_task = self.get_workflow_api(workflow).next_task + self.assertEqual('Activity_UserInput', first_task.name) + workflow_api = self.get_workflow_api(workflow) + + result = self.complete_form(workflow_api, first_task, {'user_input': False}) + self.assertIn('user_input', result.next_task.data) + self.assertEqual(False, result.next_task.data['user_input']) + self.assertIn('lookup_output', result.next_task.data) + self.assertEqual('white', result.next_task.data['lookup_output']) + + workflow_api = self.get_workflow_api(workflow) + self.assertEqual('Activity_PickColor', self.get_workflow_api(workflow_api).next_task.name) + self.assertEqual({'value': 'white', 'label': 'White'}, workflow_api.next_task.data['color_select']) + + def test_enum_value_expression_and_default(self): + spec_model = self.load_test_spec('enum_value_expression_fail') + rv = self.app.get('/v1.0/workflow-specification/%s/validate' % spec_model.id, headers=self.logged_in_headers()) + + json_data = json.loads(rv.get_data(as_text=True)) + self.assertEqual(json_data[0]['code'], 'default value and value_expression')