File size: 8,385 Bytes
e714a62
09daffd
219df52
09daffd
 
219df52
 
 
fc7ef83
 
d452590
219df52
09daffd
 
 
 
219df52
09daffd
4a78b46
 
 
219df52
4a78b46
219df52
 
09daffd
219df52
 
 
 
 
 
 
09daffd
219df52
 
 
 
 
 
 
 
 
 
 
 
 
09daffd
 
 
 
219df52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e714a62
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
219df52
 
 
 
 
 
 
 
 
 
 
e714a62
 
 
 
 
 
 
 
219df52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
09daffd
219df52
 
 
 
 
36e302c
 
 
 
 
 
 
 
 
 
 
 
219df52
 
36e302c
 
219df52
 
 
 
36e302c
 
 
 
 
 
 
 
 
219df52
36e302c
 
219df52
 
 
36e302c
219df52
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
from flask import Flask, render_template, request, send_file, jsonify, Response, redirect, url_for
import os
import json
import logging
from utils.callbackmanager import CallbackManager
from utils.generators import (generate_pdf_from_form, generate_pdf_from_meldrx,
                              analyze_dicom_file_with_ai, analyze_hl7_file_with_ai,
                              analyze_cda_xml_file_with_ai, analyze_pdf_file_with_ai,
                              analyze_csv_file_with_ai)
from utils.oneclick import generate_discharge_paper_one_click
from utils.meldrx import MeldRxAPI

# Set up logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

app = Flask(__name__)

# Set SPACE_URL from environment variable or default to the correct Space URL
SPACE_URL = os.getenv("SPACE_URL", "https://multitransformer-tonic-discharge-guard.hf.space")
REDIRECT_URI = f"{SPACE_URL}/auth/callback"
CALLBACK_MANAGER = CallbackManager(
    redirect_uri=REDIRECT_URI,
    client_secret=None,
)

# Mock display_form function for HTML rendering
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):
    return f"""
    <div style='color:#00FFFF; font-family: monospace;'>
    <strong>Patient Discharge Form</strong><br>
    - Name: {first_name} {middle_initial} {last_name}<br>
    - Date of Birth: {dob}, Age: {age}, Sex: {sex}<br>
    - Address: {address}, {city}, {state}, {zip_code}<br>
    - Doctor: {doctor_first_name} {doctor_middle_initial} {doctor_last_name}<br>
    - Hospital/Clinic: {hospital_name}<br>
    - Doctor Address: {doctor_address}, {doctor_city}, {doctor_state}, {doctor_zip}<br>
    - Admission Date: {admission_date}, Source: {referral_source}, Method: {admission_method}<br>
    - Discharge Date: {discharge_date}, Reason: {discharge_reason}<br>
    - Date of Death: {date_of_death}<br>
    - Diagnosis: {diagnosis}<br>
    - Procedures: {procedures}<br>
    - Medications: {medications}<br>
    - Prepared By: {preparer_name}, {preparer_job_title}
    </div>
    """

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/auth', methods=['GET', 'POST'])
def auth():
    auth_url = CALLBACK_MANAGER.get_auth_url()
    if request.method == 'POST':
        redirected_url = request.form.get('redirected_url')
        if redirected_url:
            auth_code, error = CALLBACK_MANAGER.handle_callback(redirected_url)
            result = CALLBACK_MANAGER.set_auth_code(auth_code) if auth_code else f"<span style='color:#FF4500;'>{error}</span>"
            return render_template('auth.html', auth_url=auth_url, auth_result=result)
        auth_code = request.form.get('auth_code')
        if auth_code:
            result = CALLBACK_MANAGER.set_auth_code(auth_code)
            return render_template('auth.html', auth_url=auth_url, auth_result=result)
    return render_template('auth.html', auth_url=auth_url)

@app.route('/auth/callback', methods=['GET'])
def auth_callback():
    redirected_url = request.url
    result = CALLBACK_MANAGER.handle_callback(redirected_url)
    if "Authentication successful" in result:
        return redirect(url_for('dashboard'))
    return render_template('auth.html', auth_url=CALLBACK_MANAGER.get_auth_url(), auth_result=result)

