From 796c109611682e73f3693300f2e561ea37f5b89c Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Thu, 23 Apr 2020 14:40:05 -0400 Subject: [PATCH] Adds approvals to study service --- crc/scripts/study_info.py | 7 +++++-- crc/services/study_service.py | 23 +++++++++++++++++++++++ tests/test_study_service.py | 10 +++++++++- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/crc/scripts/study_info.py b/crc/scripts/study_info.py index 5d5adc3a..d82c485c 100644 --- a/crc/scripts/study_info.py +++ b/crc/scripts/study_info.py @@ -6,6 +6,7 @@ from crc.models.study import StudyModel, StudySchema from crc.scripts.script import Script from crc.services.ldap_service import LdapService from crc.services.protocol_builder import ProtocolBuilderService +from crc.services.study_service import StudyService from crc.services.workflow_processor import WorkflowProcessor @@ -13,7 +14,7 @@ class StudyInfo(Script): """Just your basic class that can pull in data from a few api endpoints and do a basic task.""" pb = ProtocolBuilderService() - type_options = ['info', 'investigators', 'details'] + type_options = ['info', 'investigators', 'details', 'approvals'] def get_description(self): return """StudyInfo [TYPE], where TYPE is one of 'info', 'investigators', or 'details' @@ -68,6 +69,8 @@ class StudyInfo(Script): self.add_data_to_task(task, {cmd: self.organize_investigators_by_type(pb_response)}) if cmd == 'details': self.add_data_to_task(task, {cmd: self.pb.get_study_details(study_id)}) + if cmd == 'approvals': + self.add_data_to_task(task, {cmd: StudyService().get_approvals(study_id)}) task.data["study"] = study_info @@ -96,4 +99,4 @@ class StudyInfo(Script): return {} except LDAPSocketOpenError: app.logger.info("Failed to connect to LDAP Server.") - return {} \ No newline at end of file + return {} diff --git a/crc/services/study_service.py b/crc/services/study_service.py index 35b7c42d..41dce476 100644 --- a/crc/services/study_service.py +++ b/crc/services/study_service.py @@ -62,6 +62,29 @@ class StudyService(object): categories.append(Category(cat_model)) return categories + @staticmethod + def get_approvals(study_id): + """Returns a list of category objects, in the correct order.""" + cat = session.query(WorkflowSpecCategoryModel).filter_by(name="approvals").first() + specs = session.query(WorkflowSpecModel).filter_by(category_id=cat.id).all() + spec_ids = [spec.id for spec in specs] + workflows = session.query(WorkflowModel)\ + .filter(WorkflowModel.study_id == study_id)\ + .filter(WorkflowModel.workflow_spec_id.in_(spec_ids))\ + .all() + + approvals = [] + for workflow in workflows: + workflow: WorkflowModel = workflow + approvals.append({ + 'id': workflow.id, + 'display_name': workflow.workflow_spec.display_name, + 'name': workflow.workflow_spec.display_name, + 'status': workflow.status, + 'workflow_spec_id': workflow.workflow_spec_id, + }) + return approvals + @staticmethod def synch_all_studies_with_protocol_builder(user): """Assures that the studies we have locally for the given user are diff --git a/tests/test_study_service.py b/tests/test_study_service.py index 8ab54faa..9d967c5c 100644 --- a/tests/test_study_service.py +++ b/tests/test_study_service.py @@ -30,10 +30,14 @@ class TestStudyService(BaseTest): db.session.add(user) db.session.commit() study = StudyModel(title="My title", protocol_builder_status=ProtocolBuilderStatus.ACTIVE, user_uid=user.uid) - cat = WorkflowSpecCategoryModel(name="cat", display_name="cat", display_order=0) + cat = WorkflowSpecCategoryModel(name="approvals", display_name="Approvals", display_order=0) db.session.add_all([study, cat]) db.session.commit() + + self.assertIsNotNone(cat.id) self.load_test_spec("random_fact", category_id=cat.id) + + self.assertIsNotNone(study.id) workflow = WorkflowModel(workflow_spec_id="random_fact", study_id=study.id, status=WorkflowStatus.not_started) db.session.add(workflow) db.session.commit() @@ -74,3 +78,7 @@ class TestStudyService(BaseTest): studies = StudyService.get_studies_for_user(user) workflow = next(iter(studies[0].categories[0].workflows)) # Workflows is a set. self.assertEqual(1, workflow.completed_tasks) + + # Get approvals + approvals = StudyService.get_approvals(studies[0].id) + self.assertGreater(len(approvals), 0)