cr-connect-workflow/crc/scripts/required_docs.py

80 lines
3.1 KiB
Python

from pandas import ExcelFile
from crc import session, ma
from crc.api.common import ApiError
from crc.models.study import StudyModel, StudyModelSchema
from crc.scripts.script import Script, ScriptValidationError
from crc.services.file_service import FileService
from crc.services.protocol_builder import ProtocolBuilderService
class RequiredDocs(Script):
"""Provides information about the documents required by Protocol Builder."""
pb = ProtocolBuilderService()
def get_description(self):
return """
Provides detailed information about the documents required by the Protocol Builder.
Makes an immediate call to the IRB Protocol Builder API to get a list of currently required
documents. It then collects all the information in a reference file called 'irb_pro_categories.xls',
if the Id from Protocol Builder matches an Id in this table, all data available in that row
is also provided.
This place a dictionary of values in the current task, where the key is the numeric id.
For example:
``` "required_docs" :
{
6: {
"name": "Cancer Center's PRC Approval Form",
"category1": "UVA Compliance",
"category2": "PRC Approval",
"category3": "",
"Who Uploads?": "CRC",
"required": True,
"upload_count": 0
},
24: { ...
}
```
"""
def do_task(self, task, study_id, *args, **kwargs):
"""Takes data from the protocol builder, and merges it with data from the IRB Pro Categories
spreadsheet to return pertinent details about the required documents."""
self.get_required_docs(study_id)
task.data["required_docs"] = self.get_required_docs(study_id)
def get_required_docs(self, study_id):
"""Takes data from the protocol builder, and merges it with data from the IRB Pro Categories spreadsheet to return
pertinant details about the required documents."""
pb_docs = self.pb.get_required_docs(study_id)
doc_dictionary = FileService.get_file_reference_dictionary()
required_docs = {}
for doc in pb_docs:
id = int(doc.AUXDOCID)
required_doc = {'id': id, 'name': doc.AUXDOC, 'required': True,
'count': 0}
if id in doc_dictionary:
required_doc = {**required_doc, **doc_dictionary[id]}
required_doc['count'] = self.get_count(study_id, doc_dictionary[id]["Code"])
required_docs[id] = required_doc
return required_docs
def get_count(self, study_id, irb_doc_code):
"""Returns the total number of documents that have been uploaded that match
the given document id. """
return(len(FileService.get_files(study_id=study_id, irb_doc_code=irb_doc_code)))
# Verifies that information is available for this script task to function
# correctly. Returns a list of validation errors.
@staticmethod
def validate():
errors = []
try:
dict = FileService.get_file_reference_dictionary()
except ApiError as ae:
errors.append(ScriptValidationError.from_api_error(ae))
return errors