Ejemplo n.º 1
0
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.")
Ejemplo n.º 3
0
    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"])