def init_workflow_from_spec_json(spec_json): serializer = TradeFlowSerializer() spec = WorkflowSpec.deserialize(serializer, spec_json) workflow = Workflow(spec) workflow_meta = {"id": str(uuid.uuid4()), "fields": []} workflow_skip_start_and_root(workflow) for t in workflow.get_tasks(): t.task_spec.x_instances = [] for t in workflow.get_tasks(): if "_meta" not in t.task_spec.data: t.task_spec.data["_meta"] = {} if not isinstance(t.task_spec.data["_meta"], dict): t.task_spec.data["_meta"] = {} t.task_spec.data["_meta"]["locked"] = False t.task_spec.data["_meta"]["id"] = str(t.id) t.task_spec.data["_meta"]["type"] = t.task_spec.__class__.__name__ # workflow_meta["fields"] += t.task_spec.data["_meta"].get("fields", []) workflow.data["_meta"] = workflow_meta return workflow
def _advance_to_a1(self, wf_spec): workflow = Workflow(wf_spec) tasks = workflow.get_tasks(Task.READY) task_start = tasks[0] workflow.complete_task_from_id(task_start.id) tasks = workflow.get_tasks(Task.READY) multichoice = tasks[0] workflow.complete_task_from_id(multichoice.id) tasks = workflow.get_tasks(Task.READY) task_a1 = tasks[0] workflow.complete_task_from_id(task_a1.id) return workflow
def deserialize_workflow(self, s_state, **kwargs): wf_spec = self.deserialize_workflow_spec(s_state['wf_spec'], **kwargs) workflow = Workflow(wf_spec) # data workflow.data = s_state['data'] # last_task workflow.last_task = s_state['last_task'] # outer_workflow #workflow.outer_workflow = find_workflow_by_id(remap_workflow_id(s_state['outer_workflow'])) # success workflow.success = s_state['success'] # workflow workflow.spec = wf_spec # task_tree workflow.task_tree = self._deserialize_task(workflow, s_state['task_tree']) # Re-connect parents for task in workflow.get_tasks(): task.parent = workflow.get_task(task.parent) return workflow
def start_workflow(workflow_name): """ start workflow for graduation project """ # create workflow instance workflow = Workflow(workflow_specs[workflow_name]) # complete start task start_task = workflow.get_tasks(state=Task.READY)[0] workflow.complete_task_from_id(start_task.id) # save username in workflow workflow.data["student"] = g.user.username # save workflow instance to database save_workflow_instance(workflow, g.user.id) return redirect(url_for('.user_page', username=g.user.username))
def testBeginWorkflowStepByStep(self): """ Simulates interactive calls, as would be issued by a user. """ xml_file = os.path.join(data_dir, 'spiff', 'workflow1.xml') with open(xml_file) as fp: xml = fp.read() wf_spec = WorkflowSpec.deserialize(XmlSerializer(), xml) workflow = Workflow(wf_spec) tasks = workflow.get_tasks(Task.READY) self.assertEqual(len(tasks), 1) self.assertEqual(tasks[0].task_spec.name, 'Start') workflow.complete_task_from_id(tasks[0].id) self.assertEqual(tasks[0].state, Task.COMPLETED) tasks = workflow.get_tasks(Task.READY) self.assertEqual(len(tasks), 2) task_a1 = tasks[0] task_b1 = tasks[1] self.assertEqual(task_a1.task_spec.__class__, Simple) self.assertEqual(task_a1.task_spec.name, 'task_a1') self.assertEqual(task_b1.task_spec.__class__, Simple) self.assertEqual(task_b1.task_spec.name, 'task_b1') workflow.complete_task_from_id(task_a1.id) self.assertEqual(task_a1.state, Task.COMPLETED) tasks = workflow.get_tasks(Task.READY) self.assertEqual(len(tasks), 2) self.assertTrue(task_b1 in tasks) task_a2 = tasks[0] self.assertEqual(task_a2.task_spec.__class__, Simple) self.assertEqual(task_a2.task_spec.name, 'task_a2') workflow.complete_task_from_id(task_a2.id) tasks = workflow.get_tasks(Task.READY) self.assertEqual(len(tasks), 1) self.assertTrue(task_b1 in tasks) workflow.complete_task_from_id(task_b1.id) tasks = workflow.get_tasks(Task.READY) self.assertEqual(len(tasks), 1) workflow.complete_task_from_id(tasks[0].id) tasks = workflow.get_tasks(Task.READY) self.assertEqual(len(tasks), 1) self.assertEqual(tasks[0].task_spec.name, 'synch_1')
def testBeginWorkflowStepByStep(self): """ Simulates interactive calls, as would be issued by a user. """ xml_file = os.path.join(data_dir, 'spiff', 'workflow1.xml') xml = open(xml_file).read() wf_spec = WorkflowSpec.deserialize(XmlSerializer(), xml) workflow = Workflow(wf_spec) tasks = workflow.get_tasks(Task.READY) self.assertEqual(len(tasks), 1) self.assertEqual(tasks[0].task_spec.name, 'Start') workflow.complete_task_from_id(tasks[0].id) self.assertEqual(tasks[0].state, Task.COMPLETED) tasks = workflow.get_tasks(Task.READY) self.assertEqual(len(tasks), 2) task_a1 = tasks[0] task_b1 = tasks[1] self.assertEqual(task_a1.task_spec.__class__, Simple) self.assertEqual(task_a1.task_spec.name, 'task_a1') self.assertEqual(task_b1.task_spec.__class__, Simple) self.assertEqual(task_b1.task_spec.name, 'task_b1') workflow.complete_task_from_id(task_a1.id) self.assertEqual(task_a1.state, Task.COMPLETED) tasks = workflow.get_tasks(Task.READY) self.assertEqual(len(tasks), 2) self.assertTrue(task_b1 in tasks) task_a2 = tasks[0] self.assertEqual(task_a2.task_spec.__class__, Simple) self.assertEqual(task_a2.task_spec.name, 'task_a2') workflow.complete_task_from_id(task_a2.id) tasks = workflow.get_tasks(Task.READY) self.assertEqual(len(tasks), 1) self.assertTrue(task_b1 in tasks) workflow.complete_task_from_id(task_b1.id) tasks = workflow.get_tasks(Task.READY) self.assertEqual(len(tasks), 1) workflow.complete_task_from_id(tasks[0].id) tasks = workflow.get_tasks(Task.READY) self.assertEqual(len(tasks), 1) self.assertEqual(tasks[0].task_spec.name, 'synch_1')
def testBeginWorkflowStepByStep(self): """ Simulates interactive calls, as would be issued by a user. """ wf_spec = self._createWorkflowSpec() workflow = Workflow(wf_spec) tasks = workflow.get_tasks(Task.READY) self.assertEqual(len(tasks), 1) self.assertEqual(tasks[0].task_spec.name, 'Start') workflow.complete_task_from_id(tasks[0].id) self.assertEqual(tasks[0].state, Task.COMPLETED) tasks = workflow.get_tasks(Task.READY) self.assertEqual(len(tasks), 2) task_a1 = tasks[0] task_b1 = tasks[1] self.assertEqual(task_a1.task_spec.__class__, Simple) self.assertEqual(task_a1.task_spec.name, 'task_a1') self.assertEqual(task_b1.task_spec.__class__, Simple) self.assertEqual(task_b1.task_spec.name, 'task_b1') workflow.complete_task_from_id(task_a1.id) self.assertEqual(task_a1.state, Task.COMPLETED) tasks = workflow.get_tasks(Task.READY) self.assertEqual(len(tasks), 2) self.assertTrue(task_b1 in tasks) task_a2 = tasks[0] self.assertEqual(task_a2.task_spec.__class__, Simple) self.assertEqual(task_a2.task_spec.name, 'task_a2') workflow.complete_task_from_id(task_a2.id) tasks = workflow.get_tasks(Task.READY) self.assertEqual(len(tasks), 1) self.assertTrue(task_b1 in tasks) workflow.complete_task_from_id(task_b1.id) tasks = workflow.get_tasks(Task.READY) self.assertEqual(len(tasks), 1) workflow.complete_task_from_id(tasks[0].id) tasks = workflow.get_tasks(Task.READY) self.assertEqual(len(tasks), 1) self.assertEqual(tasks[0].task_spec.name, 'synch_1')
parser = etree.XMLParser(recover=True) root = etree.fromstring(xml_str.encode('utf-8'), parser=parser) bpmn_packaged = io.BytesIO() package = Packager(bpmn_packaged, 'Process_1') package.add_bpmn_file(xml_str.encode("utf-8")) package.create_package() wf_spec = WorkflowSpec.deserialize(BpmnSerializer(), xml_str.encode('utf-8')) workflow = Workflow(wf_spec) parser = BpmnParser() parser.add_bpmn_xml(root) # Create an instance of the workflow, according to the specification. wf = Workflow(spec) tasks = wf.get_tasks(Task.READY) task_start = tasks[0] workflow.complete_task_from_id(task_start.id) tasks = workflow.get_tasks(Task.READY) multichoice = tasks[0] workflow.complete_task_from_id(multichoice.id) tasks = workflow.get_tasks(Task.READY) task_a1 = tasks[0] workflow.complete_task_from_id(task_a1.id)
def test_Merge_data_merging(self): """Test that Merge task actually merges data""" wf_spec = WorkflowSpec() first = Simple(wf_spec, 'first') second = Simple(wf_spec, 'second') third = Simple(wf_spec, 'third') bump = Simple(wf_spec, 'bump') fourth = Simple(wf_spec, 'fourth') merge1 = Merge(wf_spec, 'merge 1') simple1 = Simple(wf_spec, 'simple 1') merge2 = Merge(wf_spec, 'merge 2') simple2 = Simple(wf_spec, 'simple 2') unmerged = Simple(wf_spec, 'unmerged') wf_spec.start.connect(first) wf_spec.start.connect(second) wf_spec.start.connect(third) wf_spec.start.connect(bump) bump.connect(fourth) # Test join at different depths in tree first.connect(merge1) second.connect(merge1) second.connect(unmerged) first.connect(merge2) second.connect(merge2) third.connect(merge2) fourth.connect(merge2) merge1.connect(simple1) merge2.connect(simple2) workflow = Workflow(wf_spec) workflow.task_tree.set_attribute(everywhere=1) for task in workflow.get_tasks(): task.set_attribute(**{'name': task.get_name(), task.get_name(): 1}) workflow.complete_all() self.assertTrue(workflow.is_completed()) found = {} for task in workflow.get_tasks(): if task.task_spec is simple1: self.assertIn('first', task.attributes) self.assertIn('second', task.attributes) self.assertDictEqual(task.attributes, {'Start': 1, 'merge 1': 1, 'name': 'Start', 'simple 1': 1, 'second': 1, 'first': 1}) found['simple1'] = task if task.task_spec is simple2: self.assertIn('first', task.attributes) self.assertIn('second', task.attributes) self.assertIn('third', task.attributes) self.assertIn('fourth', task.attributes) self.assertDictEqual(task.attributes, {'merge 2': 1, 'simple 2': 1, 'name': 'Start', 'third': 1, 'bump': 1, 'Start': 1, 'second': 1, 'first': 1, 'fourth': 1}) found['simple2'] = task if task.task_spec is unmerged: self.assertDictEqual(task.attributes, {'Start': 1, 'second': 1, 'name': 'Start', 'unmerged': 1}) found['unmerged'] = task self.assertIn('simple1', found) self.assertIn('simple2', found) self.assertIn('unmerged', found)