diff --git a/crc/scripts/study_sponsors.py b/crc/scripts/study_sponsors.py new file mode 100644 index 00000000..90231472 --- /dev/null +++ b/crc/scripts/study_sponsors.py @@ -0,0 +1,70 @@ +import json + +from crc.api.common import ApiError +from crc.scripts.script import Script +from crc.services.protocol_builder import ProtocolBuilderService + + +class StudySponsors(Script): + """Please see the detailed description that is provided below. """ + + pb = ProtocolBuilderService() + + # This is used for test/workflow validation, as well as documentation. + example_data = [ + { + "COMMONRULEAGENCY": None, + "SPONSOR_ID": 2453, + "SP_NAME": "Abbott Ltd", + "SP_TYPE": "Private", + "SP_TYPE_GROUP_NAME": None, + "SS_STUDY": 2 + }, + { + "COMMONRULEAGENCY": None, + "SPONSOR_ID": 2387, + "SP_NAME": "Abbott-Price", + "SP_TYPE": "Incoming Sub Award", + "SP_TYPE_GROUP_NAME": "Government", + "SS_STUDY": 2 + }, + { + "COMMONRULEAGENCY": None, + "SPONSOR_ID": 1996, + "SP_NAME": "Abernathy-Heidenreich", + "SP_TYPE": "Foundation/Not for Profit", + "SP_TYPE_GROUP_NAME": "Other External Funding", + "SS_STUDY": 2 + } + ] + + def example_to_string(self, key): + return json.dumps(self.example_data['StudyInfo'][key], indent=2, separators=(',', ': ')) + + def get_description(self): + return "" +# return """ +# Returns a list of sponsors related to a study in the following format: +# {{example}} +#z """.format(example=json.dumps(self.example_data, index=2, separators=(',', ': '))) + + def check_args(self, args): + if len(args) > 0: + raise ApiError(code="invalid_argument", + message="The Sponsor script does not take any arguments. " + "It returns the list of sponsors for the current study only. ") + + def do_task_validate_only(self, task, study_id, workflow_id, *args, **kwargs): + """For validation only, pretend no results come back from pb""" + self.check_args(args) + return self.example_data + + def do_task(self, task, study_id, workflow_id, *args, **kwargs): + self.check_args(args) + retval = ProtocolBuilderService.get_sponsors(study_id) + # Check on returning box, as in return Box(retval) - may not work with list. + return retval + + + + diff --git a/crc/services/protocol_builder.py b/crc/services/protocol_builder.py index f4984435..c61ef1b4 100644 --- a/crc/services/protocol_builder.py +++ b/crc/services/protocol_builder.py @@ -13,6 +13,7 @@ class ProtocolBuilderService(object): INVESTIGATOR_URL = app.config['PB_INVESTIGATORS_URL'] REQUIRED_DOCS_URL = app.config['PB_REQUIRED_DOCS_URL'] STUDY_DETAILS_URL = app.config['PB_STUDY_DETAILS_URL'] + SPONSORS_URL = app.config['PB_STUDY_DETAILS_URL'] @staticmethod def is_enabled(): @@ -54,6 +55,10 @@ class ProtocolBuilderService(object): def get_study_details(study_id) -> {}: return ProtocolBuilderService.__make_request(study_id, ProtocolBuilderService.STUDY_DETAILS_URL) + @staticmethod + def get_sponsors(study_id) -> {}: + return ProtocolBuilderService.__make_request(study_id, ProtocolBuilderService.SPONSORS_URL) + @staticmethod def __enabled_or_raise(): if not ProtocolBuilderService.is_enabled(): diff --git a/tests/data/pb_responses/sponsors.json b/tests/data/pb_responses/sponsors.json new file mode 100644 index 00000000..964847c6 --- /dev/null +++ b/tests/data/pb_responses/sponsors.json @@ -0,0 +1,26 @@ +[ + { + "COMMONRULEAGENCY": null, + "SPONSOR_ID": 2453, + "SP_NAME": "Abbott Ltd", + "SP_TYPE": "Private", + "SP_TYPE_GROUP_NAME": null, + "SS_STUDY": 2 + }, + { + "COMMONRULEAGENCY": null, + "SPONSOR_ID": 2387, + "SP_NAME": "Abbott-Price", + "SP_TYPE": "Incoming Sub Award", + "SP_TYPE_GROUP_NAME": "Government", + "SS_STUDY": 2 + }, + { + "COMMONRULEAGENCY": null, + "SPONSOR_ID": 1996, + "SP_NAME": "Abernathy-Heidenreich", + "SP_TYPE": "Foundation/Not for Profit", + "SP_TYPE_GROUP_NAME": "Other External Funding", + "SS_STUDY": 2 + } +] \ No newline at end of file diff --git a/tests/data/study_sponsors.bpmn b/tests/data/study_sponsors.bpmn new file mode 100644 index 00000000..966ca8ea --- /dev/null +++ b/tests/data/study_sponsors.bpmn @@ -0,0 +1,39 @@ + + + + + SequenceFlow_1nfe5m9 + + + + SequenceFlow_1nfe5m9 + SequenceFlow_1bqiin0 + sponsors = study_sponsors() + + + + SequenceFlow_1bqiin0 + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/study_sponsors/study_sponsors.bpmn b/tests/data/study_sponsors/study_sponsors.bpmn new file mode 100644 index 00000000..966ca8ea --- /dev/null +++ b/tests/data/study_sponsors/study_sponsors.bpmn @@ -0,0 +1,39 @@ + + + + + SequenceFlow_1nfe5m9 + + + + SequenceFlow_1nfe5m9 + SequenceFlow_1bqiin0 + sponsors = study_sponsors() + + + + SequenceFlow_1bqiin0 + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/study/test_study_sponsors_script.py b/tests/study/test_study_sponsors_script.py new file mode 100644 index 00000000..d9efd5d6 --- /dev/null +++ b/tests/study/test_study_sponsors_script.py @@ -0,0 +1,39 @@ +from unittest.mock import patch + +from tests.base_test import BaseTest + +from crc import session, app +from crc.models.study import StudyModel +from crc.scripts.study_sponsors import StudySponsors +from crc.services.study_service import StudyService +from crc.services.workflow_processor import WorkflowProcessor +from crc.services.workflow_service import WorkflowService + +class TestSudySponsorsScript(BaseTest): + test_uid = "dhf8r" + test_study_id = 1 + + def test_study_sponsors_script_validation(self): + self.load_test_spec("study_sponsors") + WorkflowService.test_spec("study_sponsors") # This would raise errors if it didn't validate + + + @patch('crc.services.protocol_builder.requests.get') + def test_study_sponsors_script(self, mock_get): + + mock_get.return_value.ok = True + mock_get.return_value.text = self.protocol_builder_response('sponsors.json') + app.config['PB_ENABLED'] = True + + self.load_example_data() + self.create_reference_document() + study = session.query(StudyModel).first() + workflow_spec_model = self.load_test_spec("study_sponsors") + workflow_model = StudyService._create_workflow_model(study, workflow_spec_model) + WorkflowService.test_spec("study_sponsors") + processor = WorkflowProcessor(workflow_model) + processor.do_engine_steps() + self.assertTrue(processor.bpmn_workflow.is_completed()) + data = processor.next_task().data + self.assertIn('sponsors', data) + self.assertEquals(3, len(data['sponsors']))