Implement date uniqueness validation in DataManager and update MedTrackerApp for duplicate checks

This commit is contained in:
William Valentin
2025-07-28 17:28:00 -07:00
parent f0dd47d433
commit 9aa1188c98
3 changed files with 144 additions and 8 deletions

View File

@@ -66,6 +66,14 @@ class DataManager:
def add_entry(self, entry_data: list[str | int]) -> bool:
"""Add a new entry to the CSV file."""
try:
# Check if date already exists
df: pd.DataFrame = self.load_data()
date_to_add: str = str(entry_data[0])
if not df.empty and date_to_add in df["date"].values:
self.logger.warning(f"Entry with date {date_to_add} already exists.")
return False
with open(self.filename, mode="a", newline="") as file:
writer = csv.writer(file)
writer.writerow(entry_data)
@@ -74,13 +82,22 @@ class DataManager:
self.logger.error(f"Error adding entry: {str(e)}")
return False
def update_entry(self, date: str, values: list[str | int]) -> bool:
"""Update an existing entry identified by date."""
def update_entry(self, original_date: str, values: list[str | int]) -> bool:
"""Update an existing entry identified by original_date."""
try:
df: pd.DataFrame = self.load_data()
# Find the row to update using date as a unique identifier
new_date: str = str(values[0])
# If the date is being changed, check if the new date already exists
if original_date != new_date and new_date in df["date"].values:
self.logger.warning(
f"Cannot update: entry with date {new_date} already exists."
)
return False
# Find the row to update using original_date as a unique identifier
df.loc[
df["date"] == date,
df["date"] == original_date,
[
"date",
"depression",

View File

@@ -119,9 +119,11 @@ class MedTrackerApp:
def _create_edit_window(self, item_id: str, values: tuple[str, ...]) -> None:
"""Create a new Toplevel window for editing an entry."""
original_date = values[0] # Store the original date
# Define callbacks for edit window buttons
callbacks: dict[str, Callable] = {
"save": self._save_edit,
"save": lambda win, *args: self._save_edit(win, original_date, *args),
"delete": lambda win: self._delete_entry(win, item_id),
}
@@ -131,6 +133,7 @@ class MedTrackerApp:
def _save_edit(
self,
edit_win: tk.Toplevel,
original_date: str,
date: str,
dep: int,
anx: int,
@@ -156,7 +159,7 @@ class MedTrackerApp:
note,
]
if self.data_manager.update_entry(date, values):
if self.data_manager.update_entry(original_date, values):
edit_win.destroy()
messagebox.showinfo(
"Success", "Entry updated successfully!", parent=self.root
@@ -164,7 +167,17 @@ class MedTrackerApp:
self._clear_entries()
self.load_data()
else:
messagebox.showerror("Error", "Failed to save changes", parent=edit_win)
# Check if it's a duplicate date issue
df = self.data_manager.load_data()
if original_date != date and not df.empty and date in df["date"].values:
messagebox.showerror(
"Error",
f"An entry for date '{date}' already exists. "
"Please use a different date.",
parent=edit_win,
)
else:
messagebox.showerror("Error", "Failed to save changes", parent=edit_win)
def on_closing(self) -> None:
if messagebox.askokcancel(
@@ -189,6 +202,11 @@ class MedTrackerApp:
]
logger.debug(f"Adding entry: {entry}")
# Check if date is empty
if not self.date_var.get().strip():
messagebox.showerror("Error", "Please enter a date.", parent=self.root)
return
if self.data_manager.add_entry(entry):
messagebox.showinfo(
"Success", "Entry added successfully!", parent=self.root
@@ -196,7 +214,17 @@ class MedTrackerApp:
self._clear_entries()
self.load_data()
else:
messagebox.showerror("Error", "Failed to add entry", parent=self.root)
# Check if it's a duplicate date by trying to load existing data
df = self.data_manager.load_data()
if not df.empty and self.date_var.get() in df["date"].values:
messagebox.showerror(
"Error",
f"An entry for date '{self.date_var.get()}' already exists. "
"Please use a different date or edit the existing entry.",
parent=self.root,
)
else:
messagebox.showerror("Error", "Failed to add entry", parent=self.root)
def _delete_entry(self, edit_win: tk.Toplevel, item_id: str) -> None:
"""Delete the selected entry from the CSV file."""