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
+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,
)