| |
|
|
| from flask import Flask, render_template, request, send_file, redirect, url_for |
| import os |
| import logging |
| from utils.meldrx import MeldRxAPI |
| from utils.oneclick import generate_discharge_paper_one_click |
| from huggingface_hub import InferenceClient |
|
|
| logging.basicConfig(level=logging.DEBUG) |
| logger = logging.getLogger(__name__) |
|
|
| app = Flask(__name__) |
|
|
| CLIENT_ID = os.getenv("MELDRX_CLIENT_ID", "04bdc9f9a23d488a868b93d594ee5a4a") |
| CLIENT_SECRET = os.getenv("MELDRX_CLIENT_SECRET", None) |
| WORKSPACE_ID = os.getenv("MELDRX_WORKSPACE_ID", "09ed4f76-b5ac-42bf-92d5-496933203dbe") |
| SPACE_URL = os.getenv("SPACE_URL", "https://huggingface.co/proxy/multitransformer-tonic-discharge-guard.hf.space") |
| REDIRECT_URI = f"{SPACE_URL}/auth/callback" |
|
|
| meldrx_api = MeldRxAPI( |
| client_id=CLIENT_ID, |
| client_secret=CLIENT_SECRET, |
| workspace_id=WORKSPACE_ID, |
| redirect_uri=REDIRECT_URI |
| ) |
|
|
| HF_TOKEN = os.getenv("HF_TOKEN") |
| if not HF_TOKEN: |
| raise ValueError("HF_TOKEN environment variable not set.") |
| client = InferenceClient(api_key=HF_TOKEN) |
|
|
| @app.route('/') |
| def index(): |
| return render_template('index.html') |
|
|
| @app.route('/auth', methods=['GET', 'POST']) |
| def auth(): |
| if request.method == 'POST': |
| auth_code = request.form.get('auth_code') |
| if auth_code and meldrx_api.authenticate_with_code(auth_code): |
| return redirect(url_for('dashboard')) |
| return render_template('auth.html', auth_url=meldrx_api.get_authorization_url(), auth_result="Authentication failed") |
| return render_template('auth.html', auth_url=meldrx_api.get_authorization_url()) |
|
|
| @app.route('/auth/callback', methods=['GET']) |
| def auth_callback(): |
| auth_code = request.args.get('code') |
| if auth_code and meldrx_api.authenticate_with_code(auth_code): |
| return redirect(url_for('dashboard')) |
| return render_template('auth.html', auth_url=meldrx_api.get_authorization_url(), auth_result="Callback failed") |
|
|
| @app.route('/dashboard', methods=['GET']) |
| def dashboard(): |
| if not meldrx_api.access_token: |
| return redirect(url_for('auth')) |
| patients_data = meldrx_api.get_patients() |
| if not patients_data or "entry" not in patients_data: |
| logger.error("Failed to fetch patient data for dashboard") |
| return render_template('dashboard.html', error="Failed to fetch patient data") |
| patients = [entry['resource'] for entry in patients_data.get('entry', [])] |
| logger.debug(f"Patients for dashboard: {patients}") |
| return render_template('dashboard.html', patients=patients, authenticated=True) |
|
|
| @app.route('/oneclick', methods=['GET', 'POST']) |
| def one_click(): |
| if not meldrx_api.access_token: |
| return redirect(url_for('auth')) |
| |
| if request.method == 'POST': |
| patient_id = request.form.get('patient_id', '').strip() |
| first_name = request.form.get('first_name', '').strip() |
| last_name = request.form.get('last_name', '').strip() |
| action = request.form.get('action', '') |
|
|
| logger.info(f"One-click request - ID: {patient_id}, First: {first_name}, Last: {last_name}, Action: {action}") |
|
|
| pdf_path, status, basic_summary, ai_summary, verified_summary = generate_discharge_paper_one_click( |
| meldrx_api, client, patient_id, first_name, last_name |
| ) |
|
|
| if action == "Display Summary": |
| return render_template('oneclick.html', |
| status=status, |
| basic_summary=basic_summary.replace('\n', '<br>') if basic_summary else None, |
| ai_summary=ai_summary.replace('\n', '<br>') if ai_summary else None, |
| verified_summary=verified_summary if verified_summary else None, |
| patient_id=patient_id, |
| first_name=first_name, |
| last_name=last_name) |
| elif action == "Generate PDF" and pdf_path: |
| return send_file(pdf_path, |
| as_attachment=True, |
| download_name=f"discharge_summary_{patient_id or 'patient'}.pdf") |
| return render_template('oneclick.html', |
| status=status, |
| basic_summary=basic_summary.replace('\n', '<br>') if basic_summary else None, |
| ai_summary=ai_summary.replace('\n', '<br>') if ai_summary else None, |
| verified_summary=verified_summary if verified_summary else None, |
| patient_id=patient_id, |
| first_name=first_name, |
| last_name=last_name) |
|
|
| 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) |