Skip to content
Snippets Groups Projects

Change how users delete entries from the database

Merged Kien Le requested to merge feature-new_way_to_delete_database_entry into master
@@ -506,37 +506,42 @@ class UiDBInfoDialog(OneWindowAtATimeDialog):
self.data_table_widget.setCellWidget(row_idx, self.total_col - 1,
delete_button)
delete_button.clicked.connect(
lambda: self.delete_data_row(delete_button)
lambda: self.delete_table_row(delete_button)
)
@QtCore.Slot()
def delete_data_row(self, row_delete_button: QtWidgets.QPushButton):
def delete_table_row(self, row_delete_button: QtWidgets.QPushButton):
"""
Remove all data edit widgets from a row and notify the user that they
deleted a row from the data table. Also convert the delete button into
an undo button.
On the backend, format a SQL statement to delete the row from the
database and store it for use when saving changes.
database and queue it to be run when saving changes.
:param row_delete_button: the delete button assigned to the row to be
deleted
"""
# If we don't have this line, there is an issue with the undo button
# flickering in behind the 0 row label before moving to the correct
# location.
self.data_table_widget.setUpdatesEnabled(False)
delete_button_y = row_delete_button.y()
chosen_row = self.data_table_widget.rowAt(delete_button_y)
row_idx = self.data_table_widget.rowAt(delete_button_y)
# We want to tell user what they removed. However, we will be removing
# all the data edit widgets before displaying the delete notification
# to user, so we have to save the needed information beforehand.
primary_key = self.data_table_widget.cellWidget(chosen_row, 1).text()
primary_key = self.data_table_widget.cellWidget(row_idx, 1).text()
# Remove all the data edit widgets in the chosen row.
data_edit_widgets_count = self.total_col - 2
for i in range(1, data_edit_widgets_count + 1):
self.data_table_widget.removeCellWidget(chosen_row, i)
self.data_table_widget.setSpan(chosen_row, 1,
1, data_edit_widgets_count)
self.data_table_widget.removeCellWidget(row_idx, i)
self.data_table_widget.setSpan(row_idx, 1,
1, data_edit_widgets_count)
# Show the notification that the row has been deleted.
row_deleted_notifications = (
f'{self.column_headers[1]} '
@@ -546,15 +551,43 @@ class UiDBInfoDialog(OneWindowAtATimeDialog):
row_deleted_label = QtWidgets.QLabel(row_deleted_notifications)
row_deleted_label.setTextFormat(QtCore.Qt.RichText)
row_deleted_label.setAlignment(QtCore.Qt.AlignCenter)
self.data_table_widget.setCellWidget(chosen_row, 1,
self.data_table_widget.setCellWidget(row_idx, 1,
row_deleted_label)
undo_button = QtWidgets.QPushButton('Undo')
undo_button.clicked.connect(
lambda: self.undo_delete_table_row(row_idx)
)
self.data_table_widget.setCellWidget(
row_idx, self.total_col - 1, undo_button
)
# Format the SQL statement that will delete the chosen row from the
# database and queue it for execution.
delete_sql = (f"DELETE FROM {self.table_name} "
f"WHERE {self.col_name}='{primary_key}'")
delete_sql += self.delete_sql_supplement
self.queued_row_delete_sqls[chosen_row] = delete_sql
self.queued_row_delete_sqls[row_idx] = delete_sql
self.data_table_widget.setUpdatesEnabled(True)
def undo_delete_table_row(self, row_idx: int):
"""
Undo the deletion of a table row and dequeue the corresponding SQL
statement from the list of SQL statements to be run when saving.
:param row_idx: the row number of the row being deleted
"""
# If we don't have this line, there is an issue with the undo button
# flickering in behind the 0 row label before moving to the correct
# location.
self.data_table_widget.setUpdatesEnabled(False)
self.data_table_widget.removeCellWidget(row_idx, 1)
self.data_table_widget.setSpan(row_idx, 1, 1, 1)
self.set_row_widgets(row_idx)
del self.queued_row_delete_sqls[row_idx]
self.data_table_widget.setUpdatesEnabled(True)
def data_type_changed(self):
"""
Loading