Skip to content

Commit

Permalink
Merge pull request #788 from openhealthcare/new-pathology-database
Browse files Browse the repository at this point in the history
New pathology database
  • Loading branch information
fredkingham committed Jan 22, 2020
2 parents a168b55 + 269fc48 commit 46d904d
Show file tree
Hide file tree
Showing 8 changed files with 184 additions and 72 deletions.
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

0 comments on commit 46d904d

Please sign in to comment.