diff --git a/crc/api.yml b/crc/api.yml index ab80f01d..cd3ea6fe 100644 --- a/crc/api.yml +++ b/crc/api.yml @@ -749,6 +749,12 @@ components: type: string is_latest_spec: type: boolean + num_tasks_total: + type: integer + num_tasks_complete: + type: integer + num_tasks_incomplete: + type: integer example: id: 291234 diff --git a/crc/api/workflow.py b/crc/api/workflow.py index e14023ea..8b4d6554 100644 --- a/crc/api/workflow.py +++ b/crc/api/workflow.py @@ -61,7 +61,6 @@ def delete_workflow_specification(spec_id): session.query(WorkflowModel).filter_by(workflow_spec_id=spec_id).delete() session.query(WorkflowSpecModel).filter_by(id=spec_id).delete() - session.commit() @@ -94,6 +93,7 @@ def delete(workflow_id): session.query(WorkflowModel).filter_by(id=workflow_id).delete() session.commit() + def get_task(workflow_id, task_id): workflow = session.query(WorkflowModel).filter_by(id=workflow_id).first() return workflow.bpmn_workflow().get_task(task_id) @@ -111,5 +111,6 @@ def update_task(workflow_id, task_id, body): workflow_model.bpmn_workflow_json = processor.serialize() session.add(workflow_model) session.commit() - return WorkflowApiSchema().dump(__get_workflow_api_model(processor) - ) + return WorkflowApiSchema().dump(__get_workflow_api_model(processor)) + + diff --git a/crc/models/api_models.py b/crc/models/api_models.py index c8575440..55ca3082 100644 --- a/crc/models/api_models.py +++ b/crc/models/api_models.py @@ -108,17 +108,44 @@ class WorkflowApi(object): class WorkflowApiSchema(ma.Schema): class Meta: model = WorkflowApi - fields = ["id", "status", - "user_tasks", "last_task", "next_task", - "workflow_spec_id", - "spec_version", "is_latest_spec"] + fields = ["id", "status", "user_tasks", "last_task", "next_task", + "workflow_spec_id", "spec_version", "is_latest_spec", + "num_tasks_total", "num_tasks_complete", "num_tasks_incomplete"] unknown = INCLUDE status = EnumField(WorkflowStatus) user_tasks = marshmallow.fields.List(marshmallow.fields.Nested(TaskSchema, dump_only=True)) last_task = marshmallow.fields.Nested(TaskSchema, dump_only=True) next_task = marshmallow.fields.Nested(TaskSchema, dump_only=True, required=False) + num_tasks_total = marshmallow.fields.Method('get_num_tasks_total') + num_tasks_complete = marshmallow.fields.Method('get_num_tasks_complete') + num_tasks_incomplete = marshmallow.fields.Method('get_num_tasks_incomplete') @marshmallow.post_load def make_workflow(self, data, **kwargs): - return WorkflowApi(**data) + keys = [ + 'id', + 'status', + 'user_tasks', + 'last_task', + 'next_task', + 'workflow_spec_id', + 'spec_version', + 'is_latest_spec' + ] + filtered_fields = {key: data[key] for key in keys} + return WorkflowApi(**filtered_fields) + + def get_num_tasks_total(self, obj): + tasks = list(obj.user_tasks) + return len(tasks) + + def get_num_tasks_complete(self, obj): + complete_states = ['CANCELLED', 'COMPLETED'] + tasks = list(obj.user_tasks) + return sum(1 for t in tasks if t.state in complete_states) + + def get_num_tasks_incomplete(self, obj): + incomplete_states = ['MAYBE', 'LIKELY', 'FUTURE', 'WAITING', 'READY'] + tasks = list(obj.user_tasks) + return sum(1 for t in tasks if t.state in incomplete_states)