I've TODOne some of the TODO's. As well as some other clean ups

lp:~phill-ridout/openlp/TODOne (revision 2745)
[SUCCESS] https://ci.openlp.io/job/Branch-01-Pull/2077/
[SUCCESS] https://ci.openlp.io/job/Branch-02-Functional-Tests/1987/
[SUCCESS] https://ci.openlp.io/job/Branch-03-Interface-Tests/1903/
[SUCCESS] https://ci.openlp.io/job/Branch-04a-Code_Analysis/1281/
[SUCCESS] https://ci.openlp.io/job/Branch-04b-Test_Coverage/1131/
[SUCCESS] https://ci.openlp.io/job/Branch-04c-Code_Analysis2/2...

bzr-revno: 2750
This commit is contained in:
Phill 2017-06-09 16:55:12 +01:00 committed by Tim Bentley
commit 1c720ff101
52 changed files with 132 additions and 325 deletions

View File

@ -251,8 +251,7 @@ class OpenLP(OpenLPMixin, QtWidgets.QApplication):
if QtWidgets.QMessageBox.question(None, translate('OpenLP', 'Backup'), if QtWidgets.QMessageBox.question(None, translate('OpenLP', 'Backup'),
translate('OpenLP', 'OpenLP has been upgraded, do you want to create\n' translate('OpenLP', 'OpenLP has been upgraded, do you want to create\n'
'a backup of the old data folder?'), 'a backup of the old data folder?'),
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, defaultButton=QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.Yes:
QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.Yes:
# Create copy of data folder # Create copy of data folder
data_folder_path = AppLocation.get_data_path() data_folder_path = AppLocation.get_data_path()
timestamp = time.strftime("%Y%m%d-%H%M%S") timestamp = time.strftime("%Y%m%d-%H%M%S")

View File

@ -140,8 +140,8 @@ class LanguageManager(object):
reg_ex = QtCore.QRegExp("^.*i18n/(.*).qm") reg_ex = QtCore.QRegExp("^.*i18n/(.*).qm")
if reg_ex.exactMatch(qmf): if reg_ex.exactMatch(qmf):
name = '{regex}'.format(regex=reg_ex.cap(1)) name = '{regex}'.format(regex=reg_ex.cap(1))
# TODO: Test before converting to python3 string format LanguageManager.__qm_list__[
LanguageManager.__qm_list__['%#2i %s' % (counter + 1, LanguageManager.language_name(qmf))] = name '{count:>2i} {name}'.format(count=counter + 1, name=LanguageManager.language_name(qmf))] = name
@staticmethod @staticmethod
def get_qm_list(): def get_qm_list():

View File

@ -154,8 +154,6 @@ class UiStrings(object):
self.Split = translate('OpenLP.Ui', 'Optional &Split') self.Split = translate('OpenLP.Ui', 'Optional &Split')
self.SplitToolTip = translate('OpenLP.Ui', self.SplitToolTip = translate('OpenLP.Ui',
'Split a slide into two only if it does not fit on the screen as one slide.') 'Split a slide into two only if it does not fit on the screen as one slide.')
# TODO: WHERE is this used at? cannot find where it's used at in code.
self.StartTimeCode = translate('OpenLP.Ui', 'Start {code}')
self.StopPlaySlidesInLoop = translate('OpenLP.Ui', 'Stop Play Slides in Loop') self.StopPlaySlidesInLoop = translate('OpenLP.Ui', 'Stop Play Slides in Loop')
self.StopPlaySlidesToEnd = translate('OpenLP.Ui', 'Stop Play Slides to End') self.StopPlaySlidesToEnd = translate('OpenLP.Ui', 'Stop Play Slides to End')
self.Theme = translate('OpenLP.Ui', 'Theme', 'Singular') self.Theme = translate('OpenLP.Ui', 'Theme', 'Singular')

View File

@ -24,7 +24,6 @@ The :mod:`~openlp.core.lib.exceptions` module contains custom exceptions
""" """
# TODO: Test __init__ & __str__
class ValidationError(Exception): class ValidationError(Exception):
""" """
The :class:`~openlp.core.lib.exceptions.ValidationError` exception provides a custom exception for validating The :class:`~openlp.core.lib.exceptions.ValidationError` exception provides a custom exception for validating

View File

@ -110,6 +110,8 @@ class Image(object):
:param width: The width of the image, defaults to -1 meaning that the screen width will be used. :param width: The width of the image, defaults to -1 meaning that the screen width will be used.
:param height: The height of the image, defaults to -1 meaning that the screen height will be used. :param height: The height of the image, defaults to -1 meaning that the screen height will be used.
""" """
if not os.path.exists(path):
raise FileNotFoundError('{path} not found'.format(path=path))
self.path = path self.path = path
self.image = None self.image = None
self.image_bytes = None self.image_bytes = None
@ -119,9 +121,7 @@ class Image(object):
self.timestamp = 0 self.timestamp = 0
self.width = width self.width = width
self.height = height self.height = height
# FIXME: We assume that the path exist. The caller has to take care that it exists! self.timestamp = os.stat(path).st_mtime
if os.path.exists(path):
self.timestamp = os.stat(path).st_mtime
self.secondary_priority = Image.secondary_priority self.secondary_priority = Image.secondary_priority
Image.secondary_priority += 1 Image.secondary_priority += 1

View File

@ -495,9 +495,7 @@ class AdvancedTab(SettingsTab):
'location of the OpenLP data directory to:\n\n{path}' 'location of the OpenLP data directory to:\n\n{path}'
'\n\nThe data directory will be changed when OpenLP is ' '\n\nThe data directory will be changed when OpenLP is '
'closed.').format(path=new_data_path), 'closed.').format(path=new_data_path),
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Yes | defaultButton=QtWidgets.QMessageBox.No)
QtWidgets.QMessageBox.No),
QtWidgets.QMessageBox.No)
if answer != QtWidgets.QMessageBox.Yes: if answer != QtWidgets.QMessageBox.Yes:
self.data_directory_path_edit.path = AppLocation.get_data_path() self.data_directory_path_edit.path = AppLocation.get_data_path()
return return

View File

