Implement date uniqueness validation in DataManager and update MedTrackerApp for duplicate checks
This commit is contained in:
@@ -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",
|
||||
|
||||
36
src/main.py
36
src/main.py
@@ -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."""
|
||||
|
||||
Reference in New Issue
Block a user