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

Adding extra example #66

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 41 additions & 25 deletions migrations/example/versions/add_identifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,37 +21,53 @@

def upgrade():
# Defines upgrading function ran on upgrade command
response = requests.get(f'{FHIR_SERVER_URL}/Patient/{PATIENT_ID}', headers=HEADERS)
if response.status_code == 200:
patient_resource = response.json()
if 'identifier' not in patient_resource:
patient_resource['identifier'] = []
patient_resource['identifier'].append({
"use": "usual",
"system": "http://hospital.smarthealthit.org",
"value": "12345"
})
update_response = requests.put(f'{FHIR_SERVER_URL}/Patient/{PATIENT_ID}', headers=HEADERS, data=json.dumps(patient_resource))
if update_response.status_code == 200:
logging.info('Identifier appended successfully.')
else:
logging.error(f'Failed to append identifier: {update_response.status_code} {update_response.text}')
patient_resource = {
"resourceType": "Patient",
"id": PATIENT_ID,
"name": [
{
"use": "official",
"family": "Doe",
"given": [
"John",
"A"
]
}
],
"identifier": [
{
"system": "uwDAL_Clarity",
"value": "12345"
}
],
"gender": "male",
"birthDate": "1980-01-01",
"telecom": [
{
"system": "phone",
"value": "555-555-5555",
"use": "home"
}
]
}
response = requests.put(f'{FHIR_SERVER_URL}/Patient/{PATIENT_ID}', headers=HEADERS, data=json.dumps(patient_resource))
if response.status_code == 200 or response.status_code == 201:
logging.info('Patient updated successfully with phone number.')
else:
logging.error(f'Failed to retrieve patient for updating: {response.status_code} {response.text}')
logging.error(f'Failed to update patient: {response.status_code} {response.text}')

def downgrade():
# Defines downgrading function ran on downgrade command
response = requests.get(f'{FHIR_SERVER_URL}/Patient/{PATIENT_ID}', headers=HEADERS)
if response.status_code == 200:
patient_resource = response.json()
if 'identifier' in patient_resource:
patient_resource['identifier'] = [id for id in patient_resource['identifier'] if id['value'] != '12345']
update_response = requests.put(f'{FHIR_SERVER_URL}/Patient/{PATIENT_ID}', headers=HEADERS, data=json.dumps(patient_resource))
if update_response.status_code == 200:
logging.info('Identifier deleted successfully.')
else:
logging.error(f'Failed to delete identifier: {update_response.status_code} {update_response.text}')
# Remove the phone number if it exists
if 'telecom' in patient_resource:
patient_resource['telecom'] = [entry for entry in patient_resource['telecom'] if entry['system'] != 'phone' or entry['value'] != '555-555-5555']
response = requests.put(f'{FHIR_SERVER_URL}/Patient/{PATIENT_ID}', headers=HEADERS, data=json.dumps(patient_resource))
if response.status_code == 200 or response.status_code == 201:
logging.info('Patient phone number removed successfully.')
else:
logging.info('No identifier to delete.')
logging.error(f'Failed to update patient: {response.status_code} {response.text}')
else:
logging.error(f'Failed to retrieve patient for updating: {response.status_code} {response.text}')
logging.error(f'Failed to fetch patient: {response.status_code} {response.text}')
92 changes: 92 additions & 0 deletions migrations/example/versions/add_mrn.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import requests
import json
import logging
import os
import sys

# Migration script generated for adding MRNs to Patient resources
revision = 'c5a1c49e-8efb-4610-b9d3-f59f98541f16'
down_revision = 'd5a1c49e-8efb-4610-b9d3-f59f98541f16'

# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# Define the FHIR server base URL
FHIR_SERVER_URL = os.getenv('FHIR_URL')

# Headers for FHIR requests
HEADERS = {
'Content-Type': 'application/fhir+json'
}

# Mock patient to MRN map
patient_mrn_map = [
{"PAT_ID": "12345", "MRN": "U6789012"},
{"PAT_ID": "67890", "MRN": "U3456789"}
]

def upgrade():
for record in patient_mrn_map:
pat_id = record['PAT_ID']
mrn = record['MRN']
add_mrn_to_patient(pat_id, mrn)

