def restart_workflow(workflow_id, clear_data=False, delete_files=False): """Restart a workflow with the latest spec. Clear data allows user to restart the workflow without previous data.""" workflow_model: WorkflowModel = session.query(WorkflowModel).filter_by( id=workflow_id).first() WorkflowProcessor.reset(workflow_model, clear_data=clear_data, delete_files=delete_files) return get_workflow(workflow_model.id)
def test_lookup_with_two_spreadsheets_with_the_same_field_name_in_different_forms( self): spec = BaseTest.load_test_spec('enum_options_competing_files') workflow = self.create_workflow('enum_options_competing_files') processor = WorkflowProcessor(workflow) processor.do_engine_steps() task = processor.get_ready_user_tasks()[0] task.data = {"type": "animals"} processor.complete_task(task) processor.do_engine_steps() task = processor.get_ready_user_tasks()[0] results = LookupService.lookup(workflow, task.task_spec.name, "selectedItem", "", value="pigs", limit=10) self.assertEqual( 1, len(results), "It is possible to find an item based on the id, rather than as a search" ) self.assertIsNotNone(results[0]) results = LookupService.lookup(workflow, task.task_spec.name, "selectedItem", "", value="apples", limit=10) self.assertEqual( 0, len(results), "We shouldn't find our fruits mixed in with our animals.") processor = WorkflowProcessor.reset(workflow, clear_data=True) processor.do_engine_steps() task = processor.get_ready_user_tasks()[0] task.data = {"type": "fruits"} processor.complete_task(task) processor.do_engine_steps() task = processor.get_ready_user_tasks()[0] results = LookupService.lookup(workflow, task.task_spec.name, "selectedItem", "", value="apples", limit=10) self.assertEqual( 1, len(results), "It is possible to find an item based on the id, rather than as a search" ) self.assertIsNotNone(results[0]) results = LookupService.lookup(workflow, task.task_spec.name, "selectedItem", "", value="pigs", limit=10) self.assertEqual( 0, len(results), "We shouldn't find our animals mixed in with our fruits.")
def do_task(self, task, study_id, workflow_id, *args, **kwargs): if 'reset_id' in kwargs.keys(): reset_id = kwargs['reset_id'] workflow_spec: WorkflowSpecModel = session.query( WorkflowSpecModel).filter_by(id=reset_id).first() if workflow_spec: workflow_model: WorkflowModel = session.query( WorkflowModel).filter_by(workflow_spec_id=workflow_spec.id, study_id=study_id).first() if workflow_model: workflow_processor = WorkflowProcessor.reset( workflow_model, clear_data=False, delete_files=False) return workflow_processor else: raise ApiError(code='missing_workflow_model', message=f'No WorkflowModel returned. \ workflow_spec_id: {workflow_spec.id} \ study_id: {study_id}') else: raise ApiError(code='missing_workflow_spec', message=f'No WorkflowSpecModel returned. \ id: {workflow_id}') else: raise ApiError(code='missing_workflow_id', message='Reset workflow requires a workflow id')
def test_updates_to_file_cause_lookup_rebuild(self): spec = BaseTest.load_test_spec('enum_options_with_search') workflow = self.create_workflow('enum_options_with_search') file_model = session.query(FileModel).filter( FileModel.name == "sponsors.xlsx").first() LookupService.lookup(workflow, "Task_Enum_Lookup", "sponsor", "sam", limit=10) lookup_records = session.query(LookupFileModel).all() self.assertIsNotNone(lookup_records) self.assertEqual(1, len(lookup_records)) lookup_record = lookup_records[0] lookup_data = session.query(LookupDataModel).filter( LookupDataModel.lookup_file_model == lookup_record).all() self.assertEqual(28, len(lookup_data)) # Update the workflow specification file. file_path = os.path.join(app.root_path, '..', 'tests', 'data', 'enum_options_with_search', 'sponsors_modified.xlsx') file = open(file_path, 'rb') if file_model.workflow_spec_id is not None: workflow_spec_model = session.query(WorkflowSpecModel).filter( WorkflowSpecModel.id == file_model.workflow_spec_id).first() SpecFileService().update_spec_file_data(workflow_spec_model, file_model.name, file.read()) elif file_model.is_reference: ReferenceFileService().update_reference_file( file_model, file.read()) else: FileService.update_file(file_model, file.read(), CONTENT_TYPES['xlsx']) file.close() # restart the workflow, so it can pick up the changes. processor = WorkflowProcessor.reset(workflow) workflow = processor.workflow_model LookupService.lookup(workflow, "Task_Enum_Lookup", "sponsor", "sam", limit=10) lookup_records = session.query(LookupFileModel).all() lookup_record = lookup_records[0] lookup_data = session.query(LookupDataModel).filter( LookupDataModel.lookup_file_model == lookup_record).all() self.assertEqual(4, len(lookup_data))
def test_hard_reset(self): self.load_example_data() # Start the two_forms workflow, and enter some data in the first form. study = session.query(StudyModel).first() workflow_spec_model = self.load_test_spec("two_forms") processor = self.get_processor(study, workflow_spec_model) processor.do_engine_steps() self.assertEqual(processor.workflow_model.workflow_spec_id, workflow_spec_model.id) task = processor.next_task() task.data = {"color": "blue"} processor.complete_task(task) next_task = processor.next_task() self.assertEqual("Step 2", next_task.task_spec.description) # Modify the specification, with a major change that alters the flow and can't be serialized effectively. file_path = os.path.join(app.root_path, '..', 'tests', 'data', 'two_forms', 'modified', 'two_forms_struc_mod.bpmn') self.replace_file("two_forms.bpmn", file_path) # Assure that creating a new processor doesn't cause any issues, and maintains the spec version. processor.workflow_model.bpmn_workflow_json = processor.serialize() db.session.add(processor.workflow_model) ## Assure this isn't transient, which was causing some errors. self.assertIsNotNone(processor.workflow_model.bpmn_workflow_json) processor2 = WorkflowProcessor(processor.workflow_model) # self.assertFalse(processor2.is_latest_spec) # Still at version 1. # Do a hard reset, which should bring us back to the beginning, but retain the data. processor2 = WorkflowProcessor.reset(processor2.workflow_model) processor3 = WorkflowProcessor(processor.workflow_model) processor3.do_engine_steps() self.assertEqual("Step 1", processor3.next_task().task_spec.description) # self.assertTrue(processor3.is_latest_spec) # Now at version 2. task = processor3.next_task() task.data = {"color": "blue"} processor3.complete_task(task) self.assertEqual("New Step", processor3.next_task().task_spec.description) self.assertEqual("blue", processor3.next_task().data["color"])