mirror of https://gitlab.com/openlp/openlp.git
Merge branch 'add-songs-to-topics-books-authors' into 'master'
Add the list of associated songs to the delete dialog in the song maintenance form See merge request openlp/openlp!635
This commit is contained in:
commit
d97bc6a9ca
|
@ -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):
|
||||
"""
|
||||
|
|
|
@ -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):
|
||||
"""
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
Loading…
Reference in New Issue