Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New pathology database #788

Merged
merged 9 commits into from
Jan 22, 2020
15 changes: 12 additions & 3 deletions elcid/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,9 +189,9 @@
# this needs to be set to true on prod
ASYNC_API = False

# if the intrahospital api is prod, we need
# an ip address, a database, a username and a password for
# the hospital db
# if the intrahospital api is prod
# there 2 databases
# the hopstial DB does demographics, appointments and ITU
HOSPITAL_DB = dict(
ip_address=None,
database=None,
Expand All @@ -200,6 +200,15 @@
view=None
)

# the trust DB does lab tests
TRUST_DB = dict(
ip_address=None,
database=None,
username=None,
password=None,
view=None
)


# search with external demographics when adding a patient
ADD_PATIENT_DEMOGRAPHICS = True
Expand Down
6 changes: 6 additions & 0 deletions intrahospital_api/apis/dev_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@
u'Patient_Class': u'NHS',
u'Patient_ID_External': u'7060976728',
u'Patient_Number': u'20552710',
'PV1_7_C_NUMBER': '',
'PV1_7_CONSULTANT_NAME': '',
'PV1_3_5': None,
'PV1_3_9': None,
u'Relevant_Clinical_Info': u'testing',
u'Reported_date': datetime(2015, 7, 18, 16, 26),
u'Request_Date': datetime(2015, 7, 18, 16, 15),
Expand All @@ -90,6 +94,8 @@
u'date_inserted': datetime(2015, 7, 18, 17, 0, 2, 240000),
u'id': 5949264,
u'last_updated': datetime(2015, 7, 18, 17, 0, 2, 240000),
'obr_id': 2000000,
'result_source': 'RF',
u'visible': u'Y'
}

Expand Down
100 changes: 64 additions & 36 deletions intrahospital_api/apis/prod_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,21 @@
MAIN_DEMOGRAPHICS_VIEW = "VIEW_CRS_Patient_Masterfile"

PATHOLOGY_DEMOGRAPHICS_QUERY = "SELECT top(1) * FROM {view} WHERE Patient_Number = \
@hospital_number ORDER BY last_updated DESC;"
@hospital_number ORDER BY date_inserted DESC;"

MAIN_DEMOGRAPHICS_QUERY = "SELECT top(1) * FROM {view} WHERE Patient_Number = \
@hospital_number ORDER BY last_updated DESC;"

ALL_DATA_QUERY_FOR_HOSPITAL_NUMBER = "SELECT * FROM {view} WHERE Patient_Number = \
@hospital_number AND last_updated > @since ORDER BY last_updated DESC;"
@hospital_number AND date_inserted > @since ORDER BY date_inserted DESC;"

ALL_DATA_QUERY_WITH_LAB_NUMBER = "SELECT * FROM {view} WHERE Patient_Number = \
@hospital_number AND last_updated > @since and Result_ID = @lab_number ORDER BY last_updated DESC;"
@hospital_number AND date_inserted > @since and Result_ID = @lab_number ORDER BY date_inserted DESC;"

ALL_DATA_QUERY_WITH_LAB_TEST_TYPE = "SELECT * FROM {view} WHERE Patient_Number = \
@hospital_number AND last_updated > @since and OBR_exam_code_Text = @test_type ORDER BY last_updated DESC;"
@hospital_number AND date_inserted > @since and OBR_exam_code_Text = @test_type ORDER BY date_inserted DESC;"

ALL_DATA_SINCE = "SELECT * FROM {view} WHERE last_updated > @since ORDER BY Patient_Number, last_updated DESC;"
ALL_DATA_SINCE = "SELECT * FROM {view} WHERE date_inserted > @since ORDER BY Patient_Number, date_inserted DESC;"


