protocol-builder-mock/pb/models.py

498 lines
24 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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")]
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"]