2020-01-14 16:02:44 +00:00
|
|
|
import uuid
|
|
|
|
|
2020-01-24 16:52:52 +00:00
|
|
|
from crc.api.file import delete_file
|
2020-01-14 16:45:12 +00:00
|
|
|
from crc import session
|
2020-01-21 20:24:17 +00:00
|
|
|
from crc.api.common import ApiError, ApiErrorSchema
|
2020-01-24 16:52:52 +00:00
|
|
|
from crc.models.workflow import WorkflowModel, WorkflowModelSchema, WorkflowSpecModelSchema, WorkflowSpecModel, \
|
2019-12-30 16:07:26 +00:00
|
|
|
Task, TaskSchema
|
2020-01-24 16:52:52 +00:00
|
|
|
from crc.workflow_processor import WorkflowProcessor
|
|
|
|
from crc.models.file import FileModel
|
2019-12-27 18:50:03 +00:00
|
|
|
|
|
|
|
|
|
|
|
def all_specifications():
|
2020-01-03 16:44:24 +00:00
|
|
|
schema = WorkflowSpecModelSchema(many=True)
|
2020-01-14 16:45:12 +00:00
|
|
|
return schema.dump(session.query(WorkflowSpecModel).all())
|
2019-12-27 18:50:03 +00:00
|
|
|
|
|
|
|
|
2020-01-14 02:43:09 +00:00
|
|
|
def add_workflow_specification(body):
|
2020-01-14 19:10:53 +00:00
|
|
|
new_spec = WorkflowSpecModelSchema().load(body, session=session)
|
|
|
|
session.add(new_spec)
|
|
|
|
session.commit()
|
|
|
|
return WorkflowSpecModelSchema().dump(new_spec)
|
|
|
|
|
|
|
|
|
2020-01-28 15:14:06 +00:00
|
|
|
def get_workflow_specification(spec_id):
|
2020-01-14 19:10:53 +00:00
|
|
|
if spec_id is None:
|
2020-01-23 21:05:09 +00:00
|
|
|
error = ApiError('unknown_spec', 'Please provide a valid Workflow Specification ID.')
|
2020-01-14 19:10:53 +00:00
|
|
|
return ApiErrorSchema.dump(error), 404
|
|
|
|
|
2020-01-21 20:24:17 +00:00
|
|
|
spec: WorkflowSpecModel = session.query(WorkflowSpecModel).filter_by(id=spec_id).first()
|
2020-01-14 19:10:53 +00:00
|
|
|
|
2020-01-21 20:24:17 +00:00
|
|
|
if spec is None:
|
2020-01-23 21:05:09 +00:00
|
|
|
error = ApiError('unknown_spec', 'The Workflow Specification "' + spec_id + '" is not recognized.')
|
2020-01-14 19:10:53 +00:00
|
|
|
return ApiErrorSchema.dump(error), 404
|
|
|
|
|
2020-01-28 15:14:06 +00:00
|
|
|
return WorkflowSpecModelSchema().dump(spec)
|
|
|
|
|
|
|
|
|
|
|
|
def update_workflow_specification(spec_id, body):
|
2020-01-21 20:24:17 +00:00
|
|
|
spec = WorkflowSpecModelSchema().load(body, session=session)
|
2020-01-28 15:14:06 +00:00
|
|
|
spec.id = spec_id
|
2020-01-21 20:24:17 +00:00
|
|
|
session.add(spec)
|
2020-01-14 16:45:12 +00:00
|
|
|
session.commit()
|
2020-01-21 20:24:17 +00:00
|
|
|
return WorkflowSpecModelSchema().dump(spec)
|
2020-01-14 02:43:09 +00:00
|
|
|
|
|
|
|
|
2020-01-23 21:05:09 +00:00
|
|
|
def delete_workflow_specification(spec_id):
|
|
|
|
if spec_id is None:
|
|
|
|
error = ApiError('unknown_spec', 'Please provide a valid Workflow Specification ID.')
|
|
|
|
return ApiErrorSchema.dump(error), 404
|
|
|
|
|
|
|
|
spec: WorkflowSpecModel = session.query(WorkflowSpecModel).filter_by(id=spec_id).first()
|
|
|
|
|
|
|
|
if spec is None:
|
|
|
|
error = ApiError('unknown_spec', 'The Workflow Specification "' + spec_id + '" is not recognized.')
|
|
|
|
return ApiErrorSchema.dump(error), 404
|
|
|
|
|
|
|
|
session.query(WorkflowSpecModel).filter_by(id=spec_id).delete()
|
|
|
|
|
2020-01-24 14:26:17 +00:00
|
|
|
# Delete all items in the database related to the deleted workflow spec.
|
|
|
|
files = session.query(FileModel).filter_by(workflow_spec_id=spec_id).all()
|
|
|
|
for file in files:
|
|
|
|
delete_file(file.id)
|
|
|
|
|
|
|
|
session.query(WorkflowModel).filter_by(workflow_spec_id=spec_id).delete()
|
2020-01-23 21:05:09 +00:00
|
|
|
session.commit()
|
|
|
|
|
|
|
|
|
2019-12-27 18:50:03 +00:00
|
|
|
def get_workflow(workflow_id):
|
2020-01-03 16:44:24 +00:00
|
|
|
schema = WorkflowModelSchema()
|
2020-01-14 16:45:12 +00:00
|
|
|
workflow = session.query(WorkflowModel).filter_by(id=workflow_id).first()
|
2019-12-27 18:50:03 +00:00
|
|
|
return schema.dump(workflow)
|
|
|
|
|
2019-12-31 16:31:30 +00:00
|
|
|
|
2019-12-30 18:15:39 +00:00
|
|
|
def delete(workflow_id):
|
2020-01-14 16:45:12 +00:00
|
|
|
session.query(WorkflowModel).filter_by(id=workflow_id).delete()
|
|
|
|
session.commit()
|
2020-01-30 14:11:17 +00:00
|
|
|
3
|
2019-12-27 18:50:03 +00:00
|
|
|
|
|
|
|
def get_tasks(workflow_id):
|
2020-01-14 16:45:12 +00:00
|
|
|
workflow = session.query(WorkflowModel).filter_by(id=workflow_id).first()
|
2019-12-27 18:50:03 +00:00
|
|
|
processor = WorkflowProcessor(workflow.workflow_spec_id, workflow.bpmn_workflow_json)
|
|
|
|
spiff_tasks = processor.get_ready_user_tasks()
|
|
|
|
tasks = []
|
|
|
|
for st in spiff_tasks:
|
|
|
|
tasks.append(Task.from_spiff(st))
|
|
|
|
return TaskSchema(many=True).dump(tasks)
|
|
|
|
|
|
|
|
|
|
|
|
def get_task(workflow_id, task_id):
|
2020-01-14 16:45:12 +00:00
|
|
|
workflow = session.query(WorkflowModel).filter_by(id=workflow_id).first()
|
2019-12-27 18:50:03 +00:00
|
|
|
return workflow.bpmn_workflow().get_task(task_id)
|
|
|
|
|
|
|
|
|
2020-01-14 16:02:44 +00:00
|
|
|
def update_task(workflow_id, task_id, body):
|
2020-01-14 16:45:12 +00:00
|
|
|
workflow = session.query(WorkflowModel).filter_by(id=workflow_id).first()
|
2020-01-07 18:23:46 +00:00
|
|
|
processor = WorkflowProcessor(workflow.workflow_spec_id, workflow.bpmn_workflow_json)
|
2020-01-14 16:02:44 +00:00
|
|
|
task_id = uuid.UUID(task_id)
|
|
|
|
task = processor.bpmn_workflow.get_task(task_id)
|
|
|
|
task.data = body
|
|
|
|
processor.complete_task(task)
|
|
|
|
workflow.bpmn_workflow_json = processor.serialize()
|
2020-01-14 16:45:12 +00:00
|
|
|
session.add(workflow)
|
|
|
|
session.commit()
|
2020-01-30 14:11:17 +00:00
|
|
|
return WorkflowModelSchema().dump(workflow)
|