@app.route('/dashboard', methods=['GET'])
def dashboard():
    if not CALLBACK_MANAGER.access_token:
        return render_template('auth.html', auth_url=CALLBACK_MANAGER.get_auth_url(), auth_result="<span style='color:#FF8C00;'>Please authenticate first.</span>")
    
    data = CALLBACK_MANAGER.get_patient_data()
    if data.startswith('<span'):
        return render_template('dashboard.html', error=data)
    patients_data = json.loads(data)
    patients = [entry['resource'] for entry in patients_data.get('entry', []) if entry['resource'].get('resourceType') == 'Patient']
    return render_template('dashboard.html', patients=patients, authenticated=True)

@app.route('/auth/patient-data', methods=['GET'])
def patient_data():
    data = CALLBACK_MANAGER.get_patient_data()
    return jsonify(json.loads(data) if data and not data.startswith('<span') else {"error": data})

@app.route('/auth/pdf', methods=['GET'])
def generate_meldrx_pdf():
    patient_data = CALLBACK_MANAGER.get_patient_data()
    pdf_path = generate_pdf_from_meldrx(patient_data)
    return send_file(pdf_path, as_attachment=True, download_name="meldrx_patient_data.pdf")

# @app.route('/dashboard', methods=['GET'])
# def dashboard():
#     data = CALLBACK_MANAGER.get_patient_data()
#     if data.startswith('<span'):  # Indicates an error or unauthenticated state
#         return render_template('dashboard.html', error=data)
#     patients_data = json.loads(data)
#     patients = [entry['resource'] for entry in patients_data.get('entry', []) if entry['resource'].get('resourceType') == 'Patient']
#     return render_template('dashboard.html', patients=patients, authenticated=True)

@app.route('/form', methods=['GET', 'POST'])
def discharge_form():
    if request.method == 'POST':
        form_data = request.form.to_dict()
        if 'display' in request.form:
            html_form = display_form(**form_data)
            return render_template('form.html', form_output=html_form)
        elif 'generate_pdf' in request.form:
            pdf_path = generate_pdf_from_form(**form_data)
            return send_file(pdf_path, as_attachment=True, download_name="discharge_form.pdf")
    return render_template('form.html')

@app.route('/analysis', methods=['GET', 'POST'])
def file_analysis():
    if request.method == 'POST':
        file = request.files.get('file')
        file_type = request.form.get('file_type')
        if file:
            file_path = os.path.join('/tmp', file.filename)
            file.save(file_path)
            if file_type == 'dicom':
                result = analyze_dicom_file_with_ai(file_path)
            elif file_type == 'hl7':
                result = analyze_hl7_file_with_ai(file_path)
            elif file_type == 'xml' or file_type == 'ccda' or file_type == 'ccd':
                result = analyze_cda_xml_file_with_ai(file_path)
            elif file_type == 'pdf':
                result = analyze_pdf_file_with_ai(file_path)
            elif file_type == 'csv':
                result = analyze_csv_file_with_ai(file_path)
            else:
                result = "Unsupported file type"
            os.remove(file_path)
            return render_template('analysis.html', result=result, file_type=file_type)
    return render_template('analysis.html')

# Configuration from environment variables
CLIENT_ID = os.getenv("MELDRX_CLIENT_ID")
CLIENT_SECRET = None
WORKSPACE_ID = os.getenv("WORKSPACE_URL")

# # Initialize MeldRx API
# meldrx_api = MeldRxAPI(
#     client_id=CLIENT_ID,
#     client_secret=CLIENT_SECRET,
#     workspace_id=WORKSPACE_ID,
#     redirect_uri=REDIRECT_URI
# )
@app.route('/oneclick', methods=['GET', 'POST'])
def one_click():
    if not CALLBACK_MANAGER.access_token:
        return redirect(url_for('auth'))
    if request.method == 'POST':
        patient_id = request.form.get('patient_id', '')
        first_name = request.form.get('first_name', '')
        last_name = request.form.get('last_name', '')
        action = request.form.get('action', '')

        pdf_path, status, display_summary = generate_discharge_paper_one_click(
            CALLBACK_MANAGER, patient_id, first_name, last_name
        )

        if action == "display" and display_summary:
            return render_template('oneclick.html', status=status, summary=display_summary)
        elif action == "generate_pdf" and pdf_path:
            return send_file(pdf_path, as_attachment=True, download_name="discharge_summary.pdf")
        return render_template('oneclick.html', status=status, summary=display_summary)

    return render_template('oneclick.html')

if __name__ == '__main__':
    port = int(os.getenv("PORT", 7860))
    app.run(debug=False, host='0.0.0.0', port=port)