def add_mrn_to_patient(pat_id, mrn):
# Fetch the existing patient resource
response = requests.get(f'{FHIR_SERVER_URL}/Patient',params={"identifier": f'uwDAL_Clarity|{pat_id}'}, headers=HEADERS)

if response.status_code == 200:
patients = response.json().get('entry', [])
if len(patients) > 1:
logging.error(f'Multiple patients found with PAT_ID {pat_id}. Halting the upgrade process.')
sys.exit(1)
elif len(patients) == 1:
patient_resource = patients[0]['resource']
# Add the new MRN identifier
patient_resource['identifier'].append({
"system": "urn:oid:1.2.3.4.5.6.7.8.9.10.11.12.13",
"value": mrn
})
# Update the patient resource
update_response = requests.put(f"{FHIR_SERVER_URL}/Patient/{patient_resource['id']}", headers=HEADERS, data=json.dumps(patient_resource))
if update_response.status_code in [200, 201]:
logging.info(f'Successfully updated Patient {pat_id} with MRN {mrn}.')
else:
logging.error(f'Failed to update Patient {pat_id}: {update_response.status_code} {update_response.text}')
else:
logging.error(f'No patient found with PAT_ID {pat_id}.')
else:
logging.error(f'Failed to fetch patient {pat_id}: {response.status_code} {response.text}')

def downgrade():
for record in patient_mrn_map:
pat_id = record['PAT_ID']
mrn = record['MRN']
remove_mrn_from_patient(pat_id, mrn)

def remove_mrn_from_patient(pat_id, mrn):
# Fetch the existing patient resource
response = requests.get(f'{FHIR_SERVER_URL}/Patient?identifier=uwDAL_Clarity|{pat_id}', headers=HEADERS)
if response.status_code == 200:
patients = response.json().get('entry', [])
if len(patients) > 1:
logging.error(f'Multiple patients found with PAT_ID {pat_id}. Halting the downgrade process.')
sys.exit(1)
elif len(patients) == 1:
patient_resource = patients[0]['resource']
# Remove the MRN identifier
patient_resource['identifier'] = [id for id in patient_resource['identifier'] if id['value'] != mrn]
# Update the patient resource
update_response = requests.put(f"{FHIR_SERVER_URL}/Patient/{patient_resource['id']}", headers=HEADERS, data=json.dumps(patient_resource))
if update_response.status_code in [200, 201]:
logging.info(f'Successfully removed MRN {mrn} from Patient {pat_id}.')
else:
logging.error(f'Failed to update Patient {pat_id}: {update_response.status_code} {update_response.text}')
else:
logging.error(f'No patient found with PAT_ID {pat_id}.')
else:
logging.error(f'Failed to fetch patient {pat_id}: {response.status_code} {response.text}')

if __name__ == "__main__":
# Run the upgrade function
upgrade()
12 changes: 9 additions & 3 deletions migrations/example/versions/create_patient.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@ def upgrade():
patient_resource = {
"resourceType": "Patient",
"id": PATIENT_ID,
"identifier": [
{
"system": "uwDAL_Clarity",
"value": "12345"
}
],
"name": [
{
"use": "official",
Expand All @@ -37,16 +43,16 @@ def upgrade():
"gender": "male",
"birthDate": "1980-01-01"
}
response = requests.put(f'{FHIR_SERVER_URL}/Patient/{PATIENT_ID}', headers=HEADERS, data=json.dumps(patient_resource))
response = requests.put(f'{FHIR_SERVER_URL}/Patient/examples', headers=HEADERS, data=json.dumps(patient_resource))
if response.status_code == 200 or response.status_code == 201:
logging.info('Patient created successfully.')
else:
logging.error(f'Failed to create patient: {response.status_code} {response.text}')

def downgrade():
# Defines downgrading function ran on downgrade command
response = requests.delete(f'{FHIR_SERVER_URL}/Patient/{PATIENT_ID}', headers=HEADERS)
response = requests.delete(f'{FHIR_SERVER_URL}/Patient/examples', headers=HEADERS)
if response.status_code == 200 or response.status_code == 204:
logging.info('Patient deleted successfully.')
else:
logging.error(f'Failed to delete patient: {response.status_code} {response.text}')
logging.error(f'Failed to delete patient: {response.status_code} {response.text}')