forked from openlp/openlp
Merge branch 'settings_plugins_1' into 'master'
Migrate Plugins and media item See merge request openlp/openlp!122
This commit is contained in:
commit
9dd8f51773
@ -105,7 +105,7 @@ class Plugin(RegistryBase, RegistryProperties):
|
|||||||
"""
|
"""
|
||||||
log.info('loaded')
|
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
|
This is the constructor for the plugin object. This provides an easy way for descendant plugins to populate
|
||||||
common data. This method *must*
|
common data. This method *must*
|
||||||
@ -117,8 +117,6 @@ class Plugin(RegistryBase, RegistryProperties):
|
|||||||
super(MyPlugin, self).__init__('MyPlugin', version='0.1')
|
super(MyPlugin, self).__init__('MyPlugin', version='0.1')
|
||||||
|
|
||||||
:param name: Defaults to *None*. The name of the plugin.
|
: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 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 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.
|
: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.media_item = None
|
||||||
self.weight = 0
|
self.weight = 0
|
||||||
self.status = PluginStatus.Inactive
|
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}_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)
|
Registry().register_function('{name}_config_updated'.format(name=self.name), self.config_update)
|
||||||
self._setup(version)
|
self._setup(version)
|
||||||
|
@ -122,7 +122,7 @@ class AlertsPlugin(Plugin):
|
|||||||
"""
|
"""
|
||||||
Class __init__ method
|
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.weight = -3
|
||||||
self.icon_path = UiIcons().alert
|
self.icon_path = UiIcons().alert
|
||||||
self.icon = self.icon_path
|
self.icon = self.icon_path
|
||||||
|
@ -29,7 +29,6 @@ from PyQt5 import QtCore, QtGui
|
|||||||
from openlp.core.common.i18n import translate
|
from openlp.core.common.i18n import translate
|
||||||
from openlp.core.common.mixins import LogMixin, RegistryProperties
|
from openlp.core.common.mixins import LogMixin, RegistryProperties
|
||||||
from openlp.core.common.registry import Registry, RegistryBase
|
from openlp.core.common.registry import Registry, RegistryBase
|
||||||
from openlp.core.common.settings import Settings
|
|
||||||
from openlp.core.display.screens import ScreenList
|
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.
|
Format and request the Alert and start the timer.
|
||||||
"""
|
"""
|
||||||
if not self.alert_list or (len(ScreenList()) == 1 and
|
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
|
return
|
||||||
text = self.alert_list.pop(0)
|
text = self.alert_list.pop(0)
|
||||||
|
|
||||||
# Get the rgb color format of the font & background hex colors from settings
|
# 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_font_color = self.hex_to_rgb(QtGui.QColor(self.settings.value('alerts/font color')))
|
||||||
rgb_background_color = self.hex_to_rgb(QtGui.QColor(Settings().value('alerts/background 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
|
# Put alert settings together in dict that will be passed to Display in Javascript
|
||||||
alert_settings = {
|
alert_settings = {
|
||||||
'backgroundColor': rgb_background_color,
|
'backgroundColor': rgb_background_color,
|
||||||
'location': Settings().value('alerts/location'),
|
'location': self.settings.value('alerts/location'),
|
||||||
'fontFace': Settings().value('alerts/font face'),
|
'fontFace': self.settings.value('alerts/font face'),
|
||||||
'fontSize': Settings().value('alerts/font size'),
|
'fontSize': self.settings.value('alerts/font size'),
|
||||||
'fontColor': rgb_font_color,
|
'fontColor': rgb_font_color,
|
||||||
'timeout': Settings().value('alerts/timeout'),
|
'timeout': self.settings.value('alerts/timeout'),
|
||||||
'repeat': Settings().value('alerts/repeat'),
|
'repeat': self.settings.value('alerts/repeat'),
|
||||||
'scroll': Settings().value('alerts/scroll')
|
'scroll': self.settings.value('alerts/scroll')
|
||||||
}
|
}
|
||||||
self.live_controller.displays[0].alert(text, json.dumps(alert_settings))
|
self.live_controller.displays[0].alert(text, json.dumps(alert_settings))
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ class BiblePlugin(Plugin):
|
|||||||
log.info('Bible Plugin loaded')
|
log.info('Bible Plugin loaded')
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(BiblePlugin, self).__init__('bibles', None, BibleMediaItem, BiblesTab)
|
super(BiblePlugin, self).__init__('bibles', BibleMediaItem, BiblesTab)
|
||||||
self.weight = -9
|
self.weight = -9
|
||||||
self.icon_path = UiIcons().bible
|
self.icon_path = UiIcons().bible
|
||||||
self.icon = UiIcons().bible
|
self.icon = UiIcons().bible
|
||||||
|
@ -28,7 +28,6 @@ from PyQt5 import QtCore, QtWidgets
|
|||||||
from openlp.core.common.enum import BibleSearch, DisplayStyle, LayoutStyle
|
from openlp.core.common.enum import BibleSearch, DisplayStyle, LayoutStyle
|
||||||
from openlp.core.common.i18n import UiStrings, get_locale_key, translate
|
from openlp.core.common.i18n import UiStrings, get_locale_key, translate
|
||||||
from openlp.core.common.registry import Registry
|
from openlp.core.common.registry import Registry
|
||||||
from openlp.core.common.settings import Settings
|
|
||||||
from openlp.core.lib import ServiceItemContext
|
from openlp.core.lib import ServiceItemContext
|
||||||
from openlp.core.lib.mediamanageritem import MediaManagerItem
|
from openlp.core.lib.mediamanageritem import MediaManagerItem
|
||||||
from openlp.core.lib.serviceitem import ItemCapabilities
|
from openlp.core.lib.serviceitem import ItemCapabilities
|
||||||
@ -293,7 +292,7 @@ class BibleMediaItem(MediaManagerItem):
|
|||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
log.debug('config_update')
|
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.general_bible_layout.labelForField(self.second_combo_box).setVisible(visible)
|
||||||
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', 'Text Search'),
|
||||||
translate('BiblesPlugin.MediaItem', 'Search Text...'))
|
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)):
|
'{settings_section}/reset to combined quick search'.format(settings_section=self.settings_section)):
|
||||||
self.search_edit.set_current_search_type(BibleSearch.Combined)
|
self.search_edit.set_current_search_type(BibleSearch.Combined)
|
||||||
self.config_update()
|
self.config_update()
|
||||||
@ -341,7 +340,7 @@ class BibleMediaItem(MediaManagerItem):
|
|||||||
self.version_combo_box.addItem(bible[0], bible[1])
|
self.version_combo_box.addItem(bible[0], bible[1])
|
||||||
self.second_combo_box.addItem(bible[0], bible[1])
|
self.second_combo_box.addItem(bible[0], bible[1])
|
||||||
# set the default value
|
# 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)
|
find_and_set_in_combo_box(self.version_combo_box, bible)
|
||||||
|
|
||||||
def reload_bibles(self):
|
def reload_bibles(self):
|
||||||
@ -549,7 +548,7 @@ class BibleMediaItem(MediaManagerItem):
|
|||||||
# TODO: Change layout_style to a property
|
# TODO: Change layout_style to a property
|
||||||
self.settings_tab.layout_style = index
|
self.settings_tab.layout_style = index
|
||||||
self.settings_tab.layout_style_combo_box.setCurrentIndex(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):
|
def on_version_combo_box_index_changed(self):
|
||||||
"""
|
"""
|
||||||
@ -559,7 +558,7 @@ class BibleMediaItem(MediaManagerItem):
|
|||||||
"""
|
"""
|
||||||
self.bible = self.version_combo_box.currentData()
|
self.bible = self.version_combo_box.currentData()
|
||||||
if self.bible is not None:
|
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())
|
self.initialise_advanced_bible(self.select_book_combo_box.currentData())
|
||||||
|
|
||||||
def on_second_combo_box_index_changed(self, selection):
|
def on_second_combo_box_index_changed(self, selection):
|
||||||
@ -805,7 +804,7 @@ class BibleMediaItem(MediaManagerItem):
|
|||||||
|
|
||||||
:return: None
|
: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 \
|
not self.bible or self.bible.is_web_bible or \
|
||||||
(self.second_bible and self.bible.is_web_bible):
|
(self.second_bible and self.bible.is_web_bible):
|
||||||
return
|
return
|
||||||
|
@ -51,7 +51,7 @@ class CustomPlugin(Plugin):
|
|||||||
log.info('Custom Plugin loaded')
|
log.info('Custom Plugin loaded')
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(CustomPlugin, self).__init__('custom', None, CustomMediaItem, CustomTab)
|
super(CustomPlugin, self).__init__('custom', CustomMediaItem, CustomTab)
|
||||||
self.weight = -5
|
self.weight = -5
|
||||||
self.db_manager = Manager('custom', init_schema)
|
self.db_manager = Manager('custom', init_schema)
|
||||||
self.icon_path = UiIcons().clone
|
self.icon_path = UiIcons().clone
|
||||||
|
@ -27,7 +27,6 @@ from sqlalchemy.sql import and_, func, or_
|
|||||||
from openlp.core.common.enum import CustomSearch
|
from openlp.core.common.enum import CustomSearch
|
||||||
from openlp.core.common.i18n import UiStrings, translate
|
from openlp.core.common.i18n import UiStrings, translate
|
||||||
from openlp.core.common.registry import Registry
|
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 import check_item_selected
|
||||||
from openlp.core.lib.mediamanageritem import MediaManagerItem
|
from openlp.core.lib.mediamanageritem import MediaManagerItem
|
||||||
from openlp.core.lib.plugin import PluginStatus
|
from openlp.core.lib.plugin import PluginStatus
|
||||||
@ -92,8 +91,8 @@ class CustomMediaItem(MediaManagerItem):
|
|||||||
Config has been updated so reload values
|
Config has been updated so reload values
|
||||||
"""
|
"""
|
||||||
log.debug('Config loaded')
|
log.debug('Config loaded')
|
||||||
self.add_custom_from_service = Settings().value(self.settings_section + '/add custom from service')
|
self.add_custom_from_service = self.settings.value(self.settings_section + '/add custom from service')
|
||||||
self.is_search_as_you_type_enabled = Settings().value('advanced/search as type')
|
self.is_search_as_you_type_enabled = self.settings.value('advanced/search as type')
|
||||||
|
|
||||||
def retranslate_ui(self):
|
def retranslate_ui(self):
|
||||||
"""
|
"""
|
||||||
@ -238,7 +237,7 @@ class CustomMediaItem(MediaManagerItem):
|
|||||||
service_item.title = title
|
service_item.title = title
|
||||||
for slide in raw_slides:
|
for slide in raw_slides:
|
||||||
service_item.add_from_text(slide)
|
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]))
|
service_item.raw_footer.append(' '.join([title, credit]))
|
||||||
else:
|
else:
|
||||||
service_item.raw_footer.append('')
|
service_item.raw_footer.append('')
|
||||||
|
@ -45,7 +45,7 @@ class ImagePlugin(Plugin):
|
|||||||
log.info('Image Plugin loaded')
|
log.info('Image Plugin loaded')
|
||||||
|
|
||||||
def __init__(self):
|
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.manager = Manager('images', init_schema, upgrade_mod=upgrade)
|
||||||
self.weight = -7
|
self.weight = -7
|
||||||
self.icon_path = UiIcons().picture
|
self.icon_path = UiIcons().picture
|
||||||
|
@ -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.i18n import UiStrings, get_natural_key, translate
|
||||||
from openlp.core.common.path import create_paths
|
from openlp.core.common.path import create_paths
|
||||||
from openlp.core.common.registry import Registry
|
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 import ServiceItemContext, build_icon, check_item_selected, create_thumb, validate_thumb
|
||||||
from openlp.core.lib.mediamanageritem import MediaManagerItem
|
from openlp.core.lib.mediamanageritem import MediaManagerItem
|
||||||
from openlp.core.lib.plugin import StringContent
|
from openlp.core.lib.plugin import StringContent
|
||||||
@ -407,7 +406,7 @@ class ImageMediaItem(MediaManagerItem):
|
|||||||
self.application.set_normal_cursor()
|
self.application.set_normal_cursor()
|
||||||
self.load_list(file_paths, target_group)
|
self.load_list(file_paths, target_group)
|
||||||
last_dir = file_paths[0].parent
|
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):
|
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 context: Why is it being generated
|
||||||
:param kwargs: Consume other unused args specified by the base implementation, but not use by this one.
|
: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:
|
if item:
|
||||||
items = [item]
|
items = [item]
|
||||||
else:
|
else:
|
||||||
@ -679,7 +678,7 @@ class ImageMediaItem(MediaManagerItem):
|
|||||||
if check_item_selected(
|
if check_item_selected(
|
||||||
self.list_view,
|
self.list_view,
|
||||||
translate('ImagePlugin.MediaItem', 'You must select an image to replace the background with.')):
|
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]
|
bitem = self.list_view.selectedItems()[0]
|
||||||
if not isinstance(bitem.data(0, QtCore.Qt.UserRole), ImageFilenames):
|
if not isinstance(bitem.data(0, QtCore.Qt.UserRole), ImageFilenames):
|
||||||
# Only continue when an image is selected.
|
# Only continue when an image is selected.
|
||||||
|
@ -45,7 +45,7 @@ class MediaPlugin(Plugin):
|
|||||||
log.info('{name} MediaPlugin loaded'.format(name=__name__))
|
log.info('{name} MediaPlugin loaded'.format(name=__name__))
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(MediaPlugin, self).__init__('media', None, MediaMediaItem)
|
super(MediaPlugin, self).__init__('media', MediaMediaItem)
|
||||||
self.weight = -6
|
self.weight = -6
|
||||||
self.icon_path = UiIcons().video
|
self.icon_path = UiIcons().video
|
||||||
self.icon = build_icon(self.icon_path)
|
self.icon = build_icon(self.icon_path)
|
||||||
|
@ -47,7 +47,7 @@ class PlanningCenterPlugin(Plugin):
|
|||||||
"""
|
"""
|
||||||
Create and set up the PlanningCenter 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.planningcenter_form = None
|
||||||
self.icon = UiIcons().planning_center
|
self.icon = UiIcons().planning_center
|
||||||
self.icon_path = self.icon
|
self.icon_path = self.icon
|
||||||
|
@ -25,7 +25,6 @@ from PyQt5 import QtCore, QtWidgets
|
|||||||
from openlp.core.common.i18n import UiStrings, get_natural_key, translate
|
from openlp.core.common.i18n import UiStrings, get_natural_key, translate
|
||||||
from openlp.core.common.path import path_to_str
|
from openlp.core.common.path import path_to_str
|
||||||
from openlp.core.common.registry import Registry
|
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 import ServiceItemContext, build_icon, check_item_selected, create_thumb, validate_thumb
|
||||||
from openlp.core.lib.mediamanageritem import MediaManagerItem
|
from openlp.core.lib.mediamanageritem import MediaManagerItem
|
||||||
from openlp.core.lib.serviceitem import ItemCapabilities
|
from openlp.core.lib.serviceitem import ItemCapabilities
|
||||||
@ -125,7 +124,7 @@ class PresentationMediaItem(MediaManagerItem):
|
|||||||
Populate the media manager tab
|
Populate the media manager tab
|
||||||
"""
|
"""
|
||||||
self.list_view.setIconSize(QtCore.QSize(88, 50))
|
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.load_list(file_paths, initial_load=True)
|
||||||
self.populate_display_types()
|
self.populate_display_types()
|
||||||
|
|
||||||
@ -145,7 +144,7 @@ class PresentationMediaItem(MediaManagerItem):
|
|||||||
if self.display_type_combo_box.count() > 1:
|
if self.display_type_combo_box.count() > 1:
|
||||||
self.display_type_combo_box.insertItem(0, self.automatic, userData='automatic')
|
self.display_type_combo_box.insertItem(0, self.automatic, userData='automatic')
|
||||||
self.display_type_combo_box.setCurrentIndex(0)
|
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()
|
self.presentation_widget.show()
|
||||||
else:
|
else:
|
||||||
self.presentation_widget.hide()
|
self.presentation_widget.hide()
|
||||||
@ -233,7 +232,7 @@ class PresentationMediaItem(MediaManagerItem):
|
|||||||
self.main_window.finished_progress_bar()
|
self.main_window.finished_progress_bar()
|
||||||
for row in row_list:
|
for row in row_list:
|
||||||
self.list_view.takeItem(row)
|
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()
|
self.application.set_normal_cursor()
|
||||||
|
|
||||||
def clean_up_thumbnails(self, file_path, clean_for_update=False):
|
def clean_up_thumbnails(self, file_path, clean_for_update=False):
|
||||||
@ -412,7 +411,7 @@ class PresentationMediaItem(MediaManagerItem):
|
|||||||
:param show_error: not used
|
:param show_error: not used
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
file_paths = Settings().value(self.settings_section + '/presentations files')
|
file_paths = self.settings.value(self.settings_section + '/presentations files')
|
||||||
results = []
|
results = []
|
||||||
string = string.lower()
|
string = string.lower()
|
||||||
for file_path in file_paths:
|
for file_path in file_paths:
|
||||||
|
@ -55,7 +55,7 @@ class PresentationPlugin(Plugin):
|
|||||||
"""
|
"""
|
||||||
log.debug('Initialised')
|
log.debug('Initialised')
|
||||||
self.controllers = {}
|
self.controllers = {}
|
||||||
Plugin.__init__(self, 'presentations', None, None)
|
Plugin.__init__(self, 'presentations', None)
|
||||||
self.weight = -8
|
self.weight = -8
|
||||||
self.icon_path = UiIcons().presentation
|
self.icon_path = UiIcons().presentation
|
||||||
self.icon = build_icon(self.icon_path)
|
self.icon = build_icon(self.icon_path)
|
||||||
|
@ -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.i18n import UiStrings, get_natural_key, translate
|
||||||
from openlp.core.common.path import create_paths
|
from openlp.core.common.path import create_paths
|
||||||
from openlp.core.common.registry import Registry
|
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 import ServiceItemContext, check_item_selected, create_separated_list
|
||||||
from openlp.core.lib.mediamanageritem import MediaManagerItem
|
from openlp.core.lib.mediamanageritem import MediaManagerItem
|
||||||
from openlp.core.lib.plugin import PluginStatus
|
from openlp.core.lib.plugin import PluginStatus
|
||||||
@ -115,9 +114,9 @@ class SongMediaItem(MediaManagerItem):
|
|||||||
Is triggered when the songs config is updated
|
Is triggered when the songs config is updated
|
||||||
"""
|
"""
|
||||||
log.debug('config_updated')
|
log.debug('config_updated')
|
||||||
self.is_search_as_you_type_enabled = Settings().value('advanced/search as type')
|
self.is_search_as_you_type_enabled = self.settings.value('advanced/search as type')
|
||||||
self.update_service_on_edit = Settings().value(self.settings_section + '/update service on edit')
|
self.update_service_on_edit = self.settings.value(self.settings_section + '/update service on edit')
|
||||||
self.add_song_from_service = Settings().value(self.settings_section + '/add song from service')
|
self.add_song_from_service = self.settings.value(self.settings_section + '/add song from service')
|
||||||
|
|
||||||
def retranslate_ui(self):
|
def retranslate_ui(self):
|
||||||
self.search_text_label.setText('{text}:'.format(text=UiStrings().Search))
|
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.theme = song.theme_name
|
||||||
service_item.edit_id = item_id
|
service_item.edit_id = item_id
|
||||||
verse_list = SongXML().get_verses(song.lyrics)
|
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'
|
first_slide = '\n'
|
||||||
for songbook_entry in song.songbook_entries:
|
for songbook_entry in song.songbook_entries:
|
||||||
first_slide += '{book} #{num}'.format(book=songbook_entry.songbook.name,
|
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]
|
songbooks = [str(songbook_entry) for songbook_entry in song.songbook_entries]
|
||||||
if song.songbook_entries:
|
if song.songbook_entries:
|
||||||
item.raw_footer.append(", ".join(songbooks))
|
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: ') +
|
item.raw_footer.append(translate('SongsPlugin.MediaItem', 'CCLI License: ') +
|
||||||
Settings().value('core/ccli number'))
|
self.settings.value('core/ccli number'))
|
||||||
footer_template = Settings().value('songs/footer template')
|
footer_template = self.settings.value('songs/footer template')
|
||||||
# Keep this in sync with the list in songstab.py
|
# Keep this in sync with the list in songstab.py
|
||||||
vars = {
|
vars = {
|
||||||
'title': song.title,
|
'title': song.title,
|
||||||
@ -703,7 +702,7 @@ class SongMediaItem(MediaManagerItem):
|
|||||||
'authors_music_all': authors_music + authors_words_music,
|
'authors_music_all': authors_music + authors_words_music,
|
||||||
'copyright': song.copyright,
|
'copyright': song.copyright,
|
||||||
'songbook_entries': songbooks,
|
'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_license_label': translate('SongsPlugin.MediaItem', 'CCLI License'),
|
||||||
'ccli_number': song.ccli_number,
|
'ccli_number': song.ccli_number,
|
||||||
'topics': [topic.name for topic in song.topics]
|
'topics': [topic.name for topic in song.topics]
|
||||||
|
@ -53,7 +53,7 @@ from openlp.plugins.songs.lib.songstab import SongsTab
|
|||||||
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
__default_settings__ = {
|
song_footer = {
|
||||||
'songs/footer template': """\
|
'songs/footer template': """\
|
||||||
${title}<br/>
|
${title}<br/>
|
||||||
|
|
||||||
@ -121,12 +121,13 @@ class SongsPlugin(Plugin):
|
|||||||
"""
|
"""
|
||||||
Create and set up the Songs 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.manager = Manager('songs', init_schema, upgrade_mod=upgrade)
|
||||||
self.weight = -10
|
self.weight = -10
|
||||||
self.icon_path = UiIcons().music
|
self.icon_path = UiIcons().music
|
||||||
self.icon = build_icon(self.icon_path)
|
self.icon = build_icon(self.icon_path)
|
||||||
self.songselect_form = None
|
self.songselect_form = None
|
||||||
|
self.settings.extend_default_settings(song_footer)
|
||||||
register_endpoint(songs_endpoint)
|
register_endpoint(songs_endpoint)
|
||||||
register_endpoint(api_songs_endpoint)
|
register_endpoint(api_songs_endpoint)
|
||||||
State().add_service(self.name, self.weight, is_plugin=True)
|
State().add_service(self.name, self.weight, is_plugin=True)
|
||||||
|
@ -26,7 +26,6 @@ from sqlalchemy.sql import and_
|
|||||||
from openlp.core.common.i18n import translate
|
from openlp.core.common.i18n import translate
|
||||||
from openlp.core.common.mixins import RegistryProperties
|
from openlp.core.common.mixins import RegistryProperties
|
||||||
from openlp.core.common.path import create_paths
|
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.core.lib.ui import critical_error_message_box
|
||||||
from openlp.plugins.songusage.lib.db import SongUsageItem
|
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
|
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()):
|
if not (isinstance(to_date, QtCore.QDate) and to_date.isValid()):
|
||||||
to_date = QtCore.QDate.currentDate()
|
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()):
|
if not (isinstance(from_date, QtCore.QDate) and from_date.isValid()):
|
||||||
from_date = to_date.addYears(-1)
|
from_date = to_date.addYears(-1)
|
||||||
self.from_date_calendar.setSelectedDate(from_date)
|
self.from_date_calendar.setSelectedDate(from_date)
|
||||||
self.to_date_calendar.setSelectedDate(to_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):
|
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.
|
:param pathlib.Path file_path: The new path.
|
||||||
:rtype: None
|
: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):
|
def accept(self):
|
||||||
"""
|
"""
|
||||||
@ -92,8 +91,8 @@ class SongUsageDetailForm(QtWidgets.QDialog, Ui_SongUsageDetailDialog, RegistryP
|
|||||||
'usage_detail_{old}_{new}.txt'
|
'usage_detail_{old}_{new}.txt'
|
||||||
).format(old=self.from_date_calendar.selectedDate().toString('ddMMyyyy'),
|
).format(old=self.from_date_calendar.selectedDate().toString('ddMMyyyy'),
|
||||||
new=self.to_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())
|
self.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 + '/to date', self.to_date_calendar.selectedDate())
|
||||||
usage = self.plugin.manager.get_all_objects(
|
usage = self.plugin.manager.get_all_objects(
|
||||||
SongUsageItem, and_(SongUsageItem.usagedate >= self.from_date_calendar.selectedDate().toPyDate(),
|
SongUsageItem, and_(SongUsageItem.usagedate >= self.from_date_calendar.selectedDate().toPyDate(),
|
||||||
SongUsageItem.usagedate < self.to_date_calendar.selectedDate().toPyDate()),
|
SongUsageItem.usagedate < self.to_date_calendar.selectedDate().toPyDate()),
|
||||||
|
@ -28,7 +28,6 @@ from openlp.core.state import State
|
|||||||
from openlp.core.common.actions import ActionList
|
from openlp.core.common.actions import ActionList
|
||||||
from openlp.core.common.i18n import translate
|
from openlp.core.common.i18n import translate
|
||||||
from openlp.core.common.registry import Registry
|
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.db import Manager
|
||||||
from openlp.core.lib.plugin import Plugin, StringContent
|
from openlp.core.lib.plugin import Plugin, StringContent
|
||||||
from openlp.core.lib.ui import create_action
|
from openlp.core.lib.ui import create_action
|
||||||
@ -51,7 +50,7 @@ class SongUsagePlugin(Plugin):
|
|||||||
log.info('SongUsage Plugin loaded')
|
log.info('SongUsage Plugin loaded')
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(SongUsagePlugin, self).__init__('songusage', None)
|
super(SongUsagePlugin, self).__init__('songusage')
|
||||||
self.manager = Manager('songusage', init_schema, upgrade_mod=upgrade)
|
self.manager = Manager('songusage', init_schema, upgrade_mod=upgrade)
|
||||||
self.weight = -4
|
self.weight = -4
|
||||||
self.icon = UiIcons().song_usage
|
self.icon = UiIcons().song_usage
|
||||||
@ -116,7 +115,7 @@ class SongUsagePlugin(Plugin):
|
|||||||
super(SongUsagePlugin, self).initialise()
|
super(SongUsagePlugin, self).initialise()
|
||||||
Registry().register_function('slidecontroller_live_started', self.display_song_usage)
|
Registry().register_function('slidecontroller_live_started', self.display_song_usage)
|
||||||
Registry().register_function('print_service_started', self.print_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
|
# Set the button and checkbox state
|
||||||
self.set_button_state()
|
self.set_button_state()
|
||||||
action_list = ActionList.get_instance()
|
action_list = ActionList.get_instance()
|
||||||
@ -150,7 +149,7 @@ class SongUsagePlugin(Plugin):
|
|||||||
the UI when necessary,
|
the UI when necessary,
|
||||||
"""
|
"""
|
||||||
self.song_usage_active = not self.song_usage_active
|
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()
|
self.set_button_state()
|
||||||
|
|
||||||
def set_button_state(self):
|
def set_button_state(self):
|
||||||
|
@ -31,6 +31,7 @@ from PyQt5 import QtCore, QtWidgets # noqa
|
|||||||
sys.modules['PyQt5.QtWebEngineWidgets'] = MagicMock()
|
sys.modules['PyQt5.QtWebEngineWidgets'] = MagicMock()
|
||||||
|
|
||||||
from openlp.core.app import OpenLP
|
from openlp.core.app import OpenLP
|
||||||
|
from openlp.core.state import State
|
||||||
from openlp.core.common.registry import Registry
|
from openlp.core.common.registry import Registry
|
||||||
from openlp.core.common.settings import Settings
|
from openlp.core.common.settings import Settings
|
||||||
|
|
||||||
@ -82,3 +83,8 @@ def mock_settings(registry):
|
|||||||
yield mock_settings
|
yield mock_settings
|
||||||
Registry().remove('settings')
|
Registry().remove('settings')
|
||||||
del mock_settings
|
del mock_settings
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope='function')
|
||||||
|
def state():
|
||||||
|
State().load_settings()
|
||||||
|
@ -122,12 +122,9 @@ class TestMediaItem(TestCase, TestMixin):
|
|||||||
|
|
||||||
self.mocked_settings_instance = MagicMock()
|
self.mocked_settings_instance = MagicMock()
|
||||||
self.mocked_settings_instance.value.side_effect = lambda key: self.setting_values[key]
|
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.create()
|
||||||
|
Registry().register('settings', self.mocked_settings_instance)
|
||||||
|
|
||||||
# self.setup_application()
|
# self.setup_application()
|
||||||
self.mocked_application = MagicMock()
|
self.mocked_application = MagicMock()
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
"""
|
"""
|
||||||
This module contains tests for the lib submodule of the Images plugin.
|
This module contains tests for the lib submodule of the Images plugin.
|
||||||
"""
|
"""
|
||||||
|
import pytest
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
from unittest.mock import ANY, MagicMock, patch
|
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
|
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):
|
class TestImageMediaItem(TestCase):
|
||||||
"""
|
"""
|
||||||
This is a test case to test various methods in the ImageMediaItem class.
|
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 = ImageMediaItem(None, mocked_plugin)
|
||||||
self.media_item.settings_section = 'images'
|
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')
|
@patch('openlp.plugins.images.lib.mediaitem.ImageMediaItem.load_full_list')
|
||||||
def test_save_new_images_list_empty_list(self, mocked_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 isinstance(item_data, ImageFilenames)
|
||||||
assert 1 == item_data.id
|
assert 1 == item_data.id
|
||||||
assert Path('/', 'tmp', 'test_file_1.jpg') == item_data.file_path
|
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'))
|
||||||
|
@ -29,7 +29,7 @@ from openlp.plugins.media.mediaplugin import MediaPlugin
|
|||||||
from tests.helpers.testmixin import TestMixin
|
from tests.helpers.testmixin import TestMixin
|
||||||
|
|
||||||
|
|
||||||
class MediaPluginTest(TestCase, TestMixin):
|
class TestMediaPlugin(TestCase, TestMixin):
|
||||||
"""
|
"""
|
||||||
Test the media plugin
|
Test the media plugin
|
||||||
"""
|
"""
|
||||||
|
@ -144,8 +144,7 @@ class TestMediaItem(TestCase, TestMixin):
|
|||||||
|
|
||||||
@patch('openlp.plugins.presentations.lib.mediaitem.MediaManagerItem._setup')
|
@patch('openlp.plugins.presentations.lib.mediaitem.MediaManagerItem._setup')
|
||||||
@patch('openlp.plugins.presentations.lib.mediaitem.PresentationMediaItem.setup_item')
|
@patch('openlp.plugins.presentations.lib.mediaitem.PresentationMediaItem.setup_item')
|
||||||
@patch('openlp.plugins.presentations.lib.mediaitem.Settings')
|
def test_search(self, *unreferenced_mocks):
|
||||||
def test_search(self, mocked_settings, *unreferenced_mocks):
|
|
||||||
"""
|
"""
|
||||||
Test that the search method finds the correct results
|
Test that the search method finds the correct results
|
||||||
"""
|
"""
|
||||||
@ -156,7 +155,7 @@ class TestMediaItem(TestCase, TestMixin):
|
|||||||
path_3 = Path('another_dir', 'ppt_file')
|
path_3 = Path('another_dir', 'ppt_file')
|
||||||
mocked_returned_settings = MagicMock()
|
mocked_returned_settings = MagicMock()
|
||||||
mocked_returned_settings.value.return_value = [path_1, path_2, path_3]
|
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 = PresentationMediaItem(None, MagicMock(), None)
|
||||||
media_item.settings_section = ''
|
media_item.settings_section = ''
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
"""
|
"""
|
||||||
This module contains tests for the lib submodule of the Songs plugin.
|
This module contains tests for the lib submodule of the Songs plugin.
|
||||||
"""
|
"""
|
||||||
|
import pytest
|
||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
from unittest.mock import MagicMock, patch
|
from unittest.mock import MagicMock, patch
|
||||||
|
|
||||||
@ -90,6 +91,29 @@ ${title}<br/>
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@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):
|
class TestMediaItem(TestCase, TestMixin):
|
||||||
"""
|
"""
|
||||||
Test the functions in the :mod:`lib` module.
|
Test the functions in the :mod:`lib` module.
|
||||||
@ -117,6 +141,8 @@ class TestMediaItem(TestCase, TestMixin):
|
|||||||
self.setup_application()
|
self.setup_application()
|
||||||
self.build_settings()
|
self.build_settings()
|
||||||
Settings().extend_default_settings(__default_settings__)
|
Settings().extend_default_settings(__default_settings__)
|
||||||
|
self.settings = self.setting
|
||||||
|
Registry().register('settings', self.settings)
|
||||||
QtCore.QLocale.setDefault(QtCore.QLocale('en_GB'))
|
QtCore.QLocale.setDefault(QtCore.QLocale('en_GB'))
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
@ -348,51 +374,6 @@ class TestMediaItem(TestCase, TestMixin):
|
|||||||
mock_qlist_widget.setData.assert_called_once_with(MockedUserRole, mock_song.id)
|
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)
|
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):
|
def test_build_song_footer_two_authors(self):
|
||||||
"""
|
"""
|
||||||
Test build songs footer with basic song and two authors
|
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.copyright = 'My copyright'
|
||||||
mock_song.songbook_entries = []
|
mock_song.songbook_entries = []
|
||||||
service_item = ServiceItem(None)
|
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
|
# WHEN: I generate the Footer with default settings
|
||||||
self.media_item.generate_footer(service_item, mock_song)
|
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'
|
'The array should be returned correctly with a song, an author, copyright and ccli'
|
||||||
|
|
||||||
# WHEN: I amend the CCLI value
|
# 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)
|
self.media_item.generate_footer(service_item, mock_song)
|
||||||
|
|
||||||
# THEN: I would get an amended footer string
|
# 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)
|
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'
|
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'
|
||||||
|
@ -21,78 +21,74 @@
|
|||||||
"""
|
"""
|
||||||
This module contains tests for the Songusage plugin.
|
This module contains tests for the Songusage plugin.
|
||||||
"""
|
"""
|
||||||
from unittest import TestCase
|
|
||||||
from unittest.mock import MagicMock, patch
|
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 import upgrade
|
||||||
from openlp.plugins.songusage.lib.db import init_schema
|
from openlp.plugins.songusage.lib.db import init_schema
|
||||||
from openlp.plugins.songusage.songusageplugin import SongUsagePlugin
|
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):
|
@patch('openlp.plugins.songusage.songusageplugin.Manager')
|
||||||
"""
|
def test_song_usage_init(MockedManager, settings):
|
||||||
Test the about text of the song usage plugin
|
"""
|
||||||
"""
|
Test the initialisation of the SongUsagePlugin class
|
||||||
# GIVEN: The SongUsagePlugin
|
"""
|
||||||
# WHEN: Retrieving the about text
|
# GIVEN: A mocked database manager
|
||||||
# THEN: about() should return a string object
|
mocked_manager = MagicMock()
|
||||||
assert isinstance(SongUsagePlugin.about(), str)
|
MockedManager.return_value = mocked_manager
|
||||||
# THEN: about() should return a non-empty string
|
|
||||||
assert len(SongUsagePlugin.about()) != 0
|
|
||||||
assert len(SongUsagePlugin.about()) != 0
|
|
||||||
|
|
||||||
@patch('openlp.plugins.songusage.songusageplugin.Manager')
|
# WHEN: The SongUsagePlugin class is instantiated
|
||||||
def test_song_usage_init(self, MockedManager):
|
song_usage = SongUsagePlugin()
|
||||||
"""
|
|
||||||
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
|
# THEN: It should be initialised correctly
|
||||||
song_usage = SongUsagePlugin()
|
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')
|
@patch('openlp.plugins.songusage.songusageplugin.Manager')
|
||||||
def test_check_pre_conditions(self, MockedManager):
|
def test_check_pre_conditions(MockedManager, settings):
|
||||||
"""
|
"""
|
||||||
Test that check_pre_condition returns true for valid manager session
|
Test that check_pre_condition returns true for valid manager session
|
||||||
"""
|
"""
|
||||||
# GIVEN: A mocked database manager
|
# GIVEN: A mocked database manager
|
||||||
mocked_manager = MagicMock()
|
mocked_manager = MagicMock()
|
||||||
mocked_manager.session = MagicMock()
|
mocked_manager.session = MagicMock()
|
||||||
MockedManager.return_value = mocked_manager
|
MockedManager.return_value = mocked_manager
|
||||||
song_usage = SongUsagePlugin()
|
song_usage = SongUsagePlugin()
|
||||||
|
|
||||||
# WHEN: The calling check_pre_conditions
|
# WHEN: The calling check_pre_conditions
|
||||||
ret = song_usage.check_pre_conditions()
|
ret = song_usage.check_pre_conditions()
|
||||||
|
|
||||||
# THEN: It should return True
|
# THEN: It should return True
|
||||||
assert ret is 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
|
@patch('openlp.plugins.songusage.songusageplugin.Manager')
|
||||||
song_usage.toggle_song_usage_state()
|
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
|
# WHEN: calling toggle_song_usage_state
|
||||||
assert song_usage.song_usage_active is False
|
song_usage.toggle_song_usage_state()
|
||||||
|
|
||||||
|
# THEN: song_usage_state should have been toogled
|
||||||
|
assert song_usage.song_usage_active is False
|
||||||
|
Loading…
Reference in New Issue
Block a user