Merge pull request #333 from sartography/check-study-script-273
Check study script #273
This commit is contained in:
commit
2ed436327f
|
@ -63,6 +63,7 @@ PB_REQUIRED_DOCS_URL = environ.get('PB_REQUIRED_DOCS_URL', default=PB_BASE_URL +
|
||||||
PB_STUDY_DETAILS_URL = environ.get('PB_STUDY_DETAILS_URL', default=PB_BASE_URL + "study?studyid=%i")
|
PB_STUDY_DETAILS_URL = environ.get('PB_STUDY_DETAILS_URL', default=PB_BASE_URL + "study?studyid=%i")
|
||||||
PB_SPONSORS_URL = environ.get('PB_SPONSORS_URL', default=PB_BASE_URL + "sponsors?studyid=%i")
|
PB_SPONSORS_URL = environ.get('PB_SPONSORS_URL', default=PB_BASE_URL + "sponsors?studyid=%i")
|
||||||
PB_IRB_INFO_URL = environ.get('PB_IRB_INFO_URL', default=PB_BASE_URL + "current_irb_info/%i")
|
PB_IRB_INFO_URL = environ.get('PB_IRB_INFO_URL', default=PB_BASE_URL + "current_irb_info/%i")
|
||||||
|
PB_CHECK_STUDY_URL = environ.get('PB_CHECK_STUDY_URL', default=PB_BASE_URL + "check_study/%i")
|
||||||
|
|
||||||
# Ldap Configuration
|
# Ldap Configuration
|
||||||
LDAP_URL = environ.get('LDAP_URL', default="ldap.virginia.edu").strip('/') # No trailing slash or http://
|
LDAP_URL = environ.get('LDAP_URL', default="ldap.virginia.edu").strip('/') # No trailing slash or http://
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
from crc.scripts.script import Script
|
||||||
|
from crc.api.common import ApiError
|
||||||
|
from crc.services.protocol_builder import ProtocolBuilderService
|
||||||
|
from crc.services.study_service import StudyService
|
||||||
|
|
||||||
|
|
||||||
|
class CheckStudy(Script):
|
||||||
|
|
||||||
|
pb = ProtocolBuilderService()
|
||||||
|
|
||||||
|
def get_description(self):
|
||||||
|
return """Returns the Check Study data for a Study"""
|
||||||
|
|
||||||
|
def do_task_validate_only(self, task, study_id, workflow_id, *args, **kwargs):
|
||||||
|
study = StudyService.get_study(study_id)
|
||||||
|
if study:
|
||||||
|
return {"DETAIL": "Passed validation.", "STATUS": "No Error"}
|
||||||
|
else:
|
||||||
|
raise ApiError.from_task(code='bad_study',
|
||||||
|
message=f'No study for study_id {study_id}',
|
||||||
|
task=task)
|
||||||
|
|
||||||
|
def do_task(self, task, study_id, workflow_id, *args, **kwargs):
|
||||||
|
check_study = self.pb.check_study(study_id)
|
||||||
|
if check_study:
|
||||||
|
return check_study
|
||||||
|
else:
|
||||||
|
raise ApiError.from_task(code='missing_check_study',
|
||||||
|
message='There was a problem checking information for this study.',
|
||||||
|
task=task)
|
|
@ -15,6 +15,7 @@ class ProtocolBuilderService(object):
|
||||||
STUDY_DETAILS_URL = app.config['PB_STUDY_DETAILS_URL']
|
STUDY_DETAILS_URL = app.config['PB_STUDY_DETAILS_URL']
|
||||||
SPONSORS_URL = app.config['PB_SPONSORS_URL']
|
SPONSORS_URL = app.config['PB_SPONSORS_URL']
|
||||||
IRB_INFO_URL = app.config['PB_IRB_INFO_URL']
|
IRB_INFO_URL = app.config['PB_IRB_INFO_URL']
|
||||||
|
CHECK_STUDY_URL = app.config['PB_CHECK_STUDY_URL']
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def is_enabled():
|
def is_enabled():
|
||||||
|
@ -64,6 +65,10 @@ class ProtocolBuilderService(object):
|
||||||
def get_sponsors(study_id) -> {}:
|
def get_sponsors(study_id) -> {}:
|
||||||
return ProtocolBuilderService.__make_request(study_id, ProtocolBuilderService.SPONSORS_URL)
|
return ProtocolBuilderService.__make_request(study_id, ProtocolBuilderService.SPONSORS_URL)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def check_study(study_id) -> {}:
|
||||||
|
return ProtocolBuilderService.__make_request(study_id, ProtocolBuilderService.CHECK_STUDY_URL)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def __enabled_or_raise():
|
def __enabled_or_raise():
|
||||||
if not ProtocolBuilderService.is_enabled():
|
if not ProtocolBuilderService.is_enabled():
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_3fd9241" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.0.0-dev">
|
||||||
|
<bpmn:process id="Process_9d7b2c2" isExecutable="true">
|
||||||
|
<bpmn:startEvent id="StartEvent_1">
|
||||||
|
<bpmn:outgoing>Flow_17nzcku</bpmn:outgoing>
|
||||||
|
</bpmn:startEvent>
|
||||||
|
<bpmn:sequenceFlow id="Flow_17nzcku" sourceRef="StartEvent_1" targetRef="Activity_GetCheckStudy" />
|
||||||
|
<bpmn:scriptTask id="Activity_GetCheckStudy" name="Get Check Study">
|
||||||
|
<bpmn:incoming>Flow_17nzcku</bpmn:incoming>
|
||||||
|
<bpmn:outgoing>Flow_0oozrfg</bpmn:outgoing>
|
||||||
|
<bpmn:script>check_study = check_study()</bpmn:script>
|
||||||
|
</bpmn:scriptTask>
|
||||||
|
<bpmn:sequenceFlow id="Flow_0oozrfg" sourceRef="Activity_GetCheckStudy" targetRef="Activity_DisplayCheckStudy" />
|
||||||
|
<bpmn:manualTask id="Activity_DisplayCheckStudy" name="Display Check Study">
|
||||||
|
<bpmn:documentation># Check Study
|
||||||
|
<div><span>{{check_study}}</span></div></bpmn:documentation>
|
||||||
|
<bpmn:incoming>Flow_0oozrfg</bpmn:incoming>
|
||||||
|
<bpmn:outgoing>Flow_10sc31i</bpmn:outgoing>
|
||||||
|
</bpmn:manualTask>
|
||||||
|
<bpmn:endEvent id="Event_0embsc7">
|
||||||
|
<bpmn:incoming>Flow_10sc31i</bpmn:incoming>
|
||||||
|
</bpmn:endEvent>
|
||||||
|
<bpmn:sequenceFlow id="Flow_10sc31i" sourceRef="Activity_DisplayCheckStudy" targetRef="Event_0embsc7" />
|
||||||
|
</bpmn:process>
|
||||||
|
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
|
||||||
|
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_9d7b2c2">
|
||||||
|
<bpmndi:BPMNEdge id="Flow_10sc31i_di" bpmnElement="Flow_10sc31i">
|
||||||
|
<di:waypoint x="530" y="177" />
|
||||||
|
<di:waypoint x="592" y="177" />
|
||||||
|
</bpmndi:BPMNEdge>
|
||||||
|
<bpmndi:BPMNEdge id="Flow_0oozrfg_di" bpmnElement="Flow_0oozrfg">
|
||||||
|
<di:waypoint x="370" y="177" />
|
||||||
|
<di:waypoint x="430" y="177" />
|
||||||
|
</bpmndi:BPMNEdge>
|
||||||
|
<bpmndi:BPMNEdge id="Flow_17nzcku_di" bpmnElement="Flow_17nzcku">
|
||||||
|
<di:waypoint x="215" y="177" />
|
||||||
|
<di:waypoint x="270" y="177" />
|
||||||
|
</bpmndi:BPMNEdge>
|
||||||
|
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
|
||||||
|
<dc:Bounds x="179" y="159" width="36" height="36" />
|
||||||
|
</bpmndi:BPMNShape>
|
||||||
|
<bpmndi:BPMNShape id="Activity_1f9d5ew_di" bpmnElement="Activity_GetCheckStudy">
|
||||||
|
<dc:Bounds x="270" y="137" width="100" height="80" />
|
||||||
|
</bpmndi:BPMNShape>
|
||||||
|
<bpmndi:BPMNShape id="Activity_01vscea_di" bpmnElement="Activity_DisplayCheckStudy">
|
||||||
|
<dc:Bounds x="430" y="137" width="100" height="80" />
|
||||||
|
</bpmndi:BPMNShape>
|
||||||
|
<bpmndi:BPMNShape id="Event_0embsc7_di" bpmnElement="Event_0embsc7">
|
||||||
|
<dc:Bounds x="592" y="159" width="36" height="36" />
|
||||||
|
</bpmndi:BPMNShape>
|
||||||
|
</bpmndi:BPMNPlane>
|
||||||
|
</bpmndi:BPMNDiagram>
|
||||||
|
</bpmn:definitions>
|
|
@ -0,0 +1,3 @@
|
||||||
|
[
|
||||||
|
{"DETAIL": "Passed validation.", "STATUS": "No Error"}
|
||||||
|
]
|
|
@ -0,0 +1,25 @@
|
||||||
|
from tests.base_test import BaseTest
|
||||||
|
from crc import app
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
|
||||||
|
class TestCheckStudy(BaseTest):
|
||||||
|
|
||||||
|
def test_check_study_script_validation(self):
|
||||||
|
self.load_example_data()
|
||||||
|
spec_model = self.load_test_spec('check_study_script')
|
||||||
|
rv = self.app.get('/v1.0/workflow-specification/%s/validate' % spec_model.id, headers=self.logged_in_headers())
|
||||||
|
self.assertEqual([], rv.json)
|
||||||
|
|
||||||
|
@patch('crc.services.protocol_builder.requests.get')
|
||||||
|
def test_check_study(self, mock_get):
|
||||||
|
app.config['PB_ENABLED'] = True
|
||||||
|
app.config['PB_ENABLED'] = True
|
||||||
|
mock_get.return_value.ok = True
|
||||||
|
mock_get.return_value.text = self.protocol_builder_response('check_study.json')
|
||||||
|
workflow = self.create_workflow('check_study_script')
|
||||||
|
workflow_api = self.get_workflow_api(workflow)
|
||||||
|
task = workflow_api.next_task
|
||||||
|
|
||||||
|
self.assertIn('DETAIL', task.documentation)
|
||||||
|
self.assertIn('STATUS', task.documentation)
|
|
@ -72,3 +72,13 @@ class TestProtocolBuilder(BaseTest):
|
||||||
self.assertEqual('IRB Event 1', response[0]["IRBEVENT"])
|
self.assertEqual('IRB Event 1', response[0]["IRBEVENT"])
|
||||||
self.assertEqual('IRB Event 2', response[1]["IRBEVENT"])
|
self.assertEqual('IRB Event 2', response[1]["IRBEVENT"])
|
||||||
self.assertEqual('IRB Event 3', response[2]["IRBEVENT"])
|
self.assertEqual('IRB Event 3', response[2]["IRBEVENT"])
|
||||||
|
|
||||||
|
@patch('crc.services.protocol_builder.requests.get')
|
||||||
|
def test_check_study(self, mock_get):
|
||||||
|
app.config['PB_ENABLED'] = True
|
||||||
|
mock_get.return_value.ok = True
|
||||||
|
mock_get.return_value.text = self.protocol_builder_response('check_study.json')
|
||||||
|
response = ProtocolBuilderService.check_study(self.test_study_id)
|
||||||
|
self.assertIsNotNone(response)
|
||||||
|
self.assertIn('DETAIL', response[0].keys())
|
||||||
|
self.assertIn('STATUS', response[0].keys())
|
||||||
|
|
Loading…
Reference in New Issue