Feat: Add quetiapine support to medication tracking

- Implement migration script to add quetiapine and quetiapine_doses columns to existing CSV data.
- Update DataManager to include quetiapine and quetiapine_doses in data handling.
- Modify MedTrackerApp to manage quetiapine entries and doses.
- Enhance UIManager to include quetiapine in the user interface for medication selection and display.
- Update tests to cover new quetiapine functionality, including sample data and DataManager tests.
This commit is contained in:
William Valentin
2025-07-29 13:22:35 -07:00
parent 1a6fb9fcd4
commit 2b037a83e8
7 changed files with 467 additions and 317 deletions
+4
View File
@@ -33,6 +33,8 @@ class DataManager:
"gabapentin_doses",
"propranolol",
"propranolol_doses",
"quetiapine",
"quetiapine_doses",
"note",
]
)
@@ -59,6 +61,8 @@ class DataManager:
"gabapentin_doses": str,
"propranolol": int,
"propranolol_doses": str,
"quetiapine": int,
"quetiapine_doses": str,
"note": str,
"date": str,
},
+11
View File
@@ -138,6 +138,8 @@ class MedTrackerApp:
full_row["gabapentin_doses"],
full_row["propranolol"],
full_row["propranolol_doses"],
full_row.get("quetiapine", 0),
full_row.get("quetiapine_doses", ""),
full_row["note"],
)
else:
@@ -166,6 +168,7 @@ class MedTrackerApp:
hydro: int,
gaba: int,
prop: int,
quet: int,
note: str,
dose_data: dict[str, str],
) -> None:
@@ -184,6 +187,8 @@ class MedTrackerApp:
dose_data.get("gabapentin", ""),
prop,
dose_data.get("propranolol", ""),
quet,
dose_data.get("quetiapine", ""),
note,
]
@@ -222,6 +227,7 @@ class MedTrackerApp:
hydroxyzine_doses = ""
gabapentin_doses = ""
propranolol_doses = ""
quetiapine_doses = ""
if today:
bup_doses = self.data_manager.get_today_medicine_doses(today, "bupropion")
@@ -232,6 +238,7 @@ class MedTrackerApp:
prop_doses = self.data_manager.get_today_medicine_doses(
today, "propranolol"
)
quet_doses = self.data_manager.get_today_medicine_doses(today, "quetiapine")
bupropion_doses = "|".join([f"{ts}:{dose}" for ts, dose in bup_doses])
hydroxyzine_doses = "|".join(
@@ -239,6 +246,7 @@ class MedTrackerApp:
)
gabapentin_doses = "|".join([f"{ts}:{dose}" for ts, dose in gaba_doses])
propranolol_doses = "|".join([f"{ts}:{dose}" for ts, dose in prop_doses])
quetiapine_doses = "|".join([f"{ts}:{dose}" for ts, dose in quet_doses])
entry: list[str | int] = [
self.date_var.get(),
@@ -254,6 +262,8 @@ class MedTrackerApp:
gabapentin_doses,
self.medicine_vars["propranolol"][0].get(),
propranolol_doses,
self.medicine_vars["quetiapine"][0].get(),
quetiapine_doses,
self.note_var.get(),
]
logger.debug(f"Adding entry: {entry}")
@@ -337,6 +347,7 @@ class MedTrackerApp:
"hydroxyzine",
"gabapentin",
"propranolol",
"quetiapine",
"note",
]
+54 -11
View File
@@ -138,6 +138,7 @@ class UIManager:
"hydroxyzine": (tk.IntVar(value=0), "Hydroxyzine 25mg"),
"gabapentin": (tk.IntVar(value=0), "Gabapentin 100mg"),
"propranolol": (tk.IntVar(value=0), "Propranolol 10mg"),
"quetiapine": (tk.IntVar(value=0), "Quetiapine 25mg"),
}
for idx, (_med_name, (var, text)) in enumerate(medicine_vars.items()):
@@ -197,6 +198,7 @@ class UIManager:
"Hydroxyzine",
"Gabapentin",
"Propranolol",
"Quetiapine",
"Note",
]
@@ -212,6 +214,7 @@ class UIManager:
"Hydroxyzine 25mg",
"Gabapentin 100mg",
"Propranolol 10mg",
"Quetiapine 25mg",
"Note",
]
@@ -228,6 +231,7 @@ class UIManager:
("Hydroxyzine", 120, "center"),
("Gabapentin", 120, "center"),
("Propranolol", 120, "center"),
("Quetiapine", 120, "center"),
("Note", 300, "w"),
]
@@ -286,9 +290,16 @@ class UIManager:
if len(values) == 10:
# Old format: date, dep, anx, slp, app, bup, hydro, gaba, prop, note
date, dep, anx, slp, app, bup, hydro, gaba, prop, note = values
bup_doses, hydro_doses, gaba_doses, prop_doses = "", "", "", ""
bup_doses, hydro_doses, gaba_doses, prop_doses, quet_doses = (
"",
"",
"",
"",
"",
)
quet = 0
elif len(values) == 14:
# New format with dose tracking
# Old new format with dose tracking (without quetiapine)
(
date,
dep,
@@ -305,11 +316,9 @@ class UIManager:
prop_doses,
note,
) = values
else:
# Fallback for unexpected format
self.logger.warning(f"Unexpected number of values in edit: {len(values)}")
# Pad with default values
values_list = list(values) + [""] * (14 - len(values))
quet, quet_doses = 0, ""
elif len(values) == 16:
# New format with quetiapine and dose tracking
(
date,
dep,
@@ -324,8 +333,33 @@ class UIManager:
gaba_doses,
prop,
prop_doses,
quet,
quet_doses,
note,
) = values_list[:14]
) = values
else:
# Fallback for unexpected format
self.logger.warning(f"Unexpected number of values in edit: {len(values)}")
# Pad with default values
values_list = list(values) + [""] * (16 - len(values))
(
date,
dep,
anx,
slp,
app,
bup,
bup_doses,
hydro,
hydro_doses,
gaba,
gaba_doses,
prop,
prop_doses,
quet,
quet_doses,
note,
) = values_list[:16]
# Create variables and fields
vars_dict = self._create_edit_fields(edit_win, date, dep, anx, slp, app)
@@ -333,7 +367,7 @@ class UIManager:
# Medicine checkboxes
current_row = 6 # After the 5 fields (date, dep, anx, slp, app)
med_vars = self._create_medicine_checkboxes(
edit_win, current_row, bup, hydro, gaba, prop
edit_win, current_row, bup, hydro, gaba, prop, quet
)
vars_dict.update(med_vars)
@@ -347,6 +381,7 @@ class UIManager:
"hydroxyzine": hydro_doses,
"gabapentin": gaba_doses,
"propranolol": prop_doses,
"quetiapine": quet_doses,
},
)
vars_dict.update(dose_vars)
@@ -474,6 +509,7 @@ class UIManager:
hydro: int,
gaba: int,
prop: int,
quet: int,
) -> dict[str, tk.IntVar]:
"""Create medicine checkboxes in the edit window."""
ttk.Label(parent, text="Treatment:").grid(
@@ -487,6 +523,7 @@ class UIManager:
"hydroxyzine": (hydro, "Hydroxyzine 25mg"),
"gabapentin": (gaba, "Gabapentin 100mg"),
"propranolol": (prop, "Propranolol 10mg"),
"quetiapine": (quet, "Quetiapine 25mg"),
}
vars_dict: dict[str, tk.IntVar] = {}
@@ -514,7 +551,13 @@ class UIManager:
# Extract dose data from the text widgets
dose_data = {}
for medicine in ["bupropion", "hydroxyzine", "gabapentin", "propranolol"]:
for medicine in [
"bupropion",
"hydroxyzine",
"gabapentin",
"propranolol",
"quetiapine",
]:
dose_text_key = f"{medicine}_doses_text"
if dose_text_key in vars_dict and isinstance(
@@ -526,7 +569,6 @@ class UIManager:
)
else:
dose_data[medicine] = ""
dose_data[medicine] = ""
callbacks["save"](
parent,
@@ -539,6 +581,7 @@ class UIManager:
vars_dict["hydroxyzine"].get(),
vars_dict["gabapentin"].get(),
vars_dict["propranolol"].get(),
vars_dict["quetiapine"].get(),
vars_dict["note"].get(),
dose_data,
)