diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index a9b41262e..f993640ab 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -105,7 +105,7 @@ class Plugin(RegistryBase, RegistryProperties): """ log.info('loaded') - def __init__(self, name, default_settings, media_item_class=None, settings_tab_class=None, version=None): + def __init__(self, name, media_item_class=None, settings_tab_class=None, version=None): """ This is the constructor for the plugin object. This provides an easy way for descendant plugins to populate common data. This method *must* @@ -117,8 +117,6 @@ class Plugin(RegistryBase, RegistryProperties): super(MyPlugin, self).__init__('MyPlugin', version='0.1') :param name: Defaults to *None*. The name of the plugin. - :param default_settings: A dict containing the plugin's settings. The value to each key is the default value - to be used. :param media_item_class: The class name of the plugin's media item. :param settings_tab_class: The class name of the plugin's settings tab. :param version: Defaults to *None*, which means that the same version number is used as OpenLP's version number. @@ -137,17 +135,6 @@ class Plugin(RegistryBase, RegistryProperties): self.media_item = None self.weight = 0 self.status = PluginStatus.Inactive - if default_settings: - # Add the default status to the default settings. - default_settings[name + '/status'] = PluginStatus.Inactive - default_settings[name + '/last directory'] = None - # Add settings to the dict of all settings. - Settings.extend_default_settings(default_settings) - # Append a setting for files in the mediamanager (note not all plugins - # which have a mediamanager need this). - if media_item_class is not None: - default_settings['{name}/{name} files'.format(name=name)] = [] - Registry().register_function('{name}_add_service_item'.format(name=self.name), self.process_add_service_event) Registry().register_function('{name}_config_updated'.format(name=self.name), self.config_update) self._setup(version) diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index 7bbb9d295..cf8f97124 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -122,7 +122,7 @@ class AlertsPlugin(Plugin): """ Class __init__ method """ - super(AlertsPlugin, self).__init__('alerts', None, settings_tab_class=AlertsTab) + super(AlertsPlugin, self).__init__('alerts', settings_tab_class=AlertsTab) self.weight = -3 self.icon_path = UiIcons().alert self.icon = self.icon_path diff --git a/openlp/plugins/alerts/lib/alertsmanager.py b/openlp/plugins/alerts/lib/alertsmanager.py index d9a83580c..77de61706 100644 --- a/openlp/plugins/alerts/lib/alertsmanager.py +++ b/openlp/plugins/alerts/lib/alertsmanager.py @@ -29,7 +29,6 @@ from PyQt5 import QtCore, QtGui from openlp.core.common.i18n import translate from openlp.core.common.mixins import LogMixin, RegistryProperties from openlp.core.common.registry import Registry, RegistryBase -from openlp.core.common.settings import Settings from openlp.core.display.screens import ScreenList @@ -81,24 +80,24 @@ class AlertsManager(QtCore.QObject, RegistryBase, LogMixin, RegistryProperties): Format and request the Alert and start the timer. """ if not self.alert_list or (len(ScreenList()) == 1 and - not Settings().value('core/display on monitor')): + not self.settings.value('core/display on monitor')): return text = self.alert_list.pop(0) # Get the rgb color format of the font & background hex colors from settings - rgb_font_color = self.hex_to_rgb(QtGui.QColor(Settings().value('alerts/font color'))) - rgb_background_color = self.hex_to_rgb(QtGui.QColor(Settings().value('alerts/background color'))) + rgb_font_color = self.hex_to_rgb(QtGui.QColor(self.settings.value('alerts/font color'))) + rgb_background_color = self.hex_to_rgb(QtGui.QColor(self.settings.value('alerts/background color'))) # Put alert settings together in dict that will be passed to Display in Javascript alert_settings = { 'backgroundColor': rgb_background_color, - 'location': Settings().value('alerts/location'), - 'fontFace': Settings().value('alerts/font face'), - 'fontSize': Settings().value('alerts/font size'), + 'location': self.settings.value('alerts/location'), + 'fontFace': self.settings.value('alerts/font face'), + 'fontSize': self.settings.value('alerts/font size'), 'fontColor': rgb_font_color, - 'timeout': Settings().value('alerts/timeout'), - 'repeat': Settings().value('alerts/repeat'), - 'scroll': Settings().value('alerts/scroll') + 'timeout': self.settings.value('alerts/timeout'), + 'repeat': self.settings.value('alerts/repeat'), + 'scroll': self.settings.value('alerts/scroll') } self.live_controller.displays[0].alert(text, json.dumps(alert_settings)) diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index cb9a21c8e..3eb53e560 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -44,7 +44,7 @@ class BiblePlugin(Plugin): log.info('Bible Plugin loaded') def __init__(self): - super(BiblePlugin, self).__init__('bibles', None, BibleMediaItem, BiblesTab) + super(BiblePlugin, self).__init__('bibles', BibleMediaItem, BiblesTab) self.weight = -9 self.icon_path = UiIcons().bible self.icon = UiIcons().bible diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index d878993d5..a42d1c639 100755 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -28,7 +28,6 @@ from PyQt5 import QtCore, QtWidgets from openlp.core.common.enum import BibleSearch, DisplayStyle, LayoutStyle from openlp.core.common.i18n import UiStrings, get_locale_key, translate from openlp.core.common.registry import Registry -from openlp.core.common.settings import Settings from openlp.core.lib import ServiceItemContext from openlp.core.lib.mediamanageritem import MediaManagerItem from openlp.core.lib.serviceitem import ItemCapabilities @@ -293,7 +292,7 @@ class BibleMediaItem(MediaManagerItem): :return: None """ log.debug('config_update') - visible = Settings().value('{settings_section}/second bibles'.format(settings_section=self.settings_section)) + visible = self.settings.value('{settings_section}/second bibles'.format(settings_section=self.settings_section)) self.general_bible_layout.labelForField(self.second_combo_box).setVisible(visible) self.second_combo_box.setVisible(visible) @@ -317,7 +316,7 @@ class BibleMediaItem(MediaManagerItem): translate('BiblesPlugin.MediaItem', 'Text Search'), translate('BiblesPlugin.MediaItem', 'Search Text...')) ]) - if Settings().value( + if self.settings.value( '{settings_section}/reset to combined quick search'.format(settings_section=self.settings_section)): self.search_edit.set_current_search_type(BibleSearch.Combined) self.config_update() @@ -341,7 +340,7 @@ class BibleMediaItem(MediaManagerItem): self.version_combo_box.addItem(bible[0], bible[1]) self.second_combo_box.addItem(bible[0], bible[1]) # set the default value - bible = Settings().value('{settings_section}/primary bible'.format(settings_section=self.settings_section)) + bible = self.settings.value('{settings_section}/primary bible'.format(settings_section=self.settings_section)) find_and_set_in_combo_box(self.version_combo_box, bible) def reload_bibles(self): @@ -549,7 +548,7 @@ class BibleMediaItem(MediaManagerItem): # TODO: Change layout_style to a property self.settings_tab.layout_style = index self.settings_tab.layout_style_combo_box.setCurrentIndex(index) - Settings().setValue('{section}/verse layout style'.format(section=self.settings_section), index) + self.settings.setValue('{section}/verse layout style'.format(section=self.settings_section), index) def on_version_combo_box_index_changed(self): """ @@ -559,7 +558,7 @@ class BibleMediaItem(MediaManagerItem): """ self.bible = self.version_combo_box.currentData() if self.bible is not None: - Settings().setValue('{section}/primary bible'.format(section=self.settings_section), self.bible.name) + self.settings.setValue('{section}/primary bible'.format(section=self.settings_section), self.bible.name) self.initialise_advanced_bible(self.select_book_combo_box.currentData()) def on_second_combo_box_index_changed(self, selection): @@ -805,7 +804,7 @@ class BibleMediaItem(MediaManagerItem): :return: None """ - if not Settings().value('bibles/is search while typing enabled') or \ + if not self.settings.value('bibles/is search while typing enabled') or \ not self.bible or self.bible.is_web_bible or \ (self.second_bible and self.bible.is_web_bible): return diff --git a/openlp/plugins/custom/customplugin.py b/openlp/plugins/custom/customplugin.py index 5d04c4433..40cb430e6 100644 --- a/openlp/plugins/custom/customplugin.py +++ b/openlp/plugins/custom/customplugin.py @@ -51,7 +51,7 @@ class CustomPlugin(Plugin): log.info('Custom Plugin loaded') def __init__(self): - super(CustomPlugin, self).__init__('custom', None, CustomMediaItem, CustomTab) + super(CustomPlugin, self).__init__('custom', CustomMediaItem, CustomTab) self.weight = -5 self.db_manager = Manager('custom', init_schema) self.icon_path = UiIcons().clone diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 03d9ac245..1226882ef 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -27,7 +27,6 @@ from sqlalchemy.sql import and_, func, or_ from openlp.core.common.enum import CustomSearch from openlp.core.common.i18n import UiStrings, translate from openlp.core.common.registry import Registry -from openlp.core.common.settings import Settings from openlp.core.lib import check_item_selected from openlp.core.lib.mediamanageritem import MediaManagerItem from openlp.core.lib.plugin import PluginStatus @@ -92,8 +91,8 @@ class CustomMediaItem(MediaManagerItem): Config has been updated so reload values """ log.debug('Config loaded') - self.add_custom_from_service = Settings().value(self.settings_section + '/add custom from service') - self.is_search_as_you_type_enabled = Settings().value('advanced/search as type') + self.add_custom_from_service = self.settings.value(self.settings_section + '/add custom from service') + self.is_search_as_you_type_enabled = self.settings.value('advanced/search as type') def retranslate_ui(self): """ @@ -238,7 +237,7 @@ class CustomMediaItem(MediaManagerItem): service_item.title = title for slide in raw_slides: service_item.add_from_text(slide) - if Settings().value(self.settings_section + '/display footer') or credit: + if self.settings.value(self.settings_section + '/display footer') or credit: service_item.raw_footer.append(' '.join([title, credit])) else: service_item.raw_footer.append('') diff --git a/openlp/plugins/images/imageplugin.py b/openlp/plugins/images/imageplugin.py index 38d90b86c..8a21691eb 100644 --- a/openlp/plugins/images/imageplugin.py +++ b/openlp/plugins/images/imageplugin.py @@ -45,7 +45,7 @@ class ImagePlugin(Plugin): log.info('Image Plugin loaded') def __init__(self): - super(ImagePlugin, self).__init__('images', None, ImageMediaItem, ImageTab) + super(ImagePlugin, self).__init__('images', ImageMediaItem, ImageTab) self.manager = Manager('images', init_schema, upgrade_mod=upgrade) self.weight = -7 self.icon_path = UiIcons().picture diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 74d6da50b..c8ddc42c0 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -29,7 +29,6 @@ from openlp.core.common.applocation import AppLocation from openlp.core.common.i18n import UiStrings, get_natural_key, translate from openlp.core.common.path import create_paths from openlp.core.common.registry import Registry -from openlp.core.common.settings import Settings from openlp.core.lib import ServiceItemContext, build_icon, check_item_selected, create_thumb, validate_thumb from openlp.core.lib.mediamanageritem import MediaManagerItem from openlp.core.lib.plugin import StringContent @@ -407,7 +406,7 @@ class ImageMediaItem(MediaManagerItem): self.application.set_normal_cursor() self.load_list(file_paths, target_group) last_dir = file_paths[0].parent - Settings().setValue(self.settings_section + '/last directory', last_dir) + self.settings.setValue(self.settings_section + '/last directory', last_dir) def load_list(self, image_paths, target_group=None, initial_load=False): """ @@ -552,7 +551,7 @@ class ImageMediaItem(MediaManagerItem): :param context: Why is it being generated :param kwargs: Consume other unused args specified by the base implementation, but not use by this one. """ - background = QtGui.QColor(Settings().value(self.settings_section + '/background color')) + background = QtGui.QColor(self.settings.value(self.settings_section + '/background color')) if item: items = [item] else: @@ -679,7 +678,7 @@ class ImageMediaItem(MediaManagerItem): if check_item_selected( self.list_view, translate('ImagePlugin.MediaItem', 'You must select an image to replace the background with.')): - background = QtGui.QColor(Settings().value(self.settings_section + '/background color')) + background = QtGui.QColor(self.settings.value(self.settings_section + '/background color')) bitem = self.list_view.selectedItems()[0] if not isinstance(bitem.data(0, QtCore.Qt.UserRole), ImageFilenames): # Only continue when an image is selected. diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index 407415723..728bff9b6 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -45,7 +45,7 @@ class MediaPlugin(Plugin): log.info('{name} MediaPlugin loaded'.format(name=__name__)) def __init__(self): - super(MediaPlugin, self).__init__('media', None, MediaMediaItem) + super(MediaPlugin, self).__init__('media', MediaMediaItem) self.weight = -6 self.icon_path = UiIcons().video self.icon = build_icon(self.icon_path) diff --git a/openlp/plugins/planningcenter/planningcenterplugin.py b/openlp/plugins/planningcenter/planningcenterplugin.py index 442b00196..6e6e2cf65 100644 --- a/openlp/plugins/planningcenter/planningcenterplugin.py +++ b/openlp/plugins/planningcenter/planningcenterplugin.py @@ -47,7 +47,7 @@ class PlanningCenterPlugin(Plugin): """ Create and set up the PlanningCenter plugin. """ - super(PlanningCenterPlugin, self).__init__('planningcenter', None, settings_tab_class=PlanningCenterTab) + super(PlanningCenterPlugin, self).__init__('planningcenter', settings_tab_class=PlanningCenterTab) self.planningcenter_form = None self.icon = UiIcons().planning_center self.icon_path = self.icon diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index 936354ffe..f8e0dd29f 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -25,7 +25,6 @@ from PyQt5 import QtCore, QtWidgets from openlp.core.common.i18n import UiStrings, get_natural_key, translate from openlp.core.common.path import path_to_str from openlp.core.common.registry import Registry -from openlp.core.common.settings import Settings from openlp.core.lib import ServiceItemContext, build_icon, check_item_selected, create_thumb, validate_thumb from openlp.core.lib.mediamanageritem import MediaManagerItem from openlp.core.lib.serviceitem import ItemCapabilities @@ -125,7 +124,7 @@ class PresentationMediaItem(MediaManagerItem): Populate the media manager tab """ self.list_view.setIconSize(QtCore.QSize(88, 50)) - file_paths = Settings().value(self.settings_section + '/presentations files') + file_paths = self.settings.value(self.settings_section + '/presentations files') self.load_list(file_paths, initial_load=True) self.populate_display_types() @@ -145,7 +144,7 @@ class PresentationMediaItem(MediaManagerItem): if self.display_type_combo_box.count() > 1: self.display_type_combo_box.insertItem(0, self.automatic, userData='automatic') self.display_type_combo_box.setCurrentIndex(0) - if Settings().value(self.settings_section + '/override app') == QtCore.Qt.Checked: + if self.settings.value(self.settings_section + '/override app') == QtCore.Qt.Checked: self.presentation_widget.show() else: self.presentation_widget.hide() @@ -233,7 +232,7 @@ class PresentationMediaItem(MediaManagerItem): self.main_window.finished_progress_bar() for row in row_list: self.list_view.takeItem(row) - Settings().setValue(self.settings_section + '/presentations files', self.get_file_list()) + self.settings.setValue(self.settings_section + '/presentations files', self.get_file_list()) self.application.set_normal_cursor() def clean_up_thumbnails(self, file_path, clean_for_update=False): @@ -412,7 +411,7 @@ class PresentationMediaItem(MediaManagerItem): :param show_error: not used :return: """ - file_paths = Settings().value(self.settings_section + '/presentations files') + file_paths = self.settings.value(self.settings_section + '/presentations files') results = [] string = string.lower() for file_path in file_paths: diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index b406f283b..1653cc120 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -55,7 +55,7 @@ class PresentationPlugin(Plugin): """ log.debug('Initialised') self.controllers = {} - Plugin.__init__(self, 'presentations', None, None) + Plugin.__init__(self, 'presentations', None) self.weight = -8 self.icon_path = UiIcons().presentation self.icon = build_icon(self.icon_path) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index d6eaf3798..1e39a04e3 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -32,7 +32,6 @@ from openlp.core.common.enum import SongSearch from openlp.core.common.i18n import UiStrings, get_natural_key, translate from openlp.core.common.path import create_paths from openlp.core.common.registry import Registry -from openlp.core.common.settings import Settings from openlp.core.lib import ServiceItemContext, check_item_selected, create_separated_list from openlp.core.lib.mediamanageritem import MediaManagerItem from openlp.core.lib.plugin import PluginStatus @@ -115,9 +114,9 @@ class SongMediaItem(MediaManagerItem): Is triggered when the songs config is updated """ log.debug('config_updated') - self.is_search_as_you_type_enabled = Settings().value('advanced/search as type') - self.update_service_on_edit = Settings().value(self.settings_section + '/update service on edit') - self.add_song_from_service = Settings().value(self.settings_section + '/add song from service') + self.is_search_as_you_type_enabled = self.settings.value('advanced/search as type') + self.update_service_on_edit = self.settings.value(self.settings_section + '/update service on edit') + self.add_song_from_service = self.settings.value(self.settings_section + '/add song from service') def retranslate_ui(self): self.search_text_label.setText('{text}:'.format(text=UiStrings().Search)) @@ -564,7 +563,7 @@ class SongMediaItem(MediaManagerItem): service_item.theme = song.theme_name service_item.edit_id = item_id verse_list = SongXML().get_verses(song.lyrics) - if Settings().value('songs/add songbook slide') and song.songbook_entries: + if self.settings.value('songs/add songbook slide') and song.songbook_entries: first_slide = '\n' for songbook_entry in song.songbook_entries: first_slide += '{book} #{num}'.format(book=songbook_entry.songbook.name, @@ -681,10 +680,10 @@ class SongMediaItem(MediaManagerItem): songbooks = [str(songbook_entry) for songbook_entry in song.songbook_entries] if song.songbook_entries: item.raw_footer.append(", ".join(songbooks)) - if Settings().value('core/ccli number'): + if self.settings.value('core/ccli number'): item.raw_footer.append(translate('SongsPlugin.MediaItem', 'CCLI License: ') + - Settings().value('core/ccli number')) - footer_template = Settings().value('songs/footer template') + self.settings.value('core/ccli number')) + footer_template = self.settings.value('songs/footer template') # Keep this in sync with the list in songstab.py vars = { 'title': song.title, @@ -703,7 +702,7 @@ class SongMediaItem(MediaManagerItem): 'authors_music_all': authors_music + authors_words_music, 'copyright': song.copyright, 'songbook_entries': songbooks, - 'ccli_license': Settings().value('core/ccli number'), + 'ccli_license': self.settings.value('core/ccli number'), 'ccli_license_label': translate('SongsPlugin.MediaItem', 'CCLI License'), 'ccli_number': song.ccli_number, 'topics': [topic.name for topic in song.topics] diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index 50fb15ecc..bace7c1b3 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -53,7 +53,7 @@ from openlp.plugins.songs.lib.songstab import SongsTab log = logging.getLogger(__name__) -__default_settings__ = { +song_footer = { 'songs/footer template': """\ ${title}
@@ -121,12 +121,13 @@ class SongsPlugin(Plugin): """ Create and set up the Songs plugin. """ - super(SongsPlugin, self).__init__('songs', __default_settings__, SongMediaItem, SongsTab) + super(SongsPlugin, self).__init__('songs', SongMediaItem, SongsTab) self.manager = Manager('songs', init_schema, upgrade_mod=upgrade) self.weight = -10 self.icon_path = UiIcons().music self.icon = build_icon(self.icon_path) self.songselect_form = None + self.settings.extend_default_settings(song_footer) register_endpoint(songs_endpoint) register_endpoint(api_songs_endpoint) State().add_service(self.name, self.weight, is_plugin=True) diff --git a/openlp/plugins/songusage/forms/songusagedetailform.py b/openlp/plugins/songusage/forms/songusagedetailform.py index c05613e82..bad29bfb1 100644 --- a/openlp/plugins/songusage/forms/songusagedetailform.py +++ b/openlp/plugins/songusage/forms/songusagedetailform.py @@ -26,7 +26,6 @@ from sqlalchemy.sql import and_ from openlp.core.common.i18n import translate from openlp.core.common.mixins import RegistryProperties from openlp.core.common.path import create_paths -from openlp.core.common.settings import Settings from openlp.core.lib.ui import critical_error_message_box from openlp.plugins.songusage.lib.db import SongUsageItem @@ -55,15 +54,15 @@ class SongUsageDetailForm(QtWidgets.QDialog, Ui_SongUsageDetailDialog, RegistryP """ We need to set up the screen """ - to_date = Settings().value(self.plugin.settings_section + '/to date') + to_date = self.settings.value(self.plugin.settings_section + '/to date') if not (isinstance(to_date, QtCore.QDate) and to_date.isValid()): to_date = QtCore.QDate.currentDate() - from_date = Settings().value(self.plugin.settings_section + '/from date') + from_date = self.settings.value(self.plugin.settings_section + '/from date') if not (isinstance(from_date, QtCore.QDate) and from_date.isValid()): from_date = to_date.addYears(-1) self.from_date_calendar.setSelectedDate(from_date) self.to_date_calendar.setSelectedDate(to_date) - self.report_path_edit.path = Settings().value(self.plugin.settings_section + '/last directory export') + self.report_path_edit.path = self.settings.value(self.plugin.settings_section + '/last directory export') def on_report_path_edit_path_changed(self, file_path): """ @@ -72,7 +71,7 @@ class SongUsageDetailForm(QtWidgets.QDialog, Ui_SongUsageDetailDialog, RegistryP :param pathlib.Path file_path: The new path. :rtype: None """ - Settings().setValue(self.plugin.settings_section + '/last directory export', file_path) + self.settings.setValue(self.plugin.settings_section + '/last directory export', file_path) def accept(self): """ @@ -92,8 +91,8 @@ class SongUsageDetailForm(QtWidgets.QDialog, Ui_SongUsageDetailDialog, RegistryP 'usage_detail_{old}_{new}.txt' ).format(old=self.from_date_calendar.selectedDate().toString('ddMMyyyy'), new=self.to_date_calendar.selectedDate().toString('ddMMyyyy')) - Settings().setValue(self.plugin.settings_section + '/from date', self.from_date_calendar.selectedDate()) - Settings().setValue(self.plugin.settings_section + '/to date', self.to_date_calendar.selectedDate()) + self.settings.setValue(self.plugin.settings_section + '/from date', self.from_date_calendar.selectedDate()) + self.settings.setValue(self.plugin.settings_section + '/to date', self.to_date_calendar.selectedDate()) usage = self.plugin.manager.get_all_objects( SongUsageItem, and_(SongUsageItem.usagedate >= self.from_date_calendar.selectedDate().toPyDate(), SongUsageItem.usagedate < self.to_date_calendar.selectedDate().toPyDate()), diff --git a/openlp/plugins/songusage/songusageplugin.py b/openlp/plugins/songusage/songusageplugin.py index 0cb59c932..14d610a00 100644 --- a/openlp/plugins/songusage/songusageplugin.py +++ b/openlp/plugins/songusage/songusageplugin.py @@ -28,7 +28,6 @@ from openlp.core.state import State from openlp.core.common.actions import ActionList from openlp.core.common.i18n import translate from openlp.core.common.registry import Registry -from openlp.core.common.settings import Settings from openlp.core.lib.db import Manager from openlp.core.lib.plugin import Plugin, StringContent from openlp.core.lib.ui import create_action @@ -51,7 +50,7 @@ class SongUsagePlugin(Plugin): log.info('SongUsage Plugin loaded') def __init__(self): - super(SongUsagePlugin, self).__init__('songusage', None) + super(SongUsagePlugin, self).__init__('songusage') self.manager = Manager('songusage', init_schema, upgrade_mod=upgrade) self.weight = -4 self.icon = UiIcons().song_usage @@ -116,7 +115,7 @@ class SongUsagePlugin(Plugin): super(SongUsagePlugin, self).initialise() Registry().register_function('slidecontroller_live_started', self.display_song_usage) Registry().register_function('print_service_started', self.print_song_usage) - self.song_usage_active = Settings().value(self.settings_section + '/active') + self.song_usage_active = self.settings.value(self.settings_section + '/active') # Set the button and checkbox state self.set_button_state() action_list = ActionList.get_instance() @@ -150,7 +149,7 @@ class SongUsagePlugin(Plugin): the UI when necessary, """ self.song_usage_active = not self.song_usage_active - Settings().setValue(self.settings_section + '/active', self.song_usage_active) + self.settings.setValue(self.settings_section + '/active', self.song_usage_active) self.set_button_state() def set_button_state(self): diff --git a/tests/conftest.py b/tests/conftest.py index b486d26be..7e8099515 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -31,6 +31,7 @@ from PyQt5 import QtCore, QtWidgets # noqa sys.modules['PyQt5.QtWebEngineWidgets'] = MagicMock() from openlp.core.app import OpenLP +from openlp.core.state import State from openlp.core.common.registry import Registry from openlp.core.common.settings import Settings @@ -82,3 +83,8 @@ def mock_settings(registry): yield mock_settings Registry().remove('settings') del mock_settings + + +@pytest.fixture(scope='function') +def state(): + State().load_settings() diff --git a/tests/functional/openlp_plugins/bibles/test_mediaitem.py b/tests/functional/openlp_plugins/bibles/test_mediaitem.py index b3fc73935..9900e7840 100755 --- a/tests/functional/openlp_plugins/bibles/test_mediaitem.py +++ b/tests/functional/openlp_plugins/bibles/test_mediaitem.py @@ -122,12 +122,9 @@ class TestMediaItem(TestCase, TestMixin): self.mocked_settings_instance = MagicMock() self.mocked_settings_instance.value.side_effect = lambda key: self.setting_values[key] - settings_patcher = patch( - 'openlp.plugins.bibles.lib.mediaitem.Settings', return_value=self.mocked_settings_instance) - self.addCleanup(settings_patcher.stop) - self.mocked_settings = settings_patcher.start() Registry.create() + Registry().register('settings', self.mocked_settings_instance) # self.setup_application() self.mocked_application = MagicMock() diff --git a/tests/functional/openlp_plugins/images/test_lib.py b/tests/functional/openlp_plugins/images/test_lib.py index 2324db41d..aa608fd95 100644 --- a/tests/functional/openlp_plugins/images/test_lib.py +++ b/tests/functional/openlp_plugins/images/test_lib.py @@ -21,6 +21,7 @@ """ This module contains tests for the lib submodule of the Images plugin. """ +import pytest from pathlib import Path from unittest import TestCase from unittest.mock import ANY, MagicMock, patch @@ -32,6 +33,22 @@ from openlp.plugins.images.lib.db import ImageFilenames, ImageGroups from openlp.plugins.images.lib.mediaitem import ImageMediaItem +@pytest.yield_fixture +def mocked_media_item(mock_settings): + """Local test setup""" + mocked_main_window = MagicMock() + Registry().register('application', MagicMock()) + Registry().register('service_list', MagicMock()) + Registry().register('main_window', mocked_main_window) + Registry().register('live_controller', MagicMock()) + mocked_plugin = MagicMock() + with patch('openlp.plugins.images.lib.mediaitem.MediaManagerItem._setup'), \ + patch('openlp.plugins.images.lib.mediaitem.ImageMediaItem.setup_item'): + media_item = ImageMediaItem(None, mocked_plugin) + media_item.settings_section = 'images' + yield media_item + + class TestImageMediaItem(TestCase): """ This is a test case to test various methods in the ImageMediaItem class. @@ -50,40 +67,6 @@ class TestImageMediaItem(TestCase): self.media_item = ImageMediaItem(None, mocked_plugin) self.media_item.settings_section = 'images' - @patch('openlp.plugins.images.lib.mediaitem.ImageMediaItem.load_list') - @patch('openlp.plugins.images.lib.mediaitem.Settings') - def test_validate_and_load(self, mocked_settings, mocked_load_list): - """ - Test that the validate_and_load_test() method when called without a group - """ - # GIVEN: A list of files - file_list = [Path('path1', 'image1.jpg'), Path('path2', 'image2.jpg')] - - # WHEN: Calling validate_and_load with the list of files - self.media_item.validate_and_load(file_list) - - # THEN: load_list should have been called with the file list and None, - # the directory should have been saved to the settings - mocked_load_list.assert_called_once_with(file_list, None) - mocked_settings().setValue.assert_called_once_with(ANY, Path('path1')) - - @patch('openlp.plugins.images.lib.mediaitem.ImageMediaItem.load_list') - @patch('openlp.plugins.images.lib.mediaitem.Settings') - def test_validate_and_load_group(self, mocked_settings, mocked_load_list): - """ - Test that the validate_and_load_test() method when called with a group - """ - # GIVEN: A list of files - file_list = [Path('path1', 'image1.jpg'), Path('path2', 'image2.jpg')] - - # WHEN: Calling validate_and_load with the list of files and a group - self.media_item.validate_and_load(file_list, 'group') - - # THEN: load_list should have been called with the file list and the group name, - # the directory should have been saved to the settings - mocked_load_list.assert_called_once_with(file_list, 'group') - mocked_settings().setValue.assert_called_once_with(ANY, Path('path1')) - @patch('openlp.plugins.images.lib.mediaitem.ImageMediaItem.load_full_list') def test_save_new_images_list_empty_list(self, mocked_load_full_list): """ @@ -280,3 +263,37 @@ class TestImageMediaItem(TestCase): assert isinstance(item_data, ImageFilenames) assert 1 == item_data.id assert Path('/', 'tmp', 'test_file_1.jpg') == item_data.file_path + + +@patch('openlp.plugins.images.lib.mediaitem.ImageMediaItem.load_list') +def test_validate_and_load(mocked_load_list, mocked_media_item): + """ + Test that the validate_and_load_test() method when called without a group + """ + # GIVEN: A list of files + file_list = [Path('path1', 'image1.jpg'), Path('path2', 'image2.jpg')] + + # WHEN: Calling validate_and_load with the list of files + mocked_media_item.validate_and_load(file_list) + + # THEN: load_list should have been called with the file list and None, + # the directory should have been saved to the settings + mocked_load_list.assert_called_once_with(file_list, None) + Registry().get('settings').setValue.assert_called_once_with(ANY, Path('path1')) + + +@patch('openlp.plugins.images.lib.mediaitem.ImageMediaItem.load_list') +def test_validate_and_load_group(mocked_load_list, mocked_media_item): + """ + Test that the validate_and_load_test() method when called with a group + """ + # GIVEN: A list of files + file_list = [Path('path1', 'image1.jpg'), Path('path2', 'image2.jpg')] + + # WHEN: Calling validate_and_load with the list of files and a group + mocked_media_item.validate_and_load(file_list, 'group') + + # THEN: load_list should have been called with the file list and the group name, + # the directory should have been saved to the settings + mocked_load_list.assert_called_once_with(file_list, 'group') + Registry().get('settings').setValue.assert_called_once_with(ANY, Path('path1')) diff --git a/tests/functional/openlp_plugins/media/test_mediaplugin.py b/tests/functional/openlp_plugins/media/test_mediaplugin.py index f7e90f1dc..e335ea5c6 100644 --- a/tests/functional/openlp_plugins/media/test_mediaplugin.py +++ b/tests/functional/openlp_plugins/media/test_mediaplugin.py @@ -29,7 +29,7 @@ from openlp.plugins.media.mediaplugin import MediaPlugin from tests.helpers.testmixin import TestMixin -class MediaPluginTest(TestCase, TestMixin): +class TestMediaPlugin(TestCase, TestMixin): """ Test the media plugin """ diff --git a/tests/functional/openlp_plugins/presentations/test_mediaitem.py b/tests/functional/openlp_plugins/presentations/test_mediaitem.py index cd7c3171d..2a3712ef6 100644 --- a/tests/functional/openlp_plugins/presentations/test_mediaitem.py +++ b/tests/functional/openlp_plugins/presentations/test_mediaitem.py @@ -144,8 +144,7 @@ class TestMediaItem(TestCase, TestMixin): @patch('openlp.plugins.presentations.lib.mediaitem.MediaManagerItem._setup') @patch('openlp.plugins.presentations.lib.mediaitem.PresentationMediaItem.setup_item') - @patch('openlp.plugins.presentations.lib.mediaitem.Settings') - def test_search(self, mocked_settings, *unreferenced_mocks): + def test_search(self, *unreferenced_mocks): """ Test that the search method finds the correct results """ @@ -156,7 +155,7 @@ class TestMediaItem(TestCase, TestMixin): path_3 = Path('another_dir', 'ppt_file') mocked_returned_settings = MagicMock() mocked_returned_settings.value.return_value = [path_1, path_2, path_3] - mocked_settings.return_value = mocked_returned_settings + Registry().register('settings', mocked_returned_settings) media_item = PresentationMediaItem(None, MagicMock(), None) media_item.settings_section = '' diff --git a/tests/functional/openlp_plugins/songs/test_mediaitem.py b/tests/functional/openlp_plugins/songs/test_mediaitem.py index 8cae25a56..bce6d1a5c 100644 --- a/tests/functional/openlp_plugins/songs/test_mediaitem.py +++ b/tests/functional/openlp_plugins/songs/test_mediaitem.py @@ -21,6 +21,7 @@ """ This module contains tests for the lib submodule of the Songs plugin. """ +import pytest from unittest import TestCase from unittest.mock import MagicMock, patch @@ -90,6 +91,29 @@ ${title}
} +@pytest.yield_fixture +def mocked_media_item(mock_settings): + Registry().register('service_list', MagicMock()) + Registry().register('main_window', MagicMock()) + mocked_plugin = MagicMock() + with patch('openlp.core.lib.mediamanageritem.MediaManagerItem._setup'), \ + patch('openlp.plugins.songs.forms.editsongform.EditSongForm.__init__'): + media_item = SongMediaItem(None, mocked_plugin) + media_item.save_auto_select_id = MagicMock() + media_item.list_view = MagicMock() + media_item.list_view.save_auto_select_id = MagicMock() + media_item.list_view.clear = MagicMock() + media_item.list_view.addItem = MagicMock() + media_item.list_view.setCurrentItem = MagicMock() + media_item.auto_select_id = -1 + media_item.display_songbook = False + media_item.display_copyright_symbol = False + settings = Registry().get('settings') + settings.extend_default_settings(__default_settings__) + QtCore.QLocale.setDefault(QtCore.QLocale('en_GB')) + yield media_item + + class TestMediaItem(TestCase, TestMixin): """ Test the functions in the :mod:`lib` module. @@ -117,6 +141,8 @@ class TestMediaItem(TestCase, TestMixin): self.setup_application() self.build_settings() Settings().extend_default_settings(__default_settings__) + self.settings = self.setting + Registry().register('settings', self.settings) QtCore.QLocale.setDefault(QtCore.QLocale('en_GB')) def tearDown(self): @@ -348,51 +374,6 @@ class TestMediaItem(TestCase, TestMixin): mock_qlist_widget.setData.assert_called_once_with(MockedUserRole, mock_song.id) self.media_item.list_view.addItem.assert_called_once_with(mock_qlist_widget) - @patch(u'openlp.plugins.songs.lib.mediaitem.Settings') - def test_build_song_footer_one_author_show_written_by(self, MockedSettings): - """ - Test build songs footer with basic song and one author - """ - # GIVEN: A Song and a Service Item, mocked settings - - mocked_settings = MagicMock() - mocked_settings.value.side_effect = [False, "", "0"] - MockedSettings.return_value = mocked_settings - - with patch('mako.template.Template.render_unicode') as MockedRenderer: - mock_song = MagicMock() - mock_song.title = 'My Song' - mock_song.alternate_title = '' - mock_song.ccli_number = '' - mock_song.authors_songs = [] - mock_author = MagicMock() - mock_author.display_name = 'my author' - mock_author_song = MagicMock() - mock_author_song.author = mock_author - mock_song.authors_songs.append(mock_author_song) - mock_song.copyright = 'My copyright' - mock_song.songbook_entries = [] - service_item = ServiceItem(None) - - # WHEN: I generate the Footer with default settings - author_list = self.media_item.generate_footer(service_item, mock_song) - - # THEN: The mako function was called with the following arguments - args = {'authors_translation': [], 'authors_music_label': 'Music', - 'copyright': 'My copyright', 'songbook_entries': [], - 'alternate_title': '', 'topics': [], 'authors_music_all': [], - 'authors_words_label': 'Words', 'authors_music': [], - 'authors_words_music': [], 'ccli_number': '', - 'authors_none_label': 'Written by', 'title': 'My Song', - 'authors_words_music_label': 'Words and Music', - 'authors_none': ['my author'], - 'ccli_license_label': 'CCLI License', 'authors_words': [], - 'ccli_license': '0', 'authors_translation_label': 'Translation', - 'authors_words_all': []} - MockedRenderer.assert_called_once_with(**args) - self.assertEqual(author_list, ['my author'], - 'The author list should be returned correctly with one author') - def test_build_song_footer_two_authors(self): """ Test build songs footer with basic song and two authors @@ -443,7 +424,7 @@ class TestMediaItem(TestCase, TestMixin): mock_song.copyright = 'My copyright' mock_song.songbook_entries = [] service_item = ServiceItem(None) - Settings().setValue('core/ccli number', '1234') + self.settings.setValue('core/ccli number', '1234') # WHEN: I generate the Footer with default settings self.media_item.generate_footer(service_item, mock_song) @@ -453,7 +434,7 @@ class TestMediaItem(TestCase, TestMixin): 'The array should be returned correctly with a song, an author, copyright and ccli' # WHEN: I amend the CCLI value - Settings().setValue('core/ccli number', '4321') + self.settings.setValue('core/ccli number', '4321') self.media_item.generate_footer(service_item, mock_song) # THEN: I would get an amended footer string @@ -622,3 +603,45 @@ class TestMediaItem(TestCase, TestMixin): self.mocked_plugin.manager.session.query.assert_called_once_with(MockedSong) assert self.mocked_plugin.manager.session.query.mock_calls[4][0] == '().join().join().filter().all' + + +def test_build_song_footer_one_author_show_written_by(mocked_media_item): + """ + Test build songs footer with basic song and one author + """ + # GIVEN: A Song and a Service Item, mocked settings + + mocked_media_item.settings.value.side_effect = [False, "", "0"] + + with patch('mako.template.Template.render_unicode') as MockedRenderer: + mock_song = MagicMock() + mock_song.title = 'My Song' + mock_song.alternate_title = '' + mock_song.ccli_number = '' + mock_song.authors_songs = [] + mock_author = MagicMock() + mock_author.display_name = 'my author' + mock_author_song = MagicMock() + mock_author_song.author = mock_author + mock_song.authors_songs.append(mock_author_song) + mock_song.copyright = 'My copyright' + mock_song.songbook_entries = [] + service_item = ServiceItem(None) + + # WHEN: I generate the Footer with default settings + author_list = mocked_media_item.generate_footer(service_item, mock_song) + + # THEN: The mako function was called with the following arguments + args = {'authors_translation': [], 'authors_music_label': 'Music', + 'copyright': 'My copyright', 'songbook_entries': [], + 'alternate_title': '', 'topics': [], 'authors_music_all': [], + 'authors_words_label': 'Words', 'authors_music': [], + 'authors_words_music': [], 'ccli_number': '', + 'authors_none_label': 'Written by', 'title': 'My Song', + 'authors_words_music_label': 'Words and Music', + 'authors_none': ['my author'], + 'ccli_license_label': 'CCLI License', 'authors_words': [], + 'ccli_license': '0', 'authors_translation_label': 'Translation', + 'authors_words_all': []} + MockedRenderer.assert_called_once_with(**args) + assert author_list == ['my author'], 'The author list should be returned correctly with one author' diff --git a/tests/functional/openlp_plugins/songusage/test_songusage.py b/tests/functional/openlp_plugins/songusage/test_songusage.py index c722244fb..ee3e008bb 100644 --- a/tests/functional/openlp_plugins/songusage/test_songusage.py +++ b/tests/functional/openlp_plugins/songusage/test_songusage.py @@ -21,78 +21,74 @@ """ This module contains tests for the Songusage plugin. """ -from unittest import TestCase from unittest.mock import MagicMock, patch -from openlp.core.common.registry import Registry from openlp.plugins.songusage.lib import upgrade from openlp.plugins.songusage.lib.db import init_schema from openlp.plugins.songusage.songusageplugin import SongUsagePlugin -class TestSongUsage(TestCase): +def test_about_text(state, mock_settings): + """ + Test the about text of the song usage plugin + """ + # GIVEN: The SongUsagePlugin + # WHEN: Retrieving the about text + # THEN: about() should return a string object + assert isinstance(SongUsagePlugin.about(), str) + # THEN: about() should return a non-empty string + assert len(SongUsagePlugin.about()) != 0 + assert len(SongUsagePlugin.about()) != 0 - def setUp(self): - Registry.create() - def test_about_text(self): - """ - Test the about text of the song usage plugin - """ - # GIVEN: The SongUsagePlugin - # WHEN: Retrieving the about text - # THEN: about() should return a string object - assert isinstance(SongUsagePlugin.about(), str) - # THEN: about() should return a non-empty string - assert len(SongUsagePlugin.about()) != 0 - assert len(SongUsagePlugin.about()) != 0 +@patch('openlp.plugins.songusage.songusageplugin.Manager') +def test_song_usage_init(MockedManager, settings): + """ + Test the initialisation of the SongUsagePlugin class + """ + # GIVEN: A mocked database manager + mocked_manager = MagicMock() + MockedManager.return_value = mocked_manager - @patch('openlp.plugins.songusage.songusageplugin.Manager') - def test_song_usage_init(self, MockedManager): - """ - Test the initialisation of the SongUsagePlugin class - """ - # GIVEN: A mocked database manager - mocked_manager = MagicMock() - MockedManager.return_value = mocked_manager + # WHEN: The SongUsagePlugin class is instantiated + song_usage = SongUsagePlugin() - # WHEN: The SongUsagePlugin class is instantiated - song_usage = SongUsagePlugin() + # THEN: It should be initialised correctly + MockedManager.assert_called_with('songusage', init_schema, upgrade_mod=upgrade) + assert mocked_manager == song_usage.manager + assert song_usage.song_usage_active is False - # THEN: It should be initialised correctly - MockedManager.assert_called_with('songusage', init_schema, upgrade_mod=upgrade) - assert mocked_manager == song_usage.manager - assert song_usage.song_usage_active is False - @patch('openlp.plugins.songusage.songusageplugin.Manager') - def test_check_pre_conditions(self, MockedManager): - """ - Test that check_pre_condition returns true for valid manager session - """ - # GIVEN: A mocked database manager - mocked_manager = MagicMock() - mocked_manager.session = MagicMock() - MockedManager.return_value = mocked_manager - song_usage = SongUsagePlugin() +@patch('openlp.plugins.songusage.songusageplugin.Manager') +def test_check_pre_conditions(MockedManager, settings): + """ + Test that check_pre_condition returns true for valid manager session + """ + # GIVEN: A mocked database manager + mocked_manager = MagicMock() + mocked_manager.session = MagicMock() + MockedManager.return_value = mocked_manager + song_usage = SongUsagePlugin() - # WHEN: The calling check_pre_conditions - ret = song_usage.check_pre_conditions() + # WHEN: The calling check_pre_conditions + ret = song_usage.check_pre_conditions() - # THEN: It should return True - assert ret is True + # THEN: It should return True + assert ret is True - @patch('openlp.plugins.songusage.songusageplugin.Manager') - def test_toggle_song_usage_state(self, MockedManager): - """ - Test that toggle_song_usage_state does toggle song_usage_state - """ - # GIVEN: A SongUsagePlugin - song_usage = SongUsagePlugin() - song_usage.set_button_state = MagicMock() - song_usage.song_usage_active = True - # WHEN: calling toggle_song_usage_state - song_usage.toggle_song_usage_state() +@patch('openlp.plugins.songusage.songusageplugin.Manager') +def test_toggle_song_usage_state(MockedManager, settings): + """ + Test that toggle_song_usage_state does toggle song_usage_state + """ + # GIVEN: A SongUsagePlugin + song_usage = SongUsagePlugin() + song_usage.set_button_state = MagicMock() + song_usage.song_usage_active = True - # THEN: song_usage_state should have been toogled - assert song_usage.song_usage_active is False + # WHEN: calling toggle_song_usage_state + song_usage.toggle_song_usage_state() + + # THEN: song_usage_state should have been toogled + assert song_usage.song_usage_active is False