Add the list of associated songs to the delete dialog in the song maintenance form

This commit is contained in:
Raoul Snyman 2023-07-17 14:28:32 -07:00
parent de2dde2064
commit 92db0c0cc7
3 changed files with 34 additions and 30 deletions

View File

@ -108,16 +108,19 @@ class SongMaintenanceForm(QtWidgets.QDialog, Ui_SongMaintenanceDialog, RegistryP
Delete an item.
"""
item_id = self._get_current_item_id(list_widget)
if item_id != -1:
item = self.manager.get_object(item_class, item_id)
if item and not item.songs:
if critical_error_message_box(dlg_title, del_text, self, True) == QtWidgets.QMessageBox.Yes:
self.manager.delete_object(item_class, item.id)
reset_func()
else:
critical_error_message_box(dlg_title, err_text)
else:
if item_id == -1:
critical_error_message_box(dlg_title, UiStrings().NISs)
return
item = self.manager.get_object(item_class, item_id)
if item:
song_titles = [song.title for song in item.songs]
if song_titles:
critical_error_message_box(dlg_title, err_text + '\n\n' + '\n'.join(song_titles))
elif critical_error_message_box(dlg_title, del_text, self, True) == QtWidgets.QMessageBox.Yes:
self.manager.delete_object(item_class, item.id)
reset_func()
else:
critical_error_message_box(dlg_title, err_text)
def reset_authors(self):
"""

View File

@ -192,10 +192,16 @@ class Author(Base):
authors_songs = relationship('AuthorSong', back_populates='author')
def get_display_name(self, author_type: Optional[str] = None) -> str:
"""Determine the display name"""
if author_type:
return "{name} ({author})".format(name=self.display_name, author=AuthorType.Types[author_type])
return self.display_name
@property
def songs(self):
"""All the songs associated with this author"""
return [author_song.song for author_song in self.authors_songs]
class AuthorSong(Base):
"""

View File

@ -131,8 +131,8 @@ def test_delete_item_no_item_id(mocked_critical_error_message_box, form_env):
Test the _delete_item() method when there is no item selected
"""
# GIVEN: Some mocked items
form = form_env[0]
mocked_item_class = MagicMock()
form, manager = form_env
manager.get_object.return_value = None
mocked_list_widget = MagicMock()
mocked_reset_func = MagicMock()
dialog_title = 'Delete Item'
@ -142,7 +142,7 @@ def test_delete_item_no_item_id(mocked_critical_error_message_box, form_env):
# WHEN: _delete_item() is called
with patch.object(form, '_get_current_item_id') as mocked_get_current_item_id:
mocked_get_current_item_id.return_value = -1
form._delete_item(mocked_item_class, mocked_list_widget, mocked_reset_func, dialog_title, delete_text,
form._delete_item(SongBook, mocked_list_widget, mocked_reset_func, dialog_title, delete_text,
error_text)
# THEN: The right things should have been called
@ -156,10 +156,8 @@ def test_delete_item_invalid_item(mocked_critical_error_message_box, form_env):
Test the _delete_item() method when the item doesn't exist in the database
"""
# GIVEN: Some mocked items
form = form_env[0]
mocked_manager = form_env[1]
mocked_manager.get_object.return_value = None
mocked_item_class = MagicMock()
form, manager = form_env
manager.get_object.return_value = None
mocked_list_widget = MagicMock()
mocked_reset_func = MagicMock()
dialog_title = 'Delete Item'
@ -169,12 +167,12 @@ def test_delete_item_invalid_item(mocked_critical_error_message_box, form_env):
# WHEN: _delete_item() is called
with patch.object(form, '_get_current_item_id') as mocked_get_current_item_id:
mocked_get_current_item_id.return_value = 1
form._delete_item(mocked_item_class, mocked_list_widget, mocked_reset_func, dialog_title, delete_text,
form._delete_item(SongBook, mocked_list_widget, mocked_reset_func, dialog_title, delete_text,
error_text)
# THEN: The right things should have been called
mocked_get_current_item_id.assert_called_once_with(mocked_list_widget)
mocked_manager.get_object.assert_called_once_with(mocked_item_class, 1)
manager.get_object.assert_called_once_with(SongBook, 1)
mocked_critical_error_message_box.assert_called_once_with(dialog_title, error_text)
@ -184,14 +182,12 @@ def test_delete_item(mocked_critical_error_message_box, form_env):
Test the _delete_item() method
"""
# GIVEN: Some mocked items
form = form_env[0]
mocked_manager = form_env[1]
form, mocked_manager = form_env
mocked_item = MagicMock()
mocked_item.songs = []
mocked_item.id = 1
mocked_manager.get_object.return_value = mocked_item
mocked_critical_error_message_box.return_value = QtWidgets.QMessageBox.Yes
mocked_item_class = MagicMock()
mocked_list_widget = MagicMock()
mocked_reset_func = MagicMock()
dialog_title = 'Delete Item'
@ -201,14 +197,14 @@ def test_delete_item(mocked_critical_error_message_box, form_env):
# WHEN: _delete_item() is called
with patch.object(form, '_get_current_item_id') as mocked_get_current_item_id:
mocked_get_current_item_id.return_value = 1
form._delete_item(mocked_item_class, mocked_list_widget, mocked_reset_func, dialog_title, delete_text,
form._delete_item(SongBook, mocked_list_widget, mocked_reset_func, dialog_title, delete_text,
error_text)
# THEN: The right things should have been called
mocked_get_current_item_id.assert_called_once_with(mocked_list_widget)
mocked_manager.get_object.assert_called_once_with(mocked_item_class, 1)
mocked_manager.get_object.assert_called_once_with(SongBook, 1)
mocked_critical_error_message_box.assert_called_once_with(dialog_title, delete_text, form, True)
mocked_manager.delete_object.assert_called_once_with(mocked_item_class, 1)
mocked_manager.delete_object.assert_called_once_with(SongBook, 1)
mocked_reset_func.assert_called_once_with()
@ -218,13 +214,12 @@ def test_delete_book_assigned(mocked_critical_error_message_box, form_env):
Test the _delete_item() method
"""
# GIVEN: Some mocked items
form = form_env[0]
mocked_manager = form_env[1]
form, mocked_manager = form_env
mocked_item = create_autospec(SongBook, spec_set=True)
mocked_item.id = 1
mocked_item.songs = [MagicMock(title='Amazing Grace')]
mocked_manager.get_object.return_value = mocked_item
mocked_critical_error_message_box.return_value = QtWidgets.QMessageBox.Yes
mocked_item_class = MagicMock()
mocked_list_widget = MagicMock()
mocked_reset_func = MagicMock()
dialog_title = 'Delete Book'
@ -234,13 +229,13 @@ def test_delete_book_assigned(mocked_critical_error_message_box, form_env):
# WHEN: _delete_item() is called
with patch.object(form, '_get_current_item_id') as mocked_get_current_item_id:
mocked_get_current_item_id.return_value = 1
form._delete_item(mocked_item_class, mocked_list_widget, mocked_reset_func, dialog_title, delete_text,
form._delete_item(SongBook, mocked_list_widget, mocked_reset_func, dialog_title, delete_text,
error_text)
# THEN: The right things should have been called
mocked_get_current_item_id.assert_called_once_with(mocked_list_widget)
mocked_manager.get_object.assert_called_once_with(mocked_item_class, 1)
mocked_critical_error_message_box.assert_called_once_with(dialog_title, error_text)
mocked_manager.get_object.assert_called_once_with(SongBook, 1)
mocked_critical_error_message_box.assert_called_once_with(dialog_title, error_text + '\n\nAmazing Grace')
mocked_manager.delete_object.assert_not_called()
mocked_reset_func.assert_not_called()