tonic-discharge-guard / callbackmanager.py
Tonic's picture
add callback manager , model app
5372c12 unverified
raw
history blame
7.97 kB
import gradio as gr
from meldrx import MeldRxAPI
import json
# CallbackManager class to handle OAuth callbacks
class CallbackManager:
def __init__(self, client_id: str, redirect_uri: str, workspace_id: str, client_secret: str = None):
"""
Initialize the CallbackManager with MeldRx API credentials.
Args:
client_id (str): The client ID from MeldRx Developer Portal.
redirect_uri (str): The redirect URI for the Gradio app (e.g., Space URL + /callback).
workspace_id (str): The workspace slug/ID.
client_secret (str, optional): The client secret (for confidential clients).
"""
self.api = MeldRxAPI(client_id, redirect_uri, workspace_id, client_secret)
self.auth_code = None
self.access_token = None
def get_auth_url(self) -> str:
"""Generate and return the SMART on FHIR authorization URL."""
return self.api.get_authorization_url()
def set_auth_code(self, code: str) -> str:
"""Set the authorization code and attempt to get an access token."""
self.auth_code = code
if self.api.authenticate_with_code(code):
self.access_token = self.api.access_token
return f"Authentication successful! Access Token: {self.access_token[:10]}... (truncated)"
return "Authentication failed. Please check the code."
def get_patient_data(self) -> str:
"""Retrieve patient data using the access token."""
if not self.access_token:
return "Not authenticated. Please provide a valid authorization code first."
patients = self.api.get_patients()
if patients is not None:
return json.dumps(patients, indent=2) if patients else "No patient data returned."
return "Failed to retrieve patient data."
# Discharge form display function
def display_form(
first_name, last_name, middle_initial, dob, age, sex, address, city, state, zip_code,
doctor_first_name, doctor_last_name, doctor_middle_initial, hospital_name, doctor_address,
doctor_city, doctor_state, doctor_zip,
admission_date, referral_source, admission_method, discharge_date, discharge_reason, date_of_death,
diagnosis, procedures, medications, preparer_name, preparer_job_title
):
form = f"""
**Patient Discharge Form**
**Patient Details:**
- Name: {first_name} {middle_initial} {last_name}
- Date of Birth: {dob}, Age: {age}, Sex: {sex}
- Address: {address}, {city}, {state}, {zip_code}
**Primary Healthcare Professional Details:**
- Name: {doctor_first_name} {doctor_middle_initial} {doctor_last_name}
- Hospital/Clinic: {hospital_name}
- Address: {doctor_address}, {doctor_city}, {doctor_state}, {doctor_zip}
**Admission and Discharge Details:**
- Date of Admission: {admission_date}
- Source of Referral: {referral_source}
- Method of Admission: {admission_method}
- Date of Discharge: {discharge_date}
- Discharge Reason: {discharge_reason}
- Date of Death (if applicable): {date_of_death}
**Diagnosis & Procedures:**
- Diagnosis: {diagnosis}
- Procedures: {procedures}
**Medication Details:**
- Medications on Discharge: {medications}
**Prepared By:**
- Name: {preparer_name}, Job Title: {preparer_job_title}
"""
return form
# Initialize CallbackManager with your credentials
CALLBACK_MANAGER = CallbackManager(
client_id="your_client_id", # Replace with actual client ID
redirect_uri="https://multitransformer-discharge-guard.hf.space/callback",
workspace_id="your_workspace_id", # Replace with actual workspace ID
client_secret=None # Replace with actual secret if using a confidential client
)
# Gradio interface
with gr.Blocks() as demo:
gr.Markdown("# Patient Discharge Form with MeldRx Integration")
# Authentication Section
with gr.Tab("Authenticate with MeldRx"):
gr.Markdown("## SMART on FHIR Authentication")
auth_url_output = gr.Textbox(label="Authorization URL", value=CALLBACK_MANAGER.get_auth_url(), interactive=False)
gr.Markdown("Copy the URL above, open it in a browser, log in, and paste the 'code' from the redirect URL below.")
auth_code_input = gr.Textbox(label="Authorization Code")
auth_submit = gr.Button("Submit Code")
auth_result = gr.Textbox(label="Authentication Result")
patient_data_button = gr.Button("Fetch Patient Data")
patient_data_output = gr.Textbox(label="Patient Data")
auth_submit.click(
fn=CALLBACK_MANAGER.set_auth_code,
inputs=auth_code_input,
outputs=auth_result
)
patient_data_button.click(
fn=CALLBACK_MANAGER.get_patient_data,
inputs=None,
outputs=patient_data_output
)
# Discharge Form Section
with gr.Tab("Discharge Form"):
gr.Markdown("## Patient Details")
with gr.Row():
first_name = gr.Textbox(label="First Name")
last_name = gr.Textbox(label="Last Name")
middle_initial = gr.Textbox(label="Middle Initial")
with gr.Row():
dob = gr.Textbox(label="Date of Birth")
age = gr.Textbox(label="Age")
sex = gr.Textbox(label="Sex")
address = gr.Textbox(label="Address")
with gr.Row():
city = gr.Textbox(label="City")
state = gr.Textbox(label="State")
zip_code = gr.Textbox(label="Zip Code")
gr.Markdown("## Primary Healthcare Professional Details")
with gr.Row():
doctor_first_name = gr.Textbox(label="Doctor's First Name")
doctor_last_name = gr.Textbox(label="Doctor's Last Name")
doctor_middle_initial = gr.Textbox(label="Middle Initial")
hospital_name = gr.Textbox(label="Hospital/Clinic Name")
doctor_address = gr.Textbox(label="Address")
with gr.Row():
doctor_city = gr.Textbox(label="City")
doctor_state = gr.Textbox(label="State")
doctor_zip = gr.Textbox(label="Zip Code")
gr.Markdown("## Admission and Discharge Details")
with gr.Row():
admission_date = gr.Textbox(label="Date of Admission")
referral_source = gr.Textbox(label="Source of Referral")
admission_method = gr.Textbox(label="Method of Admission")
with gr.Row():
discharge_date = gr.Textbox(label="Date of Discharge")
discharge_reason = gr.Radio(["Treated", "Transferred", "Discharge Against Advice", "Patient Died"], label="Discharge Reason")
date_of_death = gr.Textbox(label="Date of Death (if applicable)")
gr.Markdown("## Diagnosis & Procedures")
diagnosis = gr.Textbox(label="Diagnosis")
procedures = gr.Textbox(label="Operation & Procedures")
gr.Markdown("## Medication Details")
medications = gr.Textbox(label="Medication on Discharge")
gr.Markdown("## Prepared By")
with gr.Row():
preparer_name = gr.Textbox(label="Name")
preparer_job_title = gr.Textbox(label="Job Title")
submit = gr.Button("Generate Form")
output = gr.Markdown()
submit.click(
display_form,
inputs=[
first_name, last_name, middle_initial, dob, age, sex, address, city, state, zip_code,
doctor_first_name, doctor_last_name, doctor_middle_initial, hospital_name, doctor_address,
doctor_city, doctor_state, doctor_zip,
admission_date, referral_source, admission_method, discharge_date, discharge_reason, date_of_death,
diagnosis, procedures, medications, preparer_name, preparer_job_title
],
outputs=output
)
demo.launch()