Squashed 'SpiffWorkflow/' changes from 98c6294f..0e61be85

0e61be85 Merge pull request #289 from sartography/improvement/execution-and-serialization-cleanup
527684da fix some typos in the class & method docs
0dff44a4 Merge branch 'main' into improvement/execution-and-serialization-cleanup
64737498 Allow for other PythonScriptEngine environments besides task data (#288)
dd63e916 remove some unused tests & diagrams
24aae519 clean up various small stuff
3b2dc35d use context when opening files for parsing
69eec3eb update class/method docs
24528dfb move all spec conversion classes to top level
5af33b11 remove some unused methods related to old serializer
931b90fb reorganize serializer
4e81ed29 consolidate pointless serializer classes
d62acf02 change task_spec._update_hook to return a boolean indicating whether the task is ready

git-subtree-dir: SpiffWorkflow
git-subtree-split: 0e61be85c47474a33037e6f398e64c96e02f13ad
This commit is contained in:
burnettk 2023-02-02 20:59:28 -05:00
parent b8d3d5d84b
commit c237e218b2
42 changed files with 248 additions and 2842 deletions

View File

@ -1,6 +1,6 @@
import unittest
from SpiffWorkflow.bpmn.PythonScriptEngine import Box
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import Box
class BoxDeepCopyTest(unittest.TestCase):

View File

@ -7,7 +7,7 @@ from SpiffWorkflow.bpmn.parser.TaskParser import TaskParser
from SpiffWorkflow.bpmn.parser.task_parsers import ConditionalGatewayParser
from SpiffWorkflow.bpmn.parser.util import full_tag
from SpiffWorkflow.bpmn.serializer.bpmn_converters import BpmnTaskSpecConverter
from SpiffWorkflow.bpmn.serializer.helpers.spec import TaskSpecConverter
# Many of our tests relied on the Packager to set the calledElement attribute on
# Call Activities. I've moved that code to a customized parser.
@ -35,9 +35,6 @@ class TestUserTask(UserTask):
task.set_data(choice=choice)
task.complete()
@classmethod
def deserialize(self, serializer, wf_spec, s_state):
return serializer.deserialize_generic(wf_spec, s_state, TestUserTask)
class TestExclusiveGatewayParser(ConditionalGatewayParser):
@ -47,7 +44,7 @@ class TestExclusiveGatewayParser(ConditionalGatewayParser):
return cond
return "choice == '%s'" % sequence_flow_node.get('name', None)
class TestUserTaskConverter(BpmnTaskSpecConverter):
class TestUserTaskConverter(TaskSpecConverter):
def __init__(self, data_converter=None):
super().__init__(TestUserTask, data_converter)

View File

@ -7,13 +7,16 @@ from SpiffWorkflow.bpmn.parser.BpmnParser import BpmnValidator
from SpiffWorkflow.task import TaskState
from SpiffWorkflow.bpmn.serializer.workflow import BpmnWorkflowSerializer
from SpiffWorkflow.bpmn.serializer.workflow import BpmnWorkflowSerializer, DEFAULT_SPEC_CONFIG
from SpiffWorkflow.bpmn.serializer.task_spec import UserTaskConverter
from .BpmnLoaderForTests import TestUserTaskConverter, TestBpmnParser
__author__ = 'matth'
DEFAULT_SPEC_CONFIG['task_specs'].append(TestUserTaskConverter)
wf_spec_converter = BpmnWorkflowSerializer.configure_workflow_spec_converter([TestUserTaskConverter])
wf_spec_converter = BpmnWorkflowSerializer.configure_workflow_spec_converter(spec_config=DEFAULT_SPEC_CONFIG)
class BpmnWorkflowTestCase(unittest.TestCase):

View File

@ -4,6 +4,7 @@ import unittest
from SpiffWorkflow.exceptions import WorkflowTaskException
from SpiffWorkflow.task import TaskState
from SpiffWorkflow.bpmn.PythonScriptEngine import PythonScriptEngine
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import TaskDataEnvironment
from SpiffWorkflow.bpmn.workflow import BpmnWorkflow
from tests.SpiffWorkflow.bpmn.BpmnWorkflowTestCase import BpmnWorkflowTestCase
@ -17,8 +18,8 @@ class CustomBpmnScriptEngine(PythonScriptEngine):
It will execute python code read in from the bpmn. It will also make any scripts in the
scripts directory available for execution. """
def __init__(self):
augment_methods = {'custom_function': my_custom_function}
super().__init__(scripting_additions=augment_methods)
environment = TaskDataEnvironment({'custom_function': my_custom_function})
super().__init__(environment=environment)
class CustomInlineScriptTest(BpmnWorkflowTestCase):

View File

@ -3,6 +3,7 @@
import unittest
from SpiffWorkflow.bpmn.FeelLikeScriptEngine import FeelLikeScriptEngine, FeelInterval
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import BoxedTaskDataEnvironment
from tests.SpiffWorkflow.bpmn.BpmnWorkflowTestCase import BpmnWorkflowTestCase
import datetime
@ -12,7 +13,7 @@ __author__ = 'matth'
class FeelExpressionTest(BpmnWorkflowTestCase):
def setUp(self):
self.expressionEngine = FeelLikeScriptEngine()
self.expressionEngine = FeelLikeScriptEngine(environment=BoxedTaskDataEnvironment())
def testRunThroughExpressions(self):
tests = [("string length('abcd')", 4, {}),
@ -62,7 +63,7 @@ class FeelExpressionTest(BpmnWorkflowTestCase):
]
}
x = self.expressionEngine._evaluate(
"""sum([1 for x in exclusive if x.get('ExclusiveSpaceAMComputingID',None)==None])""",
"""sum([1 for x in exclusive if x.get('ExclusiveSpaceAMComputingID',None)==None])""",
data
)
self.assertEqual(x, 1)

View File

@ -1,47 +0,0 @@
# -*- coding: utf-8 -*-
import unittest
from SpiffWorkflow.bpmn.workflow import BpmnWorkflow
from tests.SpiffWorkflow.bpmn.BpmnWorkflowTestCase import BpmnWorkflowTestCase
__author__ = 'kellym'
class NavListExclusiveGatewayTest(BpmnWorkflowTestCase):
"""The example bpmn diagram looks roughly like this, a gateway
that leads to two different end points
[Step 1] -> <x exclusive gateway x>
-> 'False' -> [Alternate End] -> END A
-> 'True' -> [Step 2] -> END B
"""
def setUp(self):
self.spec = self.load_workflow1_spec()
def load_workflow1_spec(self):
return self.load_workflow_spec('ExclusiveGatewayMultipleEndNavigation.bpmn','ExclusiveGatewayMultipleEndNavigation')
def testRunThroughHappy(self):
self.workflow = BpmnWorkflow(self.spec)
self.workflow.do_engine_steps()
nav_list = self.workflow.get_nav_list()
self.assertEqual(6, len(nav_list))
self.assertEqual("Step 1", nav_list[0]["description"])
self.assertEqual("GatewayToEnd", nav_list[1]["description"])
self.assertEqual("False", nav_list[2]["description"])
self.assertEqual("Step End", nav_list[3]["description"])
self.assertEqual("True", nav_list[4]["description"])
self.assertEqual("Step 2", nav_list[5]["description"])
self.assertEqual(0, nav_list[0]["indent"])
def suite():
return unittest.TestLoader().loadTestsFromTestCase(NavListExclusiveGatewayTest)
if __name__ == '__main__':
unittest.TextTestRunner(verbosity=2).run(suite())

View File

@ -0,0 +1,80 @@
import json
from tests.SpiffWorkflow.bpmn.BpmnWorkflowTestCase import BpmnWorkflowTestCase
from SpiffWorkflow.bpmn.PythonScriptEngine import PythonScriptEngine
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import BasePythonScriptEngineEnvironment
from SpiffWorkflow.bpmn.workflow import BpmnWorkflow
from SpiffWorkflow.task import TaskState
def example_global():
pass
class NonTaskDataExampleEnvironment(BasePythonScriptEngineEnvironment):
def __init__(self, environment_globals, environment):
self.environment = environment
self.environment.update(environment_globals)
super().__init__(environment_globals)
def evaluate(self, expression, context, external_methods=None):
pass
def execute(self, script, context, external_methods=None):
self.environment.update(context)
self.environment.update(external_methods or {})
exec(script, self.environment)
self.environment = {k: v for k, v in self.environment.items() if k not in external_methods}
def user_defined_values(self):
return {k: v for k, v in self.environment.items() if k not in self.globals}
class PythonScriptEngineEnvironmentTest(BpmnWorkflowTestCase):
def setUp(self):
spec, subprocesses = self.load_workflow_spec('task_data_size.bpmn', 'Process_ccz6oq2')
self.workflow = BpmnWorkflow(spec, subprocesses)
def testTaskDataSizeWithDefaultPythonScriptEngine(self):
self.workflow.do_engine_steps()
self.assertIn("a", self.workflow.data)
self.assertIn("b", self.workflow.data)
self.assertIn("c", self.workflow.data)
self.assertIn("d", self.workflow.data)
task_data_len = self._get_task_data_len()
d_uniques = set(self.workflow.data["d"])
d_len = len(self.workflow.data["d"])
self.assertGreater(task_data_len, 15000)
self.assertEqual(d_len, 512*3)
self.assertEqual(d_uniques, {"a", "b", "c"})
def testTaskDataSizeWithNonTaskDataEnvironmentBasedPythonScriptEngine(self):
script_engine_environment = NonTaskDataExampleEnvironment({"example_global": example_global}, {})
script_engine = PythonScriptEngine(environment=script_engine_environment)
self.workflow.script_engine = script_engine
self.workflow.do_engine_steps()
self.workflow.data.update(script_engine.environment.user_defined_values())
self.assertIn("a", self.workflow.data)
self.assertIn("b", self.workflow.data)
self.assertIn("c", self.workflow.data)
self.assertIn("d", self.workflow.data)
self.assertNotIn("example_global", self.workflow.data)
task_data_len = self._get_task_data_len()
d_uniques = set(self.workflow.data["d"])
d_len = len(self.workflow.data["d"])
self.assertEqual(task_data_len, 2)
self.assertEqual(d_len, 512*3)
self.assertEqual(d_uniques, {"a", "b", "c"})
def _get_task_data_len(self):
tasks_to_check = self.workflow.get_tasks(TaskState.FINISHED_MASK)
task_data = [task.data for task in tasks_to_check]
task_data_to_check = list(filter(len, task_data))
task_data_len = len(json.dumps(task_data_to_check))
return task_data_len

View File

@ -4,6 +4,7 @@ import datetime
import unittest
from SpiffWorkflow.bpmn.PythonScriptEngine import PythonScriptEngine
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import TaskDataEnvironment
from SpiffWorkflow.bpmn.workflow import BpmnWorkflow
from tests.SpiffWorkflow.bpmn.BpmnWorkflowTestCase import BpmnWorkflowTestCase
@ -14,10 +15,10 @@ class CustomScriptEngine(PythonScriptEngine):
It will execute python code read in from the bpmn. It will also make any scripts in the
scripts directory available for execution. """
def __init__(self):
augment_methods = {
environment = TaskDataEnvironment({
'timedelta': datetime.timedelta,
}
super().__init__(scripting_additions=augment_methods)
})
super().__init__(environment=environment)
class TooManyLoopsTest(BpmnWorkflowTestCase):

View File

@ -1,746 +0,0 @@
<?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:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_06pyjz2" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.7.3">
<bpmn:process id="ComplexNavigation" isExecutable="true">
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_0kcrx5l</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:sequenceFlow id="Flow_0kcrx5l" sourceRef="StartEvent_1" targetRef="Step1" />
<bpmn:userTask id="Step1" name="Step 1">
<bpmn:incoming>Flow_0kcrx5l</bpmn:incoming>
<bpmn:outgoing>Flow_1seuuie</bpmn:outgoing>
</bpmn:userTask>
<bpmn:userTask id="Activity_0obertf" name="Select RO Education Department" camunda:formKey="RO_EducationDept">
<bpmn:documentation>The Study's Responsible Organization is needed in order to confirm the Department Chair. If it is the same as the Primary Investigator's Primary Department show below, we have all the information needed to determine the Department Chair.
**Primary Investigator's Primary Appointment**
***School:*** {{ pi.E0.schoolName }}
***Department:*** {{ pi.E0.deptName }}</bpmn:documentation>
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="RO_StudyDeptEducation" label="PI&#39;s Study Responsible Organization Department" type="enum">
<camunda:properties>
<camunda:property id="spreadsheet.name" value="DepartmentList-Education.xlsx" />
<camunda:property id="spreadsheet.value.column" value="Value" />
<camunda:property id="spreadsheet.label.column" value="Label" />
<camunda:property id="description" value="Type key words to find Education Department" />
</camunda:properties>
</camunda:formField>
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>Flow_12obxbo</bpmn:incoming>
<bpmn:outgoing>Flow_1y4gjsg</bpmn:outgoing>
</bpmn:userTask>
<bpmn:scriptTask id="Activity_0vmy33u" name="Update RO Data">
<bpmn:incoming>Flow_02614fd</bpmn:incoming>
<bpmn:outgoing>Flow_0c4tt8e</bpmn:outgoing>
<bpmn:script>ro.chair = {}
ro.chair.uid = RO_Chair_CID
ro.chair.name_degree = RO_Chair_Name_Degree
ro.chair.title = RO_Chair_Title
ro.chair.sig_block = RO_Chair_Sig_Block</bpmn:script>
</bpmn:scriptTask>
<bpmn:exclusiveGateway id="Gateway_0ubqopr" name="PI&#39;s Primary School / Department same as study&#39;s Responsible Organization?" default="Flow_1ni06mz">
<bpmn:incoming>Flow_1seuuie</bpmn:incoming>
<bpmn:outgoing>Flow_1ni06mz</bpmn:outgoing>
<bpmn:outgoing>Flow_1y9edqt</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:exclusiveGateway id="Gateway_13vtxns" default="Flow_1oriwwz">
<bpmn:incoming>Flow_1y9edqt</bpmn:incoming>
<bpmn:outgoing>Flow_1oriwwz</bpmn:outgoing>
<bpmn:outgoing>Flow_185jvp3</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:scriptTask id="Activity_08ldcxm" name="Build School List">
<bpmn:incoming>Flow_185jvp3</bpmn:incoming>
<bpmn:outgoing>Flow_1dh8c45</bpmn:outgoing>
<bpmn:script>sch_enum = []
if pi.E0.schoolAbbrv != "MD":
sch_enum_md = [
{
"value": "MD",
"label": "Medicine"
},
]
else:
sch_enum_md = []
if pi.E0.schoolAbbrv != "AS":
sch_enum_as = [
{
"value": "AS",
"label": "Arts &amp; Science"
},
]
else:
sch_enum_as = []
if pi.E0.schoolAbbrv != "CU":
sch_enum_cu = [
{
"value": "CU",
"label": "Education"
},
]
else:
sch_enum_cu = []
if pi.E0.schoolAbbrv != "NR":
sch_enum_nr = [
{
"value": "NR",
"label": "Nursing"
},
]
else:
sch_enum_nr = []
sch_enum = sch_enum_md + sch_enum_as + sch_enum_cu + sch_enum_nr
del(sch_enum_md)
del(sch_enum_as)
del(sch_enum_cu)
del(sch_enum_nr)</bpmn:script>
</bpmn:scriptTask>
<bpmn:userTask id="Activity_08pywzy" name="Select RO School" camunda:formKey="RO_School">
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="RO_StudySchool" label="Select the Responsible Organization&#39;s School" type="enum">
<camunda:properties>
<camunda:property id="data.name" value="sch_enum" />
<camunda:property id="data.value.column" value="value" />
<camunda:property id="data.label.column" value="label" />
</camunda:properties>
</camunda:formField>
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>Flow_1dh8c45</bpmn:incoming>
<bpmn:outgoing>Flow_0mf9npl</bpmn:outgoing>
</bpmn:userTask>
<bpmn:exclusiveGateway id="Gateway_12qlux1" name="School Have Departments?" default="Flow_0nzochy">
<bpmn:incoming>Flow_1oriwwz</bpmn:incoming>
<bpmn:incoming>Flow_0nmpxmc</bpmn:incoming>
<bpmn:outgoing>Flow_12obxbo</bpmn:outgoing>
<bpmn:outgoing>Flow_03s8gvx</bpmn:outgoing>
<bpmn:outgoing>Flow_0nzochy</bpmn:outgoing>
<bpmn:outgoing>Flow_0h955ao</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:exclusiveGateway id="Gateway_02h27h5">
<bpmn:incoming>Flow_1y4gjsg</bpmn:incoming>
<bpmn:incoming>Flow_0lnb8jw</bpmn:incoming>
<bpmn:incoming>Flow_1fqtd41</bpmn:incoming>
<bpmn:outgoing>Flow_0a626ba</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:scriptTask id="Activity_0nkgcfg" name="Reset RO Department">
<bpmn:incoming>Flow_0a626ba</bpmn:incoming>
<bpmn:outgoing>Flow_0ssrpqx</bpmn:outgoing>
<bpmn:script>if PIsPrimaryDepartmentSameAsRO.value == "diffSchool":
ro.schoolName = RO_StudySchool.label
ro.schoolAbbrv = RO_StudySchool.value
if PIsPrimaryDepartmentSameAsRO.value != "yes":
if ro.schoolAbbrv == "MD":
ro.deptName = RO_StudyDeptMedicine.label
ro.deptAbbrv = RO_StudyDeptMedicine.value
elif ro.schoolAbbrv == "AS":
ro.deptName = RO_StudyDeptArtsSciences.label
ro.deptAbbrv = RO_StudyDeptArtsSciences.value
elif ro.schoolAbbrv == "CU":
ro.deptName = RO_StudyDeptEducation.label
ro.deptAbbrv = RO_StudyDeptEducation.value
else:
ro.deptName = ""
ro.deptAbbrv = ""</bpmn:script>
</bpmn:scriptTask>
<bpmn:userTask id="Activity_16q24p2" name="Select RO Medicine Department" camunda:formKey="RO_MedicineDept">
<bpmn:documentation>The Study's Responsible Organization is needed in order to confirm the Department Chair. If it is the same as the Primary Investigator's Primary Department show below, we have all the information needed to determine the Department Chair.
**Primary Investigator's Primary Appointment**
***School:*** {{ pi.E0.schoolName }}
***Department:*** {{ pi.E0.deptName }}</bpmn:documentation>
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="RO_StudyDeptMedicine" label="PI&#39;s Study Responsible Organization Department" type="enum">
<camunda:properties>
<camunda:property id="spreadsheet.name" value="DepartmentList-Medicine.xlsx" />
<camunda:property id="spreadsheet.value.column" value="Value" />
<camunda:property id="spreadsheet.label.column" value="Label" />
<camunda:property id="description" value="Type key words to find Medicine Department" />
</camunda:properties>
</camunda:formField>
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>Flow_0nzochy</bpmn:incoming>
<bpmn:outgoing>Flow_0lnb8jw</bpmn:outgoing>
</bpmn:userTask>
<bpmn:userTask id="Activity_0nv1s23" name="Select RO A&#38;S Department" camunda:formKey="RO_AandS_Dept">
<bpmn:documentation>The Study's Responsible Organization is needed in order to confirm the Department Chair. If it is the same as the Primary Investigator's Primary Department show below, we have all the information needed to determine the Department Chair.
**Primary Investigator's Primary Appointment**
***School:*** {{ pi.E0.schoolName }}
***Department:*** {{ pi.E0.deptName }}</bpmn:documentation>
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="RO_StudyDeptArtsSciences" label="PI&#39;s Study Responsible Organization Department" type="enum">
<camunda:properties>
<camunda:property id="spreadsheet.name" value="DepartmentList-ArtsSciences.xlsx" />
<camunda:property id="spreadsheet.value.column" value="Value" />
<camunda:property id="spreadsheet.label.column" value="Label" />
<camunda:property id="description" value="Type key words to find A&#38;S Department" />
</camunda:properties>
</camunda:formField>
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>Flow_0h955ao</bpmn:incoming>
<bpmn:outgoing>Flow_1fqtd41</bpmn:outgoing>
</bpmn:userTask>
<bpmn:scriptTask id="Activity_0xa6vms" name="Reset RO School ">
<bpmn:incoming>Flow_0mf9npl</bpmn:incoming>
<bpmn:outgoing>Flow_0nmpxmc</bpmn:outgoing>
<bpmn:script>ro.schoolName = RO_StudySchool.label
ro.schoolAbbrv = RO_StudySchool.value</bpmn:script>
</bpmn:scriptTask>
<bpmn:exclusiveGateway id="Gateway_12sb0pk">
<bpmn:incoming>Flow_03s8gvx</bpmn:incoming>
<bpmn:incoming>Flow_0ssrpqx</bpmn:incoming>
<bpmn:outgoing>Flow_0tnnt3b</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="Flow_12obxbo" name="Education" sourceRef="Gateway_12qlux1" targetRef="Activity_0obertf">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">ro.schoolAbbrv == "CU"</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:sequenceFlow id="Flow_1y4gjsg" sourceRef="Activity_0obertf" targetRef="Gateway_02h27h5" />
<bpmn:sequenceFlow id="Flow_1ni06mz" sourceRef="Gateway_0ubqopr" targetRef="Activity_0whcncc" />
<bpmn:sequenceFlow id="Flow_0tnnt3b" sourceRef="Gateway_12sb0pk" targetRef="Activity_0whcncc" />
<bpmn:sequenceFlow id="Flow_02614fd" sourceRef="Activity_0whcncc" targetRef="Activity_0vmy33u" />
<bpmn:sequenceFlow id="Flow_1y9edqt" name="No" sourceRef="Gateway_0ubqopr" targetRef="Gateway_13vtxns">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">PIsPrimaryDepartmentSameAsRO.value != "yes"</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:sequenceFlow id="Flow_1oriwwz" name="Yes" sourceRef="Gateway_13vtxns" targetRef="Gateway_12qlux1" />
<bpmn:sequenceFlow id="Flow_185jvp3" name="No" sourceRef="Gateway_13vtxns" targetRef="Activity_08ldcxm">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">PIsPrimaryDepartmentSameAsRO.value == 'diffSchool'</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:sequenceFlow id="Flow_1dh8c45" sourceRef="Activity_08ldcxm" targetRef="Activity_08pywzy" />
<bpmn:sequenceFlow id="Flow_0mf9npl" sourceRef="Activity_08pywzy" targetRef="Activity_0xa6vms" />
<bpmn:sequenceFlow id="Flow_0nmpxmc" sourceRef="Activity_0xa6vms" targetRef="Gateway_12qlux1" />
<bpmn:sequenceFlow id="Flow_03s8gvx" name="No" sourceRef="Gateway_12qlux1" targetRef="Gateway_12sb0pk">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">ro.schoolAbbrv not in ["MD", "AS", "CU"]</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:sequenceFlow id="Flow_0nzochy" name="Medicine" sourceRef="Gateway_12qlux1" targetRef="Activity_16q24p2" />
<bpmn:sequenceFlow id="Flow_0h955ao" name="A&#38;S" sourceRef="Gateway_12qlux1" targetRef="Activity_0nv1s23">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">ro.schoolAbbrv == "AS"</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:sequenceFlow id="Flow_0lnb8jw" sourceRef="Activity_16q24p2" targetRef="Gateway_02h27h5" />
<bpmn:sequenceFlow id="Flow_1fqtd41" sourceRef="Activity_0nv1s23" targetRef="Gateway_02h27h5" />
<bpmn:sequenceFlow id="Flow_0a626ba" sourceRef="Gateway_02h27h5" targetRef="Activity_0nkgcfg" />
<bpmn:sequenceFlow id="Flow_0ssrpqx" sourceRef="Activity_0nkgcfg" targetRef="Gateway_12sb0pk" />
<bpmn:sequenceFlow id="Flow_1seuuie" sourceRef="Step1" targetRef="Gateway_0ubqopr" />
<bpmn:userTask id="Activity_0whcncc" name="Determine RO Chair">
<bpmn:incoming>Flow_1ni06mz</bpmn:incoming>
<bpmn:incoming>Flow_0tnnt3b</bpmn:incoming>
<bpmn:outgoing>Flow_02614fd</bpmn:outgoing>
</bpmn:userTask>
<bpmn:endEvent id="Event_0l7thbn" name="End">
<bpmn:documentation>temp</bpmn:documentation>
<bpmn:incoming>Flow_15xpsq8</bpmn:incoming>
<bpmn:incoming>Flow_1g7q28p</bpmn:incoming>
</bpmn:endEvent>
<bpmn:exclusiveGateway id="Gateway_0ym1uow" name="How many Primary Coordinators?" default="Flow_0ygr7cu">
<bpmn:incoming>Flow_0cqbu1f</bpmn:incoming>
<bpmn:incoming>Flow_1d4sb3d</bpmn:incoming>
<bpmn:outgoing>Flow_12oux1f</bpmn:outgoing>
<bpmn:outgoing>Flow_0ygr7cu</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:userTask id="Activity_0l7vq1i" name="Update Primary Coordinator Info" camunda:formKey="SC_AccessEmails">
<bpmn:documentation>The following Primary Coordinators were entered in Protocol Builder:
{%+ for key, value in pcs.items() %}{{value.display_name}} ({{key}}){% if loop.index is lt cnt_pcs %}, {% endif %}{% endfor %}
To Save the current settings for all Primary Coordinators, select Save All.
Otherwise, edit each Coordinator as necessary and select the Save button for each.
### Please provide supplemental information for:
#### {{ pc.display_name }}
##### Title: {{ pc.title }}
##### Department: {{ pc.department }}
##### Affiliation: {{ pc.affiliation }}</bpmn:documentation>
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="pc.access" label="Should this Coordinator have full editing access in the system?" type="boolean" defaultValue="true" />
<camunda:formField id="pc.emails" label="Should this Coordinator receive automated email notifications?" type="boolean" defaultValue="true" />
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>Flow_12oux1f</bpmn:incoming>
<bpmn:outgoing>Flow_1ik148z</bpmn:outgoing>
<bpmn:multiInstanceLoopCharacteristics camunda:collection="pcs" camunda:elementVariable="pc" />
</bpmn:userTask>
<bpmn:exclusiveGateway id="Gateway_1fhu0gj" name="PI is Dept Chair?" default="Flow_05g7d16">
<bpmn:incoming>Flow_0c4tt8e</bpmn:incoming>
<bpmn:outgoing>Flow_05g7d16</bpmn:outgoing>
<bpmn:outgoing>Flow_13zasb1</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:manualTask id="Activity_17ikhsk" name="Show PI is Dept Chair">
<bpmn:documentation>The PI is also the RO Chair</bpmn:documentation>
<bpmn:incoming>Flow_13zasb1</bpmn:incoming>
<bpmn:outgoing>Flow_0cqbu1f</bpmn:outgoing>
</bpmn:manualTask>
<bpmn:exclusiveGateway id="Gateway_1ykz8u2" name="How many Sub-Investigators?" default="Flow_0pdoc38">
<bpmn:incoming>Flow_0efu6u1</bpmn:incoming>
<bpmn:incoming>Flow_0a3fjzp</bpmn:incoming>
<bpmn:outgoing>Flow_0ljn2v6</bpmn:outgoing>
<bpmn:outgoing>Flow_0pdoc38</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:userTask id="Activity_0rcrs1i" name="Update Sub-Investigator Info" camunda:formKey="SI_AccessEmails">
<bpmn:documentation>The following Sub-Investigators were entered in Protocol Builder:
{%+ for key, value in subs.items() %}{{value.display_name}} ({{key}}){% if loop.index is lt cnt_subs %}, {% endif %}{% endfor %}
To Save the current settings for all Sub-Investigators, select Save All.
Otherwise, edit each Sub-Investigator as necessary and select the Save button for each.
### Please provide supplemental information for:
#### {{ sub.display_name }}
##### Title: {{ sub.title }}
##### Department: {{ sub.department }}
##### Affiliation: {{ sub.affiliation }}</bpmn:documentation>
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="sub.access" label="Should this Sub-Investigator have full editing access in the system?" type="boolean" defaultValue="false" />
<camunda:formField id="sub.emails" label="Should this Sub-Investigator receive automated email notifications?" type="boolean" defaultValue="false" />
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>Flow_0ljn2v6</bpmn:incoming>
<bpmn:outgoing>Flow_07vu2b0</bpmn:outgoing>
<bpmn:multiInstanceLoopCharacteristics camunda:collection="subs" camunda:elementVariable="sub" />
</bpmn:userTask>
<bpmn:exclusiveGateway id="Gateway_1h4d4n5" name="How many Additional Coordinators?" default="Flow_0a3fjzp">
<bpmn:incoming>Flow_1ik148z</bpmn:incoming>
<bpmn:incoming>Flow_0ygr7cu</bpmn:incoming>
<bpmn:outgoing>Flow_0a3fjzp</bpmn:outgoing>
<bpmn:outgoing>Flow_0rstqv5</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:userTask id="Activity_0tbvw9o" name="Update Additional Coordinator Info">
<bpmn:documentation>The following Additional Coordinators were entered in Protocol Builder:
{%+ for key, value in acs.items() %}{{value.display_name}} ({{key}}){% if loop.index is lt cnt_acs %}, {% endif %}{% endfor %}
To Save the current settings for all Additional Coordinators, select Save All.
Otherwise, edit each Coordinator as necessary and select the Save button for each.
### Please provide supplemental information for:
#### {{ acs.display_name }}
##### Title: {{ acs.title }}
##### Department: {{ acs.department }}
##### Affiliation: {{ acs.affiliation }}</bpmn:documentation>
<bpmn:incoming>Flow_0rstqv5</bpmn:incoming>
<bpmn:outgoing>Flow_0efu6u1</bpmn:outgoing>
<bpmn:multiInstanceLoopCharacteristics camunda:collection="acs" camunda:elementVariable="ac" />
</bpmn:userTask>
<bpmn:exclusiveGateway id="Gateway_0gjk91e" name="How many Additional Personnel? " default="Flow_1g7q28p">
<bpmn:incoming>Flow_0pdoc38</bpmn:incoming>
<bpmn:incoming>Flow_07vu2b0</bpmn:incoming>
<bpmn:outgoing>Flow_1g7q28p</bpmn:outgoing>
<bpmn:outgoing>Flow_0qti1ms</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:userTask id="Activity_1uzsp1r" name="Update Additional Personnel Info" camunda:formKey="AP_AccessEmails">
<bpmn:documentation>The following Additional Personnel were entered in Protocol Builder:
{%+ for key, value in aps.items() %}{{value.display_name}} ({{key}}){% if loop.index is lt cnt_aps %}, {% endif %}{% endfor %}
To Save the current settings for all Additional Personnel, select Save All.
Otherwise, edit each Additional Personnel as necessary and select the Save button for each.
### Please provide supplemental information for:
#### {{ ap.display_name }}
##### Title: {{ ap.title }}
##### Department: {{ ap.department }}
##### Affiliation: {{ ap.affiliation }}</bpmn:documentation>
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="ap.access" label="Should this Additional Personnel have full editing access in the system?" type="boolean" />
<camunda:formField id="FormField_27dit3u" label="Should this Additional Personnel receive automated email notifications?" />
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>Flow_0qti1ms</bpmn:incoming>
<bpmn:outgoing>Flow_15xpsq8</bpmn:outgoing>
<bpmn:multiInstanceLoopCharacteristics camunda:collection="aps" camunda:elementVariable="ap" />
</bpmn:userTask>
<bpmn:userTask id="Activity_0otiy71" name="Update Chair Info" camunda:formKey="RO_Chair_Info">
<bpmn:documentation>***Name &amp; Degree:*** {{ RO_Chair_Name_Degree }}
***School:*** {{ RO_School }}
***Department:*** {{ RO_Department }}
***Title:*** {{ RO_Chair_Title }}
***Email:*** {{ RO_Chair_CID }}
{% if RO_Chair_CID != dc.uid %}
*Does not match the Department Chair specified in Protocol Builder, {{ dc.display_name }}*
{% endif %}</bpmn:documentation>
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="RO_ChairAccess" label="Should the Department Chair have full editing access in the system?" type="boolean" defaultValue="false" />
<camunda:formField id="RO_ChairEmails" label="Should the Department Chair receive automated email notifications?" type="boolean" defaultValue="false" />
</camunda:formData>
<camunda:properties>
<camunda:property name="display_name" value="&#34;Responsible Organization&#39;s Chair Info&#34;" />
</camunda:properties>
</bpmn:extensionElements>
<bpmn:incoming>Flow_05g7d16</bpmn:incoming>
<bpmn:outgoing>Flow_1d4sb3d</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_15xpsq8" sourceRef="Activity_1uzsp1r" targetRef="Event_0l7thbn" />
<bpmn:sequenceFlow id="Flow_1g7q28p" sourceRef="Gateway_0gjk91e" targetRef="Event_0l7thbn" />
<bpmn:sequenceFlow id="Flow_0cqbu1f" sourceRef="Activity_17ikhsk" targetRef="Gateway_0ym1uow" />
<bpmn:sequenceFlow id="Flow_1d4sb3d" sourceRef="Activity_0otiy71" targetRef="Gateway_0ym1uow" />
<bpmn:sequenceFlow id="Flow_12oux1f" name="1 or more" sourceRef="Gateway_0ym1uow" targetRef="Activity_0l7vq1i" />
<bpmn:sequenceFlow id="Flow_0ygr7cu" name="None" sourceRef="Gateway_0ym1uow" targetRef="Gateway_1h4d4n5" />
<bpmn:sequenceFlow id="Flow_1ik148z" sourceRef="Activity_0l7vq1i" targetRef="Gateway_1h4d4n5" />
<bpmn:sequenceFlow id="Flow_05g7d16" name="No" sourceRef="Gateway_1fhu0gj" targetRef="Activity_0otiy71" />
<bpmn:sequenceFlow id="Flow_13zasb1" name="Yes" sourceRef="Gateway_1fhu0gj" targetRef="Activity_17ikhsk">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">RO_Chair_CID == pi.uid</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:sequenceFlow id="Flow_0efu6u1" sourceRef="Activity_0tbvw9o" targetRef="Gateway_1ykz8u2" />
<bpmn:sequenceFlow id="Flow_0a3fjzp" name="None" sourceRef="Gateway_1h4d4n5" targetRef="Gateway_1ykz8u2" />
<bpmn:sequenceFlow id="Flow_0ljn2v6" name="1 or more" sourceRef="Gateway_1ykz8u2" targetRef="Activity_0rcrs1i" />
<bpmn:sequenceFlow id="Flow_0pdoc38" name="None" sourceRef="Gateway_1ykz8u2" targetRef="Gateway_0gjk91e" />
<bpmn:sequenceFlow id="Flow_07vu2b0" sourceRef="Activity_0rcrs1i" targetRef="Gateway_0gjk91e" />
<bpmn:sequenceFlow id="Flow_0rstqv5" name="1 or more" sourceRef="Gateway_1h4d4n5" targetRef="Activity_0tbvw9o" />
<bpmn:sequenceFlow id="Flow_0qti1ms" sourceRef="Gateway_0gjk91e" targetRef="Activity_1uzsp1r" />
<bpmn:sequenceFlow id="Flow_0c4tt8e" sourceRef="Activity_0vmy33u" targetRef="Gateway_1fhu0gj" />
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="ComplexNavigation">
<bpmndi:BPMNEdge id="Flow_0c4tt8e_di" bpmnElement="Flow_0c4tt8e">
<di:waypoint x="1070" y="300" />
<di:waypoint x="1118" y="300" />
<di:waypoint x="1118" y="290" />
<di:waypoint x="1165" y="290" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0qti1ms_di" bpmnElement="Flow_0qti1ms">
<di:waypoint x="2625" y="290" />
<di:waypoint x="2730" y="290" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0rstqv5_di" bpmnElement="Flow_0rstqv5">
<di:waypoint x="1925" y="290" />
<di:waypoint x="2040" y="290" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1959" y="272" width="48" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_07vu2b0_di" bpmnElement="Flow_07vu2b0">
<di:waypoint x="2510" y="290" />
<di:waypoint x="2575" y="290" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0pdoc38_di" bpmnElement="Flow_0pdoc38">
<di:waypoint x="2280" y="315" />
<di:waypoint x="2280" y="390" />
<di:waypoint x="2600" y="390" />
<di:waypoint x="2600" y="315" />
<bpmndi:BPMNLabel>
<dc:Bounds x="2427" y="372" width="27" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0ljn2v6_di" bpmnElement="Flow_0ljn2v6">
<di:waypoint x="2305" y="290" />
<di:waypoint x="2410" y="290" />
<bpmndi:BPMNLabel>
<dc:Bounds x="2334" y="272" width="48" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0a3fjzp_di" bpmnElement="Flow_0a3fjzp">
<di:waypoint x="1900" y="265" />
<di:waypoint x="1900" y="180" />
<di:waypoint x="2280" y="180" />
<di:waypoint x="2280" y="265" />
<bpmndi:BPMNLabel>
<dc:Bounds x="2077" y="162" width="27" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0efu6u1_di" bpmnElement="Flow_0efu6u1">
<di:waypoint x="2140" y="290" />
<di:waypoint x="2255" y="290" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_13zasb1_di" bpmnElement="Flow_13zasb1">
<di:waypoint x="1190" y="265" />
<di:waypoint x="1190" y="160" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1201" y="178" width="19" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_05g7d16_di" bpmnElement="Flow_05g7d16">
<di:waypoint x="1215" y="290" />
<di:waypoint x="1350" y="290" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1260" y="272" width="15" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1ik148z_di" bpmnElement="Flow_1ik148z">
<di:waypoint x="1780" y="290" />
<di:waypoint x="1875" y="290" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0ygr7cu_di" bpmnElement="Flow_0ygr7cu">
<di:waypoint x="1540" y="315" />
<di:waypoint x="1540" y="400" />
<di:waypoint x="1900" y="400" />
<di:waypoint x="1900" y="315" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1716" y="383" width="27" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_12oux1f_di" bpmnElement="Flow_12oux1f">
<di:waypoint x="1565" y="290" />
<di:waypoint x="1680" y="290" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1593" y="273" width="48" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1d4sb3d_di" bpmnElement="Flow_1d4sb3d">
<di:waypoint x="1450" y="290" />
<di:waypoint x="1515" y="290" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0cqbu1f_di" bpmnElement="Flow_0cqbu1f">
<di:waypoint x="1240" y="120" />
<di:waypoint x="1540" y="120" />
<di:waypoint x="1540" y="260" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1g7q28p_di" bpmnElement="Flow_1g7q28p">
<di:waypoint x="2600" y="265" />
<di:waypoint x="2600" y="200" />
<di:waypoint x="2950" y="200" />
<di:waypoint x="2950" y="272" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_15xpsq8_di" bpmnElement="Flow_15xpsq8">
<di:waypoint x="2830" y="290" />
<di:waypoint x="2932" y="290" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1seuuie_di" bpmnElement="Flow_1seuuie">
<di:waypoint x="420" y="300" />
<di:waypoint x="525" y="300" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0ssrpqx_di" bpmnElement="Flow_0ssrpqx">
<di:waypoint x="840" y="470" />
<di:waypoint x="840" y="435" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0a626ba_di" bpmnElement="Flow_0a626ba">
<di:waypoint x="840" y="605" />
<di:waypoint x="840" y="550" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1fqtd41_di" bpmnElement="Flow_1fqtd41">
<di:waypoint x="980" y="690" />
<di:waypoint x="980" y="630" />
<di:waypoint x="865" y="630" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0lnb8jw_di" bpmnElement="Flow_0lnb8jw">
<di:waypoint x="840" y="690" />
<di:waypoint x="840" y="655" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0h955ao_di" bpmnElement="Flow_0h955ao">
<di:waypoint x="865" y="840" />
<di:waypoint x="980" y="840" />
<di:waypoint x="980" y="770" />
<bpmndi:BPMNLabel>
<dc:Bounds x="989" y="793" width="23" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0nzochy_di" bpmnElement="Flow_0nzochy">
<di:waypoint x="840" y="815" />
<di:waypoint x="840" y="770" />
<bpmndi:BPMNLabel>
<dc:Bounds x="847" y="793" width="45" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_03s8gvx_di" bpmnElement="Flow_03s8gvx">
<di:waypoint x="865" y="840" />
<di:waypoint x="1070" y="840" />
<di:waypoint x="1070" y="410" />
<di:waypoint x="865" y="410" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1078" y="613" width="15" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0nmpxmc_di" bpmnElement="Flow_0nmpxmc">
<di:waypoint x="840" y="910" />
<di:waypoint x="840" y="865" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0mf9npl_di" bpmnElement="Flow_0mf9npl">
<di:waypoint x="840" y="1060" />
<di:waypoint x="840" y="990" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1dh8c45_di" bpmnElement="Flow_1dh8c45">
<di:waypoint x="600" y="1100" />
<di:waypoint x="790" y="1100" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_185jvp3_di" bpmnElement="Flow_185jvp3">
<di:waypoint x="550" y="865" />
<di:waypoint x="550" y="1060" />
<bpmndi:BPMNLabel>
<dc:Bounds x="522" y="943" width="15" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1oriwwz_di" bpmnElement="Flow_1oriwwz">
<di:waypoint x="575" y="840" />
<di:waypoint x="815" y="840" />
<bpmndi:BPMNLabel>
<dc:Bounds x="611" y="823" width="19" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1y9edqt_di" bpmnElement="Flow_1y9edqt">
<di:waypoint x="550" y="325" />
<di:waypoint x="550" y="815" />
<bpmndi:BPMNLabel>
<dc:Bounds x="522" y="701" width="15" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_02614fd_di" bpmnElement="Flow_02614fd">
<di:waypoint x="890" y="300" />
<di:waypoint x="970" y="300" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0tnnt3b_di" bpmnElement="Flow_0tnnt3b">
<di:waypoint x="840" y="385" />
<di:waypoint x="840" y="340" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1ni06mz_di" bpmnElement="Flow_1ni06mz">
<di:waypoint x="575" y="300" />
<di:waypoint x="790" y="300" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1y4gjsg_di" bpmnElement="Flow_1y4gjsg">
<di:waypoint x="700" y="690" />
<di:waypoint x="700" y="630" />
<di:waypoint x="815" y="630" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_12obxbo_di" bpmnElement="Flow_12obxbo">
<di:waypoint x="815" y="840" />
<di:waypoint x="700" y="840" />
<di:waypoint x="700" y="770" />
<bpmndi:BPMNLabel>
<dc:Bounds x="705" y="793" width="49" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0kcrx5l_di" bpmnElement="Flow_0kcrx5l">
<di:waypoint x="188" y="300" />
<di:waypoint x="320" y="300" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="152" y="282" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1j808ka_di" bpmnElement="Step1">
<dc:Bounds x="320" y="260" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0obertf_di" bpmnElement="Activity_0obertf">
<dc:Bounds x="650" y="690" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0vmy33u_di" bpmnElement="Activity_0vmy33u">
<dc:Bounds x="970" y="260" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_0ubqopr_di" bpmnElement="Gateway_0ubqopr" isMarkerVisible="true">
<dc:Bounds x="525" y="275" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="506" y="180" width="88" height="80" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_13vtxns_di" bpmnElement="Gateway_13vtxns" isMarkerVisible="true">
<dc:Bounds x="525" y="815" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1014" y="423" width="72" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_08ldcxm_di" bpmnElement="Activity_08ldcxm">
<dc:Bounds x="500" y="1060" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_08pywzy_di" bpmnElement="Activity_08pywzy">
<dc:Bounds x="790" y="1060" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_12qlux1_di" bpmnElement="Gateway_12qlux1" isMarkerVisible="true">
<dc:Bounds x="815" y="815" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="855" y="856" width="70" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_02h27h5_di" bpmnElement="Gateway_02h27h5" isMarkerVisible="true">
<dc:Bounds x="815" y="605" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0nkgcfg_di" bpmnElement="Activity_0nkgcfg">
<dc:Bounds x="790" y="470" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_16q24p2_di" bpmnElement="Activity_16q24p2">
<dc:Bounds x="790" y="690" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0nv1s23_di" bpmnElement="Activity_0nv1s23">
<dc:Bounds x="930" y="690" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0xa6vms_di" bpmnElement="Activity_0xa6vms">
<dc:Bounds x="790" y="910" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_12sb0pk_di" bpmnElement="Gateway_12sb0pk" isMarkerVisible="true">
<dc:Bounds x="815" y="385" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1rtabpz_di" bpmnElement="Activity_0whcncc">
<dc:Bounds x="790" y="260" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_0l7thbn_di" bpmnElement="Event_0l7thbn">
<dc:Bounds x="2932" y="272" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="2940" y="318" width="20" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_0ym1uow_di" bpmnElement="Gateway_0ym1uow" isMarkerVisible="true">
<dc:Bounds x="1515" y="265" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1545" y="309" width="70" height="40" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0l7vq1i_di" bpmnElement="Activity_0l7vq1i">
<dc:Bounds x="1680" y="250" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_1fhu0gj_di" bpmnElement="Gateway_1fhu0gj" isMarkerVisible="true">
<dc:Bounds x="1165" y="265" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1148" y="322" width="84" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_17ikhsk_di" bpmnElement="Activity_17ikhsk">
<dc:Bounds x="1140" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_1ykz8u2_di" bpmnElement="Gateway_1ykz8u2" isMarkerVisible="true">
<dc:Bounds x="2255" y="265" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="2300" y="315" width="79" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0rcrs1i_di" bpmnElement="Activity_0rcrs1i">
<dc:Bounds x="2410" y="250" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_1h4d4n5_di" bpmnElement="Gateway_1h4d4n5" isMarkerVisible="true">
<dc:Bounds x="1875" y="265" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1915" y="309" width="70" height="40" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0tbvw9o_di" bpmnElement="Activity_0tbvw9o">
<dc:Bounds x="2040" y="250" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_0gjk91e_di" bpmnElement="Gateway_0gjk91e" isMarkerVisible="true">
<dc:Bounds x="2575" y="265" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="2622" y="309" width="56" height="40" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1uzsp1r_di" bpmnElement="Activity_1uzsp1r">
<dc:Bounds x="2730" y="250" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0otiy71_di" bpmnElement="Activity_0otiy71">
<dc:Bounds x="1350" y="250" width="100" height="80" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>

View File

@ -1,143 +0,0 @@
<?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:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_06pyjz2" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.7.3">
<bpmn:process id="ExclusiveGatewayMultipleEndNavigation" isExecutable="true">
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_0kcrx5l</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:userTask id="Jabberwocky" name="Step 2" camunda:formKey="PI_Info">
<bpmn:documentation>##### Please confirm Primary Investigator entered in Protocol Builder is correct and if so, provide additional information:
### **{{ pi.display_name }}**
***Email:*** {{ pi.email_address }}
**Primary Appointment**
***School:*** {{ pi.E0.schoolName }}
***Department:*** {{ pi.E0.deptName }}
{% if is_me_pi %}
Since you are the person entering this information, you already have access and will receive all emails.
{% endif %}</bpmn:documentation>
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="pi.experience" label="Investigator&#39;s Experience" type="textarea">
<camunda:properties>
<camunda:property id="rows" value="5" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="pi.access" label="Should the Principal Investigator have full editing access in the system?" type="boolean" defaultValue="True">
<camunda:properties>
<camunda:property id="hide_expression" value="is_cu_pi" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="pi.emails" label="Should the Principal Investigator receive automated email notifications?" type="boolean" defaultValue="True">
<camunda:properties>
<camunda:property id="hide_expression" value="is_cu_pi" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="PIsPrimaryDepartmentSameAsRO" label="Is the PI&#39;s Primary Department the same as the study&#39;s Responsible Organization?" type="enum" defaultValue="yes">
<camunda:properties>
<camunda:property id="enum_type" value="radio" />
</camunda:properties>
<camunda:value id="yes" name="Yes" />
<camunda:value id="diffDept" name="No, it is a different Department within the same School" />
<camunda:value id="diffSchool" name="No, it is a different School" />
</camunda:formField>
</camunda:formData>
<camunda:properties>
<camunda:property name="display_name" value="pi.label" />
</camunda:properties>
</bpmn:extensionElements>
<bpmn:incoming>Flow_147b9li</bpmn:incoming>
<bpmn:outgoing>Flow_0xnj2rp</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_0kcrx5l" sourceRef="StartEvent_1" targetRef="Step1" />
<bpmn:sequenceFlow id="Flow_1dcsioh" sourceRef="Step1" targetRef="Gateway" />
<bpmn:exclusiveGateway id="Gateway" name="GatewayToEnd">
<bpmn:incoming>Flow_1dcsioh</bpmn:incoming>
<bpmn:outgoing>Flow_147b9li</bpmn:outgoing>
<bpmn:outgoing>Flow_00prawo</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="Flow_147b9li" name="True" sourceRef="Gateway" targetRef="Jabberwocky">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">tru</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:sequenceFlow id="Flow_00prawo" name="False" sourceRef="Gateway" targetRef="StepEnd">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">false</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:endEvent id="Event_0npjf2p">
<bpmn:incoming>Flow_16qr5jf</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_16qr5jf" sourceRef="StepEnd" targetRef="Event_0npjf2p" />
<bpmn:userTask id="Step1" name="Step 1">
<bpmn:incoming>Flow_0kcrx5l</bpmn:incoming>
<bpmn:outgoing>Flow_1dcsioh</bpmn:outgoing>
</bpmn:userTask>
<bpmn:userTask id="StepEnd" name="Step End">
<bpmn:documentation>No PI entered in PB</bpmn:documentation>
<bpmn:incoming>Flow_00prawo</bpmn:incoming>
<bpmn:outgoing>Flow_16qr5jf</bpmn:outgoing>
</bpmn:userTask>
<bpmn:endEvent id="Event_1d1c7ov">
<bpmn:incoming>Flow_0xnj2rp</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_0xnj2rp" sourceRef="Jabberwocky" targetRef="Event_1d1c7ov" />
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="ExclusiveGatewayMultipleEndNavigation">
<bpmndi:BPMNEdge id="Flow_16qr5jf_di" bpmnElement="Flow_16qr5jf">
<di:waypoint x="740" y="150" />
<di:waypoint x="822" y="150" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_00prawo_di" bpmnElement="Flow_00prawo">
<di:waypoint x="510" y="265" />
<di:waypoint x="510" y="150" />
<di:waypoint x="640" y="150" />
<bpmndi:BPMNLabel>
<dc:Bounds x="477" y="204" width="27" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_147b9li_di" bpmnElement="Flow_147b9li">
<di:waypoint x="535" y="290" />
<di:waypoint x="640" y="290" />
<bpmndi:BPMNLabel>
<dc:Bounds x="537" y="273" width="23" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1dcsioh_di" bpmnElement="Flow_1dcsioh">
<di:waypoint x="410" y="290" />
<di:waypoint x="485" y="290" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0kcrx5l_di" bpmnElement="Flow_0kcrx5l">
<di:waypoint x="188" y="290" />
<di:waypoint x="310" y="290" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0xnj2rp_di" bpmnElement="Flow_0xnj2rp">
<di:waypoint x="740" y="290" />
<di:waypoint x="822" y="290" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="152" y="272" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_0qzf1r3_di" bpmnElement="Gateway" isMarkerVisible="true">
<dc:Bounds x="485" y="265" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="475" y="322" width="75" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_0npjf2p_di" bpmnElement="Event_0npjf2p">
<dc:Bounds x="822" y="132" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0d622qi_di" bpmnElement="Jabberwocky">
<dc:Bounds x="640" y="250" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1j808ka_di" bpmnElement="Step1">
<dc:Bounds x="310" y="250" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0efoaut_di" bpmnElement="StepEnd">
<dc:Bounds x="640" y="110" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_1d1c7ov_di" bpmnElement="Event_1d1c7ov">
<dc:Bounds x="822" y="272" width="36" height="36" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>

File diff suppressed because it is too large Load Diff

View File

@ -1,39 +0,0 @@
<?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" id="Definitions_1hbo0hp" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.7.0">
<bpmn:process id="CommonActivity" name="CommonActivity_a" isExecutable="true">
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_0xpz6la</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:scriptTask id="Activity_0bt6ln9" name="print(&#39;complicated common task&#39;)">
<bpmn:incoming>Flow_0xpz6la</bpmn:incoming>
<bpmn:outgoing>Flow_03yam6h</bpmn:outgoing>
<bpmn:script>print('complicated common task')</bpmn:script>
</bpmn:scriptTask>
<bpmn:sequenceFlow id="Flow_0xpz6la" sourceRef="StartEvent_1" targetRef="Activity_0bt6ln9" />
<bpmn:endEvent id="Event_1m1s0k4">
<bpmn:incoming>Flow_03yam6h</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_03yam6h" sourceRef="Activity_0bt6ln9" targetRef="Event_1m1s0k4" />
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="CommonActivity">
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="99" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1mbn0zk_di" bpmnElement="Activity_0bt6ln9">
<dc:Bounds x="240" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_0xpz6la_di" bpmnElement="Flow_0xpz6la">
<di:waypoint x="215" y="117" />
<di:waypoint x="240" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="Event_1m1s0k4_di" bpmnElement="Event_1m1s0k4">
<dc:Bounds x="372" y="99" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_03yam6h_di" bpmnElement="Flow_03yam6h">
<di:waypoint x="340" y="117" />
<di:waypoint x="372" y="117" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>

View File

@ -1,336 +0,0 @@
<?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:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1oogn9j" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.7.3">
<bpmn:process id="rrt" isExecutable="true">
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>SequenceFlow_05ja25w</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:manualTask id="ManualTask_1ofy9yz" name="Read RRP Instructions">
<bpmn:documentation>### UNIVERSITY OF VIRGINIA RESEARCH
#### Research Ramp-up Plan
As we plan for the resumption of on-grounds research, PIs are required to develop a Research Ramp-up Plan. Please use the ramp-up guidance provided to lay out your plan(s) to manage operations while prioritizing physical distancing, staggered work shifts to reduce group size, remote work, and other exposure-reducing measures.
Plans must be submitted to the Office of Research by Monday, May ?? for consideration in the first round of approvals. Plans will then be reviewed on a rolling basis going forward.
Instructions for Submitting:
1. Add a Request for each lab space you manage in a building. If your lab spans multiple rooms or floors in a single building, one request will be required for that lab. If your lab spans multipe buildings, one request for each building will be required for that lab. The primary reason for this differentiation is that in addition to obtaining approval to restart operations, this information will also be used after start up to assist with any contact tracing that may be needed.
2. Select each Request added and step through each form presented, responding to all required and applicable fields. You may be presented with different questions if activities in each lab differ.
3. After all forms have been completed, you will be presented with the option to create your Research Recovery Plan in Word format. Download the document and review it. If you see any corrections that need to be made, return to the coresponding form and make the correction.
4. Once the generated Research Recovery Plan is finalize, use the web site to submit it to the Office of the Vice President for Research for review.
Please submit questions on the Research Support website.</bpmn:documentation>
<bpmn:incoming>SequenceFlow_05ja25w</bpmn:incoming>
<bpmn:outgoing>SequenceFlow_0h50bp3</bpmn:outgoing>
</bpmn:manualTask>
<bpmn:userTask id="AddInfo" name="Enter Submission Info" camunda:formKey="Submission Info">
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="ComputingID" label="UVA Computing ID of Primary Investigator" type="string">
<camunda:properties>
<camunda:property id="placeholder" value="cdr9c" />
</camunda:properties>
<camunda:validation>
<camunda:constraint name="required" config="true" />
<camunda:constraint name="description" config="You may search by entering Compuingr ID or Last Name." />
</camunda:validation>
</camunda:formField>
<camunda:formField id="LabName" label="Lab Name" type="string">
<camunda:properties>
<camunda:property id="description" value="Enter the name of the lab." />
</camunda:properties>
<camunda:validation>
<camunda:constraint name="required" config="true" />
</camunda:validation>
</camunda:formField>
<camunda:formField id="Building" type="autocomplete">
<camunda:properties>
<camunda:property id="description" value="Select the building in which the lab is located." />
<camunda:property id="enum.options.file" value="BuildingList.xls" />
<camunda:property id="enum.options.value.column" value="Value" />
<camunda:property id="enum.options.label.column" value="Building Name" />
<camunda:property id="enum.options.lookup" value="True" />
</camunda:properties>
<camunda:validation>
<camunda:constraint name="Required" config="true" />
</camunda:validation>
</camunda:formField>
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>SequenceFlow_0h50bp3</bpmn:incoming>
<bpmn:outgoing>SequenceFlow_0bqu7pp</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="SequenceFlow_0h50bp3" sourceRef="ManualTask_1ofy9yz" targetRef="AddInfo" />
<bpmn:sequenceFlow id="SequenceFlow_05ja25w" sourceRef="StartEvent_1" targetRef="ManualTask_1ofy9yz" />
<bpmn:sequenceFlow id="SequenceFlow_0bqu7pp" sourceRef="AddInfo" targetRef="LabInfo" />
<bpmn:userTask id="LabInfo" name="Enter Lab Details" camunda:formKey="Lab Details">
<bpmn:documentation>### {{ LabName }}
#### Lab details
Your response to these questions will determine if you do or do not provide additional information regarding each topic later.</bpmn:documentation>
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="isHumanResearch" label="Human Research" type="boolean">
<camunda:properties>
<camunda:property id="description" value="Does this lab&#39;s research involve human subjects?" />
<camunda:property id="required" value="true" />
</camunda:properties>
<camunda:validation>
<camunda:constraint name="required" config="true" />
</camunda:validation>
</camunda:formField>
<camunda:formField id="isAnimalUse" label="Animal Use" type="boolean">
<camunda:properties>
<camunda:property id="description" value="Do you use animals in your work?" />
<camunda:property id="required" value="true" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="isSharedLab" label="Shared Lab" type="boolean">
<camunda:properties>
<camunda:property id="description" value="Is your lab shared with another researcher?" />
<camunda:property id="required" value="true" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="isSharedSpace" label="Shared Space" type="boolean">
<camunda:properties>
<camunda:property id="description" value="Do you use any shared spaces with other labs?" />
<camunda:property id="required" value="true" />
</camunda:properties>
</camunda:formField>
<camunda:formField id="isGrantSupport" label="Grant Support" type="boolean">
<camunda:properties>
<camunda:property id="required" value="true" />
<camunda:property id="description" value="Are any of the studies in your lab that will be restarted supported by grants?" />
</camunda:properties>
</camunda:formField>
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>SequenceFlow_0bqu7pp</bpmn:incoming>
<bpmn:outgoing>Flow_0scfmzc</bpmn:outgoing>
</bpmn:userTask>
<bpmn:endEvent id="EndEvent_09wp7av">
<bpmn:incoming>SequenceFlow_1qtrgbv</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_1e2qi9s" sourceRef="Activity_0rv3far" targetRef="Task_1cw2y6r" />
<bpmn:manualTask id="Activity_0rv3far" name="Review Plan">
<bpmn:documentation>Review plan, make changes if needed, continue of ready to submit.</bpmn:documentation>
<bpmn:incoming>Flow_1b6vbkk</bpmn:incoming>
<bpmn:outgoing>Flow_1e2qi9s</bpmn:outgoing>
</bpmn:manualTask>
<bpmn:sequenceFlow id="SequenceFlow_1qtrgbv" sourceRef="Task_1cw2y6r" targetRef="EndEvent_09wp7av" />
<bpmn:scriptTask id="Task_1cw2y6r" name="Generate RRP">
<bpmn:incoming>Flow_1e2qi9s</bpmn:incoming>
<bpmn:outgoing>SequenceFlow_1qtrgbv</bpmn:outgoing>
<bpmn:script>CompleteTemplate ResearchRecoveryPlan.docx RESEARCH_RECOVERY</bpmn:script>
</bpmn:scriptTask>
<bpmn:userTask id="UserTask_0ww2o4i" name="Enter Animal Research Info" camunda:formKey="Animal Research">
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="AnimalTimeline" label="Animal Timeline" type="textarea">
<camunda:properties>
<camunda:property id="description" value="Please describe the timeline for animal colony regeneration and what needs you will have for services from the ASC, including routine and specialty services." />
<camunda:property id="rows" value="10" />
<camunda:property id="help" value="[EHS Lab Ramp up Checklist for Laboratories](https://research.virginia.edu/sites/vpr/files/2020-05/EHS.LabRampUpChecklistForLaboratories_0_0.pdf)\n#### Animal Care\n- Communicate with your vivarium manager prior to restarting animal research.\n- Confirm inventory of controlled substances and proper documentation." />
</camunda:properties>
</camunda:formField>
<camunda:formField id="AnimalOrder" label="Animal Order" type="enum">
<camunda:properties>
<camunda:property id="description" value="When will you need to order animals again? Give time frame relative to the date of completion of this form." />
</camunda:properties>
<camunda:value id="immediately" name="Immediately" />
<camunda:value id="weeks_1to2" name="1 to 2 weeks" />
<camunda:value id="weeks_3to4" name="3 to 4 weeks" />
<camunda:value id="weeks_5to8" name="5 to 8 weeks" />
<camunda:value id="weeks_more_than_8" name="More than 8 weeks" />
</camunda:formField>
<camunda:formField id="Animal Housing Access" label="Animal Housing Access" type="enum">
<camunda:properties>
<camunda:property id="description" value="When do you anticipate entering the animal housing facility? Give an estimated time frame based on the date of resumption of research activity." />
<camunda:property id="Property_1km3ge3" />
</camunda:properties>
<camunda:value id="ASAP" name="As soon as possible" />
<camunda:value id="weeks_1to2" name="1 to 2 weeks" />
<camunda:value id="weeks_3to4" name="3 to 4 weeks" />
<camunda:value id="weeks_5to8" name="5 to 8 weeks" />
<camunda:value id="weeks_more_than_8" name="More than 8 weeks" />
</camunda:formField>
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>Flow_0so3402</bpmn:incoming>
<bpmn:outgoing>SequenceFlow_1yi9lig</bpmn:outgoing>
</bpmn:userTask>
<bpmn:exclusiveGateway id="Gateway_191l7i1" name="Are Animals Used?">
<bpmn:incoming>Flow_0scfmzc</bpmn:incoming>
<bpmn:outgoing>Flow_0so3402</bpmn:outgoing>
<bpmn:outgoing>Flow_0141rp3</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="Flow_0so3402" name="Yes" sourceRef="Gateway_191l7i1" targetRef="UserTask_0ww2o4i">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">isAnimalUse == True</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:userTask id="UserTask_1cx8349" name="Enter Grant Support" camunda:formKey="GrantSupport">
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="Grants" label="Grants" type="textarea">
<camunda:properties>
<camunda:property id="rows" value="10" />
<camunda:property id="description" value="What is the status of your grant support and timelines associated with each grant?" />
<camunda:property id="help" value="Example: NIH Award R01xxxxx; project period through mm/dd/yy: Brief notes on grant status if applicable" />
</camunda:properties>
</camunda:formField>
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>Flow_1121pfu</bpmn:incoming>
<bpmn:outgoing>SequenceFlow_1b4non2</bpmn:outgoing>
</bpmn:userTask>
<bpmn:exclusiveGateway id="Gateway_06s8ygl" name="Grant support?">
<bpmn:incoming>Flow_0141rp3</bpmn:incoming>
<bpmn:incoming>SequenceFlow_1yi9lig</bpmn:incoming>
<bpmn:outgoing>Flow_1121pfu</bpmn:outgoing>
<bpmn:outgoing>SequenceFlow_1wp5zmg</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="Flow_1121pfu" name="Yes" sourceRef="Gateway_06s8ygl" targetRef="UserTask_1cx8349">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">isGrantSupport == True</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:exclusiveGateway id="Gateway_01p9hbs">
<bpmn:incoming>SequenceFlow_1b4non2</bpmn:incoming>
<bpmn:incoming>SequenceFlow_1wp5zmg</bpmn:incoming>
<bpmn:outgoing>Flow_1b6vbkk</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="Flow_1b6vbkk" sourceRef="Gateway_01p9hbs" targetRef="Activity_0rv3far" />
<bpmn:sequenceFlow id="SequenceFlow_1b4non2" sourceRef="UserTask_1cx8349" targetRef="Gateway_01p9hbs" />
<bpmn:sequenceFlow id="SequenceFlow_1wp5zmg" name="No" sourceRef="Gateway_06s8ygl" targetRef="Gateway_01p9hbs">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">isGrantSupport == False</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:sequenceFlow id="Flow_0scfmzc" sourceRef="LabInfo" targetRef="Gateway_191l7i1" />
<bpmn:sequenceFlow id="Flow_0141rp3" name="No" sourceRef="Gateway_191l7i1" targetRef="Gateway_06s8ygl">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">isAnimalUse == False</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:sequenceFlow id="SequenceFlow_1yi9lig" sourceRef="UserTask_0ww2o4i" targetRef="Gateway_06s8ygl" />
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="rrt">
<bpmndi:BPMNEdge id="SequenceFlow_0bqu7pp_di" bpmnElement="SequenceFlow_0bqu7pp">
<di:waypoint x="520" y="187" />
<di:waypoint x="580" y="187" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_05ja25w_di" bpmnElement="SequenceFlow_05ja25w">
<di:waypoint x="188" y="187" />
<di:waypoint x="260" y="187" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_0h50bp3_di" bpmnElement="SequenceFlow_0h50bp3">
<di:waypoint x="360" y="187" />
<di:waypoint x="420" y="187" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_1qtrgbv_di" bpmnElement="SequenceFlow_1qtrgbv">
<di:waypoint x="1710" y="187" />
<di:waypoint x="1762" y="187" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1b6vbkk_di" bpmnElement="Flow_1b6vbkk">
<di:waypoint x="1385" y="187" />
<di:waypoint x="1460" y="187" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1e2qi9s_di" bpmnElement="Flow_1e2qi9s">
<di:waypoint x="1560" y="187" />
<di:waypoint x="1610" y="187" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_1yi9lig_di" bpmnElement="SequenceFlow_1yi9lig">
<di:waypoint x="990" y="187" />
<di:waypoint x="1075" y="187" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0141rp3_di" bpmnElement="Flow_0141rp3">
<di:waypoint x="800" y="212" />
<di:waypoint x="800" y="280" />
<di:waypoint x="1100" y="280" />
<di:waypoint x="1100" y="212" />
<bpmndi:BPMNLabel>
<dc:Bounds x="936" y="263" width="15" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0so3402_di" bpmnElement="Flow_0so3402">
<di:waypoint x="825" y="187" />
<di:waypoint x="890" y="187" />
<bpmndi:BPMNLabel>
<dc:Bounds x="849" y="169" width="19" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1121pfu_di" bpmnElement="Flow_1121pfu">
<di:waypoint x="1125" y="187" />
<di:waypoint x="1190" y="187" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1149" y="169" width="19" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_1b4non2_di" bpmnElement="SequenceFlow_1b4non2">
<di:waypoint x="1290" y="187" />
<di:waypoint x="1335" y="187" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="SequenceFlow_1wp5zmg_di" bpmnElement="SequenceFlow_1wp5zmg">
<di:waypoint x="1100" y="212" />
<di:waypoint x="1100" y="280" />
<di:waypoint x="1360" y="280" />
<di:waypoint x="1360" y="212" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1192" y="262" width="15" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0scfmzc_di" bpmnElement="Flow_0scfmzc">
<di:waypoint x="680" y="187" />
<di:waypoint x="775" y="187" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="152" y="169" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ManualTask_1ofy9yz_di" bpmnElement="ManualTask_1ofy9yz">
<dc:Bounds x="260" y="147" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_0xdpoxl_di" bpmnElement="AddInfo">
<dc:Bounds x="420" y="147" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_0nu5cww_di" bpmnElement="LabInfo">
<dc:Bounds x="580" y="147" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_191l7i1_di" bpmnElement="Gateway_191l7i1" isMarkerVisible="true">
<dc:Bounds x="775" y="162" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="770" y="125" width="60" height="27" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_0ww2o4i_di" bpmnElement="UserTask_0ww2o4i">
<dc:Bounds x="890" y="147" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_06s8ygl_di" bpmnElement="Gateway_06s8ygl" isMarkerVisible="true">
<dc:Bounds x="1075" y="162" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="1063" y="133" width="74" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="UserTask_1cx8349_di" bpmnElement="UserTask_1cx8349">
<dc:Bounds x="1190" y="147" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1mg5lp9_di" bpmnElement="Activity_0rv3far">
<dc:Bounds x="1460" y="147" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="EndEvent_09wp7av_di" bpmnElement="EndEvent_09wp7av">
<dc:Bounds x="1762" y="169" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Gateway_01p9hbs_di" bpmnElement="Gateway_01p9hbs" isMarkerVisible="true">
<dc:Bounds x="1335" y="162" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="ScriptTask_0gacq8q_di" bpmnElement="Task_1cw2y6r">
<dc:Bounds x="1610" y="147" width="100" height="80" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>

View File

@ -142,7 +142,7 @@
"typename":"SequenceFlow"
}
},
"typename":"TestUserTask",
"typename":"UserTask",
"extensions":{}
},
"sid-C014B4B9-889F-4EE9-9949-C89502C35CF0":{
@ -697,7 +697,7 @@
"typename":"SequenceFlow"
}
},
"typename":"TestUserTask",
"typename":"UserTask",
"extensions":{}
},
"sid-2EDAD784-7F15-486C-B805-D26EE25F8087":{
@ -906,7 +906,7 @@
"typename":"SequenceFlow"
}
},
"typename":"TestUserTask",
"typename":"UserTask",
"extensions":{}
},
"sid-BC014079-199F-4720-95CD-244B0ACB6DE1":{

View File

@ -0,0 +1,81 @@
<?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" id="Definitions_96f6665" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.0.0-dev">
<bpmn:process id="Process_ccz6oq2" isExecutable="true">
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_177wrsb</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:sequenceFlow id="Flow_177wrsb" sourceRef="StartEvent_1" targetRef="Activity_0tbghnr" />
<bpmn:sequenceFlow id="Flow_0eductu" sourceRef="Activity_0tbghnr" targetRef="Activity_1b4i250" />
<bpmn:endEvent id="Event_1ncs6fv">
<bpmn:incoming>Flow_0hkxb5e</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_1xryi5d" sourceRef="Activity_1b4i250" targetRef="Activity_0k6ipvz" />
<bpmn:scriptTask id="Activity_0tbghnr" name="512 a">
<bpmn:incoming>Flow_177wrsb</bpmn:incoming>
<bpmn:outgoing>Flow_0eductu</bpmn:outgoing>
<bpmn:script>a="a"*512</bpmn:script>
</bpmn:scriptTask>
<bpmn:scriptTask id="Activity_1b4i250" name="512 b">
<bpmn:incoming>Flow_0eductu</bpmn:incoming>
<bpmn:outgoing>Flow_1xryi5d</bpmn:outgoing>
<bpmn:script>b="b"*512</bpmn:script>
</bpmn:scriptTask>
<bpmn:sequenceFlow id="Flow_1of7r00" sourceRef="Activity_0k6ipvz" targetRef="Activity_1i88z55" />
<bpmn:scriptTask id="Activity_0k6ipvz" name="512 c">
<bpmn:incoming>Flow_1xryi5d</bpmn:incoming>
<bpmn:outgoing>Flow_1of7r00</bpmn:outgoing>
<bpmn:script>c="c"*512</bpmn:script>
</bpmn:scriptTask>
<bpmn:sequenceFlow id="Flow_0hkxb5e" sourceRef="Activity_1i88z55" targetRef="Event_1ncs6fv" />
<bpmn:scriptTask id="Activity_1i88z55" name="a+b+c">
<bpmn:incoming>Flow_1of7r00</bpmn:incoming>
<bpmn:outgoing>Flow_0hkxb5e</bpmn:outgoing>
<bpmn:script>d=a+b+c</bpmn:script>
</bpmn:scriptTask>
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_ccz6oq2">
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="202" y="42" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1kxr618_di" bpmnElement="Activity_0tbghnr">
<dc:Bounds x="170" y="110" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0wp0pql_di" bpmnElement="Activity_1b4i250">
<dc:Bounds x="170" y="220" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0975bxc_di" bpmnElement="Activity_0k6ipvz">
<dc:Bounds x="170" y="330" width="100" height="80" />
<bpmndi:BPMNLabel />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_1ncs6fv_di" bpmnElement="Event_1ncs6fv">
<dc:Bounds x="202" y="562" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1w8fetn_di" bpmnElement="Activity_1i88z55">
<dc:Bounds x="170" y="440" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_177wrsb_di" bpmnElement="Flow_177wrsb">
<di:waypoint x="220" y="78" />
<di:waypoint x="220" y="110" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0eductu_di" bpmnElement="Flow_0eductu">
<di:waypoint x="220" y="190" />
<di:waypoint x="220" y="220" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1xryi5d_di" bpmnElement="Flow_1xryi5d">
<di:waypoint x="220" y="300" />
<di:waypoint x="220" y="330" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1of7r00_di" bpmnElement="Flow_1of7r00">
<di:waypoint x="220" y="410" />
<di:waypoint x="220" y="440" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0hkxb5e_di" bpmnElement="Flow_0hkxb5e">
<di:waypoint x="220" y="520" />
<di:waypoint x="220" y="562" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>

View File

@ -1,77 +0,0 @@
<?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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1l7iuxt" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.10.0" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.15.0">
<bpmn:process id="test_timer_end_event" name="test_timer_end_event" isExecutable="true">
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_164sojd</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:task id="user_task" name="User Task">
<bpmn:incoming>Flow_1m2vq4v</bpmn:incoming>
<bpmn:outgoing>Flow_04tuv5z</bpmn:outgoing>
</bpmn:task>
<bpmn:sequenceFlow id="Flow_164sojd" sourceRef="StartEvent_1" targetRef="Activity_0dzjjk3" />
<bpmn:boundaryEvent id="Event_0y4hbl0" cancelActivity="false" attachedToRef="user_task">
<bpmn:outgoing>Flow_0ac4lx5</bpmn:outgoing>
<bpmn:timerEventDefinition id="TimerEventDefinition_1w16uhl">
<bpmn:timeDuration xsi:type="bpmn:tFormalExpression">timedelta(milliseconds=2)</bpmn:timeDuration>
</bpmn:timerEventDefinition>
</bpmn:boundaryEvent>
<bpmn:sequenceFlow id="Flow_0ac4lx5" sourceRef="Event_0y4hbl0" targetRef="set_variable" />
<bpmn:scriptTask id="set_variable" name="update timer_called">
<bpmn:incoming>Flow_0ac4lx5</bpmn:incoming>
<bpmn:script>timer_called = True</bpmn:script>
</bpmn:scriptTask>
<bpmn:endEvent id="final_end_event" name="End Event">
<bpmn:documentation>Some docs</bpmn:documentation>
<bpmn:incoming>Flow_04tuv5z</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_04tuv5z" sourceRef="user_task" targetRef="final_end_event" />
<bpmn:sequenceFlow id="Flow_1m2vq4v" sourceRef="Activity_0dzjjk3" targetRef="user_task" />
<bpmn:scriptTask id="Activity_0dzjjk3" name="Set timer_called">
<bpmn:incoming>Flow_164sojd</bpmn:incoming>
<bpmn:outgoing>Flow_1m2vq4v</bpmn:outgoing>
<bpmn:script>timer_called = False</bpmn:script>
</bpmn:scriptTask>
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="test_timer_end_event">
<bpmndi:BPMNEdge id="Flow_164sojd_di" bpmnElement="Flow_164sojd">
<di:waypoint x="188" y="117" />
<di:waypoint x="220" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0ac4lx5_di" bpmnElement="Flow_0ac4lx5">
<di:waypoint x="420" y="175" />
<di:waypoint x="420" y="240" />
<di:waypoint x="490" y="240" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_04tuv5z_di" bpmnElement="Flow_04tuv5z">
<di:waypoint x="460" y="117" />
<di:waypoint x="542" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1m2vq4v_di" bpmnElement="Flow_1m2vq4v">
<di:waypoint x="320" y="117" />
<di:waypoint x="360" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="Activity_0lhf45l_di" bpmnElement="user_task">
<dc:Bounds x="360" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1oduoqz_di" bpmnElement="set_variable">
<dc:Bounds x="490" y="200" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_0olfqht_di" bpmnElement="final_end_event">
<dc:Bounds x="542" y="99" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="535" y="142" width="51" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="152" y="99" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1mx687n_di" bpmnElement="Activity_0dzjjk3">
<dc:Bounds x="220" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_0w4k4ro_di" bpmnElement="Event_0y4hbl0">
<dc:Bounds x="402" y="139" width="36" height="36" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>

View File

@ -2,6 +2,7 @@ from datetime import timedelta
from SpiffWorkflow.bpmn.workflow import BpmnWorkflow
from SpiffWorkflow.bpmn.PythonScriptEngine import PythonScriptEngine
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import TaskDataEnvironment
from SpiffWorkflow.bpmn.specs.events.event_definitions import MessageEventDefinition
from SpiffWorkflow.task import TaskState
@ -11,7 +12,7 @@ class EventBsedGatewayTest(BpmnWorkflowTestCase):
def setUp(self):
self.spec, self.subprocesses = self.load_workflow_spec('event-gateway.bpmn', 'Process_0pvx19v')
self.script_engine = PythonScriptEngine(default_globals={"timedelta": timedelta})
self.script_engine = PythonScriptEngine(environment=TaskDataEnvironment({"timedelta": timedelta}))
self.workflow = BpmnWorkflow(self.spec, script_engine=self.script_engine)
def testEventBasedGateway(self):
@ -29,8 +30,8 @@ class EventBsedGatewayTest(BpmnWorkflowTestCase):
self.workflow.script_engine = self.script_engine
self.assertEqual(len(waiting_tasks), 1)
self.workflow.catch(MessageEventDefinition('message_1'))
self.workflow.refresh_waiting_tasks()
self.workflow.do_engine_steps()
self.workflow.refresh_waiting_tasks()
self.assertEqual(self.workflow.is_completed(), True)
self.assertEqual(self.workflow.get_tasks_from_spec_name('message_1_event')[0].state, TaskState.COMPLETED)
self.assertEqual(self.workflow.get_tasks_from_spec_name('message_2_event')[0].state, TaskState.CANCELLED)

View File

@ -5,6 +5,7 @@ import unittest
import time
from SpiffWorkflow.bpmn.PythonScriptEngine import PythonScriptEngine
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import TaskDataEnvironment
from SpiffWorkflow.bpmn.workflow import BpmnWorkflow
from tests.SpiffWorkflow.bpmn.BpmnWorkflowTestCase import BpmnWorkflowTestCase
@ -24,11 +25,11 @@ class CustomScriptEngine(PythonScriptEngine):
It will execute python code read in from the bpmn. It will also make any scripts in the
scripts directory available for execution. """
def __init__(self):
augment_methods = {
environment = TaskDataEnvironment({
'custom_function': my_custom_function,
'timedelta': datetime.timedelta,
}
super().__init__(scripting_additions=augment_methods)
})
super().__init__(environment=environment)
class TimerCycleStartTest(BpmnWorkflowTestCase):

View File

@ -5,6 +5,7 @@ import unittest
import time
from SpiffWorkflow.bpmn.PythonScriptEngine import PythonScriptEngine
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import TaskDataEnvironment
from SpiffWorkflow.task import TaskState
from SpiffWorkflow.bpmn.workflow import BpmnWorkflow
from tests.SpiffWorkflow.bpmn.BpmnWorkflowTestCase import BpmnWorkflowTestCase
@ -22,11 +23,11 @@ class CustomScriptEngine(PythonScriptEngine):
It will execute python code read in from the bpmn. It will also make any scripts in the
scripts directory available for execution. """
def __init__(self):
augment_methods = {
environment = TaskDataEnvironment({
'custom_function': my_custom_function,
'timedelta': datetime.timedelta,
}
super().__init__(scripting_additions=augment_methods)
})
super().__init__(environment=environment)

View File

@ -6,6 +6,7 @@ import time
from SpiffWorkflow.bpmn.workflow import BpmnWorkflow
from SpiffWorkflow.bpmn.PythonScriptEngine import PythonScriptEngine
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import TaskDataEnvironment
from tests.SpiffWorkflow.bpmn.BpmnWorkflowTestCase import BpmnWorkflowTestCase
__author__ = 'kellym'
@ -14,10 +15,10 @@ __author__ = 'kellym'
class TimerDateTest(BpmnWorkflowTestCase):
def setUp(self):
self.script_engine = PythonScriptEngine(default_globals={
self.script_engine = PythonScriptEngine(environment=TaskDataEnvironment({
"datetime": datetime.datetime,
"timedelta": datetime.timedelta,
})
}))
self.spec, self.subprocesses = self.load_workflow_spec('timer-date-start.bpmn', 'date_timer')
self.workflow = BpmnWorkflow(self.spec, self.subprocesses, script_engine=self.script_engine)

View File

@ -6,6 +6,7 @@ from datetime import timedelta
from SpiffWorkflow.bpmn.workflow import BpmnWorkflow
from SpiffWorkflow.bpmn.PythonScriptEngine import PythonScriptEngine
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import TaskDataEnvironment
from tests.SpiffWorkflow.bpmn.BpmnWorkflowTestCase import BpmnWorkflowTestCase
__author__ = 'kellym'
@ -13,7 +14,7 @@ __author__ = 'kellym'
class TimerDurationTest(BpmnWorkflowTestCase):
def setUp(self):
self.script_engine = PythonScriptEngine(default_globals={"timedelta": timedelta})
self.script_engine = PythonScriptEngine(environment=TaskDataEnvironment({"timedelta": timedelta}))
self.spec, self.subprocesses = self.load_workflow_spec('boundary_timer_on_task.bpmn', 'test_timer')
self.workflow = BpmnWorkflow(self.spec, self.subprocesses, script_engine=self.script_engine)

View File

@ -5,6 +5,7 @@ import time
from datetime import datetime, timedelta
from SpiffWorkflow.bpmn.workflow import BpmnWorkflow
from SpiffWorkflow.bpmn.PythonScriptEngine import PythonScriptEngine
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import TaskDataEnvironment
from tests.SpiffWorkflow.bpmn.BpmnWorkflowTestCase import BpmnWorkflowTestCase
__author__ = 'kellym'
@ -13,7 +14,7 @@ __author__ = 'kellym'
class TimerDurationTest(BpmnWorkflowTestCase):
def setUp(self):
self.script_engine = PythonScriptEngine(default_globals={"timedelta": timedelta})
self.script_engine = PythonScriptEngine(environment=TaskDataEnvironment({"timedelta": timedelta}))
self.spec, self.subprocesses = self.load_workflow_spec('timer.bpmn', 'timer')
self.workflow = BpmnWorkflow(self.spec, self.subprocesses, script_engine=self.script_engine)

View File

@ -4,7 +4,6 @@ import os
from SpiffWorkflow.bpmn.workflow import BpmnWorkflow
from SpiffWorkflow.bpmn.parser.BpmnParser import BpmnParser
from SpiffWorkflow.bpmn.serializer.workflow import BpmnWorkflowSerializer
from tests.SpiffWorkflow.bpmn.BpmnLoaderForTests import TestUserTaskConverter
class BaseTestCase(unittest.TestCase):
@ -21,7 +20,7 @@ class BaseTestCase(unittest.TestCase):
def setUp(self):
super(BaseTestCase, self).setUp()
wf_spec_converter = BpmnWorkflowSerializer.configure_workflow_spec_converter([TestUserTaskConverter])
wf_spec_converter = BpmnWorkflowSerializer.configure_workflow_spec_converter()
self.serializer = BpmnWorkflowSerializer(wf_spec_converter, version=self.SERIALIZER_VERSION)
spec, subprocesses = self.load_workflow_spec('random_fact.bpmn', 'random_fact')
self.workflow = BpmnWorkflow(spec, subprocesses)

View File

@ -5,7 +5,6 @@ import json
from SpiffWorkflow.bpmn.PythonScriptEngine import PythonScriptEngine
from SpiffWorkflow.bpmn.serializer.workflow import BpmnWorkflowSerializer
from SpiffWorkflow.bpmn.workflow import BpmnWorkflow
from tests.SpiffWorkflow.bpmn.BpmnLoaderForTests import TestUserTaskConverter
from .BaseTestCase import BaseTestCase
@ -71,7 +70,7 @@ class BpmnWorkflowSerializerTest(BaseTestCase):
try:
self.assertRaises(TypeError, self.serializer.serialize_json, self.workflow)
wf_spec_converter = BpmnWorkflowSerializer.configure_workflow_spec_converter([TestUserTaskConverter])
wf_spec_converter = BpmnWorkflowSerializer.configure_workflow_spec_converter()
custom_serializer = BpmnWorkflowSerializer(wf_spec_converter, version=self.SERIALIZER_VERSION,json_encoder_cls=MyJsonEncoder, json_decoder_cls=MyJsonDecoder)
serialized_workflow = custom_serializer.serialize_json(self.workflow)
finally:

View File

@ -3,9 +3,11 @@ import time
from SpiffWorkflow.task import TaskState
from SpiffWorkflow.bpmn.PythonScriptEngine import PythonScriptEngine
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import TaskDataEnvironment
from .BaseTestCase import BaseTestCase
class VersionMigrationTest(BaseTestCase):
SERIALIZER_VERSION = "1.2"
@ -24,7 +26,7 @@ class VersionMigrationTest(BaseTestCase):
def test_convert_1_1_to_1_2(self):
fn = os.path.join(self.DATA_DIR, 'serialization', 'v1-1.json')
wf = self.serializer.deserialize_json(open(fn).read())
wf.script_engine = PythonScriptEngine(default_globals={"time": time})
wf.script_engine = PythonScriptEngine(environment=TaskDataEnvironment({"time": time}))
wf.refresh_waiting_tasks()
wf.do_engine_steps()
self.assertTrue(wf.is_completed())
self.assertTrue(wf.is_completed())

View File

@ -1,22 +1,20 @@
# -*- coding: utf-8 -*-
import os
from copy import deepcopy
from SpiffWorkflow.bpmn.serializer.workflow import BpmnWorkflowSerializer
from SpiffWorkflow.camunda.parser.CamundaParser import CamundaParser
from SpiffWorkflow.camunda.serializer.task_spec_converters import UserTaskConverter, StartEventConverter, EndEventConverter, \
IntermediateCatchEventConverter, IntermediateThrowEventConverter, BoundaryEventConverter
from SpiffWorkflow.camunda.serializer.config import CAMUNDA_SPEC_CONFIG
from SpiffWorkflow.dmn.serializer.task_spec_converters import BusinessRuleTaskConverter
from SpiffWorkflow.dmn.serializer.task_spec import BusinessRuleTaskConverter
from tests.SpiffWorkflow.bpmn.BpmnWorkflowTestCase import BpmnWorkflowTestCase
CAMUNDA_SPEC_CONFIG['task_specs'].append(BusinessRuleTaskConverter)
__author__ = 'danfunk'
wf_spec_converter = BpmnWorkflowSerializer.configure_workflow_spec_converter([
UserTaskConverter, BusinessRuleTaskConverter, StartEventConverter,
EndEventConverter, BoundaryEventConverter, IntermediateCatchEventConverter,
IntermediateThrowEventConverter])
wf_spec_converter = BpmnWorkflowSerializer.configure_workflow_spec_converter(CAMUNDA_SPEC_CONFIG)
class BaseTestCase(BpmnWorkflowTestCase):
""" Provides some basic tools for loading up and parsing camunda BPMN files """

View File

@ -16,7 +16,7 @@ class CallActivityMessageTest(BaseTestCase):
def testRunThroughHappy(self):
self.actual_test(save_restore=False)
def testThroughSaveRestore(self):
def testRunThroughSaveRestore(self):
self.actual_test(save_restore=True)
def actual_test(self, save_restore=False):

View File

@ -1,5 +1,6 @@
import unittest
from SpiffWorkflow.bpmn.PythonScriptEngine import PythonScriptEngine
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import TaskDataEnvironment
from SpiffWorkflow.bpmn.workflow import BpmnWorkflow
from .BaseTestCase import BaseTestCase
@ -12,8 +13,8 @@ def my_custom_function(txt):
class CustomScriptEngine(PythonScriptEngine):
def __init__(self):
augment_methods = {'my_custom_function': my_custom_function}
super().__init__(scripting_additions=augment_methods)
environment = TaskDataEnvironment({'my_custom_function': my_custom_function})
super().__init__(environment=environment)
class DMNCustomScriptTest(BaseTestCase):

View File

@ -7,6 +7,7 @@ from datetime import timedelta
from SpiffWorkflow.task import TaskState
from SpiffWorkflow.bpmn.workflow import BpmnWorkflow
from SpiffWorkflow.bpmn.PythonScriptEngine import PythonScriptEngine
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import TaskDataEnvironment
from .BaseTestCase import BaseTestCase
__author__ = 'kellym'
@ -15,7 +16,7 @@ __author__ = 'kellym'
class MessageBoundaryTest(BaseTestCase):
def setUp(self):
self.script_engine = PythonScriptEngine(default_globals={"timedelta": timedelta})
self.script_engine = PythonScriptEngine(environment=TaskDataEnvironment({"timedelta": timedelta}))
self.spec, self.subprocesses = self.load_workflow_spec('MessageBoundary.bpmn', 'Process_1kjyavs')
self.workflow = BpmnWorkflow(self.spec, self.subprocesses, script_engine=self.script_engine)

View File

@ -1,6 +1,8 @@
import unittest
from SpiffWorkflow.bpmn.workflow import BpmnWorkflow
from SpiffWorkflow.bpmn.PythonScriptEngine import PythonScriptEngine
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import BoxedTaskDataEnvironment
from .BaseTestCase import BaseTestCase
@ -10,12 +12,13 @@ class MultiInstanceDMNTest(BaseTestCase):
self.spec, subprocesses = self.load_workflow_spec(
'DMNMultiInstance.bpmn', 'Process_1', 'test_integer_decision_multi.dmn')
self.workflow = BpmnWorkflow(self.spec)
self.script_engine = PythonScriptEngine(environment=BoxedTaskDataEnvironment())
self.workflow.script_engine = self.script_engine
def testConstructor(self):
pass # this is accomplished through setup.
def testDmnHappy(self):
self.workflow = BpmnWorkflow(self.spec)
self.workflow.do_engine_steps()
self.workflow.complete_next()
self.workflow.do_engine_steps()
@ -25,16 +28,19 @@ class MultiInstanceDMNTest(BaseTestCase):
def testDmnSaveRestore(self):
self.workflow = BpmnWorkflow(self.spec)
self.save_restore()
self.workflow.script_engine = self.script_engine
self.workflow.do_engine_steps()
self.workflow.complete_next()
self.save_restore()
self.workflow.script_engine = self.script_engine
self.workflow.do_engine_steps()
self.workflow.complete_next()
self.save_restore()
self.workflow.script_engine = self.script_engine
self.workflow.do_engine_steps()
self.save_restore()
self.workflow.script_engine = self.script_engine
self.assertEqual(self.workflow.data['stuff']['E']['y'], 'D')

View File

@ -1,94 +0,0 @@
<?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:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_1n0u11m" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.7.0">
<bpmn:process id="DefaultGateway" isExecutable="true">
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_1wis1un</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:userTask id="DoStuff" name="Do Stuff?" camunda:formKey="morestuffform">
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="morestuff" label="Do we need to do more stuff?" type="string" />
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>Flow_1wis1un</bpmn:incoming>
<bpmn:outgoing>Flow_144jxvd</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_1wis1un" sourceRef="StartEvent_1" targetRef="DoStuff" />
<bpmn:exclusiveGateway id="Gateway_1yn93jn">
<bpmn:incoming>Flow_144jxvd</bpmn:incoming>
<bpmn:outgoing>Flow_1riszc2</bpmn:outgoing>
<bpmn:outgoing>Flow_0xdvee4</bpmn:outgoing>
</bpmn:exclusiveGateway>
<bpmn:sequenceFlow id="Flow_144jxvd" sourceRef="DoStuff" targetRef="Gateway_1yn93jn" />
<bpmn:sequenceFlow id="Flow_1riszc2" name="Yes" sourceRef="Gateway_1yn93jn" targetRef="GetMoreStuff">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">morestuff == 'Yes'</bpmn:conditionExpression>
</bpmn:sequenceFlow>
<bpmn:endEvent id="Event_1xfyeiq">
<bpmn:incoming>Flow_13ncefd</bpmn:incoming>
<bpmn:incoming>Flow_0xdvee4</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_13ncefd" sourceRef="GetMoreStuff" targetRef="Event_1xfyeiq" />
<bpmn:userTask id="GetMoreStuff" name="Add More Stuff">
<bpmn:extensionElements>
<camunda:formData>
<camunda:formField id="stuff.addstuff" label="Add More Stuff" type="string" />
</camunda:formData>
</bpmn:extensionElements>
<bpmn:incoming>Flow_1riszc2</bpmn:incoming>
<bpmn:outgoing>Flow_13ncefd</bpmn:outgoing>
<bpmn:multiInstanceLoopCharacteristics camunda:collection="collectstuff" camunda:elementVariable="stuff">
<bpmn:loopCardinality xsi:type="bpmn:tFormalExpression">3</bpmn:loopCardinality>
</bpmn:multiInstanceLoopCharacteristics>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_0xdvee4" name="No" sourceRef="Gateway_1yn93jn" targetRef="Event_1xfyeiq">
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">morestuff == 'No'</bpmn:conditionExpression>
</bpmn:sequenceFlow>
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="DefaultGateway">
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="99" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_10nt4mt_di" bpmnElement="DoStuff">
<dc:Bounds x="260" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_1wis1un_di" bpmnElement="Flow_1wis1un">
<di:waypoint x="215" y="117" />
<di:waypoint x="260" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="Gateway_1yn93jn_di" bpmnElement="Gateway_1yn93jn" isMarkerVisible="true">
<dc:Bounds x="405" y="92" width="50" height="50" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_144jxvd_di" bpmnElement="Flow_144jxvd">
<di:waypoint x="360" y="117" />
<di:waypoint x="405" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1riszc2_di" bpmnElement="Flow_1riszc2">
<di:waypoint x="455" y="117" />
<di:waypoint x="520" y="117" />
<bpmndi:BPMNLabel>
<dc:Bounds x="478" y="99" width="19" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="Event_1xfyeiq_di" bpmnElement="Event_1xfyeiq">
<dc:Bounds x="692" y="99" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_13ncefd_di" bpmnElement="Flow_13ncefd">
<di:waypoint x="620" y="117" />
<di:waypoint x="692" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="Activity_0msdtf4_di" bpmnElement="GetMoreStuff">
<dc:Bounds x="520" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_0xdvee4_di" bpmnElement="Flow_0xdvee4">
<di:waypoint x="430" y="142" />
<di:waypoint x="430" y="240" />
<di:waypoint x="710" y="240" />
<di:waypoint x="710" y="135" />
<bpmndi:BPMNLabel>
<dc:Bounds x="563" y="222" width="15" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 7.9 KiB

View File

@ -1,64 +0,0 @@
<?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" id="Definitions_1c9mbga" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.7.0">
<bpmn:process id="top_workflow" name="top_workflow" isExecutable="true">
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_1xegt6f</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:sequenceFlow id="Flow_11qyfqv" sourceRef="Activity_0gjyb1c" targetRef="Activity_02eu174" />
<bpmn:sequenceFlow id="Flow_0hntmrc" sourceRef="Activity_02eu174" targetRef="Activity_0fz4sv6" />
<bpmn:endEvent id="Event_0jgpqrj">
<bpmn:incoming>Flow_0qc6vpv</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_0qc6vpv" sourceRef="Activity_0fz4sv6" targetRef="Event_0jgpqrj" />
<bpmn:sequenceFlow id="Flow_1xegt6f" sourceRef="StartEvent_1" targetRef="Activity_0gjyb1c" />
<bpmn:scriptTask id="Activity_0gjyb1c" name="my_custom_function(&#39;test 1 from top workflow&#39;)">
<bpmn:incoming>Flow_1xegt6f</bpmn:incoming>
<bpmn:outgoing>Flow_11qyfqv</bpmn:outgoing>
<bpmn:script>my_custom_function('test 1 from top workflow')</bpmn:script>
</bpmn:scriptTask>
<bpmn:callActivity id="Activity_02eu174" name="Common Activity" calledElement="CommonActivity">
<bpmn:incoming>Flow_11qyfqv</bpmn:incoming>
<bpmn:outgoing>Flow_0hntmrc</bpmn:outgoing>
</bpmn:callActivity>
<bpmn:scriptTask id="Activity_0fz4sv6" name="my_custom_function(&#39;test from top workflow&#39;)">
<bpmn:incoming>Flow_0hntmrc</bpmn:incoming>
<bpmn:outgoing>Flow_0qc6vpv</bpmn:outgoing>
<bpmn:script>my_custom_function('test 2 from top workflow')</bpmn:script>
</bpmn:scriptTask>
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="top_workflow">
<bpmndi:BPMNEdge id="Flow_1xegt6f_di" bpmnElement="Flow_1xegt6f">
<di:waypoint x="215" y="117" />
<di:waypoint x="240" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0qc6vpv_di" bpmnElement="Flow_0qc6vpv">
<di:waypoint x="640" y="117" />
<di:waypoint x="692" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0hntmrc_di" bpmnElement="Flow_0hntmrc">
<di:waypoint x="490" y="117" />
<di:waypoint x="540" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_11qyfqv_di" bpmnElement="Flow_11qyfqv">
<di:waypoint x="340" y="117" />
<di:waypoint x="390" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="99" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_0jgpqrj_di" bpmnElement="Event_0jgpqrj">
<dc:Bounds x="692" y="99" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0py36p6_di" bpmnElement="Activity_0gjyb1c">
<dc:Bounds x="240" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0zer2pn_di" bpmnElement="Activity_02eu174">
<dc:Bounds x="390" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0mjjhco_di" bpmnElement="Activity_0fz4sv6">
<dc:Bounds x="540" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>

View File

@ -1,7 +1,8 @@
import unittest
from SpiffWorkflow.camunda.specs.UserTask import FormField, UserTask, Form, EnumFormField
from SpiffWorkflow.camunda.serializer.task_spec_converters import UserTaskConverter
from SpiffWorkflow.camunda.serializer.task_spec import UserTaskConverter
from SpiffWorkflow.bpmn.serializer.helpers.dictionary import DictionaryConverter
from SpiffWorkflow.specs.WorkflowSpec import WorkflowSpec
@ -53,7 +54,7 @@ class UserTaskSpecTest(unittest.TestCase):
self.form.add_field(field1)
self.form.add_field(field2)
converter = UserTaskConverter()
converter = UserTaskConverter(DictionaryConverter())
dct = converter.to_dict(self.user_spec)
self.assertEqual(dct['name'], 'userTask')
self.assertEqual(dct['form'], {

View File

@ -2,7 +2,7 @@ import os
from lxml import etree
from SpiffWorkflow.bpmn.PythonScriptEngine import Box
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import Box
from SpiffWorkflow.dmn.engine.DMNEngine import DMNEngine
from SpiffWorkflow.dmn.parser.DMNParser import DMNParser, get_dmn_ns

View File

@ -1,14 +1,11 @@
import os
import unittest
from SpiffWorkflow.dmn.engine.DMNEngine import DMNEngine
from SpiffWorkflow.bpmn.serializer.helpers.dictionary import DictionaryConverter
from SpiffWorkflow.dmn.parser.BpmnDmnParser import BpmnDmnParser
from SpiffWorkflow.dmn.serializer.task_spec_converters import \
BusinessRuleTaskConverter
from SpiffWorkflow.dmn.serializer.task_spec import BusinessRuleTaskConverter
from tests.SpiffWorkflow.bpmn.BpmnWorkflowTestCase import BpmnWorkflowTestCase
from tests.SpiffWorkflow.dmn.DecisionRunner import DecisionRunner
from tests.SpiffWorkflow.dmn.python_engine.PythonDecisionRunner import \
PythonDecisionRunner
from tests.SpiffWorkflow.dmn.python_engine.PythonDecisionRunner import PythonDecisionRunner
class HitPolicyTest(BpmnWorkflowTestCase):
@ -38,8 +35,8 @@ class HitPolicyTest(BpmnWorkflowTestCase):
runner = PythonDecisionRunner(file_name)
decision_table = runner.decision_table
self.assertEqual("COLLECT", decision_table.hit_policy)
dict = BusinessRuleTaskConverter().decision_table_to_dict(decision_table)
new_table = BusinessRuleTaskConverter().decision_table_from_dict(dict)
dict = BusinessRuleTaskConverter(DictionaryConverter()).decision_table_to_dict(decision_table)
new_table = BusinessRuleTaskConverter(DictionaryConverter()).decision_table_from_dict(dict)
self.assertEqual("COLLECT", new_table.hit_policy)
def suite():

View File

@ -1,6 +1,6 @@
import unittest
from SpiffWorkflow.bpmn.PythonScriptEngine import PythonScriptEngine
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import Box
from .FeelDecisionRunner import FeelDecisionRunner
@ -19,7 +19,7 @@ class FeelDictDecisionTestClass(unittest.TestCase):
"PEANUTS": {"delicious": True},
"SPAM": {"delicious": False}
}}
PythonScriptEngine.convert_to_box(PythonScriptEngine(), data)
Box.convert_to_box(data)
res = self.runner.decide(data)
self.assertEqual(res.description, 'They are allergic to peanuts')

View File

@ -1,6 +1,6 @@
import unittest
from SpiffWorkflow.bpmn.PythonScriptEngine import Box
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import Box
from .FeelDecisionRunner import FeelDecisionRunner

View File

@ -1,6 +1,6 @@
import unittest
from SpiffWorkflow.bpmn.PythonScriptEngine import Box
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import Box
from .PythonDecisionRunner import PythonDecisionRunner

View File

@ -1,6 +1,6 @@
import unittest
from SpiffWorkflow.bpmn.PythonScriptEngine import Box
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import Box
from .PythonDecisionRunner import PythonDecisionRunner

View File

@ -2,11 +2,12 @@ import datetime
from decimal import Decimal
from SpiffWorkflow.bpmn.PythonScriptEngine import PythonScriptEngine
from SpiffWorkflow.bpmn.PythonScriptEngineEnvironment import TaskDataEnvironment
from ..DecisionRunner import DecisionRunner
class PythonDecisionRunner(DecisionRunner):
def __init__(self, filename):
scripting_additions={'Decimal': Decimal, 'datetime': datetime}
super().__init__(PythonScriptEngine(scripting_additions=scripting_additions), filename, 'python_engine')
environment = TaskDataEnvironment({'Decimal': Decimal, 'datetime': datetime})
super().__init__(PythonScriptEngine(environment=environment), filename, 'python_engine')

View File

@ -1,27 +1,17 @@
# -*- coding: utf-8 -*-
import os
from copy import deepcopy
from SpiffWorkflow.spiff.parser.process import SpiffBpmnParser, VALIDATOR
from SpiffWorkflow.spiff.serializer.task_spec_converters import NoneTaskConverter, \
ManualTaskConverter, UserTaskConverter, ScriptTaskConverter, \
SubWorkflowTaskConverter, TransactionSubprocessConverter, \
CallActivityTaskConverter, \
StartEventConverter, EndEventConverter, BoundaryEventConverter, \
SendTaskConverter, ReceiveTaskConverter, \
IntermediateCatchEventConverter, IntermediateThrowEventConverter, \
ServiceTaskConverter
from SpiffWorkflow.dmn.serializer.task_spec_converters import BusinessRuleTaskConverter
from SpiffWorkflow.spiff.serializer.config import SPIFF_SPEC_CONFIG
from SpiffWorkflow.dmn.serializer.task_spec import BusinessRuleTaskConverter
from SpiffWorkflow.bpmn.serializer.workflow import BpmnWorkflowSerializer
from tests.SpiffWorkflow.bpmn.BpmnWorkflowTestCase import BpmnWorkflowTestCase
wf_spec_converter = BpmnWorkflowSerializer.configure_workflow_spec_converter([
NoneTaskConverter, ManualTaskConverter, UserTaskConverter, ScriptTaskConverter,
SubWorkflowTaskConverter, TransactionSubprocessConverter, CallActivityTaskConverter,
StartEventConverter, EndEventConverter, BoundaryEventConverter, SendTaskConverter, ReceiveTaskConverter,
IntermediateCatchEventConverter, IntermediateThrowEventConverter, BusinessRuleTaskConverter,
ServiceTaskConverter
])
SPIFF_SPEC_CONFIG['task_specs'].append(BusinessRuleTaskConverter)
wf_spec_converter = BpmnWorkflowSerializer.configure_workflow_spec_converter(SPIFF_SPEC_CONFIG)
class BaseTestCase(BpmnWorkflowTestCase):
""" Provides some basic tools for loading up and parsing Spiff extensions"""