ETHNICITY_MAPPING = {
Expand Down Expand Up @@ -253,7 +253,7 @@ def get_status(self):

def get_site(self):
site = self.db_row.get('Specimen_Site')
if "^" in site and "-" in site:
if site and "^" in site and "-" in site:
return site.split("^")[1].strip().split("-")[0].strip()
return site

Expand Down Expand Up @@ -329,59 +329,89 @@ def get_all_fields(self):

class ProdApi(base_api.BaseApi):
def __init__(self):
self.ip_address = settings.HOSPITAL_DB.get("ip_address")
self.database = settings.HOSPITAL_DB.get("database")
self.username = settings.HOSPITAL_DB.get("username")
self.password = settings.HOSPITAL_DB.get("password")
self.view = settings.HOSPITAL_DB.get("view")
self.hospital_settings = settings.HOSPITAL_DB
self.trust_settings = settings.TRUST_DB
if not all([
self.ip_address,
self.database,
self.username,
self.password,
self.view
self.hospital_settings.get("ip_address"),
self.hospital_settings.get("database"),
self.hospital_settings.get("username"),
self.hospital_settings.get("password"),
self.hospital_settings.get("view"),
self.trust_settings.get("ip_address"),
self.trust_settings.get("database"),
self.trust_settings.get("username"),
self.trust_settings.get("password"),
self.trust_settings.get("view"),
]):
raise ValueError(
"You need to set proper credentials to use the prod api"
)

def execute_query(self, query, params=None):
def execute_hospital_query(self, query, params=None):
result = []
with pytds.connect(
self.hospital_settings["ip_address"],
self.hospital_settings["database"],
self.hospital_settings["username"],
self.hospital_settings["password"],
as_dict=True
) as conn:
with conn.cursor() as cur:
logger.info(
"Running upstream query {} {}".format(query, params)
)
cur.execute(query, params)
result.extend(cur.fetchmany(1000))
logger.debug(result)
return result

def execute_trust_query(self, query, params=None):
result = []
with pytds.connect(
self.ip_address,
self.database,
self.username,
self.password,
self.trust_settings["ip_address"],
self.trust_settings["database"],
self.trust_settings["username"],
self.trust_settings["password"],
as_dict=True
) as conn:
with conn.cursor() as cur:
logger.info(
"Running upstream query {} {}".format(query, params)
)
cur.execute(query, params)
result = cur.fetchall()
result.extend(cur.fetchmany(1000))
logger.debug(result)
return result

@property
def pathology_demographics_query(self):
return PATHOLOGY_DEMOGRAPHICS_QUERY.format(view=self.view)
return PATHOLOGY_DEMOGRAPHICS_QUERY.format(
view=self.trust_settings["view"]
)

@property
def all_data_for_hospital_number_query(self):
return ALL_DATA_QUERY_FOR_HOSPITAL_NUMBER.format(view=self.view)
return ALL_DATA_QUERY_FOR_HOSPITAL_NUMBER.format(
view=self.trust_settings["view"]
)

@property
def all_data_since_query(self):
return ALL_DATA_SINCE.format(view=self.view)
return ALL_DATA_SINCE.format(
view=self.trust_settings["view"]
)

@property
def all_data_query_for_lab_number(self):
return ALL_DATA_QUERY_WITH_LAB_NUMBER.format(view=self.view)
return ALL_DATA_QUERY_WITH_LAB_NUMBER.format(
view=self.trust_settings["view"]
)

@property
def all_data_query_for_lab_test_type(self):
return ALL_DATA_QUERY_WITH_LAB_TEST_TYPE.format(view=self.view)

return ALL_DATA_QUERY_WITH_LAB_TEST_TYPE.format(
view=self.trust_settings["view"]
)

@property
def main_demographics_query(self):
Expand All @@ -399,11 +429,10 @@ def demographics(self, hospital_number):
demographics_result["external_system"] = EXTERNAL_SYSTEM
return demographics_result


@timing
@db_retry
def main_demographics(self, hospital_number):
rows = list(self.execute_query(
rows = list(self.execute_hospital_query(
self.main_demographics_query,
params=dict(hospital_number=hospital_number)
))
Expand All @@ -412,11 +441,10 @@ def main_demographics(self, hospital_number):

return MainDemographicsRow(rows[0]).get_demographics_dict()


@timing
@db_retry
def pathology_demographics(self, hospital_number):
rows = list(self.execute_query(
rows = list(self.execute_trust_query(
self.pathology_demographics_query,
params=dict(hospital_number=hospital_number)
))
Expand All @@ -431,7 +459,7 @@ def raw_data(self, hospital_number, lab_number=None, test_type=None):
db_date = datetime.date.today() - datetime.timedelta(365)

if lab_number:
return self.execute_query(
return self.execute_trust_query(
self.all_data_query_for_lab_number,
params=dict(
hospital_number=hospital_number,
Expand All @@ -440,7 +468,7 @@ def raw_data(self, hospital_number, lab_number=None, test_type=None):
)
)
if test_type:
return self.execute_query(
return self.execute_trust_query(
self.all_data_query_for_lab_test_type,
params=dict(
hospital_number=hospital_number,
Expand All @@ -449,15 +477,15 @@ def raw_data(self, hospital_number, lab_number=None, test_type=None):
)
)
else:
return self.execute_query(
return self.execute_trust_query(
self.all_data_for_hospital_number_query,
params=dict(hospital_number=hospital_number, since=db_date)
)

@timing
@db_retry
def data_delta_query(self, since):
all_rows = self.execute_query(
all_rows = self.execute_trust_query(
self.all_data_since_query,
params=dict(since=since)
)
Expand Down
Loading