from fasthtml.common import *
import sqlite3
import os
import datetime
from apscheduler.schedulers.background import BackgroundScheduler
from pbs_data import PBSPublicDataAPIClient
import os
from fasthtml_hf import setup_hf_backup # Add this line
# Database file
DB_FILE = 'rheumatology_biologics_data.db'
if not os.path.exists(DB_FILE):
print(f"Database file {DB_FILE} does not exist!")
def load_data():
try:
conn = sqlite3.connect(DB_FILE)
cursor = conn.cursor()
# ... (rest of the function)
except sqlite3.Error as e:
print(f"An error occurred: {e}")
return {
'combinations': [],
'drugs': [],
'brands': [],
'formulations': [],
'indications': [],
'treatment_phases': []
}
# Fetch all data
cursor.execute('''SELECT c.pbs_code, d.name as drug, b.name as brand, f.name as formulation,
i.name as indication, tp.name as treatment_phase, c.streamlined_code,
c.online_application, c.authority_method
FROM combinations c
JOIN drugs d ON c.drug_id = d.id
JOIN brands b ON c.brand_id = b.id
JOIN formulations f ON c.formulation_id = f.id
JOIN indications i ON c.indication_id = i.id
JOIN treatment_phases tp ON c.treatment_phase_id = tp.id''')
data = cursor.fetchall()
# Fetch distinct values for dropdowns
cursor.execute('SELECT name FROM drugs')
drugs = [row[0] for row in cursor.fetchall()]
cursor.execute('SELECT name FROM brands')
brands = [row[0] for row in cursor.fetchall()]
cursor.execute('SELECT name FROM formulations')
formulations = [row[0] for row in cursor.fetchall()]
cursor.execute('SELECT name FROM indications')
indications = [row[0] for row in cursor.fetchall()]
cursor.execute('SELECT name FROM treatment_phases')
treatment_phases = [row[0] for row in cursor.fetchall()]
conn.close()
return {
'combinations': data,
'drugs': drugs,
'brands': brands,
'formulations': formulations,
'indications': indications,
'treatment_phases': treatment_phases
}
biologics_data = load_data()
app, rt = fast_app()
def search_biologics(drug, brand, formulation, indication, treatment_phase):
field_indices = {
'drug': 1,
'brand': 2,
'formulation': 3,
'indication': 4,
'treatment_phase': 5
}
results = [combo for combo in biologics_data['combinations'] if all(
not value or combo[field_indices[key]] == value
for key, value in {'drug': drug, 'brand': brand, 'formulation': formulation, 'indication': indication, 'treatment_phase': treatment_phase}.items()
)]
if not results:
return "No results found."
output = ""
for item in results:
output += f"""
{item[1]} ({item[2]})
PBS Code: {item[0]}
Formulation: {item[3]}
Indication: {item[4]}
Treatment Phase: {item[5]}
Streamlined Code: {item[6] or 'N/A'}
Authority Method: {item[8]}
Online Application: {'Yes' if item[7] else 'No'}
"""
return output
def update_options(drug, brand, formulation, indication, treatment_phase):
selected = {
'drug': drug,
'brand': brand,
'formulation': formulation,
'indication': indication,
'treatment_phase': treatment_phase
}
field_indices = {
'drug': 1,
'brand': 2,
'formulation': 3,
'indication': 4,
'treatment_phase': 5
}
filtered = [combo for combo in biologics_data['combinations'] if all(
not selected[key] or combo[field_indices[key]] == selected[key]
for key in selected
)]
options = {
'drugs': sorted(set(combo[1] for combo in filtered)),
'brands': sorted(set(combo[2] for combo in filtered)),
'formulations': sorted(set(combo[3] for combo in filtered)),
'indications': sorted(set(combo[4] for combo in filtered)),
'treatment_phases': sorted(set(combo[5] for combo in filtered))
}
return options
@rt('/')
def get():
return Titled("Biologics Prescriber Helper",
Form(
Select(Option("All", value=""), *[Option(drug, value=drug) for drug in biologics_data['drugs']], label="Drug", name="drug", hx_get="/update_options", hx_target="#options", hx_trigger="change", hx_include="[name='drug'],[name='brand'],[name='formulation'],[name='indication'],[name='treatment_phase']"),
Select(Option("All", value=""), *[Option(brand, value=brand) for brand in biologics_data['brands']], label="Brand", name="brand", hx_get="/update_options", hx_target="#options", hx_trigger="change", hx_include="[name='drug'],[name='brand'],[name='formulation'],[name='indication'],[name='treatment_phase']"),
Select(Option("All", value=""), *[Option(formulation, value=formulation) for formulation in biologics_data['formulations']], label="Formulation", name="formulation", hx_get="/update_options", hx_target="#options", hx_trigger="change", hx_include="[name='drug'],[name='brand'],[name='formulation'],[name='indication'],[name='treatment_phase']"),
Select(Option("All", value=""), *[Option(indication, value=indication) for indication in biologics_data['indications']], label="Indication", name="indication", hx_get="/update_options", hx_target="#options", hx_trigger="change", hx_include="[name='drug'],[name='brand'],[name='formulation'],[name='indication'],[name='treatment_phase']"),
Select(Option("All", value=""), *[Option(phase, value=phase) for phase in biologics_data['treatment_phases']], label="Treatment Phase", name="treatment_phase", hx_get="/update_options", hx_target="#options", hx_trigger="change", hx_include="[name='drug'],[name='brand'],[name='formulation'],[name='indication'],[name='treatment_phase']"),
Button("Search", type="submit"),
Button("Reset", hx_get="/reset", hx_target="#options"),
hx_post="/search",
hx_target="#results",
id="options"
),
Div(id="results")
)
@rt('/reset')
def get():
return Form(
Select(Option("All", value=""), *[Option(drug, value=drug) for drug in biologics_data['drugs']], label="Drug", name="drug", hx_get="/update_options", hx_target="#options", hx_trigger="change", hx_include="[name='drug'],[name='brand'],[name='formulation'],[name='indication'],[name='treatment_phase']"),
Select(Option("All", value=""), *[Option(brand, value=brand) for brand in biologics_data['brands']], label="Brand", name="brand", hx_get="/update_options", hx_target="#options", hx_trigger="change", hx_include="[name='drug'],[name='brand'],[name='formulation'],[name='indication'],[name='treatment_phase']"),
Select(Option("All", value=""), *[Option(formulation, value=formulation) for formulation in biologics_data['formulations']], label="Formulation", name="formulation", hx_get="/update_options", hx_target="#options", hx_trigger="change", hx_include="[name='drug'],[name='brand'],[name='formulation'],[name='indication'],[name='treatment_phase']"),
Select(Option("All", value=""), *[Option(indication, value=indication) for indication in biologics_data['indications']], label="Indication", name="indication", hx_get="/update_options", hx_target="#options", hx_trigger="change", hx_include="[name='drug'],[name='brand'],[name='formulation'],[name='indication'],[name='treatment_phase']"),
Select(Option("All", value=""), *[Option(phase, value=phase) for phase in biologics_data['treatment_phases']], label="Treatment Phase", name="treatment_phase", hx_get="/update_options", hx_target="#options", hx_trigger="change", hx_include="[name='drug'],[name='brand'],[name='formulation'],[name='indication'],[name='treatment_phase']"),
Button("Search", type="submit"),
Button("Reset", hx_get="/reset", hx_target="#options"),
hx_post="/search",
hx_target="#results",
id="options"
)
@rt('/update_options')
def get(drug: str = '', brand: str = '', formulation: str = '', indication: str = '', treatment_phase: str = ''):
options = update_options(drug, brand, formulation, indication, treatment_phase)
return Form(
Select(Option("All", value=""), *[Option(d, value=d, selected=(d == drug)) for d in options['drugs']], label="Drug", name="drug", hx_get="/update_options", hx_target="#options", hx_trigger="change", hx_include="[name='drug'],[name='brand'],[name='formulation'],[name='indication'],[name='treatment_phase']"),
Select(Option("All", value=""), *[Option(b, value=b, selected=(b == brand)) for b in options['brands']], label="Brand", name="brand", hx_get="/update_options", hx_target="#options", hx_trigger="change", hx_include="[name='drug'],[name='brand'],[name='formulation'],[name='indication'],[name='treatment_phase']"),
Select(Option("All", value=""), *[Option(f, value=f, selected=(f == formulation)) for f in options['formulations']], label="Formulation", name="formulation", hx_get="/update_options", hx_target="#options", hx_trigger="change", hx_include="[name='drug'],[name='brand'],[name='formulation'],[name='indication'],[name='treatment_phase']"),
Select(Option("All", value=""), *[Option(i, value=i, selected=(i == indication)) for i in options['indications']], label="Indication", name="indication", hx_get="/update_options", hx_target="#options", hx_trigger="change", hx_include="[name='drug'],[name='brand'],[name='formulation'],[name='indication'],[name='treatment_phase']"),
Select(Option("All", value=""), *[Option(p, value=p, selected=(p == treatment_phase)) for p in options['treatment_phases']], label="Treatment Phase", name="treatment_phase", hx_get="/update_options", hx_target="#options", hx_trigger="change", hx_include="[name='drug'],[name='brand'],[name='formulation'],[name='indication'],[name='treatment_phase']"),
Button("Search", type="submit"),
Button("Reset", hx_get="/reset", hx_target="#options"),
hx_post="/search",
hx_target="#results",
id="options"
)
@rt('/search')
def post(drug: str = '', brand: str = '', formulation: str = '', indication: str = '', treatment_phase: str = ''):
results = search_biologics(drug, brand, formulation, indication, treatment_phase)
return results
def update_data():
print(f"Updating data at {datetime.datetime.now()}")
client = PBSPublicDataAPIClient("2384af7c667342ceb5a736fe29f1dc6b", rate_limit=0.2)
try:
data = client.fetch_rheumatology_biologics_data()
client.save_data_to_sqlite(data, DB_FILE)
print("Data updated successfully")
global biologics_data
biologics_data = load_data()
except Exception as e:
print(f"An error occurred while updating data: {str(e)}")
# Set up the scheduler
scheduler = BackgroundScheduler()
scheduler.add_job(func=update_data, trigger='cron', day='1', hour='0', minute='0')
scheduler.start()
setup_hf_backup(app) # Add this line
serve()