@ -206,7 +206,6 @@ class FirstTimeForm(QtWidgets.QWizard, UiFirstTimeWizard, RegistryProperties):
trace_error_handler(log) trace_error_handler(log)
self.update_screen_list_combo() self.update_screen_list_combo()
self.application.process_events() self.application.process_events()
# TODO: Tested at home
self.downloading = translate('OpenLP.FirstTimeWizard', 'Downloading {name}...') self.downloading = translate('OpenLP.FirstTimeWizard', 'Downloading {name}...')
if self.has_run_wizard: if self.has_run_wizard:
self.songs_check_box.setChecked(self.plugin_manager.get_plugin_by_name('songs').is_active()) self.songs_check_box.setChecked(self.plugin_manager.get_plugin_by_name('songs').is_active())
@ -563,7 +562,6 @@ class FirstTimeForm(QtWidgets.QWizard, UiFirstTimeWizard, RegistryProperties):
item = self.songs_list_widget.item(i) item = self.songs_list_widget.item(i)
if item.checkState() == QtCore.Qt.Checked: if item.checkState() == QtCore.Qt.Checked:
filename, sha256 = item.data(QtCore.Qt.UserRole) filename, sha256 = item.data(QtCore.Qt.UserRole)
# TODO: Tested at home
self._increment_progress_bar(self.downloading.format(name=filename), 0) self._increment_progress_bar(self.downloading.format(name=filename), 0)
self.previous_size = 0 self.previous_size = 0
destination = os.path.join(songs_destination, str(filename)) destination = os.path.join(songs_destination, str(filename))
@ -576,7 +574,6 @@ class FirstTimeForm(QtWidgets.QWizard, UiFirstTimeWizard, RegistryProperties):
item = bibles_iterator.value() item = bibles_iterator.value()
if item.parent() and item.checkState(0) == QtCore.Qt.Checked: if item.parent() and item.checkState(0) == QtCore.Qt.Checked:
bible, sha256 = item.data(0, QtCore.Qt.UserRole) bible, sha256 = item.data(0, QtCore.Qt.UserRole)
# TODO: Tested at home
self._increment_progress_bar(self.downloading.format(name=bible), 0) self._increment_progress_bar(self.downloading.format(name=bible), 0)
self.previous_size = 0 self.previous_size = 0
if not url_get_file(self, '{path}{name}'.format(path=self.bibles_url, name=bible), if not url_get_file(self, '{path}{name}'.format(path=self.bibles_url, name=bible),
@ -589,7 +586,6 @@ class FirstTimeForm(QtWidgets.QWizard, UiFirstTimeWizard, RegistryProperties):
item = self.themes_list_widget.item(i) item = self.themes_list_widget.item(i)
if item.checkState() == QtCore.Qt.Checked: if item.checkState() == QtCore.Qt.Checked:
theme, sha256 = item.data(QtCore.Qt.UserRole) theme, sha256 = item.data(QtCore.Qt.UserRole)
# TODO: Tested at home
self._increment_progress_bar(self.downloading.format(name=theme), 0) self._increment_progress_bar(self.downloading.format(name=theme), 0)
self.previous_size = 0 self.previous_size = 0
if not url_get_file(self, '{path}{name}'.format(path=self.themes_url, name=theme), if not url_get_file(self, '{path}{name}'.format(path=self.themes_url, name=theme),

View File

@ -130,8 +130,7 @@ class FormattingTagController(object):
elif not match.group('empty'): elif not match.group('empty'):
end_tags.append(tag) end_tags.append(tag)
match = self.html_tag_regex.search(start_html, match.end()) match = self.html_tag_regex.search(start_html, match.end())
# TODO: Verify format() works with lambda return ''.join(map(lambda tag: '</{tag}>'.format(tag=tag), reversed(end_tags)))
return ''.join(map(lambda tag: '</%s>' % tag, reversed(end_tags)))
def start_tag_changed(self, start_html, end_html): def start_tag_changed(self, start_html, end_html):
""" """

View File

@ -123,8 +123,7 @@ class FormattingTagForm(QtWidgets.QDialog, Ui_FormattingTagDialog, FormattingTag
self.tag_table_widget.item(count, 2).text(), self.tag_table_widget.item(count, 2).text(),
self.tag_table_widget.item(count, 3).text()) self.tag_table_widget.item(count, 3).text())
if error: if error:
QtWidgets.QMessageBox.warning(self, translate('OpenLP.FormattingTagForm', 'Validation Error'), error, QtWidgets.QMessageBox.warning(self, translate('OpenLP.FormattingTagForm', 'Validation Error'), error)
QtWidgets.QMessageBox.Ok)
self.tag_table_widget.selectRow(count) self.tag_table_widget.selectRow(count)
return return
count += 1 count += 1
@ -199,6 +198,5 @@ class FormattingTagForm(QtWidgets.QDialog, Ui_FormattingTagDialog, FormattingTag
if tag: if tag:
self.tag_table_widget.setItem(pre_row, 3, QtWidgets.QTableWidgetItem(tag)) self.tag_table_widget.setItem(pre_row, 3, QtWidgets.QTableWidgetItem(tag))
if errors: if errors:
QtWidgets.QMessageBox.warning(self, translate('OpenLP.FormattingTagForm', 'Validation Error'), errors, QtWidgets.QMessageBox.warning(self, translate('OpenLP.FormattingTagForm', 'Validation Error'), errors)
QtWidgets.QMessageBox.Ok)
self.tag_table_widget.resizeRowsToContents() self.tag_table_widget.resizeRowsToContents()

View File

@ -48,7 +48,7 @@ class PathEdit(QtWidgets.QWidget):
:type parent: QWidget or None :type parent: QWidget or None
:param dialog_caption: Used to customise the caption in the QFileDialog. :param dialog_caption: Used to customise the caption in the QFileDialog.
:param dialog_caption: str :type dialog_caption: str
:param default_path: The default path. This is set as the path when the revert button is clicked :param default_path: The default path. This is set as the path when the revert button is clicked
:type default_path: str :type default_path: str

View File

@ -50,13 +50,13 @@ class WizardStrings(object):
# These strings should need a good reason to be retranslated elsewhere. # These strings should need a good reason to be retranslated elsewhere.
FinishedImport = translate('OpenLP.Ui', 'Finished import.') FinishedImport = translate('OpenLP.Ui', 'Finished import.')
FormatLabel = translate('OpenLP.Ui', 'Format:') FormatLabel = translate('OpenLP.Ui', 'Format:')
HeaderStyle = '<span style="font-size:14pt; font-weight:600;">%s</span>' HeaderStyle = '<span style="font-size:14pt; font-weight:600;">{text}</span>'
Importing = translate('OpenLP.Ui', 'Importing') Importing = translate('OpenLP.Ui', 'Importing')
ImportingType = translate('OpenLP.Ui', 'Importing "%s"...') ImportingType = translate('OpenLP.Ui', 'Importing "{source}"...')
ImportSelect = translate('OpenLP.Ui', 'Select Import Source') ImportSelect = translate('OpenLP.Ui', 'Select Import Source')
ImportSelectLong = translate('OpenLP.Ui', 'Select the import format and the location to import from.') ImportSelectLong = translate('OpenLP.Ui', 'Select the import format and the location to import from.')
OpenTypeFile = translate('OpenLP.Ui', 'Open %s File') OpenTypeFile = translate('OpenLP.Ui', 'Open {file_type} File')
OpenTypeFolder = translate('OpenLP.Ui', 'Open %s Folder') OpenTypeFolder = translate('OpenLP.Ui', 'Open {folder_name} Folder')
PercentSymbolFormat = translate('OpenLP.Ui', '%p%') PercentSymbolFormat = translate('OpenLP.Ui', '%p%')
Ready = translate('OpenLP.Ui', 'Ready.') Ready = translate('OpenLP.Ui', 'Ready.')
StartingImport = translate('OpenLP.Ui', 'Starting import...') StartingImport = translate('OpenLP.Ui', 'Starting import...')

View File

@ -920,8 +920,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, RegistryProperties):
QtWidgets.QMessageBox.information(self, translate('OpenLP.MainWindow', 'Import settings'), QtWidgets.QMessageBox.information(self, translate('OpenLP.MainWindow', 'Import settings'),
translate('OpenLP.MainWindow', translate('OpenLP.MainWindow',
'OpenLP will now close. Imported settings will ' 'OpenLP will now close. Imported settings will '
'be applied the next time you start OpenLP.'), 'be applied the next time you start OpenLP.'))
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Ok))
self.settings_imported = True self.settings_imported = True
self.clean_up() self.clean_up()
QtCore.QCoreApplication.exit() QtCore.QCoreApplication.exit()
@ -1316,7 +1315,6 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, RegistryProperties):
self.recent_files_menu.clear() self.recent_files_menu.clear()
for file_id, filename in enumerate(recent_files_to_display): for file_id, filename in enumerate(recent_files_to_display):
log.debug('Recent file name: {name}'.format(name=filename)) log.debug('Recent file name: {name}'.format(name=filename))
# TODO: Should be good
action = create_action(self, '', action = create_action(self, '',
text='&{n} {name}'.format(n=file_id + 1, text='&{n} {name}'.format(n=file_id + 1,
name=os.path.splitext(os.path.basename(str(filename)))[0]), name=os.path.splitext(os.path.basename(str(filename)))[0]),

View File

@ -466,9 +466,10 @@ class MediaController(RegistryMixin, OpenLPMixin, RegistryProperties):
player = self.media_players[used_players[0]] player = self.media_players[used_players[0]]
if suffix not in player.video_extensions_list and suffix not in player.audio_extensions_list: if suffix not in player.video_extensions_list and suffix not in player.audio_extensions_list:
# Media could not be loaded correctly # Media could not be loaded correctly
critical_error_message_box(translate('MediaPlugin.MediaItem', 'Unsupported Media File'), critical_error_message_box(
translate('MediaPlugin.MediaItem', 'File %s not supported using player %s') % translate('MediaPlugin.MediaItem', 'Unsupported Media File'),
(service_item.get_frame_path(), used_players[0])) translate('MediaPlugin.MediaItem', 'File {file_path} not supported using player {player_name}'
).format(file_path=service_item.get_frame_path(), player_name=used_players[0]))
return False return False
media_data = MediaInfoWrapper.parse(service_item.get_frame_path()) media_data = MediaInfoWrapper.parse(service_item.get_frame_path())
# duration returns in milli seconds # duration returns in milli seconds

View File

@ -61,7 +61,6 @@ class PluginForm(QtWidgets.QDialog, Ui_PluginViewDialog, RegistryProperties):
self._clear_details() self._clear_details()
self.programatic_change = True self.programatic_change = True
plugin_list_width = 0 plugin_list_width = 0
# TODO: Tested at home
for plugin in self.plugin_manager.plugins: for plugin in self.plugin_manager.plugins:
item = QtWidgets.QListWidgetItem(self.plugin_list_widget) item = QtWidgets.QListWidgetItem(self.plugin_list_widget)
# We do this just to make 100% sure the status is an integer as # We do this just to make 100% sure the status is an integer as
@ -138,7 +137,6 @@ class PluginForm(QtWidgets.QDialog, Ui_PluginViewDialog, RegistryProperties):
self.active_plugin.app_startup() self.active_plugin.app_startup()
else: else:
self.active_plugin.toggle_status(PluginStatus.Inactive) self.active_plugin.toggle_status(PluginStatus.Inactive)
# TODO: Tested at home
status_text = translate('OpenLP.PluginForm', '{name} (Inactive)') status_text = translate('OpenLP.PluginForm', '{name} (Inactive)')
if self.active_plugin.status == PluginStatus.Active: if self.active_plugin.status == PluginStatus.Active:
status_text = translate('OpenLP.PluginForm', '{name} (Active)') status_text = translate('OpenLP.PluginForm', '{name} (Active)')

View File

@ -280,9 +280,7 @@ class ShortcutListForm(QtWidgets.QDialog, Ui_ShortcutListDialog, RegistryPropert
return return
if QtWidgets.QMessageBox.question(self, translate('OpenLP.ShortcutListDialog', 'Restore Default Shortcuts'), if QtWidgets.QMessageBox.question(self, translate('OpenLP.ShortcutListDialog', 'Restore Default Shortcuts'),
translate('OpenLP.ShortcutListDialog', 'Do you want to restore all ' translate('OpenLP.ShortcutListDialog', 'Do you want to restore all '
'shortcuts to their defaults?'), 'shortcuts to their defaults?')
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Yes |
QtWidgets.QMessageBox.No)
) == QtWidgets.QMessageBox.No: ) == QtWidgets.QMessageBox.No:
return return
self._adjust_button(self.primary_push_button, False, text='') self._adjust_button(self.primary_push_button, False, text='')

View File

@ -257,10 +257,9 @@ class ThemeManager(OpenLPMixin, RegistryMixin, QtWidgets.QWidget, Ui_ThemeManage
Renames an existing theme to a new name Renames an existing theme to a new name
:param field: :param field:
""" """
# TODO: Check for delayed format() conversions
if self._validate_theme_action(translate('OpenLP.ThemeManager', 'You must select a theme to rename.'), if self._validate_theme_action(translate('OpenLP.ThemeManager', 'You must select a theme to rename.'),
translate('OpenLP.ThemeManager', 'Rename Confirmation'), translate('OpenLP.ThemeManager', 'Rename Confirmation'),
translate('OpenLP.ThemeManager', 'Rename %s theme?'), False, False): translate('OpenLP.ThemeManager', 'Rename {theme_name} theme?'), False, False):
item = self.theme_list_widget.currentItem() item = self.theme_list_widget.currentItem()
old_theme_name = item.data(QtCore.Qt.UserRole) old_theme_name = item.data(QtCore.Qt.UserRole)
self.file_rename_form.file_name_edit.setText(old_theme_name) self.file_rename_form.file_name_edit.setText(old_theme_name)
@ -334,10 +333,9 @@ class ThemeManager(OpenLPMixin, RegistryMixin, QtWidgets.QWidget, Ui_ThemeManage
Delete a theme triggered by the UI. Delete a theme triggered by the UI.
:param field: :param field:
""" """
# TODO: Verify delayed format() conversions
if self._validate_theme_action(translate('OpenLP.ThemeManager', 'You must select a theme to delete.'), if self._validate_theme_action(translate('OpenLP.ThemeManager', 'You must select a theme to delete.'),
translate('OpenLP.ThemeManager', 'Delete Confirmation'), translate('OpenLP.ThemeManager', 'Delete Confirmation'),
translate('OpenLP.ThemeManager', 'Delete %s theme?')): translate('OpenLP.ThemeManager', 'Delete {theme_name} theme?')):
item = self.theme_list_widget.currentItem() item = self.theme_list_widget.currentItem()
theme = item.text() theme = item.text()
row = self.theme_list_widget.row(item) row = self.theme_list_widget.row(item)
@ -539,9 +537,7 @@ class ThemeManager(OpenLPMixin, RegistryMixin, QtWidgets.QWidget, Ui_ThemeManage
translate('OpenLP.ThemeManager', translate('OpenLP.ThemeManager',
'Theme {name} already exists. ' 'Theme {name} already exists. '
'Do you want to replace it?').format(name=theme_name), 'Do you want to replace it?').format(name=theme_name),
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Yes | defaultButton=QtWidgets.QMessageBox.No)
QtWidgets.QMessageBox.No),
QtWidgets.QMessageBox.No)
return ret == QtWidgets.QMessageBox.Yes return ret == QtWidgets.QMessageBox.Yes
def unzip_theme(self, file_name, directory): def unzip_theme(self, file_name, directory):
@ -785,9 +781,8 @@ class ThemeManager(OpenLPMixin, RegistryMixin, QtWidgets.QWidget, Ui_ThemeManage
# confirm deletion # confirm deletion
if confirm: if confirm:
answer = QtWidgets.QMessageBox.question( answer = QtWidgets.QMessageBox.question(
self, confirm_title, confirm_text % theme, self, confirm_title, confirm_text.format(theme_name=theme),
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No), defaultButton=QtWidgets.QMessageBox.No)
QtWidgets.QMessageBox.No)
if answer == QtWidgets.QMessageBox.No: if answer == QtWidgets.QMessageBox.No:
return False return False
# should be the same unless default # should be the same unless default

View File

@ -88,21 +88,20 @@ JAVASCRIPT = """
} }
} }
""" """
# TODO: Verify format() with variable templates
CSS = """ CSS = """
#alert { #alert {{
position: absolute; position: absolute;
left: 0px; left: 0px;
top: 0px; top: 0px;
z-index: 10; z-index: 10;
width: 100%%; width: 100%;
vertical-align: %s; vertical-align: {vertical_align};
font-family: %s; font-family: {font_family};
font-size: %spt; font-size: {font_size:d}pt;
color: %s; color: {color};
background-color: %s; background-color: {background_color};
word-wrap: break-word; word-wrap: break-word;
} }}
""" """
HTML = """ HTML = """
@ -228,8 +227,11 @@ class AlertsPlugin(Plugin):
Add CSS to the main display. Add CSS to the main display.
""" """
align = VerticalType.Names[self.settings_tab.location] align = VerticalType.Names[self.settings_tab.location]
return CSS % (align, self.settings_tab.font_face, self.settings_tab.font_size, self.settings_tab.font_color, return CSS.format(vertical_align=align,
self.settings_tab.background_color) font_family=self.settings_tab.font_face,
font_size=self.settings_tab.font_size,
color=self.settings_tab.font_color,
background_color=self.settings_tab.background_color)
@staticmethod @staticmethod
def get_display_html(): def get_display_html():

View File

@ -180,9 +180,7 @@ class AlertForm(QtWidgets.QDialog, Ui_AlertDialog):
translate('AlertsPlugin.AlertForm', 'No Parameter Found'), translate('AlertsPlugin.AlertForm', 'No Parameter Found'),
translate('AlertsPlugin.AlertForm', translate('AlertsPlugin.AlertForm',
'You have not entered a parameter to be replaced.\n' 'You have not entered a parameter to be replaced.\n'
'Do you want to continue anyway?'), 'Do you want to continue anyway?')
QtWidgets.QMessageBox.StandardButtons(
QtWidgets.QMessageBox.No | QtWidgets.QMessageBox.Yes)
) == QtWidgets.QMessageBox.No: ) == QtWidgets.QMessageBox.No:
self.parameter_edit.setFocus() self.parameter_edit.setFocus()
return False return False
@ -193,9 +191,7 @@ class AlertForm(QtWidgets.QDialog, Ui_AlertDialog):
translate('AlertsPlugin.AlertForm', 'No Placeholder Found'), translate('AlertsPlugin.AlertForm', 'No Placeholder Found'),
translate('AlertsPlugin.AlertForm', translate('AlertsPlugin.AlertForm',
'The alert text does not contain \'<>\'.\n' 'The alert text does not contain \'<>\'.\n'
'Do you want to continue anyway?'), 'Do you want to continue anyway?')
QtWidgets.QMessageBox.StandardButtons(
QtWidgets.QMessageBox.No | QtWidgets.QMessageBox.Yes)
) == QtWidgets.QMessageBox.No: ) == QtWidgets.QMessageBox.No:
self.parameter_edit.setFocus() self.parameter_edit.setFocus()
return False return False

View File

@ -421,8 +421,8 @@ class BibleImportForm(OpenLPWizard):
Allow for localisation of the bible import wizard. Allow for localisation of the bible import wizard.
""" """
self.setWindowTitle(translate('BiblesPlugin.ImportWizardForm', 'Bible Import Wizard')) self.setWindowTitle(translate('BiblesPlugin.ImportWizardForm', 'Bible Import Wizard'))
self.title_label.setText(WizardStrings.HeaderStyle % translate('OpenLP.Ui', self.title_label.setText(WizardStrings.HeaderStyle.format(text=translate('OpenLP.Ui',
'Welcome to the Bible Import Wizard')) 'Welcome to the Bible Import Wizard')))
self.information_label.setText( self.information_label.setText(
translate('BiblesPlugin.ImportWizardForm', translate('BiblesPlugin.ImportWizardForm',
'This wizard will help you to import Bibles from a variety of ' 'This wizard will help you to import Bibles from a variety of '

View File

@ -221,18 +221,16 @@ def update_reference_separators():
REFERENCE_SEPARATORS['sep_{role}'.format(role=role)] = '\s*(?:{source})\s*'.format(source=source_string) REFERENCE_SEPARATORS['sep_{role}'.format(role=role)] = '\s*(?:{source})\s*'.format(source=source_string)
REFERENCE_SEPARATORS['sep_{role}_default'.format(role=role)] = default_separators[index] REFERENCE_SEPARATORS['sep_{role}_default'.format(role=role)] = default_separators[index]
# verse range match: (<chapter>:)?<verse>(-((<chapter>:)?<verse>|end)?)? # verse range match: (<chapter>:)?<verse>(-((<chapter>:)?<verse>|end)?)?
# TODO: Check before converting this string range_regex = '(?:(?P<from_chapter>[0-9]+){sep_v})?' \
range_regex = '(?:(?P<from_chapter>[0-9]+)%(sep_v)s)?' \ '(?P<from_verse>[0-9]+)(?P<range_to>{sep_r}(?:(?:(?P<to_chapter>' \
'(?P<from_verse>[0-9]+)(?P<range_to>%(sep_r)s(?:(?:(?P<to_chapter>' \ '[0-9]+){sep_v})?(?P<to_verse>[0-9]+)|{sep_e})?)?'.format_map(REFERENCE_SEPARATORS)
'[0-9]+)%(sep_v)s)?(?P<to_verse>[0-9]+)|%(sep_e)s)?)?' % REFERENCE_SEPARATORS REFERENCE_MATCHES['range'] = re.compile(r'^\s*{range}\s*$'.format(range=range_regex), re.UNICODE)
# TODO: Test before converting re.compile strings
REFERENCE_MATCHES['range'] = re.compile('^\s*%s\s*$' % range_regex, re.UNICODE)
REFERENCE_MATCHES['range_separator'] = re.compile(REFERENCE_SEPARATORS['sep_l'], re.UNICODE) REFERENCE_MATCHES['range_separator'] = re.compile(REFERENCE_SEPARATORS['sep_l'], re.UNICODE)
# full reference match: <book>(<range>(,(?!$)|(?=$)))+ # full reference match: <book>(<range>(,(?!$)|(?=$)))+
REFERENCE_MATCHES['full'] = \ REFERENCE_MATCHES['full'] = \
re.compile('^\s*(?!\s)(?P<book>[\d]*[.]?[^\d\.]+)\.*(?<!\s)\s*' re.compile(r'^\s*(?!\s)(?P<book>[\d]*[.]?[^\d\.]+)\.*(?<!\s)\s*'
'(?P<ranges>(?:%(range_regex)s(?:%(sep_l)s(?!\s*$)|(?=\s*$)))+)\s*$' r'(?P<ranges>(?:{range_regex}(?:{sep_l}(?!\s*$)|(?=\s*$)))+)\s*$'.format(
% dict(list(REFERENCE_SEPARATORS.items()) + [('range_regex', range_regex)]), re.UNICODE) range_regex=range_regex, sep_l=REFERENCE_SEPARATORS['sep_l']), re.UNICODE)
def get_reference_separator(separator_type): def get_reference_separator(separator_type):

View File

@ -306,9 +306,8 @@ class BibleDB(Manager):
book_escaped = book book_escaped = book
for character in RESERVED_CHARACTERS: for character in RESERVED_CHARACTERS:
book_escaped = book_escaped.replace(character, '\\' + character) book_escaped = book_escaped.replace(character, '\\' + character)
# TODO: Verify regex patters before using format() regex_book = re.compile('\\s*{book}\\s*'.format(book='\\s*'.join(book_escaped.split())),
regex_book = re.compile('\s*%s\s*' % '\s*'.join( re.UNICODE | re.IGNORECASE)
book_escaped.split()), re.UNICODE | re.IGNORECASE)
if language_selection == LanguageSelection.Bible: if language_selection == LanguageSelection.Bible:
db_book = self.get_book(book) db_book = self.get_book(book)
if db_book: if db_book:

View File

@ -90,6 +90,8 @@ class BGExtract(RegistryProperties):
""" """
Extract verses from BibleGateway Extract verses from BibleGateway
""" """
NAME = 'BibleGateway'
def __init__(self, proxy_url=None): def __init__(self, proxy_url=None):
log.debug('BGExtract.init("{url}")'.format(url=proxy_url)) log.debug('BGExtract.init("{url}")'.format(url=proxy_url))
self.proxy_url = proxy_url self.proxy_url = proxy_url
@ -357,6 +359,8 @@ class BSExtract(RegistryProperties):
""" """
Extract verses from Bibleserver.com Extract verses from Bibleserver.com
""" """
NAME = 'BibleServer'
def __init__(self, proxy_url=None): def __init__(self, proxy_url=None):
log.debug('BSExtract.init("{url}")'.format(url=proxy_url)) log.debug('BSExtract.init("{url}")'.format(url=proxy_url))
self.proxy_url = proxy_url self.proxy_url = proxy_url
@ -458,6 +462,8 @@ class CWExtract(RegistryProperties):
""" """
Extract verses from CrossWalk/BibleStudyTools Extract verses from CrossWalk/BibleStudyTools
""" """
NAME = 'Crosswalk'
def __init__(self, proxy_url=None): def __init__(self, proxy_url=None):
log.debug('CWExtract.init("{url}")'.format(url=proxy_url)) log.debug('CWExtract.init("{url}")'.format(url=proxy_url))
self.proxy_url = proxy_url self.proxy_url = proxy_url

View File

@ -190,9 +190,7 @@ class CustomMediaItem(MediaManagerItem):
translate('CustomPlugin.MediaItem', translate('CustomPlugin.MediaItem',
'Are you sure you want to delete the "{items:d}" ' 'Are you sure you want to delete the "{items:d}" '
'selected custom slide(s)?').format(items=len(items)), 'selected custom slide(s)?').format(items=len(items)),
QtWidgets.QMessageBox.StandardButtons( defaultButton=QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.No:
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No),
QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.No:
return return
row_list = [item.row() for item in self.list_view.selectedIndexes()] row_list = [item.row() for item in self.list_view.selectedIndexes()]
row_list.sort(reverse=True) row_list.sort(reverse=True)

View File

@ -246,9 +246,7 @@ class ImageMediaItem(MediaManagerItem):
translate('ImagePlugin.MediaItem', 'Remove group'), translate('ImagePlugin.MediaItem', 'Remove group'),
translate('ImagePlugin.MediaItem', translate('ImagePlugin.MediaItem',
'Are you sure you want to remove "{name}" and everything in it?' 'Are you sure you want to remove "{name}" and everything in it?'
).format(name=item_data.group_name), ).format(name=item_data.group_name)
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Yes |
QtWidgets.QMessageBox.No)
) == QtWidgets.QMessageBox.Yes: ) == QtWidgets.QMessageBox.Yes:
self.recursively_delete_group(item_data) self.recursively_delete_group(item_data)
self.manager.delete_object(ImageGroups, row_item.data(0, QtCore.Qt.UserRole).id) self.manager.delete_object(ImageGroups, row_item.data(0, QtCore.Qt.UserRole).id)
@ -597,8 +595,7 @@ class ImageMediaItem(MediaManagerItem):
self, translate('ImagePlugin.MediaItem', 'Missing Image(s)'), self, translate('ImagePlugin.MediaItem', 'Missing Image(s)'),
translate('ImagePlugin.MediaItem', 'The following image(s) no longer exist: {names}\n' translate('ImagePlugin.MediaItem', 'The following image(s) no longer exist: {names}\n'
'Do you want to add the other images anyway?' 'Do you want to add the other images anyway?'
).format(names='\n'.join(missing_items_file_names)), ).format(names='\n'.join(missing_items_file_names))) == \
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.No | QtWidgets.QMessageBox.Yes)) == \
QtWidgets.QMessageBox.No: QtWidgets.QMessageBox.No:
return False return False
# Continue with the existing images. # Continue with the existing images.

View File

@ -253,15 +253,14 @@ class PdfDocument(PresentationDocument):
try: try:
if not os.path.isdir(self.get_temp_folder()): if not os.path.isdir(self.get_temp_folder()):
os.makedirs(self.get_temp_folder()) os.makedirs(self.get_temp_folder())
# The %03d in the file name is handled by each binary
if self.controller.mudrawbin: if self.controller.mudrawbin:
log.debug('loading presentation using mudraw') log.debug('loading presentation using mudraw')
# TODO: Find out where the string conversion actually happens
runlog = check_output([self.controller.mudrawbin, '-w', str(size.width()), '-h', str(size.height()), runlog = check_output([self.controller.mudrawbin, '-w', str(size.width()), '-h', str(size.height()),
'-o', os.path.join(self.get_temp_folder(), 'mainslide%03d.png'), self.file_path], '-o', os.path.join(self.get_temp_folder(), 'mainslide%03d.png'), self.file_path],
startupinfo=self.startupinfo) startupinfo=self.startupinfo)
elif self.controller.mutoolbin: elif self.controller.mutoolbin:
log.debug('loading presentation using mutool') log.debug('loading presentation using mutool')
# TODO: Find out where the string convertsion actually happens
runlog = check_output([self.controller.mutoolbin, 'draw', '-w', str(size.width()), '-h', runlog = check_output([self.controller.mutoolbin, 'draw', '-w', str(size.width()), '-h',
str(size.height()), str(size.height()),
'-o', os.path.join(self.get_temp_folder(), 'mainslide%03d.png'), self.file_path], '-o', os.path.join(self.get_temp_folder(), 'mainslide%03d.png'), self.file_path],
@ -269,7 +268,6 @@ class PdfDocument(PresentationDocument):
elif self.controller.gsbin: elif self.controller.gsbin:
log.debug('loading presentation using gs') log.debug('loading presentation using gs')
resolution = self.gs_get_resolution(size) resolution = self.gs_get_resolution(size)
# TODO: Find out where the string conversion actually happens
runlog = check_output([self.controller.gsbin, '-dSAFER', '-dNOPAUSE', '-dBATCH', '-sDEVICE=png16m', runlog = check_output([self.controller.gsbin, '-dSAFER', '-dNOPAUSE', '-dBATCH', '-sDEVICE=png16m',
'-r' + str(resolution), '-dTextAlphaBits=4', '-dGraphicsAlphaBits=4', '-r' + str(resolution), '-dTextAlphaBits=4', '-dGraphicsAlphaBits=4',
'-sOutputFile=' + os.path.join(self.get_temp_folder(), 'mainslide%03d.png'), '-sOutputFile=' + os.path.join(self.get_temp_folder(), 'mainslide%03d.png'),

View File

@ -81,7 +81,7 @@ class PowerpointController(PresentationController):
if app_version >= 12: if app_version >= 12:
self.also_supports = ['odp'] self.also_supports = ['odp']
except (OSError, ValueError): except (OSError, ValueError):
log.warning('Detection of powerpoint version using registry failed.') log.exception('Detection of powerpoint version using registry failed.')
return True return True
except OSError: except OSError:
pass pass
@ -109,9 +109,8 @@ class PowerpointController(PresentationController):
if self.process.Presentations.Count > 0: if self.process.Presentations.Count > 0:
return return
self.process.Quit() self.process.Quit()
except (AttributeError, pywintypes.com_error) as e: except (AttributeError, pywintypes.com_error):
log.exception('Exception caught while killing powerpoint process') log.exception('Exception caught while killing powerpoint process')
log.exception(e)
trace_error_handler(log) trace_error_handler(log)
self.process = None self.process = None
@ -154,9 +153,8 @@ class PowerpointDocument(PresentationDocument):
if len(ScreenList().screen_list) > 1: if len(ScreenList().screen_list) > 1:
Registry().get('main_window').activateWindow() Registry().get('main_window').activateWindow()
return True return True
except (AttributeError, pywintypes.com_error) as e: except (AttributeError, pywintypes.com_error):
log.exception('Exception caught while loading Powerpoint presentation') log.exception('Exception caught while loading Powerpoint presentation')
log.exception(e)
trace_error_handler(log) trace_error_handler(log)
return False return False
@ -192,9 +190,8 @@ class PowerpointDocument(PresentationDocument):
if self.presentation: if self.presentation:
try: try:
self.presentation.Close() self.presentation.Close()
except (AttributeError, pywintypes.com_error) as e: except (AttributeError, pywintypes.com_error):
log.exception('Caught exception while closing powerpoint presentation') log.exception('Caught exception while closing powerpoint presentation')
log.exception(e)
trace_error_handler(log) trace_error_handler(log)
self.presentation = None self.presentation = None
self.controller.remove_doc(self) self.controller.remove_doc(self)
@ -210,9 +207,8 @@ class PowerpointDocument(PresentationDocument):
try: try:
if self.controller.process.Presentations.Count == 0: if self.controller.process.Presentations.Count == 0:
return False return False
except (AttributeError, pywintypes.com_error) as e: except (AttributeError, pywintypes.com_error):
log.exception('Caught exception while in is_loaded') log.exception('Caught exception while in is_loaded')
log.exception(e)
trace_error_handler(log) trace_error_handler(log)
return False return False
return True return True
@ -229,9 +225,8 @@ class PowerpointDocument(PresentationDocument):
return False return False
if self.presentation.SlideShowWindow.View is None: if self.presentation.SlideShowWindow.View is None:
return False return False
except (AttributeError, pywintypes.com_error) as e: except (AttributeError, pywintypes.com_error):
log.exception('Caught exception while in is_active') log.exception('Caught exception while in is_active')
log.exception(e)
trace_error_handler(log) trace_error_handler(log)
return False return False
return True return True
@ -249,9 +244,8 @@ class PowerpointDocument(PresentationDocument):
self.presentation.SlideShowWindow.View.GotoSlide(self.index_map[self.blank_slide], False) self.presentation.SlideShowWindow.View.GotoSlide(self.index_map[self.blank_slide], False)
if self.blank_click: if self.blank_click:
self.presentation.SlideShowWindow.View.GotoClick(self.blank_click) self.presentation.SlideShowWindow.View.GotoClick(self.blank_click)
except (AttributeError, pywintypes.com_error) as e: except (AttributeError, pywintypes.com_error):
log.exception('Caught exception while in unblank_screen') log.exception('Caught exception while in unblank_screen')
log.exception(e)
trace_error_handler(log) trace_error_handler(log)
self.show_error_msg() self.show_error_msg()
# Stop powerpoint from flashing in the taskbar # Stop powerpoint from flashing in the taskbar
@ -273,9 +267,8 @@ class PowerpointDocument(PresentationDocument):
self.blank_click = self.presentation.SlideShowWindow.View.GetClickIndex() self.blank_click = self.presentation.SlideShowWindow.View.GetClickIndex()
# ppSlideShowBlackScreen = 3 # ppSlideShowBlackScreen = 3
self.presentation.SlideShowWindow.View.State = 3 self.presentation.SlideShowWindow.View.State = 3
except (AttributeError, pywintypes.com_error) as e: except (AttributeError, pywintypes.com_error):
log.exception('Caught exception while in blank_screen') log.exception('Caught exception while in blank_screen')
log.exception(e)
trace_error_handler(log) trace_error_handler(log)
self.show_error_msg() self.show_error_msg()
@ -288,9 +281,8 @@ class PowerpointDocument(PresentationDocument):
try: try:
# ppSlideShowBlackScreen = 3 # ppSlideShowBlackScreen = 3
return self.presentation.SlideShowWindow.View.State == 3 return self.presentation.SlideShowWindow.View.State == 3
except (AttributeError, pywintypes.com_error) as e: except (AttributeError, pywintypes.com_error):
log.exception('Caught exception while in is_blank') log.exception('Caught exception while in is_blank')
log.exception(e)
trace_error_handler(log) trace_error_handler(log)
self.show_error_msg() self.show_error_msg()
else: else:
@ -303,9 +295,8 @@ class PowerpointDocument(PresentationDocument):
log.debug('stop_presentation') log.debug('stop_presentation')
try: try:
self.presentation.SlideShowWindow.View.Exit() self.presentation.SlideShowWindow.View.Exit()
except (AttributeError, pywintypes.com_error) as e: except (AttributeError, pywintypes.com_error):
log.exception('Caught exception while in stop_presentation') log.exception('Caught exception while in stop_presentation')
log.exception(e)
trace_error_handler(log) trace_error_handler(log)
self.show_error_msg() self.show_error_msg()
@ -328,9 +319,8 @@ class PowerpointDocument(PresentationDocument):
ppt_window = None ppt_window = None
try: try:
ppt_window = self.presentation.SlideShowSettings.Run() ppt_window = self.presentation.SlideShowSettings.Run()
except (AttributeError, pywintypes.com_error) as e: except (AttributeError, pywintypes.com_error):
log.exception('Caught exception while in start_presentation') log.exception('Caught exception while in start_presentation')
log.exception(e)
trace_error_handler(log) trace_error_handler(log)
self.show_error_msg() self.show_error_msg()
if ppt_window and not Settings().value('presentations/powerpoint control window'): if ppt_window and not Settings().value('presentations/powerpoint control window'):
@ -339,9 +329,8 @@ class PowerpointDocument(PresentationDocument):
ppt_window.Height = size.height() * 72 / dpi ppt_window.Height = size.height() * 72 / dpi
ppt_window.Left = size.x() * 72 / dpi ppt_window.Left = size.x() * 72 / dpi
ppt_window.Width = size.width() * 72 / dpi ppt_window.Width = size.width() * 72 / dpi
except AttributeError as e: except AttributeError:
log.exception('AttributeError while in start_presentation') log.exception('AttributeError while in start_presentation')
log.exception(e)
# Find the presentation window and save the handle for later # Find the presentation window and save the handle for later
self.presentation_hwnd = None self.presentation_hwnd = None
if ppt_window: if ppt_window:
@ -399,9 +388,8 @@ class PowerpointDocument(PresentationDocument):
ret = next((key for key, slidenum in self.index_map.items() if slidenum == ret), None) ret = next((key for key, slidenum in self.index_map.items() if slidenum == ret), None)
else: else:
ret = self.presentation.SlideShowWindow.View.CurrentShowPosition ret = self.presentation.SlideShowWindow.View.CurrentShowPosition
except (AttributeError, pywintypes.com_error) as e: except (AttributeError, pywintypes.com_error):
log.exception('Caught exception while in get_slide_number') log.exception('Caught exception while in get_slide_number')
log.exception(e)
trace_error_handler(log) trace_error_handler(log)
self.show_error_msg() self.show_error_msg()
return ret return ret
@ -431,9 +419,8 @@ class PowerpointDocument(PresentationDocument):
self.next_step() self.next_step()
else: else:
self.presentation.SlideShowWindow.View.GotoSlide(self.index_map[slide_no]) self.presentation.SlideShowWindow.View.GotoSlide(self.index_map[slide_no])
except (AttributeError, pywintypes.com_error) as e: except (AttributeError, pywintypes.com_error):
log.exception('Caught exception while in goto_slide') log.exception('Caught exception while in goto_slide')
log.exception(e)
trace_error_handler(log) trace_error_handler(log)
self.show_error_msg() self.show_error_msg()
@ -445,9 +432,8 @@ class PowerpointDocument(PresentationDocument):
try: try:
self.presentation.SlideShowWindow.Activate() self.presentation.SlideShowWindow.Activate()
self.presentation.SlideShowWindow.View.Next() self.presentation.SlideShowWindow.View.Next()
except (AttributeError, pywintypes.com_error) as e: except (AttributeError, pywintypes.com_error):
log.exception('Caught exception while in next_step') log.exception('Caught exception while in next_step')
log.exception(e)
trace_error_handler(log) trace_error_handler(log)
self.show_error_msg() self.show_error_msg()
return return
@ -468,9 +454,8 @@ class PowerpointDocument(PresentationDocument):
log.debug('previous_step') log.debug('previous_step')
try: try:
self.presentation.SlideShowWindow.View.Previous() self.presentation.SlideShowWindow.View.Previous()
except (AttributeError, pywintypes.com_error) as e: except (AttributeError, pywintypes.com_error):
log.exception('Caught exception while in previous_step') log.exception('Caught exception while in previous_step')
log.exception(e)
trace_error_handler(log) trace_error_handler(log)
self.show_error_msg() self.show_error_msg()
@ -503,8 +488,8 @@ class PowerpointDocument(PresentationDocument):
slide = self.presentation.Slides(self.index_map[num + 1]) slide = self.presentation.Slides(self.index_map[num + 1])
try: try:
text = slide.Shapes.Title.TextFrame.TextRange.Text text = slide.Shapes.Title.TextFrame.TextRange.Text
except Exception as e: except Exception:
log.exception(e) log.exception('Exception raised when getting title text')
text = '' text = ''
titles.append(text.replace('\n', ' ').replace('\x0b', ' ') + '\n') titles.append(text.replace('\n', ' ').replace('\x0b', ' ') + '\n')
note = _get_text_from_shapes(slide.NotesPage.Shapes) note = _get_text_from_shapes(slide.NotesPage.Shapes)
@ -519,9 +504,8 @@ class PowerpointDocument(PresentationDocument):
""" """
try: try:
self.presentation.SlideShowWindow.View.Exit() self.presentation.SlideShowWindow.View.Exit()
except (AttributeError, pywintypes.com_error) as e: except (AttributeError, pywintypes.com_error):
log.exception('Failed to exit Powerpoint presentation after error') log.exception('Failed to exit Powerpoint presentation after error')
log.exception(e)
critical_error_message_box(UiStrings().Error, translate('PresentationPlugin.PowerpointDocument', critical_error_message_box(UiStrings().Error, translate('PresentationPlugin.PowerpointDocument',
'An error occurred in the PowerPoint integration ' 'An error occurred in the PowerPoint integration '
'and the presentation will be stopped. ' 'and the presentation will be stopped. '
@ -540,7 +524,6 @@ def _get_text_from_shapes(shapes):
if shape.PlaceholderFormat.Type == 2: # 2 from is enum PpPlaceholderType.ppPlaceholderBody if shape.PlaceholderFormat.Type == 2: # 2 from is enum PpPlaceholderType.ppPlaceholderBody
if shape.HasTextFrame and shape.TextFrame.HasText: if shape.HasTextFrame and shape.TextFrame.HasText:
text += shape.TextFrame.TextRange.Text + '\n' text += shape.TextFrame.TextRange.Text + '\n'
except pywintypes.com_error as e: except pywintypes.com_error:
log.warning('Failed to extract text from powerpoint slide') log.exception('Failed to extract text from powerpoint slide')
log.warning(e)
return text return text

View File

@ -122,5 +122,4 @@ class RemotesPlugin(Plugin):
translate('RemotePlugin', 'Server Config Change'), translate('RemotePlugin', 'Server Config Change'),
translate('RemotePlugin', translate('RemotePlugin',
'Server configuration changes will require a restart ' 'Server configuration changes will require a restart '
'to take effect.'), 'to take effect.'))
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Ok))

View File

@ -133,9 +133,9 @@ class DuplicateSongRemovalForm(OpenLPWizard, RegistryProperties):
Song wizard localisation. Song wizard localisation.
""" """
self.setWindowTitle(translate('Wizard', 'Wizard')) self.setWindowTitle(translate('Wizard', 'Wizard'))
# TODO: Check format() using template strings self.title_label.setText(
self.title_label.setText(WizardStrings.HeaderStyle % translate('OpenLP.Ui', WizardStrings.HeaderStyle.format(text=translate('OpenLP.Ui',
'Welcome to the Duplicate Song Removal Wizard')) 'Welcome to the Duplicate Song Removal Wizard')))
self.information_label.setText( self.information_label.setText(
translate("Wizard", translate("Wizard",
'This wizard will help you to remove duplicate songs from the song database. You will have a ' 'This wizard will help you to remove duplicate songs from the song database. You will have a '
@ -219,8 +219,7 @@ class DuplicateSongRemovalForm(OpenLPWizard, RegistryProperties):
self.button(QtWidgets.QWizard.CancelButton).hide() self.button(QtWidgets.QWizard.CancelButton).hide()
QtWidgets.QMessageBox.information( QtWidgets.QMessageBox.information(
self, translate('Wizard', 'Information'), self, translate('Wizard', 'Information'),
translate('Wizard', 'No duplicate songs have been found in the database.'), translate('Wizard', 'No duplicate songs have been found in the database.'))
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Ok))
def add_duplicates_to_song_list(self, search_song, duplicate_song): def add_duplicates_to_song_list(self, search_song, duplicate_song):
""" """

View File

@ -204,8 +204,7 @@ class EditSongForm(QtWidgets.QDialog, Ui_EditSongDialog, RegistryProperties):
'There is no verse corresponding to "{invalid}". Valid entries are {valid}.\n' 'There is no verse corresponding to "{invalid}". Valid entries are {valid}.\n'
'Please enter the verses separated by spaces.').format(invalid=invalid_verses[0], 'Please enter the verses separated by spaces.').format(invalid=invalid_verses[0],
valid=valid) valid=valid)
critical_error_message_box(title=translate('SongsPlugin.EditSongForm', 'Invalid Verse Order'), critical_error_message_box(title=translate('SongsPlugin.EditSongForm', 'Invalid Verse Order'), message=msg)
message=msg)
return len(invalid_verses) == 0 return len(invalid_verses) == 0
def _validate_song(self): def _validate_song(self):
@ -580,8 +579,7 @@ class EditSongForm(QtWidgets.QDialog, Ui_EditSongDialog, RegistryProperties):
self, self,
translate('SongsPlugin.EditSongForm', 'Add Author'), translate('SongsPlugin.EditSongForm', 'Add Author'),
translate('SongsPlugin.EditSongForm', 'This author does not exist, do you want to add them?'), translate('SongsPlugin.EditSongForm', 'This author does not exist, do you want to add them?'),
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, defaultButton=QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.Yes:
QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.Yes:
if text.find(' ') == -1: if text.find(' ') == -1:
author = Author.populate(first_name='', last_name='', display_name=text) author = Author.populate(first_name='', last_name='', display_name=text)
else: else:
@ -659,8 +657,7 @@ class EditSongForm(QtWidgets.QDialog, Ui_EditSongDialog, RegistryProperties):
if QtWidgets.QMessageBox.question( if QtWidgets.QMessageBox.question(
self, translate('SongsPlugin.EditSongForm', 'Add Topic'), self, translate('SongsPlugin.EditSongForm', 'Add Topic'),
translate('SongsPlugin.EditSongForm', 'This topic does not exist, do you want to add it?'), translate('SongsPlugin.EditSongForm', 'This topic does not exist, do you want to add it?'),
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, defaultButton=QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.Yes:
QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.Yes:
topic = Topic.populate(name=text) topic = Topic.populate(name=text)
self.manager.save_object(topic) self.manager.save_object(topic)
topic_item = QtWidgets.QListWidgetItem(str(topic.name)) topic_item = QtWidgets.QListWidgetItem(str(topic.name))
@ -706,8 +703,7 @@ class EditSongForm(QtWidgets.QDialog, Ui_EditSongDialog, RegistryProperties):
if QtWidgets.QMessageBox.question( if QtWidgets.QMessageBox.question(
self, translate('SongsPlugin.EditSongForm', 'Add Songbook'), self, translate('SongsPlugin.EditSongForm', 'Add Songbook'),
translate('SongsPlugin.EditSongForm', 'This Songbook does not exist, do you want to add it?'), translate('SongsPlugin.EditSongForm', 'This Songbook does not exist, do you want to add it?'),
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, defaultButton=QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.Yes:
QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.Yes:
songbook = Book.populate(name=text) songbook = Book.populate(name=text)
self.manager.save_object(songbook) self.manager.save_object(songbook)
self.add_songbook_entry_to_list(songbook.id, songbook.name, self.songbook_entry_edit.text()) self.add_songbook_entry_to_list(songbook.id, songbook.name, self.songbook_entry_edit.text())

View File

@ -121,7 +121,7 @@ class SongExportForm(OpenLPWizard):
self.selected_list_widget = QtWidgets.QListWidget(self.export_song_page) self.selected_list_widget = QtWidgets.QListWidget(self.export_song_page)
self.selected_list_widget.setObjectName('selected_list_widget') self.selected_list_widget.setObjectName('selected_list_widget')
self.grid_layout.addWidget(self.selected_list_widget, 1, 0, 1, 1) self.grid_layout.addWidget(self.selected_list_widget, 1, 0, 1, 1)
# FIXME: self.horizontal_layout is already defined above?!?!? # FIXME: self.horizontal_layout is already defined above?!?!? Replace with Path Eidt!
self.horizontal_layout = QtWidgets.QHBoxLayout() self.horizontal_layout = QtWidgets.QHBoxLayout()
self.horizontal_layout.setObjectName('horizontal_layout') self.horizontal_layout.setObjectName('horizontal_layout')
self.directory_label = QtWidgets.QLabel(self.export_song_page) self.directory_label = QtWidgets.QLabel(self.export_song_page)
@ -143,9 +143,8 @@ class SongExportForm(OpenLPWizard):
Song wizard localisation. Song wizard localisation.
""" """
self.setWindowTitle(translate('SongsPlugin.ExportWizardForm', 'Song Export Wizard')) self.setWindowTitle(translate('SongsPlugin.ExportWizardForm', 'Song Export Wizard'))
# TODO: Verify format() with template variables self.title_label.setText(
self.title_label.setText(WizardStrings.HeaderStyle % WizardStrings.HeaderStyle.format(text=translate('OpenLP.Ui', 'Welcome to the Song Export Wizard')))
translate('OpenLP.Ui', 'Welcome to the Song Export Wizard'))
self.information_label.setText( self.information_label.setText(
translate('SongsPlugin.ExportWizardForm', 'This wizard will help to export your songs to the open and free ' translate('SongsPlugin.ExportWizardForm', 'This wizard will help to export your songs to the open and free '
'<strong>OpenLyrics </strong> worship song format.')) '<strong>OpenLyrics </strong> worship song format.'))

View File

@ -132,9 +132,8 @@ class SongImportForm(OpenLPWizard, RegistryProperties):
Song wizard localisation. Song wizard localisation.
""" """
self.setWindowTitle(translate('SongsPlugin.ImportWizardForm', 'Song Import Wizard')) self.setWindowTitle(translate('SongsPlugin.ImportWizardForm', 'Song Import Wizard'))
# TODO: Verify format() with template variables self.title_label.setText(
self.title_label.setText(WizardStrings.HeaderStyle % translate('OpenLP.Ui', WizardStrings.HeaderStyle.format(text=translate('OpenLP.Ui', 'Welcome to the Song Import Wizard')))
'Welcome to the Song Import Wizard'))
self.information_label.setText( self.information_label.setText(
translate('SongsPlugin.ImportWizardForm', translate('SongsPlugin.ImportWizardForm',
'This wizard will help you to import songs from a variety of formats. Click the next button ' 'This wizard will help you to import songs from a variety of formats. Click the next button '
@ -272,12 +271,11 @@ class SongImportForm(OpenLPWizard, RegistryProperties):
select_mode, format_name, ext_filter = SongFormat.get(this_format, 'selectMode', 'name', 'filter') select_mode, format_name, ext_filter = SongFormat.get(this_format, 'selectMode', 'name', 'filter')
file_path_edit = self.format_widgets[this_format]['file_path_edit'] file_path_edit = self.format_widgets[this_format]['file_path_edit']
if select_mode == SongFormatSelect.SingleFile: if select_mode == SongFormatSelect.SingleFile:
# TODO: Verify format() with template variables self.get_file_name(WizardStrings.OpenTypeFile.format(file_type=format_name),
self.get_file_name( file_path_edit, 'last directory import', ext_filter)
WizardStrings.OpenTypeFile % format_name, file_path_edit, 'last directory import', ext_filter)
elif select_mode == SongFormatSelect.SingleFolder: elif select_mode == SongFormatSelect.SingleFolder:
# TODO: Verify format() with template variables self.get_folder(
self.get_folder(WizardStrings.OpenTypeFolder % format_name, file_path_edit, 'last directory import') WizardStrings.OpenTypeFolder.format(folder_name=format_name), file_path_edit, 'last directory import')
def on_add_button_clicked(self): def on_add_button_clicked(self):
""" """
@ -286,8 +284,7 @@ class SongImportForm(OpenLPWizard, RegistryProperties):
this_format = self.current_format this_format = self.current_format
select_mode, format_name, ext_filter, custom_title = \ select_mode, format_name, ext_filter, custom_title = \
SongFormat.get(this_format, 'selectMode', 'name', 'filter', 'getFilesTitle') SongFormat.get(this_format, 'selectMode', 'name', 'filter', 'getFilesTitle')
# TODO: Verify format() with template variables title = custom_title if custom_title else WizardStrings.OpenTypeFile.format(file_type=format_name)
title = custom_title if custom_title else WizardStrings.OpenTypeFile % format_name
if select_mode == SongFormatSelect.MultipleFiles: if select_mode == SongFormatSelect.MultipleFiles:
self.get_files(title, self.format_widgets[this_format]['file_list_widget'], ext_filter) self.get_files(title, self.format_widgets[this_format]['file_list_widget'], ext_filter)
self.source_page.completeChanged.emit() self.source_page.completeChanged.emit()

View File

@ -249,8 +249,7 @@ class SongSelectForm(QtWidgets.QDialog, Ui_SongSelectDialog):
translate('SongsPlugin.SongSelectForm', 'WARNING: Saving your username and password is INSECURE, your ' translate('SongsPlugin.SongSelectForm', 'WARNING: Saving your username and password is INSECURE, your '
'password is stored in PLAIN TEXT. Click Yes to save your ' 'password is stored in PLAIN TEXT. Click Yes to save your '
'password or No to cancel this.'), 'password or No to cancel this.'),
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No), defaultButton=QtWidgets.QMessageBox.No)
QtWidgets.QMessageBox.No)
if answer == QtWidgets.QMessageBox.No: if answer == QtWidgets.QMessageBox.No:
self.save_password_checkbox.setChecked(False) self.save_password_checkbox.setChecked(False)
@ -398,8 +397,7 @@ class SongSelectForm(QtWidgets.QDialog, Ui_SongSelectDialog):
translate('SongsPlugin.SongSelectForm', translate('SongsPlugin.SongSelectForm',
'Your song has been imported, would you ' 'Your song has been imported, would you '
'like to import more songs?'), 'like to import more songs?'),
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, defaultButton=QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.Yes:
QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.Yes:
self.on_back_button_clicked() self.on_back_button_clicked()
else: else:
self.application.process_events() self.application.process_events()

View File

@ -265,7 +265,7 @@ class SongFormat(object):
}, },
EasyWorshipService: { EasyWorshipService: {
'class': EasyWorshipSongImport, 'class': EasyWorshipSongImport,
'name': 'EasyWorship Service File', 'name': 'EasyWorship Service',
'prefix': 'ew', 'prefix': 'ew',
'selectMode': SongFormatSelect.SingleFile, 'selectMode': SongFormatSelect.SingleFile,
'filter': '{text} (*.ews)'.format(text=translate('SongsPlugin.ImportWizardForm', 'filter': '{text} (*.ews)'.format(text=translate('SongsPlugin.ImportWizardForm',

View File

@ -121,8 +121,8 @@ class FoilPresenterImport(SongImport):
for file_path in self.import_source: for file_path in self.import_source:
if self.stop_import_flag: if self.stop_import_flag:
return return
# TODO: Verify format() with template strings self.import_wizard.increment_progress_bar(
self.import_wizard.increment_progress_bar(WizardStrings.ImportingType % os.path.basename(file_path)) WizardStrings.ImportingType.format(source=os.path.basename(file_path)))
try: try:
parsed_file = etree.parse(file_path, parser) parsed_file = etree.parse(file_path, parser)
xml = etree.tostring(parsed_file).decode() xml = etree.tostring(parsed_file).decode()

View File

@ -275,11 +275,9 @@ class OpenLPSongImport(SongImport):
self.manager.save_object(new_song) self.manager.save_object(new_song)
if progress_dialog: if progress_dialog:
progress_dialog.setValue(progress_dialog.value() + 1) progress_dialog.setValue(progress_dialog.value() + 1)
# TODO: Verify format() with template strings progress_dialog.setLabelText(WizardStrings.ImportingType.format(source=new_song.title))
progress_dialog.setLabelText(WizardStrings.ImportingType % new_song.title)
else: else:
# TODO: Verify format() with template strings self.import_wizard.increment_progress_bar(WizardStrings.ImportingType.format(source=new_song.title))
self.import_wizard.increment_progress_bar(WizardStrings.ImportingType % new_song.title)
if self.stop_import_flag: if self.stop_import_flag:
break break
self.source_session.close() self.source_session.close()

View File

@ -58,8 +58,8 @@ class OpenLyricsImport(SongImport):
for file_path in self.import_source: for file_path in self.import_source:
if self.stop_import_flag: if self.stop_import_flag:
return return
# TODO: Verify format() with template strings self.import_wizard.increment_progress_bar(
self.import_wizard.increment_progress_bar(WizardStrings.ImportingType % os.path.basename(file_path)) WizardStrings.ImportingType.format(source=os.path.basename(file_path)))
try: try:
# Pass a file object, because lxml does not cope with some # Pass a file object, because lxml does not cope with some
# special characters in the path (see lp:757673 and lp:744337). # special characters in the path (see lp:757673 and lp:744337).

View File

@ -41,8 +41,8 @@ class PowerPraiseImport(SongImport):
for file_path in self.import_source: for file_path in self.import_source:
if self.stop_import_flag: if self.stop_import_flag:
return return
# TODO: Verify format() with template strings self.import_wizard.increment_progress_bar(
self.import_wizard.increment_progress_bar(WizardStrings.ImportingType % os.path.basename(file_path)) WizardStrings.ImportingType.format(source=os.path.basename(file_path)))
root = objectify.parse(open(file_path, 'rb')).getroot() root = objectify.parse(open(file_path, 'rb')).getroot()
self.process_song(root) self.process_song(root)

View File

@ -44,8 +44,8 @@ class PresentationManagerImport(SongImport):
for file_path in self.import_source: for file_path in self.import_source:
if self.stop_import_flag: if self.stop_import_flag:
return return
# TODO: Verify format() with template strings self.import_wizard.increment_progress_bar(
self.import_wizard.increment_progress_bar(WizardStrings.ImportingType % os.path.basename(file_path)) WizardStrings.ImportingType.format(source=os.path.basename(file_path)))
try: try:
tree = etree.parse(file_path, parser=etree.XMLParser(recover=True)) tree = etree.parse(file_path, parser=etree.XMLParser(recover=True))
except etree.XMLSyntaxError: except etree.XMLSyntaxError:

View File

@ -46,8 +46,8 @@ class ProPresenterImport(SongImport):
for file_path in self.import_source: for file_path in self.import_source:
if self.stop_import_flag: if self.stop_import_flag:
return return
# TODO: Verify format() with template strings self.import_wizard.increment_progress_bar(
self.import_wizard.increment_progress_bar(WizardStrings.ImportingType % os.path.basename(file_path)) WizardStrings.ImportingType.format(source=os.path.basename(file_path)))
root = objectify.parse(open(file_path, 'rb')).getroot() root = objectify.parse(open(file_path, 'rb')).getroot()
self.process_song(root, file_path) self.process_song(root, file_path)

View File

@ -347,8 +347,7 @@ class SongImport(QtCore.QObject):
song = Song() song = Song()
song.title = self.title song.title = self.title
if self.import_wizard is not None: if self.import_wizard is not None:
# TODO: Verify format() with template variables self.import_wizard.increment_progress_bar(WizardStrings.ImportingType.format(source=song.title))
self.import_wizard.increment_progress_bar(WizardStrings.ImportingType % song.title)
song.alternate_title = self.alternate_title song.alternate_title = self.alternate_title
# Values will be set when cleaning the song. # Values will be set when cleaning the song.
song.search_title = '' song.search_title = ''

View File

@ -100,8 +100,7 @@ class SongShowPlusImport(SongImport):
self.other_count = 0 self.other_count = 0
self.other_list = {} self.other_list = {}
file_name = os.path.split(file)[1] file_name = os.path.split(file)[1]
# TODO: Verify format() with template variables self.import_wizard.increment_progress_bar(WizardStrings.ImportingType.format(source=file_name), 0)
self.import_wizard.increment_progress_bar(WizardStrings.ImportingType % file_name, 0)
song_data = open(file, 'rb') song_data = open(file, 'rb')
while True: while True:
block_key, = struct.unpack("I", song_data.read(4)) block_key, = struct.unpack("I", song_data.read(4))

View File

@ -505,8 +505,7 @@ class SongMediaItem(MediaManagerItem):
translate('SongsPlugin.MediaItem', translate('SongsPlugin.MediaItem',
'Are you sure you want to delete the "{items:d}" ' 'Are you sure you want to delete the "{items:d}" '
'selected song(s)?').format(items=len(items)), 'selected song(s)?').format(items=len(items)),
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No), defaultButton=QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.No:
QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.No:
return return
self.application.set_busy_cursor() self.application.set_busy_cursor()
self.main_window.display_progress_bar(len(items)) self.main_window.display_progress_bar(len(items))

View File

@ -70,8 +70,7 @@ from openlp.plugins.songs.lib.db import Author, AuthorType, Book, Song, Topic
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
NAMESPACE = 'http://openlyrics.info/namespace/2009/song' NAMESPACE = 'http://openlyrics.info/namespace/2009/song'
# TODO: Verify format() with template variable NSMAP = '{{' + NAMESPACE + '}}{tag}'
NSMAP = '{' + NAMESPACE + '}' + '%s'
class SongXML(object): class SongXML(object):
@ -616,15 +615,13 @@ class OpenLyrics(object):
text = '' text = ''
use_endtag = True use_endtag = True
# Skip <comment> elements - not yet supported. # Skip <comment> elements - not yet supported.
# TODO: Verify format() with template variables if element.tag == NSMAP.format(tag='comment'):
if element.tag == NSMAP % 'comment':
if element.tail: if element.tail:
# Append tail text at comment element. # Append tail text at comment element.
text += element.tail text += element.tail
return text return text
# Convert chords to ChordPro format which OpenLP uses internally # Convert chords to ChordPro format which OpenLP uses internally
# TODO: Verify format() with template variables elif element.tag == NSMAP.format(tag='chord'):
elif element.tag == NSMAP % 'chord':
if Settings().value('songs/enable chords') and not Settings().value('songs/disable chords import'): if Settings().value('songs/enable chords') and not Settings().value('songs/disable chords import'):
text += '[{chord}]'.format(chord=element.get('name')) text += '[{chord}]'.format(chord=element.get('name'))
if element.tail: if element.tail:
@ -632,15 +629,13 @@ class OpenLyrics(object):
text += element.tail text += element.tail
return text return text
# Convert line breaks <br/> to \n. # Convert line breaks <br/> to \n.
# TODO: Verify format() with template variables elif newlines and element.tag == NSMAP.format(tag='br'):
elif newlines and element.tag == NSMAP % 'br':
text += '\n' text += '\n'
if element.tail: if element.tail:
text += element.tail text += element.tail
return text return text
# Start formatting tag. # Start formatting tag.
# TODO: Verify format() with template variables if element.tag == NSMAP.format(tag='tag'):
if element.tag == NSMAP % 'tag':
text += '{{{name}}}'.format(name=element.get('name')) text += '{{{name}}}'.format(name=element.get('name'))
# Some formattings may have only start tag. # Some formattings may have only start tag.
# Handle this case if element has no children and contains no text. # Handle this case if element has no children and contains no text.
@ -654,8 +649,7 @@ class OpenLyrics(object):
# Use recursion since nested formatting tags are allowed. # Use recursion since nested formatting tags are allowed.
text += self._process_lines_mixed_content(child, newlines) text += self._process_lines_mixed_content(child, newlines)
# Append text from tail and add formatting end tag. # Append text from tail and add formatting end tag.
# TODO: Verify format() with template variables if element.tag == NSMAP.format(tag='tag') and use_endtag:
if element.tag == NSMAP % 'tag' and use_endtag:
text += '{{/{name}}}'.format(name=element.get('name')) text += '{{/{name}}}'.format(name=element.get('name'))
# Append text from tail. # Append text from tail.
if element.tail: if element.tail:
@ -682,8 +676,7 @@ class OpenLyrics(object):
# Loop over the "line" elements removing comments # Loop over the "line" elements removing comments
for line in element: for line in element:
# Skip comment lines. # Skip comment lines.
# TODO: Verify format() with template variables if line.tag == NSMAP.format(tag='comment'):
if line.tag == NSMAP % 'comment':
continue continue
if text: if text:
text += '\n' text += '\n'

View File

@ -53,9 +53,7 @@ class SongUsageDeleteForm(QtWidgets.QDialog, Ui_SongUsageDeleteDialog, RegistryP
'Delete Selected Song Usage Events?'), 'Delete Selected Song Usage Events?'),
translate('SongUsagePlugin.SongUsageDeleteForm', translate('SongUsagePlugin.SongUsageDeleteForm',
'Are you sure you want to delete selected Song Usage data?'), 'Are you sure you want to delete selected Song Usage data?'),
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Yes | defaultButton=QtWidgets.QMessageBox.No)
QtWidgets.QMessageBox.No),
QtWidgets.QMessageBox.No)
if ret == QtWidgets.QMessageBox.Yes: if ret == QtWidgets.QMessageBox.Yes:
delete_date = self.delete_calendar.selectedDate().toPyDate() delete_date = self.delete_calendar.selectedDate().toPyDate()
self.manager.delete_all_objects(SongUsageItem, SongUsageItem.usagedate <= delete_date) self.manager.delete_all_objects(SongUsageItem, SongUsageItem.usagedate <= delete_date)

View File

@ -27,12 +27,6 @@ from unittest.mock import MagicMock, patch, call
from openlp.core.ui.formattingtagform import FormattingTagForm from openlp.core.ui.formattingtagform import FormattingTagForm
# TODO: Tests Still TODO
# __init__
# exec
# on_saved_clicked
# _reloadTable
class TestFormattingTagForm(TestCase): class TestFormattingTagForm(TestCase):

View File

@ -176,7 +176,7 @@ class TestThemeManager(TestCase):
self.assertTrue(result) self.assertTrue(result)
mocked_qmessagebox_question.assert_called_once_with( mocked_qmessagebox_question.assert_called_once_with(
theme_manager, 'Theme Already Exists', 'Theme Theme Name already exists. Do you want to replace it?', theme_manager, 'Theme Already Exists', 'Theme Theme Name already exists. Do you want to replace it?',
ANY, ANY) defaultButton=ANY)
def test_over_write_message_box_no(self): def test_over_write_message_box_no(self):
""" """
@ -196,7 +196,7 @@ class TestThemeManager(TestCase):
self.assertFalse(result) self.assertFalse(result)
mocked_qmessagebox_question.assert_called_once_with( mocked_qmessagebox_question.assert_called_once_with(
theme_manager, 'Theme Already Exists', 'Theme Theme Name already exists. Do you want to replace it?', theme_manager, 'Theme Already Exists', 'Theme Theme Name already exists. Do you want to replace it?',
ANY, ANY) defaultButton=ANY)
def test_unzip_theme(self): def test_unzip_theme(self):
""" """

View File

@ -29,45 +29,11 @@ from bs4 import BeautifulSoup
from openlp.plugins.bibles.lib.importers.http import BSExtract from openlp.plugins.bibles.lib.importers.http import BSExtract
# TODO: Items left to test
# BGExtract
# __init__
# _remove_elements
# _extract_verse
# _clean_soup
# _extract_verses
# _extract_verses_old
# get_bible_chapter
# get_books_from_http
# _get_application
# CWExtract
# __init__
# get_bible_chapter
# get_books_from_http
# _get_application
# HTTPBible
# __init__
# do_import
# get_verses
# get_chapter
# get_books
# get_chapter_count
# get_verse_count
# _get_application
# get_soup_for_bible_ref
# send_error_message
class TestBSExtract(TestCase): class TestBSExtract(TestCase):
""" """
Test the BSExtractClass Test the BSExtractClass
""" """
# TODO: Items left to test
# BSExtract
# __init__
# get_bible_chapter
# get_books_from_http
# _get_application
def setUp(self): def setUp(self):
self.get_soup_for_bible_ref_patcher = patch('openlp.plugins.bibles.lib.importers.http.get_soup_for_bible_ref') self.get_soup_for_bible_ref_patcher = patch('openlp.plugins.bibles.lib.importers.http.get_soup_for_bible_ref')
self.log_patcher = patch('openlp.plugins.bibles.lib.importers.http.log') self.log_patcher = patch('openlp.plugins.bibles.lib.importers.http.log')

View File

@ -199,9 +199,6 @@ class TestMediaItem(TestCase, TestMixin):
self.assertTrue(self.media_item.has_delete_icon, 'Check that the icon is called as True.') self.assertTrue(self.media_item.has_delete_icon, 'Check that the icon is called as True.')
self.assertFalse(self.media_item.add_to_service_item, 'Check that the icon is called as False') self.assertFalse(self.media_item.add_to_service_item, 'Check that the icon is called as False')
# TODO: Test add_end_header_bar
# TODO: Test setupUi
def test_on_focus_search_tab_visible(self): def test_on_focus_search_tab_visible(self):
""" """
Test the correct widget gets focus when the BibleMediaItem receives focus Test the correct widget gets focus when the BibleMediaItem receives focus
@ -1381,8 +1378,6 @@ class TestMediaItem(TestCase, TestMixin):
self.assertTrue(self.mocked_main_window.information_message.called) self.assertTrue(self.mocked_main_window.information_message.called)
mocked_display_results.assert_called_once_with() mocked_display_results.assert_called_once_with()
# TODO: Test text_search
def test_on_search_edit_text_changed_search_while_typing_disabled(self): def test_on_search_edit_text_changed_search_while_typing_disabled(self):
""" """
Test on_search_edit_text_changed when 'search while typing' is disabled Test on_search_edit_text_changed when 'search while typing' is disabled

View File

@ -42,11 +42,6 @@ class TestPptviewController(TestCase, TestMixin):
""" """
Test the PptviewController Class Test the PptviewController Class
""" """
# TODO: Items left to test
# PptviewController
# start_process(self)
# kill
def setUp(self): def setUp(self):
""" """
Set up the patches and mocks need for all tests. Set up the patches and mocks need for all tests.
@ -103,24 +98,6 @@ class TestPptviewDocument(TestCase):
""" """
Test the PptviewDocument Class Test the PptviewDocument Class
""" """
# TODO: Items left to test
# PptviewDocument
# __init__
# create_thumbnails
# close_presentation
# is_loaded
# is_active
# blank_screen
# unblank_screen
# is_blank
# stop_presentation
# start_presentation
# get_slide_number
# get_slide_count
# goto_slide
# next_step
# previous_step
def setUp(self): def setUp(self):
""" """
Set up the patches and mocks need for all tests. Set up the patches and mocks need for all tests.

View File

@ -36,19 +36,6 @@ class TestPresentationController(TestCase):
""" """
Test the PresentationController. Test the PresentationController.
""" """
# TODO: Items left to test
# PresentationController
# __init__
# enabled
# is_available
# check_available
# start_process
# kill
# add_document
# remove_doc
# close_presentation
# _get_plugin_manager
def setUp(self): def setUp(self):
self.get_thumbnail_folder_patcher = \ self.get_thumbnail_folder_patcher = \
patch('openlp.plugins.presentations.lib.presentationcontroller.PresentationDocument.get_thumbnail_folder') patch('openlp.plugins.presentations.lib.presentationcontroller.PresentationDocument.get_thumbnail_folder')
@ -183,32 +170,6 @@ class TestPresentationDocument(TestCase):
""" """
Test the PresentationDocument Class Test the PresentationDocument Class
""" """
# TODO: Items left to test
# PresentationDocument
# __init__
# presentation_deleted
# get_thumbnail_folder
# get_temp_folder
# check_thumbnails
# close_presentation
# is_active
# is_loaded
# blank_screen
# unblank_screen
# is_blank
# stop_presentation
# start_presentation
# get_slide_number
# get_slide_count
# goto_slide
# next_step
# previous_step
# convert_thumbnail
# get_thumbnail_path
# poll_slidenumber
# get_slide_text
# get_slide_notes
def setUp(self): def setUp(self):
""" """
Set up the patches and mocks need for all tests. Set up the patches and mocks need for all tests.

View File

@ -36,18 +36,6 @@ class TestFoilPresenter(TestCase):
""" """
Test the functions in the :mod:`foilpresenterimport` module. Test the functions in the :mod:`foilpresenterimport` module.
""" """
# TODO: The following modules still need tests written for
# xml_to_song
# to_str
# _process_authors
# _process_cclinumber
# _process_comments
# _process_copyright
# _process_lyrics
# _process_songbooks
# _process_titles
# _process_topics
def setUp(self): def setUp(self):
self.to_str_patcher = patch('openlp.plugins.songs.lib.importers.foilpresenter.to_str') self.to_str_patcher = patch('openlp.plugins.songs.lib.importers.foilpresenter.to_str')
self.clean_song_patcher = patch('openlp.plugins.songs.lib.importers.foilpresenter.clean_song') self.clean_song_patcher = patch('openlp.plugins.songs.lib.importers.foilpresenter.clean_song')

View File

@ -612,8 +612,7 @@ class TestSongSelectForm(TestCase, TestMixin):
mocked_song_select_importer.save_song.assert_called_with(None) mocked_song_select_importer.save_song.assert_called_with(None)
mocked_question.assert_called_with(ssform, 'Song Imported', mocked_question.assert_called_with(ssform, 'Song Imported',
'Your song has been imported, would you like to import more songs?', 'Your song has been imported, would you like to import more songs?',
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, defaultButton=QtWidgets.QMessageBox.Yes)
QtWidgets.QMessageBox.Yes)
mocked_on_back_button_clicked.assert_called_with() mocked_on_back_button_clicked.assert_called_with()
self.assertIsNone(ssform.song) self.assertIsNone(ssform.song)
@ -639,8 +638,7 @@ class TestSongSelectForm(TestCase, TestMixin):
mocked_song_select_importer.save_song.assert_called_with(None) mocked_song_select_importer.save_song.assert_called_with(None)
mocked_question.assert_called_with(ssform, 'Song Imported', mocked_question.assert_called_with(ssform, 'Song Imported',
'Your song has been imported, would you like to import more songs?', 'Your song has been imported, would you like to import more songs?',
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, defaultButton=QtWidgets.QMessageBox.Yes)
QtWidgets.QMessageBox.Yes)
mocked_done.assert_called_with(QtWidgets.QDialog.Accepted) mocked_done.assert_called_with(QtWidgets.QDialog.Accepted)
self.assertIsNone(ssform.song) self.assertIsNone(ssform.song)