mirror of
https://github.com/sartography/spiffworkflow-backend.git
synced 2025-02-23 21:08:18 +00:00
cleaned up api to run process model w/ burnettk
This commit is contained in:
parent
60c60e7ea3
commit
053571500f
@ -39,33 +39,6 @@ paths:
|
||||
schema:
|
||||
$ref: "#/components/schemas/WorkflowSpecCategory"
|
||||
/process-models:
|
||||
# get:
|
||||
# operationId: crc.api.workflow.all_specifications
|
||||
# summary: Provides a list of workflows specifications that can be added to a study manually. Please note that Protocol Builder will handle this most of the time.
|
||||
# tags:
|
||||
# - Workflow Specifications
|
||||
# parameters :
|
||||
# - name : libraries
|
||||
# in : query
|
||||
# required : false
|
||||
# description : True if we should return just library schemas
|
||||
# schema :
|
||||
# type : boolean
|
||||
# - name : standalone
|
||||
# in : query
|
||||
# required : false
|
||||
# description : True if we should return just standalone schemas
|
||||
# schema :
|
||||
# type : boolean
|
||||
# responses:
|
||||
# '200':
|
||||
# description: An array of workflow specifications
|
||||
# content:
|
||||
# application/json:
|
||||
# schema:
|
||||
# type: array
|
||||
# items:
|
||||
# $ref: "#/components/schemas/WorkflowSpec"
|
||||
post:
|
||||
operationId: spiffworkflow_backend.routes.process_api_blueprint.add_process_model
|
||||
summary: Creates a new workflow specification with the given parameters.
|
||||
@ -147,7 +120,7 @@ paths:
|
||||
schema:
|
||||
$ref: "#/components/schemas/WorkflowSpec"
|
||||
post:
|
||||
operationId: spiffworkflow_backend.routes.process_api_blueprint.create_process_instance
|
||||
operationId: spiffworkflow_backend.routes.process_api_blueprint.process_instance_create
|
||||
summary: Creates a workflow from a workflow spec and returns the workflow
|
||||
tags:
|
||||
- Workflow Specifications
|
||||
|
@ -79,8 +79,9 @@ def add_file(process_model_id):
|
||||
)
|
||||
|
||||
|
||||
def create_process_instance(process_model_id):
|
||||
def process_instance_create(process_model_id):
|
||||
"""Create_process_instance."""
|
||||
# import pdb; pdb.set_trace()
|
||||
process_instance = ProcessInstanceService.create_process_instance(process_model_id, g.user)
|
||||
processor = ProcessInstanceProcessor(process_instance)
|
||||
|
||||
@ -88,11 +89,14 @@ def create_process_instance(process_model_id):
|
||||
processor.save()
|
||||
# ProcessInstanceService.update_task_assignments(processor)
|
||||
|
||||
workflow_api_model = ProcessInstanceService.processor_to_process_instance_api(
|
||||
process_instance_api = ProcessInstanceService.processor_to_process_instance_api(
|
||||
processor
|
||||
)
|
||||
process_instance_data = processor.get_data()
|
||||
process_instance_metadata = ProcessInstanceApiSchema().dump(process_instance_api)
|
||||
process_instance_metadata["data"] = process_instance_data
|
||||
return Response(
|
||||
json.dumps(ProcessInstanceApiSchema().dump(workflow_api_model)), status=201, mimetype="application/json"
|
||||
json.dumps(process_instance_metadata), status=201, mimetype="application/json"
|
||||
)
|
||||
|
||||
|
||||
|
@ -480,7 +480,7 @@ class ProcessInstanceProcessor:
|
||||
# Assure that we find the end event for this process_instance, and not for any sub-process_instances.
|
||||
if (
|
||||
isinstance(task.task_spec, EndEvent)
|
||||
and task.process_instance == self.bpmn_process_instance
|
||||
and task.workflow == self.bpmn_process_instance
|
||||
):
|
||||
endtasks.append(task)
|
||||
return endtasks[-1]
|
||||
|
59
tests/data/sample/sample.bpmn
Normal file
59
tests/data/sample/sample.bpmn
Normal file
@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1ny7jp4" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.0.0" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.17.0">
|
||||
<bpmn:process id="sample" isExecutable="true">
|
||||
<bpmn:startEvent id="StartEvent_1">
|
||||
<bpmn:outgoing>Flow_10jwwqy</bpmn:outgoing>
|
||||
</bpmn:startEvent>
|
||||
<bpmn:sequenceFlow id="Flow_10jwwqy" sourceRef="StartEvent_1" targetRef="Activity_0pxf6g1" />
|
||||
<bpmn:endEvent id="Event_1qb1u6a">
|
||||
<bpmn:incoming>Flow_1hd6o66</bpmn:incoming>
|
||||
</bpmn:endEvent>
|
||||
<bpmn:sequenceFlow id="Flow_0htxke7" sourceRef="Activity_0pxf6g1" targetRef="Activity_0a21ntf" />
|
||||
<bpmn:scriptTask id="Activity_0pxf6g1" name="My Script">
|
||||
<bpmn:incoming>Flow_10jwwqy</bpmn:incoming>
|
||||
<bpmn:outgoing>Flow_0htxke7</bpmn:outgoing>
|
||||
<bpmn:script>my_var = "Hello World"
|
||||
Mike = "Awesome"
|
||||
person = "Kevin"</bpmn:script>
|
||||
</bpmn:scriptTask>
|
||||
<bpmn:sequenceFlow id="Flow_1hd6o66" sourceRef="Activity_0a21ntf" targetRef="Event_1qb1u6a" />
|
||||
<bpmn:businessRuleTask id="Activity_0a21ntf" name="is wonderful?" camunda:decisionRef="wonderful">
|
||||
<bpmn:incoming>Flow_0htxke7</bpmn:incoming>
|
||||
<bpmn:outgoing>Flow_1hd6o66</bpmn:outgoing>
|
||||
</bpmn:businessRuleTask>
|
||||
</bpmn:process>
|
||||
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
|
||||
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="sample">
|
||||
<bpmndi:BPMNEdge id="Flow_1hd6o66_di" bpmnElement="Flow_1hd6o66">
|
||||
<di:waypoint x="600" y="230" />
|
||||
<di:waypoint x="656" y="230" />
|
||||
<di:waypoint x="656" y="110" />
|
||||
<di:waypoint x="802" y="110" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="Flow_0htxke7_di" bpmnElement="Flow_0htxke7">
|
||||
<di:waypoint x="340" y="120" />
|
||||
<di:waypoint x="420" y="120" />
|
||||
<di:waypoint x="420" y="230" />
|
||||
<di:waypoint x="500" y="230" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="Flow_10jwwqy_di" bpmnElement="Flow_10jwwqy">
|
||||
<di:waypoint x="188" y="120" />
|
||||
<di:waypoint x="240" y="120" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
|
||||
<dc:Bounds x="152" y="102" width="36" height="36" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="Event_1qb1u6a_di" bpmnElement="Event_1qb1u6a">
|
||||
<dc:Bounds x="802" y="92" width="36" height="36" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="Activity_17ohe7r_di" bpmnElement="Activity_0pxf6g1">
|
||||
<dc:Bounds x="240" y="80" width="100" height="80" />
|
||||
<bpmndi:BPMNLabel />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="Activity_06nka7s_di" bpmnElement="Activity_0a21ntf">
|
||||
<dc:Bounds x="500" y="190" width="100" height="80" />
|
||||
<bpmndi:BPMNLabel />
|
||||
</bpmndi:BPMNShape>
|
||||
</bpmndi:BPMNPlane>
|
||||
</bpmndi:BPMNDiagram>
|
||||
</bpmn:definitions>
|
44
tests/data/sample/wonderful.dmn
Normal file
44
tests/data/sample/wonderful.dmn
Normal file
@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<definitions xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/" xmlns:dmndi="https://www.omg.org/spec/DMN/20191111/DMNDI/" xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="wonderful_process" name="DRD" namespace="http://camunda.org/schema/1.0/dmn" exporter="Camunda Modeler" exporterVersion="5.0.0" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.0.0">
|
||||
<decision id="wonderful" name="wonderful">
|
||||
<decisionTable id="DecisionTable_02m334z">
|
||||
<input id="Input_1">
|
||||
<inputExpression id="InputExpression_1" typeRef="string">
|
||||
<text>person</text>
|
||||
</inputExpression>
|
||||
</input>
|
||||
<output id="Output_1" name="wonderfulness" typeRef="string" />
|
||||
<rule id="DecisionRule_1hnzjl8">
|
||||
<inputEntry id="UnaryTests_1pb0ou0">
|
||||
<text>"Dan"</text>
|
||||
</inputEntry>
|
||||
<outputEntry id="LiteralExpression_0rtsxgu">
|
||||
<text>"pretty wonderful"</text>
|
||||
</outputEntry>
|
||||
</rule>
|
||||
<rule id="DecisionRule_1cc73tk">
|
||||
<inputEntry id="UnaryTests_1fbj1wn">
|
||||
<text>"Kevin"</text>
|
||||
</inputEntry>
|
||||
<outputEntry id="LiteralExpression_1d9nsnp">
|
||||
<text>"Very wonderful"</text>
|
||||
</outputEntry>
|
||||
</rule>
|
||||
<rule id="DecisionRule_09y32t9">
|
||||
<inputEntry id="UnaryTests_05h3qcx">
|
||||
<text>"Mike"</text>
|
||||
</inputEntry>
|
||||
<outputEntry id="LiteralExpression_15b83d9">
|
||||
<text>"Powerful wonderful"</text>
|
||||
</outputEntry>
|
||||
</rule>
|
||||
</decisionTable>
|
||||
</decision>
|
||||
<dmndi:DMNDI>
|
||||
<dmndi:DMNDiagram>
|
||||
<dmndi:DMNShape dmnElementRef="wonderful">
|
||||
<dc:Bounds height="80" width="180" x="160" y="100" />
|
||||
</dmndi:DMNShape>
|
||||
</dmndi:DMNDiagram>
|
||||
</dmndi:DMNDI>
|
||||
</definitions>
|
@ -132,6 +132,22 @@ def test_get_process_model_when_not_found(app, client: FlaskClient, with_bpmn_fi
|
||||
assert response.json["code"] == "process_mode_cannot_be_found"
|
||||
|
||||
|
||||
def test_process_instance_create(app, client: FlaskClient, with_bpmn_file_cleanup):
|
||||
user = find_or_create_user()
|
||||
test_process_group_id = "runs_without_input"
|
||||
process_model_dir_name = "sample"
|
||||
load_test_spec(app, process_model_dir_name, process_group_id=test_process_group_id)
|
||||
response = client.post(
|
||||
f"/v1.0/process-models/{process_model_dir_name}", headers=logged_in_headers(user)
|
||||
)
|
||||
assert response.status_code == 201
|
||||
assert response.json["status"] == "complete"
|
||||
assert response.json["process_model_identifier"] == "sample"
|
||||
assert response.json["data"]["current_user"]["username"] == "test_user1"
|
||||
assert response.json["data"]["Mike"] == "Awesome"
|
||||
assert response.json["data"]["person"] == "Kevin"
|
||||
|
||||
|
||||
def create_process_model(app, client: FlaskClient):
|
||||
"""Create_process_model."""
|
||||
process_model_service = ProcessModelService()
|
||||
|
Loading…
x
Reference in New Issue
Block a user