mirror of
https://github.com/sartography/protocol-builder-mock.git
synced 2025-01-12 00:34:44 +00:00
e4d5babee8
The name of the "Radioactive Material Use Approval” was changed to “Radiopharmaceuticals Use Approval” due to an IRB name change.
499 lines
24 KiB
Python
499 lines
24 KiB
Python
from marshmallow import fields
|
||
from sqlalchemy import func
|
||
from pb import db, ma
|
||
from marshmallow_sqlalchemy import SQLAlchemySchema
|
||
from sqlalchemy.orm import backref, dynamic
|
||
|
||
|
||
class Sponsor(db.Model):
|
||
SPONSOR_ID = db.Column(db.Integer, primary_key=True)
|
||
SP_NAME = db.Column(db.String, nullable=True)
|
||
SP_MAILING_ADDRESS = db.Column(db.String, nullable=True)
|
||
SP_PHONE = db.Column(db.String, nullable=True)
|
||
SP_FAX = db.Column(db.String, nullable=True)
|
||
SP_EMAIL = db.Column(db.String, nullable=True)
|
||
SP_HOMEPAGE = db.Column(db.String, nullable=True)
|
||
COMMONRULEAGENCY = db.Column(db.Boolean, nullable=True)
|
||
SP_TYPE = db.Column(db.String, nullable=True)
|
||
SP_TYPE_GROUP_NAME = db.Column(db.String, nullable=True)
|
||
|
||
@staticmethod
|
||
def all_types():
|
||
types = [
|
||
Sponsor(SP_TYPE="Federal", SP_TYPE_GROUP_NAME="Government"),
|
||
Sponsor(SP_TYPE="Foundation/Not for Profit", SP_TYPE_GROUP_NAME="Other External Funding"),
|
||
Sponsor(SP_TYPE="Incoming Sub Award", SP_TYPE_GROUP_NAME="Government"),
|
||
Sponsor(SP_TYPE="Industry", SP_TYPE_GROUP_NAME="Industry"),
|
||
Sponsor(SP_TYPE="Internal/Departmental/Gift", SP_TYPE_GROUP_NAME="Internal Funding"),
|
||
Sponsor(SP_TYPE="No Funding", SP_TYPE_GROUP_NAME="Internal Funding"),
|
||
Sponsor(SP_TYPE="Other Colleges and Universities", SP_TYPE_GROUP_NAME="Other External Funding"),
|
||
Sponsor(SP_TYPE="State", SP_TYPE_GROUP_NAME="Government"),
|
||
]
|
||
return types
|
||
|
||
@staticmethod
|
||
def get_type_group_name(type_code):
|
||
for t in Sponsor.all_types():
|
||
if t.SP_TYPE == type_code:
|
||
return t.SP_TYPE_GROUP_NAME
|
||
|
||
|
||
class SponsorSchema(ma.Schema):
|
||
class Meta:
|
||
fields = ("SPONSOR_ID", "SP_NAME", "SP_MAILING_ADDRESS",
|
||
"SP_PHONE", "SP_FAX", "SP_EMAIL", "SP_HOMEPAGE",
|
||
"COMMONRULEAGENCY", "SP_TYPE")
|
||
|
||
|
||
class StudySponsor(db.Model):
|
||
id = db.Column(db.Integer, primary_key=True)
|
||
SS_STUDY = db.Column(db.Integer, db.ForeignKey('study.STUDYID'))
|
||
SPONSOR_ID = db.Column(db.Integer, db.ForeignKey('sponsor.SPONSOR_ID'))
|
||
study = db.relationship("Study", back_populates="sponsors")
|
||
sponsor = db.relationship("Sponsor")
|
||
|
||
|
||
class StudySponsorSchema(ma.Schema):
|
||
|
||
class Meta:
|
||
fields = ("SS_STUDY", "SPONSOR_ID", "SP_NAME", "SP_TYPE", "SP_TYPE_GROUP_NAME", "COMMONRULEAGENCY")
|
||
|
||
SP_TYPE = fields.Function(lambda obj: obj.sponsor.SP_TYPE)
|
||
SP_NAME = fields.Function(lambda obj: obj.sponsor.SP_NAME)
|
||
SP_TYPE_GROUP_NAME = fields.Function(lambda obj: obj.sponsor.SP_TYPE_GROUP_NAME)
|
||
COMMONRULEAGENCY = fields.Function(lambda obj: obj.sponsor.COMMONRULEAGENCY)
|
||
|
||
|
||
class Study(db.Model):
|
||
STUDYID = db.Column(db.Integer, primary_key=True)
|
||
TITLE = db.Column(db.Text(), nullable=False)
|
||
NETBADGEID = db.Column(db.String(), nullable=False)
|
||
DATE_MODIFIED = db.Column(db.DateTime(timezone=True), default=func.now())
|
||
Q_COMPLETE = db.relationship("IRBStatus", backref="study", lazy='dynamic')
|
||
irb_info = db.relationship("IRBInfo", backref="study", lazy='dynamic')
|
||
requirements = db.relationship("RequiredDocument", backref="study", lazy='dynamic')
|
||
investigators = db.relationship("Investigator", backref="study", lazy='dynamic')
|
||
study_details = db.relationship("StudyDetails", uselist=False, backref="study")
|
||
sponsors = db.relationship("StudySponsor", back_populates="study", cascade="all, delete, delete-orphan")
|
||
# This is a hack to get PB Mock up and running
|
||
# We need to decide what to do about HSRNUMBER
|
||
# TODO: Resolve HSRNUMBER issue
|
||
HSRNUMBER = "0"
|
||
|
||
|
||
class IRBInfoEvent(db.Model):
|
||
STUDY_ID = db.Column(db.Integer, db.ForeignKey('irb_info.SS_STUDY_ID'), primary_key=True)
|
||
EVENT_ID = db.Column(db.String(), nullable=False, default='')
|
||
EVENT = db.Column(db.String(), nullable=False, default='')
|
||
|
||
@staticmethod
|
||
def all():
|
||
event = [IRBInfoEvent(EVENT_ID='', EVENT=''),
|
||
IRBInfoEvent(EVENT_ID='299', EVENT='PreReview Returned to PI New Protocol'),
|
||
IRBInfoEvent(EVENT_ID='2', EVENT='Pending Full Committee Review'),
|
||
IRBInfoEvent(EVENT_ID='57', EVENT='Approval New Protocol'),
|
||
IRBInfoEvent(EVENT_ID='300', EVENT='Approvable with Conditions-New Protocol'),
|
||
IRBInfoEvent(EVENT_ID='312', EVENT='Condition Response Accepted-New Protocol'),
|
||
IRBInfoEvent(EVENT_ID='316', EVENT='Deferred New Protocol'),
|
||
IRBInfoEvent(EVENT_ID='346', EVENT='Receipt of Non-UVA Study'),
|
||
IRBInfoEvent(EVENT_ID='317', EVENT='Disapproved New Protocol'),
|
||
IRBInfoEvent(EVENT_ID='62', EVENT='Closed by PI'),
|
||
IRBInfoEvent(EVENT_ID='63', EVENT='Receipt of New Protocol'),
|
||
IRBInfoEvent(EVENT_ID='359', EVENT='Administrative Review Complete – Non-UVA IRB')]
|
||
return event
|
||
|
||
|
||
class IRBInfoEventSchema(SQLAlchemySchema):
|
||
class Meta:
|
||
model = IRBInfoEvent
|
||
|
||
|
||
class IRBInfoStatus(db.Model):
|
||
STUDY_ID = db.Column(db.Integer, db.ForeignKey('irb_info.SS_STUDY_ID'), primary_key=True)
|
||
STATUS_ID = db.Column(db.String(), nullable=False, default='')
|
||
STATUS = db.Column(db.String(), nullable=False, default='')
|
||
|
||
@staticmethod
|
||
def all():
|
||
status = [IRBInfoStatus(STATUS_ID='', STATUS=''),
|
||
IRBInfoStatus(STATUS_ID='30', STATUS='In PreReview New Protocol'),
|
||
IRBInfoStatus(STATUS_ID='31', STATUS='PreReview Complete New Protocol'),
|
||
IRBInfoStatus(STATUS_ID='2', STATUS='Open to Enrollment'),
|
||
IRBInfoStatus(STATUS_ID='39', STATUS='Withdrawn'),
|
||
IRBInfoStatus(STATUS_ID='37', STATUS='Disapproved'),
|
||
IRBInfoStatus(STATUS_ID='35', STATUS='Approvable with Conditions')]
|
||
return status
|
||
|
||
|
||
class IRBInfoStatusSchema(SQLAlchemySchema):
|
||
class Meta:
|
||
model = IRBInfoStatus
|
||
|
||
|
||
class IRBInfo(db.Model):
|
||
SS_STUDY_ID = db.Column(db.Integer, db.ForeignKey('study.STUDYID'), primary_key=True)
|
||
UVA_STUDY_TRACKING = db.Column(db.String(), nullable=False, default='')
|
||
DATE_MODIFIED = db.Column(db.Date, nullable=True)
|
||
IRB_ADMINISTRATIVE_REVIEWER = db.Column(db.String(), nullable=False, default='')
|
||
AGENDA_DATE = db.Column(db.Date, nullable=True)
|
||
IRB_REVIEW_TYPE = db.Column(db.String(), nullable=False, default='')
|
||
IRBEVENT = db.relationship("IRBInfoEvent", backref=backref("irb_info_event"), lazy='dynamic')
|
||
IRB_STATUS = db.relationship("IRBInfoStatus", backref=backref("irb_info_status"), lazy='dynamic')
|
||
IRB_OF_RECORD = db.Column(db.String(), nullable=False, default='')
|
||
UVA_IRB_HSR_IS_IRB_OF_RECORD_FOR_ALL_SITES = db.Column(db.Integer(), nullable=True)
|
||
STUDYIRBREVIEWERADMIN = db.Column(db.String(), nullable=False, default='')
|
||
IRB_ONLINE_STATUS = db.Column(db.String(), nullable=True)
|
||
|
||
|
||
class IRBInfoSchema(ma.Schema):
|
||
class Meta:
|
||
model = IRBInfo
|
||
include_relationships = True
|
||
load_instance = True
|
||
fields = ("UVA_STUDY_TRACKING", "DATE_MODIFIED", "IRB_ADMINISTRATIVE_REVIEWER",
|
||
"AGENDA_DATE", "IRB_REVIEW_TYPE", "IRB_OF_RECORD", "IRBEVENT", "IRBEVENT_ID", "IRB_STATUS", "IRB_STATUS_ID",
|
||
"UVA_IRB_HSR_IS_IRB_OF_RECORD_FOR_ALL_SITES", "STUDYIRBREVIEWERADMIN", "STATUS", "DETAIL")
|
||
|
||
IRBEVENT = fields.Method("get_event")
|
||
IRBEVENT_ID = fields.Method("get_event_id")
|
||
IRB_STATUS = fields.Method("get_status")
|
||
IRB_STATUS_ID = fields.Method("get_status_id")
|
||
STATUS = fields.Method("get_online_status")
|
||
DETAIL = fields.Method("get_online_detail")
|
||
|
||
@staticmethod
|
||
def get_event(obj):
|
||
if obj is not None and hasattr(obj, 'IRBEVENT'):
|
||
return obj.IRBEVENT[0].EVENT
|
||
|
||
@staticmethod
|
||
def get_event_id(obj):
|
||
if obj is not None and hasattr(obj, 'IRBEVENT'):
|
||
return obj.IRBEVENT[0].EVENT_ID
|
||
|
||
@staticmethod
|
||
def get_status(obj):
|
||
if obj is not None and hasattr(obj, 'IRB_STATUS'):
|
||
return obj.IRB_STATUS[0].STATUS
|
||
|
||
@staticmethod
|
||
def get_status_id(obj):
|
||
if obj is not None and hasattr(obj, 'IRB_STATUS'):
|
||
return obj.IRB_STATUS[0].STATUS_ID
|
||
|
||
@staticmethod
|
||
def get_online_status(obj):
|
||
if obj is not None and hasattr(obj, 'IRB_ONLINE_STATUS') and obj.IRB_ONLINE_STATUS is not None:
|
||
return obj.IRB_ONLINE_STATUS
|
||
|
||
@staticmethod
|
||
def get_online_detail(obj):
|
||
if obj is not None and hasattr(obj, 'IRB_ONLINE_STATUS') and obj.IRB_ONLINE_STATUS is not None:
|
||
return 'Study downloaded to IRB Online.'
|
||
|
||
|
||
class IRBInfoErrorSchema(ma.Schema):
|
||
class Meta:
|
||
model = IRBInfo
|
||
load_instance = True
|
||
fields = ('STATUS', 'DETAIL')
|
||
|
||
STATUS = fields.Method("get_online_status")
|
||
DETAIL = fields.Method("get_online_detail")
|
||
|
||
@staticmethod
|
||
def get_online_status(obj):
|
||
return 'Error'
|
||
|
||
@staticmethod
|
||
def get_online_detail(obj):
|
||
return 'Study not downloaded to IRB Online.'
|
||
|
||
|
||
class Investigator(db.Model):
|
||
id = db.Column(db.Integer, primary_key=True)
|
||
STUDYID = db.Column(db.Integer, db.ForeignKey('study.STUDYID'))
|
||
NETBADGEID = db.Column(db.String(), nullable=False)
|
||
INVESTIGATORTYPE = db.Column(db.String(), nullable=False)
|
||
INVESTIGATORTYPEFULL = db.Column(db.String(), nullable=False)
|
||
|
||
@staticmethod
|
||
def all_types():
|
||
types = [
|
||
Investigator(INVESTIGATORTYPE="PI", INVESTIGATORTYPEFULL="Primary Investigator"),
|
||
Investigator(INVESTIGATORTYPE="SI", INVESTIGATORTYPEFULL="Sub Investigator"),
|
||
Investigator(INVESTIGATORTYPE="DC", INVESTIGATORTYPEFULL="Department Contact"),
|
||
Investigator(INVESTIGATORTYPE="SC_I", INVESTIGATORTYPEFULL="Study Coordinator 1"),
|
||
Investigator(INVESTIGATORTYPE="SC_II", INVESTIGATORTYPEFULL="Study Coordinator 2"),
|
||
Investigator(INVESTIGATORTYPE="AS_C", INVESTIGATORTYPEFULL="Additional Study Coordinators"),
|
||
Investigator(INVESTIGATORTYPE="DEPT_CH", INVESTIGATORTYPEFULL="Department Chair"),
|
||
Investigator(INVESTIGATORTYPE="IRBC", INVESTIGATORTYPEFULL="IRB Coordinator"),
|
||
]
|
||
return types
|
||
|
||
def set_type(self, type_code):
|
||
self.INVESTIGATORTYPE = type_code
|
||
for t in self.all_types():
|
||
if t.INVESTIGATORTYPE == type_code:
|
||
self.INVESTIGATORTYPEFULL = t.INVESTIGATORTYPEFULL
|
||
|
||
|
||
class InvestigatorSchema(ma.Schema):
|
||
class Meta:
|
||
fields = ("STUDYID", "NETBADGEID", "INVESTIGATORTYPE", "INVESTIGATORTYPEFULL")
|
||
|
||
|
||
class RequiredDocument(db.Model):
|
||
id = db.Column(db.Integer, primary_key=True)
|
||
SS_AUXILIARY_DOC_TYPE_ID = db.Column(db.String(), nullable=False, default="")
|
||
AUXILIARY_DOC = db.Column(db.String(), nullable=False, default="")
|
||
STUDYID = db.Column(db.Integer, db.ForeignKey('study.STUDYID'))
|
||
|
||
@staticmethod
|
||
def all():
|
||
docs = [RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=1, AUXILIARY_DOC="Investigators Brochure"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=2, AUXILIARY_DOC="Screening Log"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=3, AUXILIARY_DOC="Protocol"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=6, AUXILIARY_DOC="Cancer Center's PRC Approval Form"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=7, AUXILIARY_DOC="GCRC Approval Form"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=8, AUXILIARY_DOC="SOM CTO IND/IDE Review Letter"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=9, AUXILIARY_DOC="HIRE Approval"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=10, AUXILIARY_DOC="Cancer Center's PRC Approval Waiver"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=11, AUXILIARY_DOC="HSR Grant"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=12, AUXILIARY_DOC="Certificate of Confidentiality Application"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=14, AUXILIARY_DOC="Institutional Biosafety Committee Approval"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=18, AUXILIARY_DOC="SOM CTO Approval Letter - UVA PI Multisite Trial"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=19, AUXILIARY_DOC="IRB Approval or Letter of Approval from Administration: Send Data or Specimens to UVA"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=20, AUXILIARY_DOC="IRB Approval or Letter of Approval from Administration: Study Conducted at non- UVA Facilities "),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=21, AUXILIARY_DOC="New Medical Device Form"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=22, AUXILIARY_DOC="SOM CTO Review regarding need for IDE"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=23, AUXILIARY_DOC="SOM CTO Review regarding need for IND"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=24, AUXILIARY_DOC="InfoSec Approval"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=25, AUXILIARY_DOC="Scientific Pre-review Documentation"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=26, AUXILIARY_DOC="IBC Number"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=32, AUXILIARY_DOC="IDS - Investigational Drug Service Approval"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=33, AUXILIARY_DOC="Data Security Plan"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=35, AUXILIARY_DOC="Model Consent"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=36, AUXILIARY_DOC="RDRC Approval "),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=39, AUXILIARY_DOC="Age of Majority Cover Letter and Consent"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=40, AUXILIARY_DOC="SBS/IRB Approval-FERPA"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=41, AUXILIARY_DOC="HIRE Standard Radiation Language"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=42, AUXILIARY_DOC="COI Management Plan"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=43, AUXILIARY_DOC="SOM CTO Approval Letter-Non UVA, Non Industry PI MultiSite Study"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=44, AUXILIARY_DOC="GRIME Approval"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=45, AUXILIARY_DOC="GMEC Approval"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=46, AUXILIARY_DOC="IRB Reliance Agreement Request Form- IRB-HSR is IRB of Record"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=47, AUXILIARY_DOC="Non UVA IRB Approval - Initial and Last Continuation"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=48, AUXILIARY_DOC="MR Physicist Approval- Use of Gadolinium"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=49, AUXILIARY_DOC="SOM CTO Approval- Non- UVA Academia PI of IDE"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=51, AUXILIARY_DOC="IDS Waiver"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=52, AUXILIARY_DOC="Package Inserts"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=53, AUXILIARY_DOC="IRB Reliance Agreement Request Form- IRB-HSR Not IRB of Record"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=54, AUXILIARY_DOC="ESCRO Approval"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=56, AUXILIARY_DOC="Unaffiliated Investigator Agreement "),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=57, AUXILIARY_DOC="Laser Safety Officer Approval"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=58, AUXILIARY_DOC="FDA Letter granting IND/IDE# or exemption"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=59, AUXILIARY_DOC="SOM CTO Review for Gene Therapy/Transfer Study"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=60, AUXILIARY_DOC="Recruitment Material"),
|
||
RequiredDocument(SS_AUXILIARY_DOC_TYPE_ID=61, AUXILIARY_DOC="Radiopharmaceuticals Use Approval")]
|
||
return docs
|
||
|
||
|
||
class RequiredDocumentSchema(ma.Schema):
|
||
class Meta:
|
||
fields = ("SS_AUXILIARY_DOC_TYPE_ID", "AUXILIARY_DOC")
|
||
|
||
|
||
class IRBStatus(db.Model):
|
||
STUDYID = db.Column(db.Integer, db.ForeignKey('study.STUDYID'), primary_key=True)
|
||
STATUS = db.Column(db.String(), nullable=False, default="")
|
||
DETAIL = db.Column(db.String(), nullable=False, default="")
|
||
|
||
@staticmethod
|
||
def all():
|
||
status = [IRBStatus(STATUS="Error", DETAIL="Study ID does not exist."),
|
||
IRBStatus(STATUS="Error", DETAIL="General study errors. UVA Study Tracking Number is missing or not formatted correctly."),
|
||
IRBStatus(STATUS="No Error", DETAIL="Passed validation.")]
|
||
return status
|
||
|
||
|
||
class IRBStatusSchema(ma.Schema):
|
||
class Meta:
|
||
fields = ("STATUS", "DETAIL")
|
||
|
||
|
||
class CreatorStudySchema(ma.Schema):
|
||
class Meta:
|
||
model = Study
|
||
include_relationships = True
|
||
load_instance = True
|
||
fields = ["STUDYID", "TITLE", "DATECREATED", "DATELASTMODIFIED", "REVIEW_TYPE"]
|
||
DATECREATED = DATELASTMODIFIED = fields.Method("get_dates")
|
||
REVIEW_TYPE = fields.Method("get_review_type")
|
||
|
||
@staticmethod
|
||
def get_dates(obj):
|
||
if obj is not None and hasattr(obj, "DATE_MODIFIED"):
|
||
return obj.DATE_MODIFIED
|
||
|
||
@staticmethod
|
||
def get_review_type(obj):
|
||
if obj is not None and hasattr(obj, "study_details"):
|
||
return obj.study_details.REVIEW_TYPE
|
||
|
||
|
||
class StudySchema(ma.Schema):
|
||
class Meta:
|
||
include_relationships = True
|
||
load_instance = True
|
||
# Fields to expose
|
||
fields = ("STUDYID", "TITLE", "NETBADGEID",
|
||
"DATE_MODIFIED", "Q_COMPLETE", "HSRNUMBER")
|
||
Q_COMPLETE = fields.Method("get_q_complete")
|
||
# TODO: Resolve HSRNUMBER issue
|
||
# Currently, we set HSRNUMBER to 0 in the model
|
||
|
||
@staticmethod
|
||
def get_q_complete(obj):
|
||
"""Ultimately, this will be calculated based on the contents of Q_COMPLETE.
|
||
For now, we return the contents of Q_COMPLETE"""
|
||
# TODO: Calculate whatever we need to calculate.
|
||
# TODO: Currently, we don't return HSRNUMBER,
|
||
# but we don't currently use it in CR Connect either
|
||
if obj is not None and hasattr(obj, 'Q_COMPLETE'):
|
||
if len(obj.Q_COMPLETE.all()) > 0:
|
||
return {'STATUS': obj.Q_COMPLETE[0].STATUS, 'DETAIL': obj.Q_COMPLETE[0].DETAIL}
|
||
return {}
|
||
|
||
|
||
class StudyDetails(db.Model):
|
||
STUDYID = db.Column(db.Integer, db.ForeignKey('study.STUDYID'), primary_key=True)
|
||
UVA_STUDY_TRACKING = db.Column(db.String, nullable=True)
|
||
IS_IND = db.Column(db.Integer, nullable=True)
|
||
IND_1 = db.Column(db.String, nullable=True)
|
||
IND_2 = db.Column(db.String, nullable=True)
|
||
IND_3 = db.Column(db.String, nullable=True)
|
||
IS_UVA_IND = db.Column(db.Integer, nullable=True)
|
||
IS_IDE = db.Column(db.Integer, nullable=True)
|
||
IS_UVA_IDE = db.Column(db.Integer, nullable=True)
|
||
IDE = db.Column(db.String, nullable=True)
|
||
IS_CHART_REVIEW = db.Column(db.Integer, nullable=True)
|
||
IS_RADIATION = db.Column(db.Integer, nullable=True)
|
||
GCRC_NUMBER = db.Column(db.String, nullable=True)
|
||
IS_GCRC = db.Column(db.Integer, nullable=True)
|
||
IS_PRC_DSMP = db.Column(db.Integer, nullable=True)
|
||
IS_PRC = db.Column(db.Integer, nullable=True)
|
||
PRC_NUMBER = db.Column(db.String, nullable=True)
|
||
IS_IBC = db.Column(db.Integer, nullable=True)
|
||
IBC_NUMBER = db.Column(db.String, nullable=True)
|
||
SPONSORS_PROTOCOL_REVISION_DATE = db.Column(db.Date, nullable=True)
|
||
IS_SPONSOR_MONITORING = db.Column(db.Integer, nullable=True)
|
||
IS_AUX = db.Column(db.Integer, nullable=True)
|
||
IS_SPONSOR = db.Column(db.Integer, nullable=True)
|
||
IS_GRANT = db.Column(db.Integer, nullable=True)
|
||
IS_COMMITTEE_CONFLICT = db.Column(db.Integer, nullable=True)
|
||
DSMB = db.Column(db.String, nullable=True)
|
||
DSMB_FREQUENCY = db.Column(db.Integer, nullable=True)
|
||
IS_DB = db.Column(db.Integer, nullable=True)
|
||
IS_UVA_DB = db.Column(db.Integer, nullable=True)
|
||
IS_CENTRAL_REG_DB = db.Column(db.Integer, nullable=True)
|
||
IS_CONSENT_WAIVER = db.Column(db.Integer, nullable=True)
|
||
IS_HGT = db.Column(db.Integer, nullable=True)
|
||
IS_GENE_TRANSFER = db.Column(db.Integer, nullable=True)
|
||
IS_TISSUE_BANKING = db.Column(db.Integer, nullable=True)
|
||
IS_SURROGATE_CONSENT = db.Column(db.Integer, nullable=True)
|
||
IS_ADULT_PARTICIPANT = db.Column(db.Integer, nullable=True)
|
||
IS_MINOR_PARTICIPANT = db.Column(db.Integer, nullable=True)
|
||
IS_MINOR = db.Column(db.Integer, nullable=True)
|
||
IS_BIOMEDICAL = db.Column(db.Integer, nullable=True)
|
||
IS_QUALITATIVE = db.Column(db.Integer, nullable=True)
|
||
IS_PI_SCHOOL = db.Column(db.Integer, nullable=True)
|
||
IS_PRISONERS_POP = db.Column(db.Integer, nullable=True)
|
||
IS_PREGNANT_POP = db.Column(db.Integer, nullable=True)
|
||
IS_FETUS_POP = db.Column(db.Integer, nullable=True)
|
||
IS_MENTAL_IMPAIRMENT_POP = db.Column(db.Integer, nullable=True)
|
||
IS_ELDERLY_POP = db.Column(db.Integer, nullable=True)
|
||
IS_OTHER_VULNERABLE_POP = db.Column(db.Integer, nullable=True)
|
||
OTHER_VULNERABLE_DESC = db.Column(db.String, nullable=True)
|
||
IS_MULTI_SITE = db.Column(db.Integer, nullable=True)
|
||
IS_UVA_LOCATION = db.Column(db.Integer, nullable=True)
|
||
NON_UVA_LOCATION = db.Column(db.String, nullable=True)
|
||
MULTI_SITE_LOCATIONS = db.Column(db.String, nullable=True)
|
||
IS_OUTSIDE_CONTRACT = db.Column(db.Integer, nullable=True)
|
||
IS_UVA_PI_MULTI = db.Column(db.Integer, nullable=True)
|
||
IS_NOT_PRC_WAIVER = db.Column(db.Integer, nullable=True)
|
||
IS_CANCER_PATIENT = db.Column(db.Integer, nullable=True)
|
||
UPLOAD_COMPLETE = db.Column(db.Integer, nullable=True)
|
||
IS_FUNDING_SOURCE = db.Column(db.Integer, nullable=True)
|
||
IS_PI_INITIATED = db.Column(db.Integer, nullable=True)
|
||
IS_ENGAGED_RESEARCH = db.Column(db.Integer, nullable=True)
|
||
IS_APPROVED_DEVICE = db.Column(db.Integer, nullable=True)
|
||
IS_FINANCIAL_CONFLICT = db.Column(db.Integer, nullable=True)
|
||
IS_NOT_CONSENT_WAIVER = db.Column(db.Integer, nullable=True)
|
||
IS_FOR_CANCER_CENTER = db.Column(db.Integer, nullable=True)
|
||
IS_REVIEW_BY_CENTRAL_IRB = db.Column(db.Integer, nullable=True)
|
||
IRBREVIEWERADMIN = db.Column(db.String, nullable=True)
|
||
IS_SPONSOR_TRACKING = db.Column(db.Integer, nullable=True)
|
||
SPONSOR_TRACKING = db.Column(db.Integer, nullable=True)
|
||
IS_DSMB = db.Column(db.Integer, nullable=True)
|
||
IS_COMPLETE_NON_IRB_REGULATORY = db.Column(db.Integer, nullable=True)
|
||
IS_INSIDE_CONTRACT = db.Column(db.Integer, nullable=True)
|
||
IS_CODED_RESEARCH = db.Column(db.Integer, nullable=True)
|
||
IS_OUTSIDE_SPONSOR = db.Column(db.Integer, nullable=True)
|
||
IS_UVA_COLLABANALYSIS = db.Column(db.Integer, nullable=True)
|
||
REVIEW_TYPE = db.Column(db.Integer, nullable=True)
|
||
REVIEWTYPENAME = db.Column(db.String, nullable=True)
|
||
|
||
|
||
class StudyDetailsSchema(ma.SQLAlchemyAutoSchema):
|
||
class Meta:
|
||
model = StudyDetails
|
||
load_instance = True
|
||
include_relationships = False
|
||
|
||
|
||
class SelectedUser(db.Model):
|
||
user_id = db.Column(db.String(), primary_key=True)
|
||
selected_user = db.Column(db.String(), nullable=True)
|
||
|
||
|
||
class SelectedUserSchema(ma.Schema):
|
||
class Meta:
|
||
fields = ("user_id", "selected_user")
|
||
|
||
|
||
class PreReview(db.Model):
|
||
__tablename__ = 'pre_review'
|
||
|
||
PROT_EVENT_ID = db.Column(db.Integer, primary_key=True)
|
||
SS_STUDY_ID = db.Column(db.Integer, db.ForeignKey('study.STUDYID'))
|
||
DATEENTERED = db.Column(db.DateTime(timezone=True), default=func.now())
|
||
REVIEW_TYPE = db.Column(db.Integer)
|
||
COMMENTS = db.Column(db.String)
|
||
IRBREVIEWERADMIN = db.Column(db.String)
|
||
FNAME = db.Column(db.String)
|
||
LNAME = db.Column(db.String)
|
||
LOGIN = db.Column(db.String)
|
||
EVENT_TYPE = db.Column(db.Integer)
|
||
STATUS = db.Column(db.String)
|
||
DETAIL = db.Column(db.String)
|
||
|
||
|
||
class PreReviewSchema(ma.Schema):
|
||
class Meta:
|
||
model = PreReview
|
||
fields = ["SS_STUDY_ID", "PROT_EVENT_ID", "DATEENTERED", "REVIEW_TYPE", "UVA_STUDY_TRACKING",
|
||
"COMMENTS", "IRBREVIEWERADMIN", "FNAME", "LNAME", "LOGIN", "EVENT_TYPE", "STATUS", "DETAIL"]
|
||
|
||
UVA_STUDY_TRACKING = fields.Method('get_uva_study_tracking', dump_only=True)
|
||
|
||
@staticmethod
|
||
def get_uva_study_tracking(obj):
|
||
return obj.SS_STUDY_ID
|
||
|
||
|
||
class PreReviewErrorSchema(ma.Schema):
|
||
class Meta:
|
||
model = PreReview
|
||
fields = ["STATUS", "DETAIL"]
|