This commit is contained in:
Tomas Groth 2016-05-26 15:09:03 +02:00
commit 11e7ff5621
36 changed files with 450 additions and 292 deletions

View File

@ -88,6 +88,7 @@ JAVASCRIPT = """
} }
} }
""" """
# TODO: Verify format() with variable templates
CSS = """ CSS = """
#alert { #alert {
position: absolute; position: absolute;
@ -244,6 +245,9 @@ class AlertsPlugin(Plugin):
:param frame: The Web frame holding the page. :param frame: The Web frame holding the page.
""" """
align = VerticalType.Names[self.settings_tab.location] align = VerticalType.Names[self.settings_tab.location]
frame.evaluateJavaScript('update_css("%s", "%s", "%s", "%s", "%s")' % frame.evaluateJavaScript('update_css("{align}", "{face}", "{size}", "{color}", '
(align, self.settings_tab.font_face, self.settings_tab.font_size, '"{background}")'.format(align=align,
self.settings_tab.font_color, self.settings_tab.background_color)) face=self.settings_tab.font_face,
size=self.settings_tab.font_size,
color=self.settings_tab.font_color,
background=self.settings_tab.background_color))

View File

@ -62,7 +62,7 @@ class AlertsManager(OpenLPMixin, RegistryMixin, QtCore.QObject, RegistryProperti
:param text: The text to display :param text: The text to display
""" """
self.log_debug('display alert called %s' % text) self.log_debug('display alert called {text}'.format(text=text))
if text: if text:
self.alert_list.append(text) self.alert_list.append(text)
if self.timer_id != 0: if self.timer_id != 0:

View File

@ -197,5 +197,6 @@ class AlertsTab(SettingsTab):
font.setBold(True) font.setBold(True)
font.setPointSize(self.font_size) font.setPointSize(self.font_size)
self.font_preview.setFont(font) self.font_preview.setFont(font)
self.font_preview.setStyleSheet('background-color: %s; color: %s' % (self.background_color, self.font_color)) self.font_preview.setStyleSheet('background-color: {back}; color: {front}'.format(back=self.background_color,
front=self.font_color))
self.changed = True self.changed = True

View File

@ -593,22 +593,27 @@ class BibleImportForm(OpenLPWizard):
""" """
Show the file open dialog for the books CSV file. Show the file open dialog for the books CSV file.
""" """
# TODO: Verify format() with varible template
self.get_file_name( self.get_file_name(
WizardStrings.OpenTypeFile % WizardStrings.CSV, self.csv_books_edit, 'last directory import', '%s (*.csv)' % WizardStrings.OpenTypeFile % WizardStrings.CSV,
translate('BiblesPlugin.ImportWizardForm', 'CSV File')) self.csv_books_edit,
'last directory import',
'{name} (*.csv)'.format(name=translate('BiblesPlugin.ImportWizardForm', 'CSV File')))
def on_csv_verses_browse_button_clicked(self): def on_csv_verses_browse_button_clicked(self):
""" """
Show the file open dialog for the verses CSV file. Show the file open dialog for the verses CSV file.
""" """
# TODO: Verify format() with variable template
self.get_file_name(WizardStrings.OpenTypeFile % WizardStrings.CSV, self.csv_verses_edit, self.get_file_name(WizardStrings.OpenTypeFile % WizardStrings.CSV, self.csv_verses_edit,
'last directory import', '%s (*.csv)' % 'last directory import',
translate('BiblesPlugin.ImportWizardForm', 'CSV File')) '{name} (*.csv)'.format(name=translate('BiblesPlugin.ImportWizardForm', 'CSV File')))
def on_open_song_browse_button_clicked(self): def on_open_song_browse_button_clicked(self):
""" """
Show the file open dialog for the OpenSong file. Show the file open dialog for the OpenSong file.
""" """
# TODO: Verify format() with variable template
self.get_file_name(WizardStrings.OpenTypeFile % WizardStrings.OS, self.open_song_file_edit, self.get_file_name(WizardStrings.OpenTypeFile % WizardStrings.OS, self.open_song_file_edit,
'last directory import') 'last directory import')
@ -616,6 +621,7 @@ class BibleImportForm(OpenLPWizard):
""" """
Show the file open dialog for the Zefania file. Show the file open dialog for the Zefania file.
""" """
# TODO: Verify format() with variable template
self.get_file_name(WizardStrings.OpenTypeFile % WizardStrings.ZEF, self.zefania_file_edit, self.get_file_name(WizardStrings.OpenTypeFile % WizardStrings.ZEF, self.zefania_file_edit,
'last directory import') 'last directory import')
@ -631,6 +637,7 @@ class BibleImportForm(OpenLPWizard):
self.web_progress_bar.setVisible(True) self.web_progress_bar.setVisible(True)
self.web_progress_bar.setValue(0) self.web_progress_bar.setValue(0)
proxy_server = self.field('proxy_server') proxy_server = self.field('proxy_server')
# TODO: Where does critical_error_message_box get %s string from?
for (download_type, extractor) in ((WebDownload.Crosswalk, CWExtract(proxy_server)), for (download_type, extractor) in ((WebDownload.Crosswalk, CWExtract(proxy_server)),
(WebDownload.BibleGateway, BGExtract(proxy_server)), (WebDownload.BibleGateway, BGExtract(proxy_server)),
(WebDownload.Bibleserver, BSExtract(proxy_server))): (WebDownload.Bibleserver, BSExtract(proxy_server))):

View File

@ -209,7 +209,7 @@ class BibleUpgradeForm(OpenLPWizard):
for number, filename in enumerate(self.files): for number, filename in enumerate(self.files):
bible = OldBibleDB(self.media_item, path=self.path, file=filename[0]) bible = OldBibleDB(self.media_item, path=self.path, file=filename[0])
self.checkBox[number] = QtWidgets.QCheckBox(self.scrollAreaContents) self.checkBox[number] = QtWidgets.QCheckBox(self.scrollAreaContents)
self.checkBox[number].setObjectName('checkBox[%d]' % number) self.checkBox[number].setObjectName('checkBox[{count:d}]'.format(count=number))
self.checkBox[number].setText(bible.get_name()) self.checkBox[number].setText(bible.get_name())
self.checkBox[number].setCheckState(QtCore.Qt.Checked) self.checkBox[number].setCheckState(QtCore.Qt.Checked)
self.formLayout.addWidget(self.checkBox[number]) self.formLayout.addWidget(self.checkBox[number])
@ -364,7 +364,10 @@ class BibleUpgradeForm(OpenLPWizard):
name = filename[1] name = filename[1]
self.progress_label.setText( self.progress_label.setText(
translate('BiblesPlugin.UpgradeWizardForm', translate('BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\nUpgrading ...') % (number + 1, max_bibles, name)) 'Upgrading Bible {count} of {total}: "{name}"\n'
'Upgrading ...').format(count=number + 1,
total=max_bibles,
name=name))
self.new_bibles[number] = BibleDB(self.media_item, path=self.path, name=name, file=filename[0]) self.new_bibles[number] = BibleDB(self.media_item, path=self.path, name=name, file=filename[0])
self.new_bibles[number].register(self.plugin.upgrade_wizard) self.new_bibles[number].register(self.plugin.upgrade_wizard)
metadata = old_bible.get_metadata() metadata = old_bible.get_metadata()
@ -394,17 +397,19 @@ class BibleUpgradeForm(OpenLPWizard):
handler = BSExtract(proxy_server) handler = BSExtract(proxy_server)
books = handler.get_books_from_http(meta_data['download_name']) books = handler.get_books_from_http(meta_data['download_name'])
if not books: if not books:
log.error('Upgrading books from %s - download name: "%s" failed' % ( log.error('Upgrading books from {uri} - '
meta_data['download_source'], meta_data['download_name'])) 'download name: "{name}" failed'.format(uri=meta_data['download_source'],
name=meta_data['download_name']))
self.new_bibles[number].session.close() self.new_bibles[number].session.close()
del self.new_bibles[number] del self.new_bibles[number]
critical_error_message_box( critical_error_message_box(
translate('BiblesPlugin.UpgradeWizardForm', 'Download Error'), translate('BiblesPlugin.UpgradeWizardForm', 'Download Error'),
translate('BiblesPlugin.UpgradeWizardForm', translate('BiblesPlugin.UpgradeWizardForm',
'To upgrade your Web Bibles an Internet connection is required.')) 'To upgrade your Web Bibles an Internet connection is required.'))
self.increment_progress_bar(translate( text = translate('BiblesPlugin.UpgradeWizardForm',
'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\nFailed') % 'Upgrading Bible {count} of {total}: "{name}"\n'
(number + 1, max_bibles, name), self.progress_bar.maximum() - self.progress_bar.value()) 'Failed').format(count=number + 1, total=max_bibles, name=name)
self.increment_progress_bar(text, self.progress_bar.maximum() - self.progress_bar.value())
self.success[number] = False self.success[number] = False
continue continue
bible = BiblesResourcesDB.get_webbible( bible = BiblesResourcesDB.get_webbible(
@ -416,12 +421,13 @@ class BibleUpgradeForm(OpenLPWizard):
else: else:
language_id = self.new_bibles[number].get_language(name) language_id = self.new_bibles[number].get_language(name)
if not language_id: if not language_id:
log.warning('Upgrading from "%s" failed' % filename[0]) log.warning('Upgrading from "{name}" failed'.format(name=filename[0]))
self.new_bibles[number].session.close() self.new_bibles[number].session.close()
del self.new_bibles[number] del self.new_bibles[number]
self.increment_progress_bar( self.increment_progress_bar(
translate('BiblesPlugin.UpgradeWizardForm', translate('BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\nFailed') % (number + 1, max_bibles, name), 'Upgrading Bible {count} of {total}: "{name}"\n'
'Failed').format(count=number + 1, total=max_bibles, name=name),
self.progress_bar.maximum() - self.progress_bar.value()) self.progress_bar.maximum() - self.progress_bar.value())
self.success[number] = False self.success[number] = False
continue continue
@ -432,13 +438,15 @@ class BibleUpgradeForm(OpenLPWizard):
break break
self.increment_progress_bar( self.increment_progress_bar(
translate('BiblesPlugin.UpgradeWizardForm', translate('BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\nUpgrading %s ...') % 'Upgrading Bible {count} of {total}: "{name}"\n'
(number + 1, max_bibles, name, book)) 'Upgrading {book} ...').format(count=number + 1, total=max_bibles,
name=name, book=book))
book_ref_id = self.new_bibles[number].\ book_ref_id = self.new_bibles[number].\
get_book_ref_id_by_name(book, len(books), language_id) get_book_ref_id_by_name(book, len(books), language_id)
if not book_ref_id: if not book_ref_id:
log.warning('Upgrading books from %s - download name: "%s" aborted by user' % ( log.warning('Upgrading books from {source} - download name: "{name}" '
meta_data['download_source'], meta_data['download_name'])) 'aborted by user'.format(source=meta_data['download_source'],
name=meta_data['download_name']))
self.new_bibles[number].session.close() self.new_bibles[number].session.close()
del self.new_bibles[number] del self.new_bibles[number]
self.success[number] = False self.success[number] = False
@ -450,7 +458,7 @@ class BibleUpgradeForm(OpenLPWizard):
if oldbook: if oldbook:
verses = old_bible.get_verses(oldbook['id']) verses = old_bible.get_verses(oldbook['id'])
if not verses: if not verses:
log.warning('No verses found to import for book "%s"', book) log.warning('No verses found to import for book "{book}"'.format(book=book))
continue continue
for verse in verses: for verse in verses:
if self.stop_import_flag: if self.stop_import_flag:
@ -465,12 +473,13 @@ class BibleUpgradeForm(OpenLPWizard):
if not language_id: if not language_id:
language_id = self.new_bibles[number].get_language(name) language_id = self.new_bibles[number].get_language(name)
if not language_id: if not language_id:
log.warning('Upgrading books from "%s" failed' % name) log.warning('Upgrading books from "{name}" failed'.format(name=name))
self.new_bibles[number].session.close() self.new_bibles[number].session.close()
del self.new_bibles[number] del self.new_bibles[number]
self.increment_progress_bar( self.increment_progress_bar(
translate('BiblesPlugin.UpgradeWizardForm', translate('BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\nFailed') % (number + 1, max_bibles, name), 'Upgrading Bible {count} of {total}: "{name}"\n'
'Failed').format(count=number + 1, total=max_bibles, name=name),
self.progress_bar.maximum() - self.progress_bar.value()) self.progress_bar.maximum() - self.progress_bar.value())
self.success[number] = False self.success[number] = False
continue continue
@ -482,11 +491,12 @@ class BibleUpgradeForm(OpenLPWizard):
break break
self.increment_progress_bar( self.increment_progress_bar(
translate('BiblesPlugin.UpgradeWizardForm', translate('BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\nUpgrading %s ...') % 'Upgrading Bible {count} of {total}: "{name}"\n'
(number + 1, max_bibles, name, book['name'])) 'Upgrading {book} ...').format(count=number + 1, total=max_bibles,
name=name, book=book['name']))
book_ref_id = self.new_bibles[number].get_book_ref_id_by_name(book['name'], len(books), language_id) book_ref_id = self.new_bibles[number].get_book_ref_id_by_name(book['name'], len(books), language_id)
if not book_ref_id: if not book_ref_id:
log.warning('Upgrading books from %s " failed - aborted by user' % name) log.warning('Upgrading books from {name} " failed - aborted by user'.format(name=name))
self.new_bibles[number].session.close() self.new_bibles[number].session.close()
del self.new_bibles[number] del self.new_bibles[number]
self.success[number] = False self.success[number] = False
@ -496,7 +506,7 @@ class BibleUpgradeForm(OpenLPWizard):
book_details['testament_id']) book_details['testament_id'])
verses = old_bible.get_verses(book['id']) verses = old_bible.get_verses(book['id'])
if not verses: if not verses:
log.warning('No verses found to import for book "%s"', book['name']) log.warning('No verses found to import for book "{book}"'.format(book=book['name']))
self.new_bibles[number].delete_book(db_book) self.new_bibles[number].delete_book(db_book)
continue continue
for verse in verses: for verse in verses:
@ -510,14 +520,16 @@ class BibleUpgradeForm(OpenLPWizard):
if not self.success.get(number, True): if not self.success.get(number, True):
self.increment_progress_bar( self.increment_progress_bar(
translate('BiblesPlugin.UpgradeWizardForm', translate('BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\nFailed') % (number + 1, max_bibles, name), 'Upgrading Bible {count} of {total}: "{name}"\n'
'Failed').format(count=number + 1, total=max_bibles, name=name),
self.progress_bar.maximum() - self.progress_bar.value()) self.progress_bar.maximum() - self.progress_bar.value())
else: else:
self.success[number] = True self.success[number] = True
self.new_bibles[number].save_meta('name', name) self.new_bibles[number].save_meta('name', name)
self.increment_progress_bar( self.increment_progress_bar(
translate('BiblesPlugin.UpgradeWizardForm', translate('BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\nComplete') % (number + 1, max_bibles, name)) 'Upgrading Bible {count} of {total}: "{name}"\n'
'Complete').format(count=number + 1, total=max_bibles, name=name))
if number in self.new_bibles: if number in self.new_bibles:
self.new_bibles[number].session.close() self.new_bibles[number].session.close()
# Close the last bible's connection if possible. # Close the last bible's connection if possible.
@ -540,20 +552,22 @@ class BibleUpgradeForm(OpenLPWizard):
# Copy not upgraded bible back. # Copy not upgraded bible back.
shutil.move(os.path.join(self.temp_dir, filename[0]), self.path) shutil.move(os.path.join(self.temp_dir, filename[0]), self.path)
if failed_import > 0: if failed_import > 0:
failed_import_text = translate('BiblesPlugin.UpgradeWizardForm', ', %s failed') % failed_import failed_import_text = translate('BiblesPlugin.UpgradeWizardForm',
', {name} failed').format(name=failed_import)
else: else:
failed_import_text = '' failed_import_text = ''
if successful_import > 0: if successful_import > 0:
if self.includeWebBible: if self.includeWebBible:
self.progress_label.setText( self.progress_label.setText(
translate('BiblesPlugin.UpgradeWizardForm', translate('BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible(s): %(success)d successful%(failed_text)s\nPlease note that verses ' 'Upgrading Bible(s): {count:d} successful{failed}\nPlease note that verses '
'from Web Bibles will be downloaded on demand and so an Internet connection is required.') 'from Web Bibles will be downloaded on demand and so an Internet connection is required.'
% {'success': successful_import, 'failed_text': failed_import_text}) ).format(count=successful_import, failed=failed_import_text))
else: else:
self.progress_label.setText( self.progress_label.setText(
translate('BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible(s): %s successful%s') % ( translate('BiblesPlugin.UpgradeWizardForm',
successful_import, failed_import_text)) 'Upgrading Bible(s): {count:d} successful{failed}').format(count=successful_import,
failed=failed_import_text))
else: else:
self.progress_label.setText(translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade failed.')) self.progress_label.setText(translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade failed.'))
# Remove temp directory. # Remove temp directory.

View File

@ -103,9 +103,11 @@ class Ui_EditBibleDialog(object):
self.book_name_edit = {} self.book_name_edit = {}
for book in BiblesResourcesDB.get_books(): for book in BiblesResourcesDB.get_books():
self.book_name_label[book['abbreviation']] = QtWidgets.QLabel(self.book_name_widget) self.book_name_label[book['abbreviation']] = QtWidgets.QLabel(self.book_name_widget)
self.book_name_label[book['abbreviation']].setObjectName('book_name_label[%s]' % book['abbreviation']) self.book_name_label[book['abbreviation']].setObjectName(
'book_name_label[{name}]'.format(book=book['abbreviation']))
self.book_name_edit[book['abbreviation']] = QtWidgets.QLineEdit(self.book_name_widget) self.book_name_edit[book['abbreviation']] = QtWidgets.QLineEdit(self.book_name_widget)
self.book_name_edit[book['abbreviation']].setObjectName('book_name_edit[%s]' % book['abbreviation']) self.book_name_edit[book['abbreviation']].setObjectName(
'book_name_edit[{name}]'.format(name=book['abbreviation']))
self.book_name_widget_layout.addRow( self.book_name_widget_layout.addRow(
self.book_name_label[book['abbreviation']], self.book_name_label[book['abbreviation']],
self.book_name_edit[book['abbreviation']]) self.book_name_edit[book['abbreviation']])
@ -148,4 +150,5 @@ class Ui_EditBibleDialog(object):
self.bible_tab_widget.indexOf(self.book_name_tab), self.bible_tab_widget.indexOf(self.book_name_tab),
translate('SongsPlugin.EditBibleForm', 'Custom Book Names')) translate('SongsPlugin.EditBibleForm', 'Custom Book Names'))
for book in BiblesResourcesDB.get_books(): for book in BiblesResourcesDB.get_books():
self.book_name_label[book['abbreviation']].setText('%s:' % str(self.book_names[book['abbreviation']])) self.book_name_label[book['abbreviation']].setText(
'{text}:'.format(text=self.book_names[book['abbreviation']]))

View File

@ -39,7 +39,7 @@ class EditBibleForm(QtWidgets.QDialog, Ui_EditBibleDialog, RegistryProperties):
""" """
Class to manage the editing of a bible Class to manage the editing of a bible
""" """
log.info('%s EditBibleForm loaded', __name__) log.info('{name} EditBibleForm loaded'.format(name=__name__))
def __init__(self, media_item, parent, manager): def __init__(self, media_item, parent, manager):
""" """
@ -168,16 +168,17 @@ class EditBibleForm(QtWidgets.QDialog, Ui_EditBibleDialog, RegistryProperties):
self.book_name_edit[abbreviation].setFocus() self.book_name_edit[abbreviation].setFocus()
critical_error_message_box( critical_error_message_box(
UiStrings().EmptyField, UiStrings().EmptyField,
translate('BiblesPlugin.BibleEditForm', 'You need to specify a book name for "%s".') % translate('BiblesPlugin.BibleEditForm',
self.book_names[abbreviation]) 'You need to specify a book name for "{text}".').format(text=self.book_names[abbreviation]))
return False return False
elif not book_regex.match(new_book_name): elif not book_regex.match(new_book_name):
self.book_name_edit[abbreviation].setFocus() self.book_name_edit[abbreviation].setFocus()
critical_error_message_box( critical_error_message_box(
UiStrings().EmptyField, UiStrings().EmptyField,
translate('BiblesPlugin.BibleEditForm', translate('BiblesPlugin.BibleEditForm',
'The book name "%s" is not correct.\nNumbers can only be used at the beginning and must\nbe ' 'The book name "{name}" is not correct.\n'
'followed by one or more non-numeric characters.') % new_book_name) 'Numbers can only be used at the beginning and must\nbe '
'followed by one or more non-numeric characters.').format(name=new_book_name))
return False return False
for abbr, book in self.books.items(): for abbr, book in self.books.items():
if book: if book:
@ -187,7 +188,7 @@ class EditBibleForm(QtWidgets.QDialog, Ui_EditBibleDialog, RegistryProperties):
self.book_name_edit[abbreviation].setFocus() self.book_name_edit[abbreviation].setFocus()
critical_error_message_box( critical_error_message_box(
translate('BiblesPlugin.BibleEditForm', 'Duplicate Book Name'), translate('BiblesPlugin.BibleEditForm', 'Duplicate Book Name'),
translate('BiblesPlugin.BibleEditForm', 'The Book Name "%s" has been entered more than once.') translate('BiblesPlugin.BibleEditForm',
% new_book_name) 'The Book Name "{name}" has been entered more than once.').format(name=new_book_name))
return False return False
return True return True

View File

@ -86,7 +86,7 @@ class CSVBible(BibleDB):
success = True success = True
language_id = self.get_language(bible_name) language_id = self.get_language(bible_name)
if not language_id: if not language_id:
log.error('Importing books from "%s" failed' % self.filename) log.error('Importing books from "{name}" failed'.format(name=self.filename))
return False return False
books_file = None books_file = None
book_list = {} book_list = {}
@ -98,11 +98,11 @@ class CSVBible(BibleDB):
for line in books_reader: for line in books_reader:
if self.stop_import_flag: if self.stop_import_flag:
break break
self.wizard.increment_progress_bar(translate('BiblesPlugin.CSVBible', 'Importing books... %s') self.wizard.increment_progress_bar(translate('BiblesPlugin.CSVBible',
% line[2]) 'Importing books... {text}').format(text=line[2]))
book_ref_id = self.get_book_ref_id_by_name(line[2], 67, language_id) book_ref_id = self.get_book_ref_id_by_name(line[2], 67, language_id)
if not book_ref_id: if not book_ref_id:
log.error('Importing books from "%s" failed' % self.books_file) log.error('Importing books from "{name}" failed'.format(name=self.books_file))
return False return False
book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
self.create_book(line[2], book_ref_id, book_details['testament_id']) self.create_book(line[2], book_ref_id, book_details['testament_id'])
@ -134,9 +134,11 @@ class CSVBible(BibleDB):
if book_ptr != line_book: if book_ptr != line_book:
book = self.get_book(line_book) book = self.get_book(line_book)
book_ptr = book.name book_ptr = book.name
# TODO: Check out this conversion in translations
self.wizard.increment_progress_bar( self.wizard.increment_progress_bar(
translate('BiblesPlugin.CSVBible', translate('BiblesPlugin.CSVBible',
'Importing verses from %s...' % book.name, 'Importing verses from <book name>...')) 'Importing verses from {name}...'.format(name=book.name),
'Importing verses from <book name>...'))
self.session.commit() self.session.commit()
verse_text = line[3] verse_text = line[3]
self.create_verse(book.id, line[1], line[2], verse_text) self.create_verse(book.id, line[1], line[2], verse_text)

View File

@ -185,7 +185,7 @@ class BibleDB(Manager, RegistryProperties):
:param testament: *Defaults to 1.* The testament_reference_id from :param testament: *Defaults to 1.* The testament_reference_id from
bibles_resources.sqlite of the testament this book belongs to. bibles_resources.sqlite of the testament this book belongs to.
""" """
log.debug('BibleDB.create_book("%s", "%s")' % (name, bk_ref_id)) log.debug('BibleDB.create_book("{name}", "{number}")'.format(name=name, number=bk_ref_id))
book = Book.populate(name=name, book_reference_id=bk_ref_id, testament_reference_id=testament) book = Book.populate(name=name, book_reference_id=bk_ref_id, testament_reference_id=testament)
self.save_object(book) self.save_object(book)
return book return book
@ -196,7 +196,7 @@ class BibleDB(Manager, RegistryProperties):
:param book: The book object :param book: The book object
""" """
log.debug('BibleDB.update_book("%s")' % book.name) log.debug('BibleDB.update_book("{name}")'.format(name=book.name))
return self.save_object(book) return self.save_object(book)
def delete_book(self, db_book): def delete_book(self, db_book):
@ -205,7 +205,7 @@ class BibleDB(Manager, RegistryProperties):
:param db_book: The book object. :param db_book: The book object.
""" """
log.debug('BibleDB.delete_book("%s")' % db_book.name) log.debug('BibleDB.delete_book("{name}")'.format(name=db_book.name))
if self.delete_object(Book, db_book.id): if self.delete_object(Book, db_book.id):
return True return True
return False return False
@ -219,7 +219,7 @@ class BibleDB(Manager, RegistryProperties):
:param text_list: A dict of the verses to be inserted. The key is the verse number, and the value is the :param text_list: A dict of the verses to be inserted. The key is the verse number, and the value is the
verse text. verse text.
""" """
log.debug('BibleDBcreate_chapter("%s", "%s")' % (book_id, chapter)) log.debug('BibleDBcreate_chapter("{number}", "{chapter}")'.format(number=book_id, chapter=chapter))
# Text list has book and chapter as first two elements of the array. # Text list has book and chapter as first two elements of the array.
for verse_number, verse_text in text_list.items(): for verse_number, verse_text in text_list.items():
verse = Verse.populate( verse = Verse.populate(
@ -266,7 +266,7 @@ class BibleDB(Manager, RegistryProperties):
""" """
if not isinstance(value, str): if not isinstance(value, str):
value = str(value) value = str(value)
log.debug('BibleDB.save_meta("%s/%s")' % (key, value)) log.debug('BibleDB.save_meta("{key}/{val}")'.format(key=key, val=value))
meta = self.get_object(BibleMeta, key) meta = self.get_object(BibleMeta, key)
if meta: if meta:
meta.value = value meta.value = value
@ -280,7 +280,7 @@ class BibleDB(Manager, RegistryProperties):
:param book: The name of the book to return. :param book: The name of the book to return.
""" """
log.debug('BibleDB.get_book("%s")' % book) log.debug('BibleDB.get_book("{book}")'.format(book=book))
return self.get_object_filtered(Book, Book.name.like(book + '%')) return self.get_object_filtered(Book, Book.name.like(book + '%'))
def get_books(self): def get_books(self):
@ -297,11 +297,11 @@ class BibleDB(Manager, RegistryProperties):
:param ref_id: The reference id of the book to return. :param ref_id: The reference id of the book to return.
""" """
log.debug('BibleDB.get_book_by_book_ref_id("%s")' % ref_id) log.debug('BibleDB.get_book_by_book_ref_id("{ref}")'.format(ref=ref_id))
return self.get_object_filtered(Book, Book.book_reference_id.like(ref_id)) return self.get_object_filtered(Book, Book.book_reference_id.like(ref_id))
def get_book_ref_id_by_name(self, book, maxbooks, language_id=None): def get_book_ref_id_by_name(self, book, maxbooks, language_id=None):
log.debug('BibleDB.get_book_ref_id_by_name:("%s", "%s")' % (book, language_id)) log.debug('BibleDB.get_book_ref_id_by_name:("{book}", "{lang}")'.format(book=book, lang=language_id))
book_id = None book_id = None
if BiblesResourcesDB.get_book(book, True): if BiblesResourcesDB.get_book(book, True):
book_temp = BiblesResourcesDB.get_book(book, True) book_temp = BiblesResourcesDB.get_book(book, True)
@ -327,13 +327,14 @@ class BibleDB(Manager, RegistryProperties):
:param book: The name of the book, according to the selected language. :param book: The name of the book, according to the selected language.
:param language_selection: The language selection the user has chosen in the settings section of the Bible. :param language_selection: The language selection the user has chosen in the settings section of the Bible.
""" """
log.debug('get_book_ref_id_by_localised_name("%s", "%s")' % (book, language_selection)) log.debug('get_book_ref_id_by_localised_name("{book}", "{lang}")'.format(book=book, lang=language_selection))
from openlp.plugins.bibles.lib import LanguageSelection, BibleStrings from openlp.plugins.bibles.lib import LanguageSelection, BibleStrings
book_names = BibleStrings().BookNames book_names = BibleStrings().BookNames
# escape reserved characters # escape reserved characters
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*%s\s*' % '\s*'.join( regex_book = re.compile('\s*%s\s*' % '\s*'.join(
book_escaped.split()), re.UNICODE | re.IGNORECASE) book_escaped.split()), re.UNICODE | re.IGNORECASE)
if language_selection == LanguageSelection.Bible: if language_selection == LanguageSelection.Bible:
@ -374,14 +375,14 @@ class BibleDB(Manager, RegistryProperties):
[('35', 1, 1, 1), ('35', 2, 2, 3)] [('35', 1, 1, 1), ('35', 2, 2, 3)]
:param show_error: :param show_error:
""" """
log.debug('BibleDB.get_verses("%s")' % reference_list) log.debug('BibleDB.get_verses("{ref}")'.format(ref=reference_list))
verse_list = [] verse_list = []
book_error = False book_error = False
for book_id, chapter, start_verse, end_verse in reference_list: for book_id, chapter, start_verse, end_verse in reference_list:
db_book = self.get_book_by_book_ref_id(book_id) db_book = self.get_book_by_book_ref_id(book_id)
if db_book: if db_book:
book_id = db_book.book_reference_id book_id = db_book.book_reference_id
log.debug('Book name corrected to "%s"' % db_book.name) log.debug('Book name corrected to "{book}"'.format(book=db_book.name))
if end_verse == -1: if end_verse == -1:
end_verse = self.get_verse_count(book_id, chapter) end_verse = self.get_verse_count(book_id, chapter)
verses = self.session.query(Verse) \ verses = self.session.query(Verse) \
@ -393,7 +394,7 @@ class BibleDB(Manager, RegistryProperties):
.all() .all()
verse_list.extend(verses) verse_list.extend(verses)
else: else:
log.debug('OpenLP failed to find book with id "%s"' % book_id) log.debug('OpenLP failed to find book with id "{book}"'.format(book=book_id))
book_error = True book_error = True
if book_error and show_error: if book_error and show_error:
critical_error_message_box( critical_error_message_box(
@ -412,8 +413,9 @@ class BibleDB(Manager, RegistryProperties):
contains spaces, it will split apart and AND'd on the list of contains spaces, it will split apart and AND'd on the list of
values. values.
""" """
log.debug('BibleDB.verse_search("%s")' % text) log.debug('BibleDB.verse_search("{text}")'.format(text=text))
verses = self.session.query(Verse) verses = self.session.query(Verse)
# TODO: Find out what this is doing before converting to format()
if text.find(',') > -1: if text.find(',') > -1:
keywords = ['%%%s%%' % keyword.strip() for keyword in text.split(',')] keywords = ['%%%s%%' % keyword.strip() for keyword in text.split(',')]
or_clause = [Verse.text.like(keyword) for keyword in keywords] or_clause = [Verse.text.like(keyword) for keyword in keywords]
@ -431,7 +433,7 @@ class BibleDB(Manager, RegistryProperties):
:param book: The book object to get the chapter count for. :param book: The book object to get the chapter count for.
""" """
log.debug('BibleDB.get_chapter_count("%s")' % book.name) log.debug('BibleDB.get_chapter_count("{book}")'.format(book=book.name))
count = self.session.query(func.max(Verse.chapter)).join(Book).filter( count = self.session.query(func.max(Verse.chapter)).join(Book).filter(
Book.book_reference_id == book.book_reference_id).scalar() Book.book_reference_id == book.book_reference_id).scalar()
if not count: if not count:
@ -445,7 +447,7 @@ class BibleDB(Manager, RegistryProperties):
:param book_ref_id: The book reference id. :param book_ref_id: The book reference id.
:param chapter: The chapter to get the verse count for. :param chapter: The chapter to get the verse count for.
""" """
log.debug('BibleDB.get_verse_count("%s", "%s")' % (book_ref_id, chapter)) log.debug('BibleDB.get_verse_count("{ref}", "{chapter}")'.format(ref=book_ref_id, chapter=chapter))
count = self.session.query(func.max(Verse.verse)).join(Book) \ count = self.session.query(func.max(Verse.verse)).join(Book) \
.filter(Book.book_reference_id == book_ref_id) \ .filter(Book.book_reference_id == book_ref_id) \
.filter(Verse.chapter == chapter) \ .filter(Verse.chapter == chapter) \
@ -551,7 +553,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
:param name: The name or abbreviation of the book. :param name: The name or abbreviation of the book.
:param lower: True if the comparison should be only lowercase :param lower: True if the comparison should be only lowercase
""" """
log.debug('BiblesResourcesDB.get_book("%s")' % name) log.debug('BiblesResourcesDB.get_book("{name}")'.format(name=name))
if not isinstance(name, str): if not isinstance(name, str):
name = str(name) name = str(name)
if lower: if lower:
@ -580,7 +582,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
:param string: The string to search for in the book names or abbreviations. :param string: The string to search for in the book names or abbreviations.
""" """
log.debug('BiblesResourcesDB.get_book_like("%s")' % string) log.debug('BiblesResourcesDB.get_book_like("{text}")'.format(text=string))
if not isinstance(string, str): if not isinstance(string, str):
name = str(string) name = str(string)
books = BiblesResourcesDB.run_sql( books = BiblesResourcesDB.run_sql(
@ -605,7 +607,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
:param book_id: The id of the book. :param book_id: The id of the book.
""" """
log.debug('BiblesResourcesDB.get_book_by_id("%s")' % book_id) log.debug('BiblesResourcesDB.get_book_by_id("{book}")'.format(book=book_id))
if not isinstance(book_id, int): if not isinstance(book_id, int):
book_id = int(book_id) book_id = int(book_id)
books = BiblesResourcesDB.run_sql( books = BiblesResourcesDB.run_sql(
@ -629,7 +631,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
:param book_ref_id: The id of a book. :param book_ref_id: The id of a book.
:param chapter: The chapter number. :param chapter: The chapter number.
""" """
log.debug('BiblesResourcesDB.get_chapter("%s", "%s")' % (book_ref_id, chapter)) log.debug('BiblesResourcesDB.get_chapter("{book}", "{ref}")'.format(book=book_ref_id, ref=chapter))
if not isinstance(chapter, int): if not isinstance(chapter, int):
chapter = int(chapter) chapter = int(chapter)
chapters = BiblesResourcesDB.run_sql( chapters = BiblesResourcesDB.run_sql(
@ -652,7 +654,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
:param book_ref_id: The id of the book. :param book_ref_id: The id of the book.
""" """
log.debug('BiblesResourcesDB.get_chapter_count("%s")' % book_ref_id) log.debug('BiblesResourcesDB.get_chapter_count("{ref}")'.format(ref=book_ref_id))
details = BiblesResourcesDB.get_book_by_id(book_ref_id) details = BiblesResourcesDB.get_book_by_id(book_ref_id)
if details: if details:
return details['chapters'] return details['chapters']
@ -666,7 +668,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
:param book_ref_id: The id of the book. :param book_ref_id: The id of the book.
:param chapter: The number of the chapter. :param chapter: The number of the chapter.
""" """
log.debug('BiblesResourcesDB.get_verse_count("%s", "%s")' % (book_ref_id, chapter)) log.debug('BiblesResourcesDB.get_verse_count("{ref}", "{chapter}")'.format(ref=book_ref_id, chapter=chapter))
details = BiblesResourcesDB.get_chapter(book_ref_id, chapter) details = BiblesResourcesDB.get_chapter(book_ref_id, chapter)
if details: if details:
return details['verse_count'] return details['verse_count']
@ -679,7 +681,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
:param source: The name or abbreviation of the book. :param source: The name or abbreviation of the book.
""" """
log.debug('BiblesResourcesDB.get_download_source("%s")' % source) log.debug('BiblesResourcesDB.get_download_source("{source}")'.format(source=source))
if not isinstance(source, str): if not isinstance(source, str):
source = str(source) source = str(source)
source = source.title() source = source.title()
@ -700,7 +702,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
:param source: The source of the web_bible. :param source: The source of the web_bible.
""" """
log.debug('BiblesResourcesDB.get_webbibles("%s")' % source) log.debug('BiblesResourcesDB.get_webbibles("{source}")'.format(source=source))
if not isinstance(source, str): if not isinstance(source, str):
source = str(source) source = str(source)
source = BiblesResourcesDB.get_download_source(source) source = BiblesResourcesDB.get_download_source(source)
@ -725,7 +727,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
:param abbreviation: The abbreviation of the web_bible. :param abbreviation: The abbreviation of the web_bible.
:param source: The source of the web_bible. :param source: The source of the web_bible.
""" """
log.debug('BiblesResourcesDB.get_webbibles("%s", "%s")' % (abbreviation, source)) log.debug('BiblesResourcesDB.get_webbibles("{text}", "{source}")'.format(text=abbreviation, source=source))
if not isinstance(abbreviation, str): if not isinstance(abbreviation, str):
abbreviation = str(abbreviation) abbreviation = str(abbreviation)
if not isinstance(source, str): if not isinstance(source, str):
@ -753,7 +755,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
:param name: The name to search the id. :param name: The name to search the id.
:param language_id: The language_id for which language should be searched :param language_id: The language_id for which language should be searched
""" """
log.debug('BiblesResourcesDB.get_alternative_book_name("%s", "%s")' % (name, language_id)) log.debug('BiblesResourcesDB.get_alternative_book_name("{name}", "{lang}")'.format(name=name, lang=language_id))
if language_id: if language_id:
books = BiblesResourcesDB.run_sql( books = BiblesResourcesDB.run_sql(
'SELECT book_reference_id, name FROM alternative_book_names WHERE language_id = ? ORDER BY id', 'SELECT book_reference_id, name FROM alternative_book_names WHERE language_id = ? ORDER BY id',
@ -772,7 +774,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
:param name: The name or abbreviation of the language. :param name: The name or abbreviation of the language.
""" """
log.debug('BiblesResourcesDB.get_language("%s")' % name) log.debug('BiblesResourcesDB.get_language("{name}")'.format(name=name))
if not isinstance(name, str): if not isinstance(name, str):
name = str(name) name = str(name)
language = BiblesResourcesDB.run_sql( language = BiblesResourcesDB.run_sql(
@ -868,7 +870,7 @@ class AlternativeBookNamesDB(QtCore.QObject, Manager):
:param name: The name to search the id. :param name: The name to search the id.
:param language_id: The language_id for which language should be searched :param language_id: The language_id for which language should be searched
""" """
log.debug('AlternativeBookNamesDB.get_book_reference_id("%s", "%s")' % (name, language_id)) log.debug('AlternativeBookNamesDB.get_book_reference_id("{name}", "{ref}")'.format(name=name, ref=language_id))
if language_id: if language_id:
books = AlternativeBookNamesDB.run_sql( books = AlternativeBookNamesDB.run_sql(
'SELECT book_reference_id, name FROM alternative_book_names WHERE language_id = ?', (language_id, )) 'SELECT book_reference_id, name FROM alternative_book_names WHERE language_id = ?', (language_id, ))
@ -889,8 +891,8 @@ class AlternativeBookNamesDB(QtCore.QObject, Manager):
:param book_reference_id: The book_reference_id of the book. :param book_reference_id: The book_reference_id of the book.
:param language_id: The language to which the alternative book name belong. :param language_id: The language to which the alternative book name belong.
""" """
log.debug('AlternativeBookNamesDB.create_alternative_book_name("%s", "%s", "%s")' % log.debug('AlternativeBookNamesDB.create_alternative_book_name("{name}", '
(name, book_reference_id, language_id)) '"{ref}", "{lang}")'.format(name=name, ref=book_reference_id, lang=language_id))
return AlternativeBookNamesDB.run_sql( return AlternativeBookNamesDB.run_sql(
'INSERT INTO alternative_book_names(book_reference_id, language_id, name) ' 'INSERT INTO alternative_book_names(book_reference_id, language_id, name) '
'VALUES (?, ?, ?)', (book_reference_id, language_id, name), True) 'VALUES (?, ?, ?)', (book_reference_id, language_id, name), True)

View File

@ -90,7 +90,7 @@ class BGExtract(RegistryProperties):
Extract verses from BibleGateway Extract verses from BibleGateway
""" """
def __init__(self, proxy_url=None): def __init__(self, proxy_url=None):
log.debug('BGExtract.init("%s")', proxy_url) log.debug('BGExtract.init("{url}")'.format(url=proxy_url))
self.proxy_url = proxy_url self.proxy_url = proxy_url
socket.setdefaulttimeout(30) socket.setdefaulttimeout(30)
@ -188,7 +188,7 @@ class BGExtract(RegistryProperties):
if len(verse_parts) > 1: if len(verse_parts) > 1:
verse = int(verse_parts[0]) verse = int(verse_parts[0])
except TypeError: except TypeError:
log.warning('Illegal verse number: %s', str(verse)) log.warning('Illegal verse number: {verse:d}'.format(verse=verse))
verses.append((verse, text)) verses.append((verse, text))
verse_list = {} verse_list = {}
for verse, text in verses[::-1]: for verse, text in verses[::-1]:
@ -221,7 +221,7 @@ class BGExtract(RegistryProperties):
if len(verse_parts) > 1: if len(verse_parts) > 1:
clean_verse_num = int(verse_parts[0]) clean_verse_num = int(verse_parts[0])
except TypeError: except TypeError:
log.warning('Illegal verse number: %s', str(raw_verse_num)) log.warning('Illegal verse number: {verse:d}'.format(verse=raw_verse_num))
if clean_verse_num: if clean_verse_num:
verse_text = raw_verse_num.next_element verse_text = raw_verse_num.next_element
part = raw_verse_num.next_element.next_element part = raw_verse_num.next_element.next_element
@ -244,11 +244,15 @@ class BGExtract(RegistryProperties):
:param book_name: Name of the Book. :param book_name: Name of the Book.
:param chapter: Chapter number. :param chapter: Chapter number.
""" """
log.debug('BGExtract.get_bible_chapter("%s", "%s", "%s")', version, book_name, chapter) log.debug('BGExtract.get_bible_chapter("{version}", "{name}", "{chapter}")'.format(version=version,
name=book_name,
chapter=chapter))
url_book_name = urllib.parse.quote(book_name.encode("utf-8")) url_book_name = urllib.parse.quote(book_name.encode("utf-8"))
url_params = 'search=%s+%s&version=%s' % (url_book_name, chapter, version) url_params = 'search={name}+{chapter}&version={version}'.format(name=url_book_name,
chapter=chapter,
version=version)
soup = get_soup_for_bible_ref( soup = get_soup_for_bible_ref(
'http://legacy.biblegateway.com/passage/?%s' % url_params, 'http://legacy.biblegateway.com/passage/?{url}'.format(url=url_params),
pre_parse_regex=r'<meta name.*?/>', pre_parse_substitute='') pre_parse_regex=r'<meta name.*?/>', pre_parse_substitute='')
if not soup: if not soup:
return None return None
@ -257,7 +261,7 @@ class BGExtract(RegistryProperties):
return None return None
self._clean_soup(div) self._clean_soup(div)
span_list = div.find_all('span', 'text') span_list = div.find_all('span', 'text')
log.debug('Span list: %s', span_list) log.debug('Span list: {span}'.format(span=span_list))
if not span_list: if not span_list:
# If we don't get any spans then we must have the old HTML format # If we don't get any spans then we must have the old HTML format
verse_list = self._extract_verses_old(div) verse_list = self._extract_verses_old(div)
@ -275,9 +279,9 @@ class BGExtract(RegistryProperties):
:param version: The version of the Bible like NIV for New International Version :param version: The version of the Bible like NIV for New International Version
""" """
log.debug('BGExtract.get_books_from_http("%s")', version) log.debug('BGExtract.get_books_from_http("{version}")'.format(version=version))
url_params = urllib.parse.urlencode({'action': 'getVersionInfo', 'vid': '%s' % version}) url_params = urllib.parse.urlencode({'action': 'getVersionInfo', 'vid': '{version}'.format(version=version)})
reference_url = 'http://legacy.biblegateway.com/versions/?%s#books' % url_params reference_url = 'http://legacy.biblegateway.com/versions/?{url}#books'.format(url=url_params)
page = get_web_page(reference_url) page = get_web_page(reference_url)
if not page: if not page:
send_error_message('download') send_error_message('download')
@ -353,7 +357,7 @@ class BSExtract(RegistryProperties):
Extract verses from Bibleserver.com Extract verses from Bibleserver.com
""" """
def __init__(self, proxy_url=None): def __init__(self, proxy_url=None):
log.debug('BSExtract.init("%s")', proxy_url) log.debug('BSExtract.init("{url}")'.format(url=proxy_url))
self.proxy_url = proxy_url self.proxy_url = proxy_url
socket.setdefaulttimeout(30) socket.setdefaulttimeout(30)
@ -365,10 +369,14 @@ class BSExtract(RegistryProperties):
:param book_name: Text name of bible book e.g. Genesis, 1. John, 1John or Offenbarung :param book_name: Text name of bible book e.g. Genesis, 1. John, 1John or Offenbarung
:param chapter: Chapter number :param chapter: Chapter number
""" """
log.debug('BSExtract.get_bible_chapter("%s", "%s", "%s")', version, book_name, chapter) log.debug('BSExtract.get_bible_chapter("{version}", "{book}", "{chapter}")'.format(version=version,
book=book_name,
chapter=chapter))
url_version = urllib.parse.quote(version.encode("utf-8")) url_version = urllib.parse.quote(version.encode("utf-8"))
url_book_name = urllib.parse.quote(book_name.encode("utf-8")) url_book_name = urllib.parse.quote(book_name.encode("utf-8"))
chapter_url = 'http://m.bibleserver.com/text/%s/%s%d' % (url_version, url_book_name, chapter) chapter_url = 'http://m.bibleserver.com/text/{version}/{name}{chapter:d}'.format(version=url_version,
name=url_book_name,
chapter=chapter)
header = ('Accept-Language', 'en') header = ('Accept-Language', 'en')
soup = get_soup_for_bible_ref(chapter_url, header) soup = get_soup_for_bible_ref(chapter_url, header)
if not soup: if not soup:
@ -393,9 +401,9 @@ class BSExtract(RegistryProperties):
:param version: The version of the Bible like NIV for New International Version :param version: The version of the Bible like NIV for New International Version
""" """
log.debug('BSExtract.get_books_from_http("%s")', version) log.debug('BSExtract.get_books_from_http("{version}")'.format(version=version))
url_version = urllib.parse.quote(version.encode("utf-8")) url_version = urllib.parse.quote(version.encode("utf-8"))
chapter_url = 'http://m.bibleserver.com/overlay/selectBook?translation=%s' % url_version chapter_url = 'http://m.bibleserver.com/overlay/selectBook?translation={version}'.format(version=url_version)
soup = get_soup_for_bible_ref(chapter_url) soup = get_soup_for_bible_ref(chapter_url)
if not soup: if not soup:
return None return None
@ -450,7 +458,7 @@ class CWExtract(RegistryProperties):
Extract verses from CrossWalk/BibleStudyTools Extract verses from CrossWalk/BibleStudyTools
""" """
def __init__(self, proxy_url=None): def __init__(self, proxy_url=None):
log.debug('CWExtract.init("%s")', proxy_url) log.debug('CWExtract.init("{url}")'.format(url=proxy_url))
self.proxy_url = proxy_url self.proxy_url = proxy_url
socket.setdefaulttimeout(30) socket.setdefaulttimeout(30)
@ -462,11 +470,15 @@ class CWExtract(RegistryProperties):
:param book_name: Text name of in english e.g. 'gen' for Genesis :param book_name: Text name of in english e.g. 'gen' for Genesis
:param chapter: Chapter number :param chapter: Chapter number
""" """
log.debug('CWExtract.get_bible_chapter("%s", "%s", "%s")', version, book_name, chapter) log.debug('CWExtract.get_bible_chapter("{version}", "{book}", "{chapter}")'.format(version=version,
book=book_name,
chapter=chapter))
url_book_name = book_name.replace(' ', '-') url_book_name = book_name.replace(' ', '-')
url_book_name = url_book_name.lower() url_book_name = url_book_name.lower()
url_book_name = urllib.parse.quote(url_book_name.encode("utf-8")) url_book_name = urllib.parse.quote(url_book_name.encode("utf-8"))
chapter_url = 'http://www.biblestudytools.com/%s/%s/%s.html' % (version, url_book_name, chapter) chapter_url = 'http://www.biblestudytools.com/{version}/{book}/{chapter}.html'.format(version=version,
book=url_book_name,
chapter=chapter)
soup = get_soup_for_bible_ref(chapter_url) soup = get_soup_for_bible_ref(chapter_url)
if not soup: if not soup:
return None return None
@ -499,8 +511,8 @@ class CWExtract(RegistryProperties):
:param version: The version of the bible like NIV for New International Version :param version: The version of the bible like NIV for New International Version
""" """
log.debug('CWExtract.get_books_from_http("%s")', version) log.debug('CWExtract.get_books_from_http("{version}")'.format(version=version))
chapter_url = 'http://www.biblestudytools.com/%s/' % version chapter_url = 'http://www.biblestudytools.com/{version}/'.format(version=version)
soup = get_soup_for_bible_ref(chapter_url) soup = get_soup_for_bible_ref(chapter_url)
if not soup: if not soup:
return None return None
@ -559,7 +571,7 @@ class CWExtract(RegistryProperties):
class HTTPBible(BibleDB, RegistryProperties): class HTTPBible(BibleDB, RegistryProperties):
log.info('%s HTTPBible loaded', __name__) log.info('{name} HTTPBible loaded'.format(name=__name__))
def __init__(self, parent, **kwargs): def __init__(self, parent, **kwargs):
""" """
@ -615,8 +627,8 @@ class HTTPBible(BibleDB, RegistryProperties):
handler = BSExtract(self.proxy_server) handler = BSExtract(self.proxy_server)
books = handler.get_books_from_http(self.download_name) books = handler.get_books_from_http(self.download_name)
if not books: if not books:
log.error('Importing books from %s - download name: "%s" failed' % log.error('Importing books from {source} - download name: "{name}" '
(self.download_source, self.download_name)) 'failed'.format(source=self.download_source, name=self.download_name))
return False return False
self.wizard.progress_bar.setMaximum(len(books) + 2) self.wizard.progress_bar.setMaximum(len(books) + 2)
self.wizard.increment_progress_bar(translate('BiblesPlugin.HTTPBible', 'Registering Language...')) self.wizard.increment_progress_bar(translate('BiblesPlugin.HTTPBible', 'Registering Language...'))
@ -625,21 +637,24 @@ class HTTPBible(BibleDB, RegistryProperties):
else: else:
self.language_id = self.get_language(bible_name) self.language_id = self.get_language(bible_name)
if not self.language_id: if not self.language_id:
log.error('Importing books from %s failed' % self.filename) log.error('Importing books from {name} failed'.format(name=self.filename))
return False return False
for book in books: for book in books:
if self.stop_import_flag: if self.stop_import_flag:
break break
self.wizard.increment_progress_bar(translate( self.wizard.increment_progress_bar(translate('BiblesPlugin.HTTPBible',
'BiblesPlugin.HTTPBible', 'Importing %s...', 'Importing <book name>...') % book) 'Importing {book}...',
'Importing <book name>...').format(book=book))
book_ref_id = self.get_book_ref_id_by_name(book, len(books), self.language_id) book_ref_id = self.get_book_ref_id_by_name(book, len(books), self.language_id)
if not book_ref_id: if not book_ref_id:
log.error('Importing books from %s - download name: "%s" failed' % log.error('Importing books from {source} - download name: "{name}" '
(self.download_source, self.download_name)) 'failed'.format(source=self.download_source, name=self.download_name))
return False return False
book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
log.debug('Book details: Name:%s; id:%s; testament_id:%s', log.debug('Book details: Name:{book}; id:{ref}; '
book, book_ref_id, book_details['testament_id']) 'testament_id:{detail}'.format(book=book,
ref=book_ref_id,
detail=book_details['testament_id']))
self.create_book(book, book_ref_id, book_details['testament_id']) self.create_book(book, book_ref_id, book_details['testament_id'])
if self.stop_import_flag: if self.stop_import_flag:
return False return False
@ -664,7 +679,7 @@ class HTTPBible(BibleDB, RegistryProperties):
[('35', 1, 1, 1), ('35', 2, 2, 3)] [('35', 1, 1, 1), ('35', 2, 2, 3)]
""" """
log.debug('HTTPBible.get_verses("%s")', reference_list) log.debug('HTTPBible.get_verses("{ref}")'.format(ref=reference_list))
for reference in reference_list: for reference in reference_list:
book_id = reference[0] book_id = reference[0]
db_book = self.get_book_by_book_ref_id(book_id) db_book = self.get_book_by_book_ref_id(book_id)
@ -698,8 +713,8 @@ class HTTPBible(BibleDB, RegistryProperties):
""" """
Receive the request and call the relevant handler methods. Receive the request and call the relevant handler methods.
""" """
log.debug('HTTPBible.get_chapter("%s", "%s")', book, chapter) log.debug('HTTPBible.get_chapter("{book}", "{chapter}")'.format(book=book, chapter=chapter))
log.debug('source = %s', self.download_source) log.debug('source = {source}'.format(source=self.download_source))
if self.download_source.lower() == 'crosswalk': if self.download_source.lower() == 'crosswalk':
handler = CWExtract(self.proxy_server) handler = CWExtract(self.proxy_server)
elif self.download_source.lower() == 'biblegateway': elif self.download_source.lower() == 'biblegateway':
@ -712,7 +727,7 @@ class HTTPBible(BibleDB, RegistryProperties):
""" """
Return the list of books. Return the list of books.
""" """
log.debug('HTTPBible.get_books("%s")', Book.name) log.debug('HTTPBible.get_books("{name}")'.format(name=Book.name))
return self.get_all_objects(Book, order_by_ref=Book.id) return self.get_all_objects(Book, order_by_ref=Book.id)
def get_chapter_count(self, book): def get_chapter_count(self, book):
@ -721,7 +736,7 @@ class HTTPBible(BibleDB, RegistryProperties):
:param book: The book object to get the chapter count for. :param book: The book object to get the chapter count for.
""" """
log.debug('HTTPBible.get_chapter_count("%s")', book.name) log.debug('HTTPBible.get_chapter_count("{name}")'.format(name=book.name))
return BiblesResourcesDB.get_chapter_count(book.book_reference_id) return BiblesResourcesDB.get_chapter_count(book.book_reference_id)
def get_verse_count(self, book_id, chapter): def get_verse_count(self, book_id, chapter):
@ -731,7 +746,7 @@ class HTTPBible(BibleDB, RegistryProperties):
:param book_id: The name of the book. :param book_id: The name of the book.
:param chapter: The chapter whose verses are being counted. :param chapter: The chapter whose verses are being counted.
""" """
log.debug('HTTPBible.get_verse_count("%s", %s)', book_id, chapter) log.debug('HTTPBible.get_verse_count("{ref}", {chapter})'.format(ref=book_id, chapter=chapter))
return BiblesResourcesDB.get_verse_count(book_id, chapter) return BiblesResourcesDB.get_verse_count(book_id, chapter)

View File

@ -122,7 +122,7 @@ class BibleManager(RegistryProperties):
files = AppLocation.get_files(self.settings_section, self.suffix) files = AppLocation.get_files(self.settings_section, self.suffix)
if 'alternative_book_names.sqlite' in files: if 'alternative_book_names.sqlite' in files:
files.remove('alternative_book_names.sqlite') files.remove('alternative_book_names.sqlite')
log.debug('Bible Files %s', files) log.debug('Bible Files {text}'.format(text=files))
self.db_cache = {} self.db_cache = {}
self.old_bible_databases = [] self.old_bible_databases = []
for filename in files: for filename in files:
@ -135,7 +135,7 @@ class BibleManager(RegistryProperties):
bible.session.close() bible.session.close()
delete_file(os.path.join(self.path, filename)) delete_file(os.path.join(self.path, filename))
continue continue
log.debug('Bible Name: "%s"', name) log.debug('Bible Name: "{name}"'.format(name=name))
self.db_cache[name] = bible self.db_cache[name] = bible
# Look to see if lazy load bible exists and get create getter. # Look to see if lazy load bible exists and get create getter.
source = self.db_cache[name].get_object(BibleMeta, 'download_source') source = self.db_cache[name].get_object(BibleMeta, 'download_source')
@ -177,7 +177,7 @@ class BibleManager(RegistryProperties):
:param name: The name of the bible. :param name: The name of the bible.
""" """
log.debug('BibleManager.delete_bible("%s")', name) log.debug('BibleManager.delete_bible("{name}")'.format(name=name))
bible = self.db_cache[name] bible = self.db_cache[name]
bible.session.close() bible.session.close()
bible.session = None bible.session = None
@ -196,7 +196,7 @@ class BibleManager(RegistryProperties):
:param bible: Unicode. The Bible to get the list of books from. :param bible: Unicode. The Bible to get the list of books from.
""" """
log.debug('BibleManager.get_books("%s")', bible) log.debug('BibleManager.get_books("{bible}")'.format(bible=bible))
return [ return [
{ {
'name': book.name, 'name': book.name,
@ -213,7 +213,7 @@ class BibleManager(RegistryProperties):
:param bible: Unicode. The Bible to get the list of books from. :param bible: Unicode. The Bible to get the list of books from.
:param id: Unicode. The book_reference_id to get the book for. :param id: Unicode. The book_reference_id to get the book for.
""" """
log.debug('BibleManager.get_book_by_id("%s", "%s")', bible, id) log.debug('BibleManager.get_book_by_id("{bible}", "{ref}")'.format(bible=bible, ref=id))
return self.db_cache[bible].get_book_by_book_ref_id(id) return self.db_cache[bible].get_book_by_book_ref_id(id)
def get_chapter_count(self, bible, book): def get_chapter_count(self, bible, book):
@ -223,14 +223,16 @@ class BibleManager(RegistryProperties):
:param bible: Unicode. The Bible to get the list of books from. :param bible: Unicode. The Bible to get the list of books from.
:param book: The book object to get the chapter count for. :param book: The book object to get the chapter count for.
""" """
log.debug('BibleManager.get_book_chapter_count ("%s", "%s")', bible, book.name) log.debug('BibleManager.get_book_chapter_count ("{bible}", "{name}")'.format(bible=bible, name=book.name))
return self.db_cache[bible].get_chapter_count(book) return self.db_cache[bible].get_chapter_count(book)
def get_verse_count(self, bible, book, chapter): def get_verse_count(self, bible, book, chapter):
""" """
Returns all the number of verses for a given book and chapterMaxBibleBookVerses. Returns all the number of verses for a given book and chapterMaxBibleBookVerses.
""" """
log.debug('BibleManager.get_verse_count("%s", "%s", %s)', bible, book, chapter) log.debug('BibleManager.get_verse_count("{bible}", "{book}", {chapter})'.format(bible=bible,
book=book,
chapter=chapter))
language_selection = self.get_language_selection(bible) language_selection = self.get_language_selection(bible)
book_ref_id = self.db_cache[bible].get_book_ref_id_by_localised_name(book, language_selection) book_ref_id = self.db_cache[bible].get_book_ref_id_by_localised_name(book, language_selection)
return self.db_cache[bible].get_verse_count(book_ref_id, chapter) return self.db_cache[bible].get_verse_count(book_ref_id, chapter)
@ -240,7 +242,8 @@ class BibleManager(RegistryProperties):
Returns all the number of verses for a given Returns all the number of verses for a given
book_ref_id and chapterMaxBibleBookVerses. book_ref_id and chapterMaxBibleBookVerses.
""" """
log.debug('BibleManager.get_verse_count_by_book_ref_id("%s", "%s", "%s")', bible, book_ref_id, chapter) log.debug('BibleManager.get_verse_count_by_book_ref_id("{bible}", '
'"{book}", "{chapter}")'.format(bible=bible, book=book_ref_id, chapter=chapter))
return self.db_cache[bible].get_verse_count(book_ref_id, chapter) return self.db_cache[bible].get_verse_count(book_ref_id, chapter)
def get_verses(self, bible, verse_text, book_ref_id=False, show_error=True): def get_verses(self, bible, verse_text, book_ref_id=False, show_error=True):
@ -264,7 +267,7 @@ class BibleManager(RegistryProperties):
For second bible this is necessary. For second bible this is necessary.
:param show_error: :param show_error:
""" """
log.debug('BibleManager.get_verses("%s", "%s")', bible, verse_text) log.debug('BibleManager.get_verses("{bible}", "{verse}")'.format(bible=bible, verse=verse_text))
if not bible: if not bible:
if show_error: if show_error:
self.main_window.information_message( self.main_window.information_message(
@ -308,7 +311,7 @@ class BibleManager(RegistryProperties):
:param bible: Unicode. The Bible to get the language selection from. :param bible: Unicode. The Bible to get the language selection from.
""" """
log.debug('BibleManager.get_language_selection("%s")', bible) log.debug('BibleManager.get_language_selection("{bible}")'.format(bible=bible))
language_selection = self.get_meta_data(bible, 'book_name_language') language_selection = self.get_meta_data(bible, 'book_name_language')
if not language_selection or language_selection.value == "None" or language_selection.value == "-1": if not language_selection or language_selection.value == "None" or language_selection.value == "-1":
# If None is returned, it's not the singleton object but a # If None is returned, it's not the singleton object but a
@ -330,7 +333,7 @@ class BibleManager(RegistryProperties):
:param second_bible: The second bible (unicode). We do not search in this bible. :param second_bible: The second bible (unicode). We do not search in this bible.
:param text: The text to search for (unicode). :param text: The text to search for (unicode).
""" """
log.debug('BibleManager.verse_search("%s", "%s")', bible, text) log.debug('BibleManager.verse_search("{bible}", "{text}")'.format(bible=bible, text=text))
if not bible: if not bible:
self.main_window.information_message( self.main_window.information_message(
translate('BiblesPlugin.BibleManager', 'No Bibles Available'), translate('BiblesPlugin.BibleManager', 'No Bibles Available'),
@ -365,7 +368,10 @@ class BibleManager(RegistryProperties):
""" """
Saves the bibles meta data. Saves the bibles meta data.
""" """
log.debug('save_meta data %s, %s, %s, %s', bible, version, copyright, permissions) log.debug('save_meta data {bible}, {version}, {copyright}, {perms}'.format(bible=bible,
version=version,
cr=copyright,
perms=permissions))
self.db_cache[bible].save_meta('name', version) self.db_cache[bible].save_meta('name', version)
self.db_cache[bible].save_meta('copyright', copyright) self.db_cache[bible].save_meta('copyright', copyright)
self.db_cache[bible].save_meta('permissions', permissions) self.db_cache[bible].save_meta('permissions', permissions)
@ -375,14 +381,14 @@ class BibleManager(RegistryProperties):
""" """
Returns the meta data for a given key. Returns the meta data for a given key.
""" """
log.debug('get_meta %s,%s', bible, key) log.debug('get_meta {bible},{key}'.format(bible=bible, key=key))
return self.db_cache[bible].get_object(BibleMeta, key) return self.db_cache[bible].get_object(BibleMeta, key)
def update_book(self, bible, book): def update_book(self, bible, book):
""" """
Update a book of the bible. Update a book of the bible.
""" """
log.debug('BibleManager.update_book("%s", "%s")', bible, book.name) log.debug('BibleManager.update_book("{bible}", "{name}")'.format(bible=bible, name=book.name))
self.db_cache[bible].update_book(book) self.db_cache[bible].update_book(book)
def exists(self, name): def exists(self, name):
@ -392,7 +398,7 @@ class BibleManager(RegistryProperties):
if not isinstance(name, str): if not isinstance(name, str):
name = str(name) name = str(name)
for bible in list(self.db_cache.keys()): for bible in list(self.db_cache.keys()):
log.debug('Bible from cache in is_new_bible %s', bible) log.debug('Bible from cache in is_new_bible {bible}'.format(bible=bible))
if not isinstance(bible, str): if not isinstance(bible, str):
bible = str(bible) bible = str(bible)
if bible == name: if bible == name:

View File

@ -280,7 +280,7 @@ class BibleMediaItem(MediaManagerItem):
def retranslateUi(self): def retranslateUi(self):
log.debug('retranslateUi') log.debug('retranslateUi')
self.quick_search_label.setText(translate('BiblesPlugin.MediaItem', 'Find:')) self.quick_search_label.setText(translate('BiblesPlugin.MediaItem', 'Find:'))
self.quickVersionLabel.setText('%s:' % UiStrings().Version) self.quickVersionLabel.setText('{version}:'.format(version=UiStrings().Version))
self.quickSecondLabel.setText(translate('BiblesPlugin.MediaItem', 'Second:')) self.quickSecondLabel.setText(translate('BiblesPlugin.MediaItem', 'Second:'))
self.quickStyleLabel.setText(UiStrings().LayoutStyle) self.quickStyleLabel.setText(UiStrings().LayoutStyle)
self.quickStyleComboBox.setItemText(LayoutStyle.VersePerSlide, UiStrings().VersePerSlide) self.quickStyleComboBox.setItemText(LayoutStyle.VersePerSlide, UiStrings().VersePerSlide)
@ -294,7 +294,7 @@ class BibleMediaItem(MediaManagerItem):
self.advanced_verse_label.setText(translate('BiblesPlugin.MediaItem', 'Verse:')) self.advanced_verse_label.setText(translate('BiblesPlugin.MediaItem', 'Verse:'))
self.advanced_from_label.setText(translate('BiblesPlugin.MediaItem', 'From:')) self.advanced_from_label.setText(translate('BiblesPlugin.MediaItem', 'From:'))
self.advanced_to_label.setText(translate('BiblesPlugin.MediaItem', 'To:')) self.advanced_to_label.setText(translate('BiblesPlugin.MediaItem', 'To:'))
self.advancedVersionLabel.setText('%s:' % UiStrings().Version) self.advancedVersionLabel.setText('{version}:'.format(version=UiStrings().Version))
self.advancedSecondLabel.setText(translate('BiblesPlugin.MediaItem', 'Second:')) self.advancedSecondLabel.setText(translate('BiblesPlugin.MediaItem', 'Second:'))
self.advancedStyleLabel.setText(UiStrings().LayoutStyle) self.advancedStyleLabel.setText(UiStrings().LayoutStyle)
self.advancedStyleComboBox.setItemText(LayoutStyle.VersePerSlide, UiStrings().VersePerSlide) self.advancedStyleComboBox.setItemText(LayoutStyle.VersePerSlide, UiStrings().VersePerSlide)
@ -316,7 +316,8 @@ class BibleMediaItem(MediaManagerItem):
translate('BiblesPlugin.MediaItem', 'Text Search'), translate('BiblesPlugin.MediaItem', 'Text Search'),
translate('BiblesPlugin.MediaItem', 'Search Text...')) translate('BiblesPlugin.MediaItem', 'Search Text...'))
]) ])
self.quick_search_edit.set_current_search_type(Settings().value('%s/last search type' % self.settings_section)) text = self.settings_section
self.quick_search_edit.set_current_search_type(Settings().value('{text}/last search type'.format(text=text)))
self.config_update() self.config_update()
log.debug('bible manager initialise complete') log.debug('bible manager initialise complete')
@ -364,7 +365,7 @@ class BibleMediaItem(MediaManagerItem):
:param bible: The bible to initialise (unicode). :param bible: The bible to initialise (unicode).
:param last_book_id: The "book reference id" of the book which is chosen at the moment. (int) :param last_book_id: The "book reference id" of the book which is chosen at the moment. (int)
""" """
log.debug('initialise_advanced_bible %s, %s', bible, last_book_id) log.debug('initialise_advanced_bible {bible}, {ref}'.format(bible=bible, ref=last_book_id))
book_data = self.plugin.manager.get_books(bible) book_data = self.plugin.manager.get_books(bible)
second_bible = self.advancedSecondComboBox.currentText() second_bible = self.advancedSecondComboBox.currentText()
if second_bible != '': if second_bible != '':
@ -406,7 +407,7 @@ class BibleMediaItem(MediaManagerItem):
self.initialise_chapter_verse(bible, first_book['name'], first_book['book_reference_id']) self.initialise_chapter_verse(bible, first_book['name'], first_book['book_reference_id'])
def initialise_chapter_verse(self, bible, book, book_ref_id): def initialise_chapter_verse(self, bible, book, book_ref_id):
log.debug('initialise_chapter_verse %s, %s, %s', bible, book, book_ref_id) log.debug('initialise_chapter_verse {bible}, {book), {ref}'.format(bible=bible, book=book, ref=book_ref_id))
book = self.plugin.manager.get_book_by_id(bible, book_ref_id) book = self.plugin.manager.get_book_by_id(bible, book_ref_id)
self.chapter_count = self.plugin.manager.get_chapter_count(bible, book) self.chapter_count = self.plugin.manager.get_chapter_count(bible, book)
verse_count = self.plugin.manager.get_verse_count_by_book_ref_id(bible, book_ref_id, 1) verse_count = self.plugin.manager.get_verse_count_by_book_ref_id(bible, book_ref_id, 1)
@ -427,9 +428,11 @@ class BibleMediaItem(MediaManagerItem):
""" """
log.debug('update_auto_completer') log.debug('update_auto_completer')
# Save the current search type to the configuration. # Save the current search type to the configuration.
Settings().setValue('%s/last search type' % self.settings_section, self.quick_search_edit.current_search_type()) Settings().setValue('{section}/last search type'.format(section=self.settings_section),
self.quick_search_edit.current_search_type())
# Save the current bible to the configuration. # Save the current bible to the configuration.
Settings().setValue(self.settings_section + '/quick bible', self.quickVersionComboBox.currentText()) Settings().setValue('{section}/quick bible'.format(section=self.settings_section),
self.quickVersionComboBox.currentText())
books = [] books = []
# We have to do a 'Reference Search'. # We have to do a 'Reference Search'.
if self.quick_search_edit.current_search_type() == BibleSearch.Reference: if self.quick_search_edit.current_search_type() == BibleSearch.Reference:
@ -502,9 +505,10 @@ class BibleMediaItem(MediaManagerItem):
if bible: if bible:
if QtWidgets.QMessageBox.question( if QtWidgets.QMessageBox.question(
self, UiStrings().ConfirmDelete, self, UiStrings().ConfirmDelete,
translate('BiblesPlugin.MediaItem', 'Are you sure you want to completely delete "%s" Bible from ' translate('BiblesPlugin.MediaItem',
'OpenLP?\n\nYou will need to re-import this Bible to use it ' 'Are you sure you want to completely delete "{bible}" Bible '
'again.') % bible, 'from OpenLP?\n\nYou will need to re-import this Bible to use it '
'again.').format(bible=bible),
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No), QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No),
QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.No: QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.No:
return return
@ -606,7 +610,7 @@ class BibleMediaItem(MediaManagerItem):
:param combo: The combo box itself (QComboBox). :param combo: The combo box itself (QComboBox).
:param restore: If True, then the combo's currentText will be restored after adjusting (if possible). :param restore: If True, then the combo's currentText will be restored after adjusting (if possible).
""" """
log.debug('adjust_combo_box %s, %s, %s', combo, range_from, range_to) log.debug('adjust_combo_box {box}, {start}, {end}'.format(box=combo, start=range_from, end=range_to))
if restore: if restore:
old_text = combo.currentText() old_text = combo.currentText()
combo.clear() combo.clear()
@ -633,7 +637,7 @@ class BibleMediaItem(MediaManagerItem):
range_separator = get_reference_separator('sep_r_display') range_separator = get_reference_separator('sep_r_display')
verse_range = chapter_from + verse_separator + verse_from + range_separator + chapter_to + \ verse_range = chapter_from + verse_separator + verse_from + range_separator + chapter_to + \
verse_separator + verse_to verse_separator + verse_to
verse_text = '%s %s' % (book, verse_range) verse_text = '{book} {verse}'.format(book=book, verse=verse_range)
self.application.set_busy_cursor() self.application.set_busy_cursor()
self.search_results = self.plugin.manager.get_verses(bible, verse_text, book_ref_id) self.search_results = self.plugin.manager.get_verses(bible, verse_text, book_ref_id)
if second_bible: if second_bible:
@ -678,8 +682,8 @@ class BibleMediaItem(MediaManagerItem):
for verse in self.search_results: for verse in self.search_results:
db_book = bibles[second_bible].get_book_by_book_ref_id(verse.book.book_reference_id) db_book = bibles[second_bible].get_book_by_book_ref_id(verse.book.book_reference_id)
if not db_book: if not db_book:
log.debug('Passage "%s %d:%d" not found in Second Bible' % log.debug('Passage "{name} {chapter:d}:{verse:d}" not found in '
(verse.book.name, verse.chapter, verse.verse)) 'Second Bible'.format(name=verse.book.name, chapter=verse.chapter, verse=verse.verse))
passage_not_found = True passage_not_found = True
count += 1 count += 1
continue continue
@ -688,9 +692,10 @@ class BibleMediaItem(MediaManagerItem):
if passage_not_found: if passage_not_found:
QtWidgets.QMessageBox.information( QtWidgets.QMessageBox.information(
self, translate('BiblesPlugin.MediaItem', 'Information'), self, translate('BiblesPlugin.MediaItem', 'Information'),
translate('BiblesPlugin.MediaItem', 'The second Bible does not contain all the verses ' translate('BiblesPlugin.MediaItem',
'that are in the main Bible. Only verses found in both Bibles will be shown. %d ' 'The second Bible does not contain all the verses that are in the main Bible. '
'verses have not been included in the results.') % count, 'Only verses found in both Bibles will be shown. {count:d} verses have not been '
'included in the results.').format(count=count),
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Ok)) QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Ok))
self.search_results = new_search_results self.search_results = new_search_results
self.second_search_results = bibles[second_bible].get_verses(text) self.second_search_results = bibles[second_bible].get_verses(text)
@ -767,10 +772,19 @@ class BibleMediaItem(MediaManagerItem):
except TypeError: except TypeError:
log.exception('The second_search_results does not have this book.') log.exception('The second_search_results does not have this book.')
break break
bible_text = '%s %d%s%d (%s, %s)' % (book, verse.chapter, verse_separator, verse.verse, version, bible_text = ('{book} {chapter:d}{sep}{verse:d} '
second_version) '({version1}, {version2})').format(book=book,
chapter=verse.chapter,
sep=verse_separator,
verse=verse.verse,
version1=version,
version2=second_version)
else: else:
bible_text = '%s %d%s%d (%s)' % (book, verse.chapter, verse_separator, verse.verse, version) bible_text = '{book} {chapter:d}{sep}{verse:d} ({version})'.format(book=book,
chapter=verse.chapter,
sep=verse_separator,
verse=verse.verse,
version=version)
bible_verse = QtWidgets.QListWidgetItem(bible_text) bible_verse = QtWidgets.QListWidgetItem(bible_text)
bible_verse.setData(QtCore.Qt.UserRole, data) bible_verse.setData(QtCore.Qt.UserRole, data)
items.append(bible_verse) items.append(bible_verse)
@ -817,20 +831,22 @@ class BibleMediaItem(MediaManagerItem):
verses.add(book, chapter, verse, version, copyright, permissions) verses.add(book, chapter, verse, version, copyright, permissions)
verse_text = self.format_verse(old_chapter, chapter, verse) verse_text = self.format_verse(old_chapter, chapter, verse)
if second_bible: if second_bible:
bible_text = '%s%s\n\n%s&nbsp;%s' % (verse_text, text, verse_text, second_text) bible_text = '{verse}{text1}\n\n{verse}&nbsp;{text2}'.format(verse=verse_text,
text1=text,
text2=second_text)
raw_slides.append(bible_text.rstrip()) raw_slides.append(bible_text.rstrip())
bible_text = '' bible_text = ''
# If we are 'Verse Per Slide' then create a new slide. # If we are 'Verse Per Slide' then create a new slide.
elif self.settings.layout_style == LayoutStyle.VersePerSlide: elif self.settings.layout_style == LayoutStyle.VersePerSlide:
bible_text = '%s%s' % (verse_text, text) bible_text = '{verse}{text}'.format(verse=verse_text, text=text)
raw_slides.append(bible_text.rstrip()) raw_slides.append(bible_text.rstrip())
bible_text = '' bible_text = ''
# If we are 'Verse Per Line' then force a new line. # If we are 'Verse Per Line' then force a new line.
elif self.settings.layout_style == LayoutStyle.VersePerLine: elif self.settings.layout_style == LayoutStyle.VersePerLine:
bible_text = '%s%s%s\n' % (bible_text, verse_text, text) bible_text = '{bible}{verse}{text}\n'.format(bible=bible_text, verse=verse_text, text=text)
# We have to be 'Continuous'. # We have to be 'Continuous'.
else: else:
bible_text = '%s %s%s\n' % (bible_text, verse_text, text) bible_text = '{bible} {verse}{text}\n'.format(bible=bible_text, verse=verse_text, text=text)
bible_text = bible_text.strip(' ') bible_text = bible_text.strip(' ')
if not old_item: if not old_item:
start_item = bitem start_item = bitem
@ -857,7 +873,7 @@ class BibleMediaItem(MediaManagerItem):
service_item.add_capability(ItemCapabilities.CanWordSplit) service_item.add_capability(ItemCapabilities.CanWordSplit)
service_item.add_capability(ItemCapabilities.CanEditTitle) service_item.add_capability(ItemCapabilities.CanEditTitle)
# Service Item: Title # Service Item: Title
service_item.title = '%s %s' % (verses.format_verses(), verses.format_versions()) service_item.title = '{verse} {version}'.format(verse=verses.format_verses(), version=verses.format_versions())
# Service Item: Theme # Service Item: Theme
if not self.settings.bible_theme: if not self.settings.bible_theme:
service_item.theme = None service_item.theme = None
@ -885,7 +901,7 @@ class BibleMediaItem(MediaManagerItem):
start_bible = self._decode_qt_object(start_bitem, 'bible') start_bible = self._decode_qt_object(start_bitem, 'bible')
start_second_bible = self._decode_qt_object(start_bitem, 'second_bible') start_second_bible = self._decode_qt_object(start_bitem, 'second_bible')
if start_second_bible: if start_second_bible:
bibles = '%s, %s' % (start_bible, start_second_bible) bibles = '{bible1}, {bible2}'.format(bible1=start_bible, bible2=start_second_bible)
else: else:
bibles = start_bible bibles = start_bible
if start_chapter == old_chapter: if start_chapter == old_chapter:
@ -896,7 +912,7 @@ class BibleMediaItem(MediaManagerItem):
else: else:
verse_range = start_chapter + verse_separator + start_verse + \ verse_range = start_chapter + verse_separator + start_verse + \
range_separator + old_chapter + verse_separator + old_verse range_separator + old_chapter + verse_separator + old_verse
return '%s %s (%s)' % (start_book, verse_range, bibles) return '{book} {verse} ({bible})'.format(book=start_book, verse=verse_range, bible=bibles)
def check_title(self, bitem, old_bitem): def check_title(self, bitem, old_bitem):
""" """
@ -949,12 +965,12 @@ class BibleMediaItem(MediaManagerItem):
else: else:
verse_text = str(verse) verse_text = str(verse)
if self.settings.display_style == DisplayStyle.Round: if self.settings.display_style == DisplayStyle.Round:
return '{su}(%s){/su}&nbsp;' % verse_text return '{{su}}({verse}){{/su}}&nbsp;'.format(verse=verse_text)
if self.settings.display_style == DisplayStyle.Curly: if self.settings.display_style == DisplayStyle.Curly:
return '{su}{%s}{/su}&nbsp;' % verse_text return '{{su}}{{{verse}}}{{/su}}&nbsp;'.format(verse=verse_text)
if self.settings.display_style == DisplayStyle.Square: if self.settings.display_style == DisplayStyle.Square:
return '{su}[%s]{/su}&nbsp;' % verse_text return '{{su}}[{verse}]{{/su}}&nbsp;'.format(verse=verse_text)
return '{su}%s{/su}&nbsp;' % verse_text return '{{su}}{verse}{{/su}}&nbsp;'.format(verse=verse_text)
def search(self, string, showError): def search(self, string, showError):
""" """

View File

@ -63,7 +63,7 @@ class OpenSongBible(BibleDB):
""" """
Loads a Bible from file. Loads a Bible from file.
""" """
log.debug('Starting OpenSong import from "%s"' % self.filename) log.debug('Starting OpenSong import from "{name}"'.format(name=self.filename))
if not isinstance(self.filename, str): if not isinstance(self.filename, str):
self.filename = str(self.filename, 'utf8') self.filename = str(self.filename, 'utf8')
import_file = None import_file = None
@ -84,14 +84,14 @@ class OpenSongBible(BibleDB):
# No language info in the opensong format, so ask the user # No language info in the opensong format, so ask the user
language_id = self.get_language(bible_name) language_id = self.get_language(bible_name)
if not language_id: if not language_id:
log.error('Importing books from "%s" failed' % self.filename) log.error('Importing books from "{name}" failed'.format(name=self.filename))
return False return False
for book in bible.b: for book in bible.b:
if self.stop_import_flag: if self.stop_import_flag:
break break
book_ref_id = self.get_book_ref_id_by_name(str(book.attrib['n']), len(bible.b), language_id) book_ref_id = self.get_book_ref_id_by_name(str(book.attrib['n']), len(bible.b), language_id)
if not book_ref_id: if not book_ref_id:
log.error('Importing books from "%s" failed' % self.filename) log.error('Importing books from "{name}" failed'.format(name=self.filename))
return False return False
book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
db_book = self.create_book(book.attrib['n'], book_ref_id, book_details['testament_id']) db_book = self.create_book(book.attrib['n'], book_ref_id, book_details['testament_id'])
@ -117,14 +117,14 @@ class OpenSongBible(BibleDB):
if len(verse_parts) > 1: if len(verse_parts) > 1:
number = int(verse_parts[0]) number = int(verse_parts[0])
except TypeError: except TypeError:
log.warning('Illegal verse number: %s', str(verse.attrib['n'])) log.warning('Illegal verse number: {verse:d}'.format(verse.attrib['n']))
verse_number = number verse_number = number
else: else:
verse_number += 1 verse_number += 1
self.create_verse(db_book.id, chapter_number, verse_number, self.get_text(verse)) self.create_verse(db_book.id, chapter_number, verse_number, self.get_text(verse))
self.wizard.increment_progress_bar( self.wizard.increment_progress_bar(translate('BiblesPlugin.Opensong',
translate('BiblesPlugin.Opensong', 'Importing %(bookname)s %(chapter)s...') % 'Importing {name} {chapter}...'
{'bookname': db_book.name, 'chapter': chapter_number}) ).format(name=db_book.name, chapter=chapter_number))
self.session.commit() self.session.commit()
self.application.process_events() self.application.process_events()
except etree.XMLSyntaxError as inst: except etree.XMLSyntaxError as inst:

View File

@ -49,7 +49,7 @@ class OSISBible(BibleDB):
""" """
Loads a Bible from file. Loads a Bible from file.
""" """
log.debug('Starting OSIS import from "%s"' % self.filename) log.debug('Starting OSIS import from "{name}"'.format(name=self.filename))
if not isinstance(self.filename, str): if not isinstance(self.filename, str):
self.filename = str(self.filename, 'utf8') self.filename = str(self.filename, 'utf8')
import_file = None import_file = None
@ -69,7 +69,7 @@ class OSISBible(BibleDB):
if not language_id: if not language_id:
language_id = self.get_language(bible_name) language_id = self.get_language(bible_name)
if not language_id: if not language_id:
log.error('Importing books from "%s" failed' % self.filename) log.error('Importing books from "{name}" failed'.format(name=self.filename))
return False return False
self.save_meta('language_id', language_id) self.save_meta('language_id', language_id)
num_books = int(osis_bible_tree.xpath("count(//ns:div[@type='book'])", namespaces=namespace)) num_books = int(osis_bible_tree.xpath("count(//ns:div[@type='book'])", namespaces=namespace))
@ -129,7 +129,7 @@ class OSISBible(BibleDB):
if not book_ref_id: if not book_ref_id:
book_ref_id = self.get_book_ref_id_by_localised_name(book.get('osisID')) book_ref_id = self.get_book_ref_id_by_localised_name(book.get('osisID'))
if not book_ref_id: if not book_ref_id:
log.error('Importing books from "%s" failed' % self.filename) log.error('Importing books from "{name}" failed'.format(name=self.filename))
return False return False
book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
db_book = self.create_book(book_details['name'], book_ref_id, book_details['testament_id']) db_book = self.create_book(book_details['name'], book_ref_id, book_details['testament_id'])
@ -187,7 +187,8 @@ class OSISBible(BibleDB):
trace_error_handler(log) trace_error_handler(log)
success = False success = False
critical_error_message_box(message=translate('BiblesPlugin.OsisImport', critical_error_message_box(message=translate('BiblesPlugin.OsisImport',
'The file is not a valid OSIS-XML file: \n%s' % e.msg)) 'The file is not a valid OSIS-XML file:'
'\n{text}').format(text=e.msg))
finally: finally:
if import_file: if import_file:
import_file.close() import_file.close()

View File

@ -51,7 +51,7 @@ class SwordBible(BibleDB):
""" """
Loads a Bible from SWORD module. Loads a Bible from SWORD module.
""" """
log.debug('Starting SWORD import from "%s"' % self.sword_key) log.debug('Starting SWORD import from "{key}"'.format(key=self.sword_key))
success = True success = True
try: try:
pysword_modules = modules.SwordModules(self.sword_path) pysword_modules = modules.SwordModules(self.sword_path)
@ -84,14 +84,14 @@ class SwordBible(BibleDB):
verse_number += 1 verse_number += 1
self.create_verse(db_book.id, chapter_number, verse_number, verse) self.create_verse(db_book.id, chapter_number, verse_number, verse)
self.wizard.increment_progress_bar( self.wizard.increment_progress_bar(
translate('BiblesPlugin.Sword', 'Importing %s...') % db_book.name) translate('BiblesPlugin.Sword', 'Importing {name}...').format(name=db_book.name))
self.session.commit() self.session.commit()
self.application.process_events() self.application.process_events()
except Exception as e: except Exception as e:
critical_error_message_box( critical_error_message_box(
message=translate('BiblesPlugin.SwordImport', 'An unexpected error happened while importing the SWORD ' message=translate('BiblesPlugin.SwordImport', 'An unexpected error happened while importing the SWORD '
'bible, please report this to the OpenLP developers.\n' 'bible, please report this to the OpenLP developers.\n'
'%s' % e)) '{error}').format(error=e))
log.exception(str(e)) log.exception(str(e))
success = False success = False
if self.stop_import_flag: if self.stop_import_flag:

View File

@ -101,7 +101,7 @@ def upgrade_1(session, metadata):
metadata_table.c.key == 'download source' metadata_table.c.key == 'download source'
) )
).scalar() ).scalar()
log.debug('download source: %s', value_count) log.debug('download source: {count}'.format(count=value_count))
if value_count > 0: if value_count > 0:
session.execute(insert(metadata_table).values( session.execute(insert(metadata_table).values(
key='download_source', key='download_source',
@ -121,7 +121,7 @@ def upgrade_1(session, metadata):
metadata_table.c.key == 'download name' metadata_table.c.key == 'download name'
) )
).scalar() ).scalar()
log.debug('download name: %s', value_count) log.debug('download name: {count}'.format(count=value_count))
if value_count > 0: if value_count > 0:
session.execute(insert(metadata_table).values( session.execute(insert(metadata_table).values(
key='download_name', key='download_name',
@ -141,7 +141,7 @@ def upgrade_1(session, metadata):
metadata_table.c.key == 'proxy server' metadata_table.c.key == 'proxy server'
) )
).scalar() ).scalar()
log.debug('proxy server: %s', value_count) log.debug('proxy server: {count}'.format(count=value_count))
if value_count > 0: if value_count > 0:
session.execute(insert(metadata_table).values( session.execute(insert(metadata_table).values(
key='proxy_server', key='proxy_server',
@ -161,7 +161,7 @@ def upgrade_1(session, metadata):
metadata_table.c.key == 'proxy username' metadata_table.c.key == 'proxy username'
) )
).scalar() ).scalar()
log.debug('proxy username: %s', value_count) log.debug('proxy username: {count}'.format(count=value_count))
if value_count > 0: if value_count > 0:
session.execute(insert(metadata_table).values( session.execute(insert(metadata_table).values(
key='proxy_username', key='proxy_username',
@ -181,7 +181,7 @@ def upgrade_1(session, metadata):
metadata_table.c.key == 'proxy password' metadata_table.c.key == 'proxy password'
) )
).scalar() ).scalar()
log.debug('proxy password: %s', value_count) log.debug('proxy password: {count}'.format(count=value_count))
if value_count > 0: if value_count > 0:
session.execute(insert(metadata_table).values( session.execute(insert(metadata_table).values(
key='proxy_password', key='proxy_password',

View File

@ -61,23 +61,29 @@ class VerseReferenceList(object):
result = '' result = ''
for index, verse in enumerate(self.verse_list): for index, verse in enumerate(self.verse_list):
if index == 0: if index == 0:
result = '%s %s%s%s' % (verse['book'], verse['chapter'], verse_sep, verse['start']) result = '{book} {chapter}{sep}{verse}'.format(book=verse['book'],
chapter=verse['chapter'],
sep=verse_sep,
verse=verse['start'])
if verse['start'] != verse['end']: if verse['start'] != verse['end']:
result = '%s%s%s' % (result, range_sep, verse['end']) result = '{result}{sep}{end}'.format(result=result, sep=range_sep, end=verse['end'])
continue continue
prev = index - 1 prev = index - 1
if self.verse_list[prev]['version'] != verse['version']: if self.verse_list[prev]['version'] != verse['version']:
result = '%s (%s)' % (result, self.verse_list[prev]['version']) result = '{result} ({version})'.format(result=result, version=self.verse_list[prev]['version'])
result += '%s ' % list_sep result += '{sep} '.format(sep=list_sep)
if self.verse_list[prev]['book'] != verse['book']: if self.verse_list[prev]['book'] != verse['book']:
result = '%s%s %s%s' % (result, verse['book'], verse['chapter'], verse_sep) result = '{result}{book} {chapter}{sep}'.format(result=result,
book=verse['book'],
chapter=verse['chapter'],
sep=verse_sep)
elif self.verse_list[prev]['chapter'] != verse['chapter']: elif self.verse_list[prev]['chapter'] != verse['chapter']:
result = '%s%s%s' % (result, verse['chapter'], verse_sep) result = '{result}{chapter}{sep}'.format(result=result, chapter=verse['chapter'], sep=verse_sep)
result += str(verse['start']) result += str(verse['start'])
if verse['start'] != verse['end']: if verse['start'] != verse['end']:
result = '%s%s%s' % (result, range_sep, verse['end']) result = '{result}{sep}{end}'.format(result=result, sep=range_sep, end=verse['end'])
if len(self.version_list) > 1: if len(self.version_list) > 1:
result = '%s (%s)' % (result, verse['version']) result = '{result} ({version})'.format(result=result, version=verse['version'])
return result return result
def format_versions(self, copyright=True, permission=True): def format_versions(self, copyright=True, permission=True):

View File

@ -48,7 +48,7 @@ class ZefaniaBible(BibleDB):
""" """
Loads a Bible from file. Loads a Bible from file.
""" """
log.debug('Starting Zefania import from "%s"' % self.filename) log.debug('Starting Zefania import from "{name}"'.format(name=self.filename))
if not isinstance(self.filename, str): if not isinstance(self.filename, str):
self.filename = str(self.filename, 'utf8') self.filename = str(self.filename, 'utf8')
import_file = None import_file = None
@ -67,7 +67,7 @@ class ZefaniaBible(BibleDB):
if not language_id: if not language_id:
language_id = self.get_language(bible_name) language_id = self.get_language(bible_name)
if not language_id: if not language_id:
log.error('Importing books from "%s" failed' % self.filename) log.error('Importing books from "{name}" failed'.format(name=self.filename))
return False return False
self.save_meta('language_id', language_id) self.save_meta('language_id', language_id)
num_books = int(zefania_bible_tree.xpath('count(//BIBLEBOOK)')) num_books = int(zefania_bible_tree.xpath('count(//BIBLEBOOK)'))
@ -92,7 +92,7 @@ class ZefaniaBible(BibleDB):
log.debug('Could not find a name, will use number, basically a guess.') log.debug('Could not find a name, will use number, basically a guess.')
book_ref_id = int(bnumber) book_ref_id = int(bnumber)
if not book_ref_id: if not book_ref_id:
log.error('Importing books from "%s" failed' % self.filename) log.error('Importing books from "{name}" failed'.format(name=self.filename))
return False return False
book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
db_book = self.create_book(book_details['name'], book_ref_id, book_details['testament_id']) db_book = self.create_book(book_details['name'], book_ref_id, book_details['testament_id'])
@ -104,8 +104,9 @@ class ZefaniaBible(BibleDB):
verse_number = VERS.get("vnumber") verse_number = VERS.get("vnumber")
self.create_verse(db_book.id, chapter_number, verse_number, VERS.text.replace('<BR/>', '\n')) self.create_verse(db_book.id, chapter_number, verse_number, VERS.text.replace('<BR/>', '\n'))
self.wizard.increment_progress_bar( self.wizard.increment_progress_bar(
translate('BiblesPlugin.Zefnia', 'Importing %(bookname)s %(chapter)s...') % translate('BiblesPlugin.Zefnia',
{'bookname': db_book.name, 'chapter': chapter_number}) 'Importing {book} {chapter}...').format(book=db_book.name,
chapter=chapter_number))
self.session.commit() self.session.commit()
self.application.process_events() self.application.process_events()
except Exception as e: except Exception as e:

View File

@ -128,7 +128,7 @@ class CustomXMLParser(object):
try: try:
self.custom_xml = objectify.fromstring(xml) self.custom_xml = objectify.fromstring(xml)
except etree.XMLSyntaxError: except etree.XMLSyntaxError:
log.exception('Invalid xml %s', xml) log.exception('Invalid xml {xml}'.format(xml=xml))
def get_verses(self): def get_verses(self):
""" """

View File

@ -94,7 +94,7 @@ class CustomMediaItem(MediaManagerItem):
""" """
""" """
self.search_text_label.setText('%s:' % UiStrings().Search) self.search_text_label.setText('{text}:'.format(text=UiStrings().Search))
self.search_text_button.setText(UiStrings().Search) self.search_text_button.setText(UiStrings().Search)
def initialise(self): def initialise(self):
@ -105,7 +105,8 @@ class CustomMediaItem(MediaManagerItem):
[(CustomSearch.Titles, ':/songs/song_search_title.png', translate('SongsPlugin.MediaItem', 'Titles'), [(CustomSearch.Titles, ':/songs/song_search_title.png', translate('SongsPlugin.MediaItem', 'Titles'),
translate('SongsPlugin.MediaItem', 'Search Titles...')), translate('SongsPlugin.MediaItem', 'Search Titles...')),
(CustomSearch.Themes, ':/slides/slide_theme.png', UiStrings().Themes, UiStrings().SearchThemes)]) (CustomSearch.Themes, ':/slides/slide_theme.png', UiStrings().Themes, UiStrings().SearchThemes)])
self.search_text_edit.set_current_search_type(Settings().value('%s/last search type' % self.settings_section)) text = '{section}/last search type'.format(section=self.settings_section)
self.search_text_edit.set_current_search_type(Settings().value(text))
self.load_list(self.plugin.db_manager.get_all_objects(CustomSlide, order_by_ref=CustomSlide.title)) self.load_list(self.plugin.db_manager.get_all_objects(CustomSlide, order_by_ref=CustomSlide.title))
self.config_update() self.config_update()
@ -190,7 +191,8 @@ class CustomMediaItem(MediaManagerItem):
if QtWidgets.QMessageBox.question( if QtWidgets.QMessageBox.question(
self, UiStrings().ConfirmDelete, self, UiStrings().ConfirmDelete,
translate('CustomPlugin.MediaItem', translate('CustomPlugin.MediaItem',
'Are you sure you want to delete the "%d" selected custom slide(s)?') % len(items), 'Are you sure you want to delete the "{items:d}" '
'selected custom slide(s)?').format(items=len(items)),
QtWidgets.QMessageBox.StandardButtons( QtWidgets.QMessageBox.StandardButtons(
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No), QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No),
QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.No: QtWidgets.QMessageBox.Yes) == QtWidgets.QMessageBox.No:
@ -249,10 +251,11 @@ class CustomMediaItem(MediaManagerItem):
Search the plugin database Search the plugin database
""" """
# Save the current search type to the configuration. # Save the current search type to the configuration.
Settings().setValue('%s/last search type' % self.settings_section, self.search_text_edit.current_search_type()) Settings().setValue('{section}/last search type'.format(section=self.settings_section),
self.search_text_edit.current_search_type())
# Reload the list considering the new search type. # Reload the list considering the new search type.
search_type = self.search_text_edit.current_search_type() search_type = self.search_text_edit.current_search_type()
search_keywords = '%' + self.whitespace.sub(' ', self.search_text_edit.displayText()) + '%' search_keywords = '%{search}%'.format(search=self.whitespace.sub(' ', self.search_text_edit.displayText()))
if search_type == CustomSearch.Titles: if search_type == CustomSearch.Titles:
log.debug('Titles Search') log.debug('Titles Search')
search_results = self.plugin.db_manager.get_all_objects(CustomSlide, search_results = self.plugin.db_manager.get_all_objects(CustomSlide,
@ -347,7 +350,7 @@ class CustomMediaItem(MediaManagerItem):
:param string: The search string :param string: The search string
:param show_error: The error string to be show. :param show_error: The error string to be show.
""" """
search = '%' + string.lower() + '%' search = '%{search}%'.forma(search=string.lower())
search_results = self.plugin.db_manager.get_all_objects(CustomSlide, search_results = self.plugin.db_manager.get_all_objects(CustomSlide,
or_(func.lower(CustomSlide.title).like(search), or_(func.lower(CustomSlide.title).like(search),
func.lower(CustomSlide.text).like(search)), func.lower(CustomSlide.text).like(search)),

View File

@ -74,7 +74,7 @@ class ImageMediaItem(MediaManagerItem):
def retranslateUi(self): def retranslateUi(self):
self.on_new_prompt = translate('ImagePlugin.MediaItem', 'Select Image(s)') self.on_new_prompt = translate('ImagePlugin.MediaItem', 'Select Image(s)')
file_formats = get_images_filter() file_formats = get_images_filter()
self.on_new_file_masks = '%s;;%s (*)' % (file_formats, UiStrings().AllFiles) self.on_new_file_masks = '{formats};;{files} (*)'.format(formats=file_formats, files=UiStrings().AllFiles)
self.add_group_action.setText(UiStrings().AddGroup) self.add_group_action.setText(UiStrings().AddGroup)
self.add_group_action.setToolTip(UiStrings().AddGroup) self.add_group_action.setToolTip(UiStrings().AddGroup)
self.replace_action.setText(UiStrings().ReplaceBG) self.replace_action.setText(UiStrings().ReplaceBG)
@ -113,7 +113,7 @@ class ImageMediaItem(MediaManagerItem):
self.list_view = TreeWidgetWithDnD(self, self.plugin.name) self.list_view = TreeWidgetWithDnD(self, self.plugin.name)
self.list_view.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) self.list_view.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
self.list_view.setAlternatingRowColors(True) self.list_view.setAlternatingRowColors(True)
self.list_view.setObjectName('%sTreeView' % self.plugin.name) self.list_view.setObjectName('{name}TreeView'.format(name=self.plugin.name))
# Add to pageLayout # Add to pageLayout
self.page_layout.addWidget(self.list_view) self.page_layout.addWidget(self.list_view)
# define and add the context menu # define and add the context menu
@ -127,21 +127,21 @@ class ImageMediaItem(MediaManagerItem):
create_widget_action(self.list_view, separator=True) create_widget_action(self.list_view, separator=True)
create_widget_action( create_widget_action(
self.list_view, self.list_view,
'listView%s%sItem' % (self.plugin.name.title(), StringContent.Preview.title()), 'listView{name}{preview}Item'.format(name=self.plugin.name.title(), preview=StringContent.Preview.title()),
text=self.plugin.get_string(StringContent.Preview)['title'], text=self.plugin.get_string(StringContent.Preview)['title'],
icon=':/general/general_preview.png', icon=':/general/general_preview.png',
can_shortcuts=True, can_shortcuts=True,
triggers=self.on_preview_click) triggers=self.on_preview_click)
create_widget_action( create_widget_action(
self.list_view, self.list_view,
'listView%s%sItem' % (self.plugin.name.title(), StringContent.Live.title()), 'listView{name}{live}Item'.format(name=self.plugin.name.title(), live=StringContent.Live.title()),
text=self.plugin.get_string(StringContent.Live)['title'], text=self.plugin.get_string(StringContent.Live)['title'],
icon=':/general/general_live.png', icon=':/general/general_live.png',
can_shortcuts=True, can_shortcuts=True,
triggers=self.on_live_click) triggers=self.on_live_click)
create_widget_action( create_widget_action(
self.list_view, self.list_view,
'listView%s%sItem' % (self.plugin.name.title(), StringContent.Service.title()), 'listView{name}{service}Item'.format(name=self.plugin.name.title(), service=StringContent.Service.title()),
can_shortcuts=True, can_shortcuts=True,
text=self.plugin.get_string(StringContent.Service)['title'], text=self.plugin.get_string(StringContent.Service)['title'],
icon=':/general/general_add.png', icon=':/general/general_add.png',
@ -157,7 +157,7 @@ class ImageMediaItem(MediaManagerItem):
if self.has_delete_icon: if self.has_delete_icon:
create_widget_action( create_widget_action(
self.list_view, self.list_view,
'listView%s%sItem' % (self.plugin.name.title(), StringContent.Delete.title()), 'listView{name}{delete}Item'.format(name=self.plugin.name.title(), delete=StringContent.Delete.title()),
text=self.plugin.get_string(StringContent.Delete)['title'], text=self.plugin.get_string(StringContent.Delete)['title'],
icon=':/general/general_delete.png', icon=':/general/general_delete.png',
can_shortcuts=True, triggers=self.on_delete_click) can_shortcuts=True, triggers=self.on_delete_click)
@ -245,8 +245,8 @@ class ImageMediaItem(MediaManagerItem):
self.list_view.parent(), self.list_view.parent(),
translate('ImagePlugin.MediaItem', 'Remove group'), translate('ImagePlugin.MediaItem', 'Remove group'),
translate('ImagePlugin.MediaItem', translate('ImagePlugin.MediaItem',
'Are you sure you want to remove "%s" and everything in it?') % 'Are you sure you want to remove "{name}" and everything in it?'
item_data.group_name, ).format(name=item_data.group_name),
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.Yes |
QtWidgets.QMessageBox.No) QtWidgets.QMessageBox.No)
) == QtWidgets.QMessageBox.Yes: ) == QtWidgets.QMessageBox.Yes:
@ -355,7 +355,7 @@ class ImageMediaItem(MediaManagerItem):
# characters. # characters.
images.sort(key=lambda image_object: get_locale_key(os.path.split(str(image_object.filename))[1])) images.sort(key=lambda image_object: get_locale_key(os.path.split(str(image_object.filename))[1]))
for image_file in images: for image_file in images:
log.debug('Loading image: %s', image_file.filename) log.debug('Loading image: {name}'.format(name=image_file.filename))
filename = os.path.split(image_file.filename)[1] filename = os.path.split(image_file.filename)[1]
thumb = self.generate_thumbnail_path(image_file) thumb = self.generate_thumbnail_path(image_file)
if not os.path.exists(image_file.filename): if not os.path.exists(image_file.filename):
@ -481,7 +481,7 @@ class ImageMediaItem(MediaManagerItem):
for filename in images_list: for filename in images_list:
if not isinstance(filename, str): if not isinstance(filename, str):
continue continue
log.debug('Adding new image: %s', filename) log.debug('Adding new image: {name}'.format(name=filename))
image_file = ImageFilenames() image_file = ImageFilenames()
image_file.group_id = group_id image_file.group_id = group_id
image_file.filename = str(filename) image_file.filename = str(filename)
@ -589,14 +589,15 @@ class ImageMediaItem(MediaManagerItem):
if not remote: if not remote:
critical_error_message_box( critical_error_message_box(
translate('ImagePlugin.MediaItem', 'Missing Image(s)'), translate('ImagePlugin.MediaItem', 'Missing Image(s)'),
translate('ImagePlugin.MediaItem', 'The following image(s) no longer exist: %s') translate('ImagePlugin.MediaItem', 'The following image(s) no longer exist: {names}'
% '\n'.join(missing_items_file_names)) ).format(names='\n'.join(missing_items_file_names)))
return False return False
# We have missing as well as existing images. We ask what to do. # We have missing as well as existing images. We ask what to do.
elif missing_items_file_names and QtWidgets.QMessageBox.question( elif missing_items_file_names and QtWidgets.QMessageBox.question(
self, translate('ImagePlugin.MediaItem', 'Missing Image(s)'), self, translate('ImagePlugin.MediaItem', 'Missing Image(s)'),
translate('ImagePlugin.MediaItem', 'The following image(s) no longer exist: %s\n' translate('ImagePlugin.MediaItem', 'The following image(s) no longer exist: {names}\n'
'Do you want to add the other images anyway?') % '\n'.join(missing_items_file_names), 'Do you want to add the other images anyway?'
).format(names='\n'.join(missing_items_file_names)),
QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.No | QtWidgets.QMessageBox.Yes)) == \ QtWidgets.QMessageBox.StandardButtons(QtWidgets.QMessageBox.No | QtWidgets.QMessageBox.Yes)) == \
QtWidgets.QMessageBox.No: QtWidgets.QMessageBox.No:
return False return False
@ -688,7 +689,7 @@ class ImageMediaItem(MediaManagerItem):
critical_error_message_box( critical_error_message_box(
UiStrings().LiveBGError, UiStrings().LiveBGError,
translate('ImagePlugin.MediaItem', 'There was a problem replacing your background, ' translate('ImagePlugin.MediaItem', 'There was a problem replacing your background, '
'the image file "%s" no longer exists.') % filename) 'the image file "{name}" no longer exists.').format(name=filename))
def search(self, string, show_error=True): def search(self, string, show_error=True):
""" """

View File

@ -46,7 +46,7 @@ class MediaClipSelectorForm(QtWidgets.QDialog, Ui_MediaClipSelector, RegistryPro
""" """
Class to manage the clip selection Class to manage the clip selection
""" """
log.info('%s MediaClipSelectorForm loaded', __name__) log.info('{name} MediaClipSelectorForm loaded'.format(name=__name__))
def __init__(self, media_item, parent, manager): def __init__(self, media_item, parent, manager):
""" """
@ -265,7 +265,8 @@ class MediaClipSelectorForm(QtWidgets.QDialog, Ui_MediaClipSelector, RegistryPro
# Enable audio track combobox if anything is in it # Enable audio track combobox if anything is in it
if len(titles) > 0: if len(titles) > 0:
self.titles_combo_box.setDisabled(False) self.titles_combo_box.setDisabled(False)
log.debug('load_disc_button end - vlc_media_player state: %s' % self.vlc_media_player.get_state()) log.debug('load_disc_button end - '
'vlc_media_player state: {state}'.format(state=self.vlc_media_player.get_state()))
@QtCore.pyqtSlot(bool) @QtCore.pyqtSlot(bool)
def on_play_button_clicked(self, clicked): def on_play_button_clicked(self, clicked):
@ -374,7 +375,7 @@ class MediaClipSelectorForm(QtWidgets.QDialog, Ui_MediaClipSelector, RegistryPro
:param index: The index of the newly chosen title track. :param index: The index of the newly chosen title track.
""" """
log.debug('in on_titles_combo_box_changed, index: %d', index) log.debug('in on_titles_combo_box_changed, index: {index:d}'.format(index=index))
vlc = get_vlc() vlc = get_vlc()
if not self.vlc_media_player: if not self.vlc_media_player:
log.error('vlc_media_player was None') log.error('vlc_media_player was None')
@ -407,7 +408,7 @@ class MediaClipSelectorForm(QtWidgets.QDialog, Ui_MediaClipSelector, RegistryPro
self.vlc_media_player.audio_set_mute(True) self.vlc_media_player.audio_set_mute(True)
# Get audio tracks # Get audio tracks
audio_tracks = self.vlc_media_player.audio_get_track_description() audio_tracks = self.vlc_media_player.audio_get_track_description()
log.debug('number of audio tracks: %d' % len(audio_tracks)) log.debug('number of audio tracks: {tracks:d}'.format(tracks=len(audio_tracks)))
# Clear the audio track combobox, insert new tracks # Clear the audio track combobox, insert new tracks
self.audio_tracks_combobox.clear() self.audio_tracks_combobox.clear()
for audio_track in audio_tracks: for audio_track in audio_tracks:
@ -433,14 +434,14 @@ class MediaClipSelectorForm(QtWidgets.QDialog, Ui_MediaClipSelector, RegistryPro
self.toggle_disable_player(False) self.toggle_disable_player(False)
# Set media length info # Set media length info
self.playback_length = self.vlc_media_player.get_length() self.playback_length = self.vlc_media_player.get_length()
log.debug('playback_length: %d ms' % self.playback_length) log.debug('playback_length: {length:d} ms'.format(length=self.playback_length))
# if length is 0, wait a bit, maybe vlc will change its mind... # if length is 0, wait a bit, maybe vlc will change its mind...
loop_count = 0 loop_count = 0
while self.playback_length == 0 and loop_count < 20: while self.playback_length == 0 and loop_count < 20:
sleep(0.1) sleep(0.1)
self.playback_length = self.vlc_media_player.get_length() self.playback_length = self.vlc_media_player.get_length()
loop_count += 1 loop_count += 1
log.debug('in loop, playback_length: %d ms' % self.playback_length) log.debug('in loop, playback_length: {length:d} ms'.format(length=self.playback_length))
self.position_slider.setMaximum(self.playback_length) self.position_slider.setMaximum(self.playback_length)
# setup start and end time # setup start and end time
rounded_vlc_ms_length = int(round(self.playback_length / 100.0) * 100.0) rounded_vlc_ms_length = int(round(self.playback_length / 100.0) * 100.0)
@ -455,7 +456,8 @@ class MediaClipSelectorForm(QtWidgets.QDialog, Ui_MediaClipSelector, RegistryPro
sleep(0.1) sleep(0.1)
self.vlc_media_player.set_pause(1) self.vlc_media_player.set_pause(1)
loop_count += 1 loop_count += 1
log.debug('titles_combo_box end - vlc_media_player state: %s' % self.vlc_media_player.get_state()) log.debug('titles_combo_box end - '
'vlc_media_player state: {state}'.format(state=self.vlc_media_player.get_state()))
self.application.set_normal_cursor() self.application.set_normal_cursor()
@QtCore.pyqtSlot(int) @QtCore.pyqtSlot(int)
@ -468,7 +470,8 @@ class MediaClipSelectorForm(QtWidgets.QDialog, Ui_MediaClipSelector, RegistryPro
if not self.vlc_media_player: if not self.vlc_media_player:
return return
audio_track = self.audio_tracks_combobox.itemData(index) audio_track = self.audio_tracks_combobox.itemData(index)
log.debug('in on_audio_tracks_combobox_currentIndexChanged, index: %d audio_track: %s' % (index, audio_track)) log.debug('in on_audio_tracks_combobox_currentIndexChanged, '
'index: {index:d} audio_track: {tracks}'.format(index=index, tracks=audio_track))
if audio_track and int(audio_track) > 0: if audio_track and int(audio_track) > 0:
self.vlc_media_player.audio_set_track(int(audio_track)) self.vlc_media_player.audio_set_track(int(audio_track))
@ -566,7 +569,9 @@ class MediaClipSelectorForm(QtWidgets.QDialog, Ui_MediaClipSelector, RegistryPro
translate('MediaPlugin.MediaClipSelectorForm', translate('MediaPlugin.MediaClipSelectorForm',
'The CD was not loaded correctly, please re-load and try again.')) 'The CD was not loaded correctly, please re-load and try again.'))
return return
optical = 'optical:%d:-1:-1:%d:%d:' % (title, start_time_ms, end_time_ms) optical = 'optical:{title:d}:-1:-1:{start:d}:{end:d}:'.format(title=title,
start=start_time_ms,
end=end_time_ms)
else: else:
audio_track = self.audio_tracks_combobox.itemData(self.audio_tracks_combobox.currentIndex()) audio_track = self.audio_tracks_combobox.itemData(self.audio_tracks_combobox.currentIndex())
subtitle_track = self.subtitle_tracks_combobox.itemData(self.subtitle_tracks_combobox.currentIndex()) subtitle_track = self.subtitle_tracks_combobox.itemData(self.subtitle_tracks_combobox.currentIndex())
@ -577,7 +582,11 @@ class MediaClipSelectorForm(QtWidgets.QDialog, Ui_MediaClipSelector, RegistryPro
translate('MediaPlugin.MediaClipSelectorForm', translate('MediaPlugin.MediaClipSelectorForm',
'The DVD was not loaded correctly, please re-load and try again.')) 'The DVD was not loaded correctly, please re-load and try again.'))
return return
optical = 'optical:%d:%d:%d:%d:%d:' % (title, audio_track, subtitle_track, start_time_ms, end_time_ms) optical = 'optical:{title:d}:{audio:d}:{sub:d}:{start:d}:{end:d}:'.format(title=title,
audio=audio_track,
sub=subtitle_track,
start=start_time_ms,
end=end_time_ms)
# Ask for an alternative name for the mediaclip # Ask for an alternative name for the mediaclip
while True: while True:
new_optical_name, ok = QtWidgets.QInputDialog.getText(self, translate('MediaPlugin.MediaClipSelectorForm', new_optical_name, ok = QtWidgets.QInputDialog.getText(self, translate('MediaPlugin.MediaClipSelectorForm',
@ -634,10 +643,10 @@ class MediaClipSelectorForm(QtWidgets.QDialog, Ui_MediaClipSelector, RegistryPro
# use win api to find optical drives # use win api to find optical drives
fso = Dispatch('scripting.filesystemobject') fso = Dispatch('scripting.filesystemobject')
for drive in fso.Drives: for drive in fso.Drives:
log.debug('Drive %s has type %d' % (drive.DriveLetter, drive.DriveType)) log.debug('Drive {drive} has type {types:d}'.format(drive=drive.DriveLetter, types=drive.DriveType))
# if type is 4, it is a cd-rom drive # if type is 4, it is a cd-rom drive
if drive.DriveType == 4: if drive.DriveType == 4:
self.media_path_combobox.addItem('%s:\\' % drive.DriveLetter) self.media_path_combobox.addItem('{drive}:\\'.format(drive=drive.DriveLetter))
elif is_linux(): elif is_linux():
# Get disc devices from dbus and find the ones that are optical # Get disc devices from dbus and find the ones that are optical
bus = dbus.SystemBus() bus = dbus.SystemBus()

View File

@ -51,7 +51,7 @@ class MediaMediaItem(MediaManagerItem, RegistryProperties):
""" """
media_go_live = QtCore.pyqtSignal(list) media_go_live = QtCore.pyqtSignal(list)
media_add_to_service = QtCore.pyqtSignal(list) media_add_to_service = QtCore.pyqtSignal(list)
log.info('%s MediaMediaItem loaded', __name__) log.info('{name} MediaMediaItem loaded'.format(name=__name__))
def __init__(self, parent, plugin): def __init__(self, parent, plugin):
self.setup() self.setup()
@ -232,7 +232,7 @@ class MediaMediaItem(MediaManagerItem, RegistryProperties):
critical_error_message_box(UiStrings().LiveBGError, critical_error_message_box(UiStrings().LiveBGError,
translate('MediaPlugin.MediaItem', translate('MediaPlugin.MediaItem',
'There was a problem replacing your background, ' 'There was a problem replacing your background, '
'the media file "%s" no longer exists.') % filename) 'the media file "{name}" no longer exists.').format(name=filename))
def generate_slide_data(self, service_item, item=None, xml_version=False, remote=False, def generate_slide_data(self, service_item, item=None, xml_version=False, remote=False,
context=ServiceItemContext.Service): context=ServiceItemContext.Service):
@ -258,7 +258,8 @@ class MediaMediaItem(MediaManagerItem, RegistryProperties):
# Optical disc is no longer present # Optical disc is no longer present
critical_error_message_box( critical_error_message_box(
translate('MediaPlugin.MediaItem', 'Missing Media File'), translate('MediaPlugin.MediaItem', 'Missing Media File'),
translate('MediaPlugin.MediaItem', 'The optical disc %s is no longer available.') % name) translate('MediaPlugin.MediaItem',
'The optical disc {name} is no longer available.').format(name=name))
return False return False
service_item.processor = self.display_type_combo_box.currentText() service_item.processor = self.display_type_combo_box.currentText()
service_item.add_from_command(filename, name, CLAPPERBOARD) service_item.add_from_command(filename, name, CLAPPERBOARD)
@ -275,7 +276,7 @@ class MediaMediaItem(MediaManagerItem, RegistryProperties):
# File is no longer present # File is no longer present
critical_error_message_box( critical_error_message_box(
translate('MediaPlugin.MediaItem', 'Missing Media File'), translate('MediaPlugin.MediaItem', 'Missing Media File'),
translate('MediaPlugin.MediaItem', 'The file %s no longer exists.') % filename) translate('MediaPlugin.MediaItem', 'The file {name} no longer exists.').format(name=filename))
return False return False
(path, name) = os.path.split(filename) (path, name) = os.path.split(filename)
service_item.title = name service_item.title = name
@ -308,9 +309,11 @@ class MediaMediaItem(MediaManagerItem, RegistryProperties):
Rebuild the tab in the media manager when changes are made in the settings. Rebuild the tab in the media manager when changes are made in the settings.
""" """
self.populate_display_types() self.populate_display_types()
self.on_new_file_masks = translate('MediaPlugin.MediaItem', 'Videos (%s);;Audio (%s);;%s (*)') % ( self.on_new_file_masks = translate('MediaPlugin.MediaItem',
' '.join(self.media_controller.video_extensions_list), 'Videos ({video});;Audio ({audio});;{files} '
' '.join(self.media_controller.audio_extensions_list), UiStrings().AllFiles) '(*)').format(video=' '.join(self.media_controller.video_extensions_list),
audio=' '.join(self.media_controller.audio_extensions_list),
files=UiStrings().AllFiles)
def populate_display_types(self): def populate_display_types(self):
""" """
@ -365,7 +368,9 @@ class MediaMediaItem(MediaManagerItem, RegistryProperties):
item_name = QtWidgets.QListWidgetItem(clip_name) item_name = QtWidgets.QListWidgetItem(clip_name)
item_name.setIcon(self.optical_icon) item_name.setIcon(self.optical_icon)
item_name.setData(QtCore.Qt.UserRole, track) item_name.setData(QtCore.Qt.UserRole, track)
item_name.setToolTip('%s@%s-%s' % (file_name, format_milliseconds(start), format_milliseconds(end))) item_name.setToolTip('{name}@{start}-{end}'.format(name=file_name,
start=format_milliseconds(start),
end=format_milliseconds(end)))
elif not os.path.exists(track): elif not os.path.exists(track):
# File doesn't exist, mark as error. # File doesn't exist, mark as error.
file_name = os.path.split(str(track))[1] file_name = os.path.split(str(track))[1]
@ -377,7 +382,8 @@ class MediaMediaItem(MediaManagerItem, RegistryProperties):
# Normal media file handling. # Normal media file handling.
file_name = os.path.split(str(track))[1] file_name = os.path.split(str(track))[1]
item_name = QtWidgets.QListWidgetItem(file_name) item_name = QtWidgets.QListWidgetItem(file_name)
if '*.%s' % (file_name.split('.')[-1].lower()) in self.media_controller.audio_extensions_list: search = file_name.split('.')[-1].lower()
if '*.{text}'.format(text=search) in self.media_controller.audio_extensions_list:
item_name.setIcon(self.audio_icon) item_name.setIcon(self.audio_icon)
else: else:
item_name.setIcon(self.video_icon) item_name.setIcon(self.video_icon)

View File

@ -49,7 +49,7 @@ class MediaPlugin(Plugin):
""" """
The media plugin adds the ability to playback audio and video content. The media plugin adds the ability to playback audio and video content.
""" """
log.info('%s MediaPlugin loaded', __name__) log.info('{name} MediaPlugin loaded'.format(name=__name__))
def __init__(self): def __init__(self):
super(MediaPlugin, self).__init__('media', __default_settings__, MediaMediaItem) super(MediaPlugin, self).__init__('media', __default_settings__, MediaMediaItem)

View File

@ -236,7 +236,7 @@ class ImpressDocument(PresentationDocument):
try: try:
self.document = desktop.loadComponentFromURL(url, '_blank', 0, properties) self.document = desktop.loadComponentFromURL(url, '_blank', 0, properties)
except: except:
log.warning('Failed to load presentation %s' % url) log.warning('Failed to load presentation {url}'.format(url=url))
return False return False
self.presentation = self.document.getPresentation() self.presentation = self.document.getPresentation()
self.presentation.Display = ScreenList().current['number'] + 1 self.presentation.Display = ScreenList().current['number'] + 1
@ -269,16 +269,16 @@ class ImpressDocument(PresentationDocument):
for index in range(pages.getCount()): for index in range(pages.getCount()):
page = pages.getByIndex(index) page = pages.getByIndex(index)
doc.getCurrentController().setCurrentPage(page) doc.getCurrentController().setCurrentPage(page)
url_path = '%s/%s.png' % (thumb_dir_url, str(index + 1)) url_path = '{path}/{name}.png'.format(path=thumb_dir_url, name=str(index + 1))
path = os.path.join(self.get_temp_folder(), str(index + 1) + '.png') path = os.path.join(self.get_temp_folder(), str(index + 1) + '.png')
try: try:
doc.storeToURL(url_path, properties) doc.storeToURL(url_path, properties)
self.convert_thumbnail(path, index + 1) self.convert_thumbnail(path, index + 1)
delete_file(path) delete_file(path)
except ErrorCodeIOException as exception: except ErrorCodeIOException as exception:
log.exception('ERROR! ErrorCodeIOException %d' % exception.ErrCode) log.exception('ERROR! ErrorCodeIOException {error:d}'.format(error=exception.ErrCode))
except: except:
log.exception('%s - Unable to store openoffice preview' % path) log.exception('{path} - Unable to store openoffice preview'.format(path=path))
def create_property(self, name, value): def create_property(self, name, value):
""" """

View File

@ -88,9 +88,10 @@ class PresentationMediaItem(MediaManagerItem):
file_types = self.controllers[controller].supports + self.controllers[controller].also_supports file_types = self.controllers[controller].supports + self.controllers[controller].also_supports
for file_type in file_types: for file_type in file_types:
if file_type not in file_type_string: if file_type not in file_type_string:
file_type_string += '*.%s ' % file_type file_type_string += '*.{text} '.format(text=file_type)
self.service_manager.supported_suffixes(file_type) self.service_manager.supported_suffixes(file_type)
self.on_new_file_masks = translate('PresentationPlugin.MediaItem', 'Presentations (%s)') % file_type_string self.on_new_file_masks = translate('PresentationPlugin.MediaItem',
'Presentations ({text})').format(text=file_type_string)
def required_icons(self): def required_icons(self):
""" """
@ -306,13 +307,13 @@ class PresentationMediaItem(MediaManagerItem):
os.path.join(doc.get_temp_folder(), 'mainslide001.png')): os.path.join(doc.get_temp_folder(), 'mainslide001.png')):
doc.load_presentation() doc.load_presentation()
i = 1 i = 1
image = os.path.join(doc.get_temp_folder(), 'mainslide%03d.png' % i) image = os.path.join(doc.get_temp_folder(), 'mainslide{number:0>3d}.png'.format(number=i))
thumbnail = os.path.join(doc.get_thumbnail_folder(), 'slide%d.png' % i) thumbnail = os.path.join(doc.get_thumbnail_folder(), 'slide%d.png' % i)
while os.path.isfile(image): while os.path.isfile(image):
service_item.add_from_image(image, name, thumbnail=thumbnail) service_item.add_from_image(image, name, thumbnail=thumbnail)
i += 1 i += 1
image = os.path.join(doc.get_temp_folder(), 'mainslide%03d.png' % i) image = os.path.join(doc.get_temp_folder(), 'mainslide{number:0>3d}.png'.format(number=i))
thumbnail = os.path.join(doc.get_thumbnail_folder(), 'slide%d.png' % i) thumbnail = os.path.join(doc.get_thumbnail_folder(), 'slide{number:d}.png'.format(number=i))
service_item.add_capability(ItemCapabilities.HasThumbnails) service_item.add_capability(ItemCapabilities.HasThumbnails)
doc.close_presentation() doc.close_presentation()
return True return True
@ -321,7 +322,8 @@ class PresentationMediaItem(MediaManagerItem):
if not remote: if not remote:
critical_error_message_box(translate('PresentationPlugin.MediaItem', 'Missing Presentation'), critical_error_message_box(translate('PresentationPlugin.MediaItem', 'Missing Presentation'),
translate('PresentationPlugin.MediaItem', translate('PresentationPlugin.MediaItem',
'The presentation %s no longer exists.') % filename) 'The presentation {name} no longer exists.'
).format(name=filename))
return False return False
else: else:
service_item.processor = self.display_type_combo_box.currentText() service_item.processor = self.display_type_combo_box.currentText()
@ -367,15 +369,16 @@ class PresentationMediaItem(MediaManagerItem):
critical_error_message_box(translate('PresentationPlugin.MediaItem', critical_error_message_box(translate('PresentationPlugin.MediaItem',
'Missing Presentation'), 'Missing Presentation'),
translate('PresentationPlugin.MediaItem', translate('PresentationPlugin.MediaItem',
'The presentation %s is incomplete, please reload.') 'The presentation {name} is incomplete, '
% filename) 'please reload.').format(name=filename))
return False return False
else: else:
# File is no longer present # File is no longer present
if not remote: if not remote:
critical_error_message_box(translate('PresentationPlugin.MediaItem', 'Missing Presentation'), critical_error_message_box(translate('PresentationPlugin.MediaItem', 'Missing Presentation'),
translate('PresentationPlugin.MediaItem', translate('PresentationPlugin.MediaItem',
'The presentation %s no longer exists.') % filename) 'The presentation {name} no longer exists.'
).format(name=filename))
return False return False
def find_controller_by_type(self, filename): def find_controller_by_type(self, filename):

View File

@ -48,14 +48,14 @@ class Controller(object):
self.is_live = live self.is_live = live
self.doc = None self.doc = None
self.hide_mode = None self.hide_mode = None
log.info('%s controller loaded' % live) log.info('{name} controller loaded'.format(name=live))
def add_handler(self, controller, file, hide_mode, slide_no): def add_handler(self, controller, file, hide_mode, slide_no):
""" """
Add a handler, which is an instance of a presentation and slidecontroller combination. If the slidecontroller Add a handler, which is an instance of a presentation and slidecontroller combination. If the slidecontroller
has a display then load the presentation. has a display then load the presentation.
""" """
log.debug('Live = %s, add_handler %s' % (self.is_live, file)) log.debug('Live = {live}, add_handler {handler}'.format(live=self.is_live, handler=file))
self.controller = controller self.controller = controller
if self.doc is not None: if self.doc is not None:
self.shutdown() self.shutdown()
@ -67,7 +67,7 @@ class Controller(object):
return return
self.doc.slidenumber = slide_no self.doc.slidenumber = slide_no
self.hide_mode = hide_mode self.hide_mode = hide_mode
log.debug('add_handler, slide_number: %d' % slide_no) log.debug('add_handler, slide_number: {slide:d}'.format(slide=slide_no))
if self.is_live: if self.is_live:
if hide_mode == HideMode.Screen: if hide_mode == HideMode.Screen:
Registry().execute('live_display_hide', HideMode.Screen) Registry().execute('live_display_hide', HideMode.Screen)
@ -87,14 +87,14 @@ class Controller(object):
""" """
Active the presentation, and show it on the screen. Use the last slide number. Active the presentation, and show it on the screen. Use the last slide number.
""" """
log.debug('Live = %s, activate' % self.is_live) log.debug('Live = {live}, activate'.format(live=self.is_live))
if not self.doc: if not self.doc:
return False return False
if self.doc.is_active(): if self.doc.is_active():
return True return True
if not self.doc.is_loaded(): if not self.doc.is_loaded():
if not self.doc.load_presentation(): if not self.doc.load_presentation():
log.warning('Failed to activate %s' % self.doc.file_path) log.warning('Failed to activate {path}'.format(path=self.doc.file_path))
return False return False
if self.is_live: if self.is_live:
self.doc.start_presentation() self.doc.start_presentation()
@ -105,14 +105,14 @@ class Controller(object):
if self.doc.is_active(): if self.doc.is_active():
return True return True
else: else:
log.warning('Failed to activate %s' % self.doc.file_path) log.warning('Failed to activate {path}'.format(path=self.doc.file_path))
return False return False
def slide(self, slide): def slide(self, slide):
""" """
Go to a specific slide Go to a specific slide
""" """
log.debug('Live = %s, slide' % self.is_live) log.debug('Live = {live}, slide'.format(live=self.is_live))
if not self.doc: if not self.doc:
return return
if not self.is_live: if not self.is_live:
@ -130,7 +130,7 @@ class Controller(object):
""" """
Based on the handler passed at startup triggers the first slide. Based on the handler passed at startup triggers the first slide.
""" """
log.debug('Live = %s, first' % self.is_live) log.debug('Live = {live}, first'.format(live=self.is_live))
if not self.doc: if not self.doc:
return return
if not self.is_live: if not self.is_live:
@ -148,7 +148,7 @@ class Controller(object):
""" """
Based on the handler passed at startup triggers the last slide. Based on the handler passed at startup triggers the last slide.
""" """
log.debug('Live = %s, last' % self.is_live) log.debug('Live = {live}, last'.format(live=self.is_live))
if not self.doc: if not self.doc:
return return
if not self.is_live: if not self.is_live:
@ -166,7 +166,7 @@ class Controller(object):
""" """
Based on the handler passed at startup triggers the next slide event. Based on the handler passed at startup triggers the next slide event.
""" """
log.debug('Live = %s, next' % self.is_live) log.debug('Live = {live}, next'.format(live=self.is_live))
if not self.doc: if not self.doc:
return return
if not self.is_live: if not self.is_live:
@ -191,7 +191,7 @@ class Controller(object):
""" """
Based on the handler passed at startup triggers the previous slide event. Based on the handler passed at startup triggers the previous slide event.
""" """
log.debug('Live = %s, previous' % self.is_live) log.debug('Live = {live}, previous'.formta(live=self.is_live))
if not self.doc: if not self.doc:
return return
if not self.is_live: if not self.is_live:
@ -212,7 +212,7 @@ class Controller(object):
""" """
Based on the handler passed at startup triggers slide show to shut down. Based on the handler passed at startup triggers slide show to shut down.
""" """
log.debug('Live = %s, shutdown' % self.is_live) log.debug('Live = {live}, shutdown'.format(live=self.is_live))
if not self.doc: if not self.doc:
return return
self.doc.close_presentation() self.doc.close_presentation()
@ -222,7 +222,7 @@ class Controller(object):
""" """
Instruct the controller to blank the presentation. Instruct the controller to blank the presentation.
""" """
log.debug('Live = %s, blank' % self.is_live) log.debug('Live = {live}, blank'.format(live=self.is_live))
self.hide_mode = hide_mode self.hide_mode = hide_mode
if not self.doc: if not self.doc:
return return
@ -243,7 +243,7 @@ class Controller(object):
""" """
Instruct the controller to stop and hide the presentation. Instruct the controller to stop and hide the presentation.
""" """
log.debug('Live = %s, stop' % self.is_live) log.debug('Live = {live}, stop'.format(live=self.is_live))
# The document has not been loaded yet, so don't do anything. This can happen when going live with a # The document has not been loaded yet, so don't do anything. This can happen when going live with a
# presentation while blanked to desktop. # presentation while blanked to desktop.
if not self.doc: if not self.doc:
@ -266,7 +266,7 @@ class Controller(object):
""" """
Instruct the controller to unblank the presentation. Instruct the controller to unblank the presentation.
""" """
log.debug('Live = %s, unblank' % self.is_live) log.debug('Live = {live}, unblank'.format(live=self.is_live))
self.hide_mode = None self.hide_mode = None
if not self.doc: if not self.doc:
return return
@ -321,7 +321,7 @@ class MessageListener(object):
""" """
Start of new presentation. Save the handler as any new presentations start here Start of new presentation. Save the handler as any new presentations start here
""" """
log.debug('Startup called with message %s' % message) log.debug('Startup called with message {text}'.format(text=message))
is_live = message[1] is_live = message[1]
item = message[0] item = message[0]
hide_mode = message[2] hide_mode = message[2]
@ -332,7 +332,7 @@ class MessageListener(object):
# the conversion has already been done at this point. # the conversion has already been done at this point.
file_type = os.path.splitext(file.lower())[1][1:] file_type = os.path.splitext(file.lower())[1][1:]
if file_type in PDF_CONTROLLER_FILETYPES: if file_type in PDF_CONTROLLER_FILETYPES:
log.debug('Converting from pdf/xps/oxps to images for serviceitem with file %s', file) log.debug('Converting from pdf/xps/oxps to images for serviceitem with file {name}'.format(name=file))
# Create a copy of the original item, and then clear the original item so it can be filled with images # Create a copy of the original item, and then clear the original item so it can be filled with images
item_cpy = copy.copy(item) item_cpy = copy.copy(item)
item.__init__(None) item.__init__(None)

View File

@ -87,7 +87,7 @@ class PdfController(PresentationController):
if found_gs: if found_gs:
program_type = 'gs' program_type = 'gs'
break break
log.debug('in check_binary, found: %s', program_type) log.debug('in check_binary, found: {text}'.format(text=program_type))
return program_type return program_type
def check_available(self): def check_available(self):
@ -255,11 +255,13 @@ class PdfDocument(PresentationDocument):
os.makedirs(self.get_temp_folder()) os.makedirs(self.get_temp_folder())
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],
@ -267,6 +269,7 @@ 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

@ -179,7 +179,7 @@ class PowerpointDocument(PresentationDocument):
if not self.presentation.Slides(num + 1).SlideShowTransition.Hidden: if not self.presentation.Slides(num + 1).SlideShowTransition.Hidden:
self.index_map[key] = num + 1 self.index_map[key] = num + 1
self.presentation.Slides(num + 1).Export( self.presentation.Slides(num + 1).Export(
os.path.join(self.get_thumbnail_folder(), 'slide%d.png' % (key)), 'png', 320, 240) os.path.join(self.get_thumbnail_folder(), 'slide{key:d}.png'.format(key=key)), 'png', 320, 240)
key += 1 key += 1
self.slide_count = key - 1 self.slide_count = key - 1
@ -345,8 +345,9 @@ class PowerpointDocument(PresentationDocument):
# 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:
log.debug('main display size: y=%d, height=%d, x=%d, width=%d' log.debug('main display size: y={y:d}, height={height:d}, '
% (size.y(), size.height(), size.x(), size.width())) 'x={x:d}, width={width:d}'.format(y=size.y(), height=size.height(),
x=size.x(), width=size.width()))
win32gui.EnumWindows(self._window_enum_callback, size) win32gui.EnumWindows(self._window_enum_callback, size)
# Make sure powerpoint doesn't steal focus, unless we're on a single screen setup # Make sure powerpoint doesn't steal focus, unless we're on a single screen setup
if len(ScreenList().screen_list) > 1: if len(ScreenList().screen_list) > 1:
@ -361,10 +362,18 @@ class PowerpointDocument(PresentationDocument):
# it is the powerpoint presentation window. # it is the powerpoint presentation window.
(left, top, right, bottom) = win32gui.GetWindowRect(hwnd) (left, top, right, bottom) = win32gui.GetWindowRect(hwnd)
window_title = win32gui.GetWindowText(hwnd) window_title = win32gui.GetWindowText(hwnd)
log.debug('window size: left=%d, top=%d, right=%d, width=%d' % (left, top, right, bottom)) log.debug('window size: left=left:d}, top={top:d}, '
log.debug('compare size: %d and %d, %d and %d, %d and %d, %d and %d' 'right={right:d}, bottom={bottom:d}'.format(left=left, top=top, right=right, bottom=bottom))
% (size.y(), top, size.height(), (bottom - top), size.x(), left, size.width(), (right - left))) log.debug('compare size: {y:d} and {top:d}, {height:d} and {vertical:d}, '
log.debug('window title: %s' % window_title) '{x:d} and {left}, {width:d} and {horizontal:d}'.format(y=size.y(),
top=top,
height=size.height(),
vertical=(bottom - top),
x=size.x(),
left=left,
width=size.width(),
horizontal=(right - left)))
log.debug('window title: {title}'.format(title=window_title))
filename_root, filename_ext = os.path.splitext(os.path.basename(self.file_path)) filename_root, filename_ext = os.path.splitext(os.path.basename(self.file_path))
if size.y() == top and size.height() == (bottom - top) and size.x() == left and \ if size.y() == top and size.height() == (bottom - top) and size.x() == left and \
size.width() == (right - left) and filename_root in window_title: size.width() == (right - left) and filename_root in window_title:
@ -416,8 +425,8 @@ class PowerpointDocument(PresentationDocument):
and self.get_slide_number() == slide_no: and self.get_slide_number() == slide_no:
click_index = self.presentation.SlideShowWindow.View.GetClickIndex() click_index = self.presentation.SlideShowWindow.View.GetClickIndex()
click_count = self.presentation.SlideShowWindow.View.GetClickCount() click_count = self.presentation.SlideShowWindow.View.GetClickCount()
log.debug('We are already on this slide - go to next effect if any left, idx: %d, count: %d' log.debug('We are already on this slide - go to next effect if any left, idx: '
% (click_index, click_count)) '{index:d}, count: {count:d}'.format(index=click_index, count=click_count))
if click_index < click_count: if click_index < click_count:
self.next_step() self.next_step()
else: else:

View File

@ -148,7 +148,7 @@ class PptviewDocument(PresentationDocument):
return return
log.debug('create_thumbnails proceeding') log.debug('create_thumbnails proceeding')
for idx in range(self.get_slide_count()): for idx in range(self.get_slide_count()):
path = '%s\\slide%s.bmp' % (self.get_temp_folder(), str(idx + 1)) path = '{folder}\\slide{index}.bmp'.format(folder=self.get_temp_folder(), index=str(idx + 1))
self.convert_thumbnail(path, idx + 1) self.convert_thumbnail(path, idx + 1)
def create_titles_and_notes(self): def create_titles_and_notes(self):

View File

@ -278,7 +278,7 @@ class PresentationDocument(object):
prefix = 'live' prefix = 'live'
else: else:
prefix = 'preview' prefix = 'preview'
Registry().execute('slidecontroller_%s_change' % prefix, self.slide_number - 1) Registry().execute('slidecontroller_{prefix}_change'.format(prefix=prefix), self.slide_number - 1)
def get_slide_text(self, slide_no): def get_slide_text(self, slide_no):
""" """
@ -312,7 +312,7 @@ class PresentationDocument(object):
log.exception('Failed to open/read existing titles file') log.exception('Failed to open/read existing titles file')
titles = [] titles = []
for slide_no, title in enumerate(titles, 1): for slide_no, title in enumerate(titles, 1):
notes_file = os.path.join(self.get_thumbnail_folder(), 'slideNotes%d.txt' % slide_no) notes_file = os.path.join(self.get_thumbnail_folder(), 'slideNotes{number:d}.txt'.format(number=slide_no))
note = '' note = ''
if os.path.exists(notes_file): if os.path.exists(notes_file):
try: try:
@ -335,7 +335,8 @@ class PresentationDocument(object):
fo.writelines(titles) fo.writelines(titles)
if notes: if notes:
for slide_no, note in enumerate(notes, 1): for slide_no, note in enumerate(notes, 1):
notes_file = os.path.join(self.get_thumbnail_folder(), 'slideNotes%d.txt' % slide_no) notes_file = os.path.join(self.get_thumbnail_folder(),
'slideNotes{number:d}.txt'.format(number=slide_no))
with open(notes_file, mode='wt', encoding='utf-8') as fn: with open(notes_file, mode='wt', encoding='utf-8') as fn:
fn.write(note) fn.write(note)

View File

@ -137,7 +137,8 @@ class PresentationTab(SettingsTab):
if checkbox.isEnabled(): if checkbox.isEnabled():
checkbox.setText(controller.name) checkbox.setText(controller.name)
else: else:
checkbox.setText(translate('PresentationPlugin.PresentationTab', '%s (unavailable)') % controller.name) checkbox.setText(translate('PresentationPlugin.PresentationTab',
'{name} (unavailable)').format(name=controller.name))
def load(self): def load(self):
""" """

View File

@ -128,11 +128,11 @@ class PresentationPlugin(Plugin):
path = os.path.join(controller_dir, filename) path = os.path.join(controller_dir, filename)
if os.path.isfile(path): if os.path.isfile(path):
module_name = 'openlp.plugins.presentations.lib.' + os.path.splitext(filename)[0] module_name = 'openlp.plugins.presentations.lib.' + os.path.splitext(filename)[0]
log.debug('Importing controller %s', module_name) log.debug('Importing controller {name}'.format(name=module_name))
try: try:
__import__(module_name, globals(), locals(), []) __import__(module_name, globals(), locals(), [])
except ImportError: except ImportError:
log.warning('Failed to import %s on path %s', module_name, path) log.warning('Failed to import {name} on path {path}'.format(name=module_name, path=path))
controller_classes = PresentationController.__subclasses__() controller_classes = PresentationController.__subclasses__()
for controller_class in controller_classes: for controller_class in controller_classes:
controller = controller_class(self) controller = controller_class(self)

View File

@ -250,3 +250,17 @@ class TestPJLink(TestCase):
# THEN: Shutter should be closed and mute should be True # THEN: Shutter should be closed and mute should be True
self.assertTrue(pjlink.shutter, 'Shutter should have been set to closed') self.assertTrue(pjlink.shutter, 'Shutter should have been set to closed')
self.assertTrue(pjlink.mute, 'Audio should be on') self.assertTrue(pjlink.mute, 'Audio should be on')
def projector_process_input_test(self):
"""
Test input source status shows current input
"""
# GIVEN: Test object
pjlink = pjlink_test
pjlink.source = '0'
# WHEN: Called with input source
pjlink.process_inpt('1')
# THEN: Input selected should reflect current input
self.assertEquals(pjlink.source, '1', 'Input source should be set to "1"')

View File

@ -29,6 +29,7 @@ import os
from unittest import TestCase from unittest import TestCase
from openlp.core.lib.projector.db import Manufacturer, Model, Projector, ProjectorDB, ProjectorSource, Source from openlp.core.lib.projector.db import Manufacturer, Model, Projector, ProjectorDB, ProjectorSource, Source
from openlp.core.lib.projector.constants import PJLINK_PORT
from tests.functional import MagicMock, patch from tests.functional import MagicMock, patch
from tests.resources.projector.data import TEST_DB, TEST1_DATA, TEST2_DATA, TEST3_DATA from tests.resources.projector.data import TEST_DB, TEST1_DATA, TEST2_DATA, TEST3_DATA
@ -195,7 +196,7 @@ class TestProjectorDB(TestCase):
def manufacturer_repr_test(self): def manufacturer_repr_test(self):
""" """
Test manufacturer class __repr__ text Test Manufacturer.__repr__ text
""" """
# GIVEN: Test object # GIVEN: Test object
manufacturer = Manufacturer() manufacturer = Manufacturer()
@ -209,7 +210,7 @@ class TestProjectorDB(TestCase):
def model_repr_test(self): def model_repr_test(self):
""" """
Test model class __repr__ text Test Model.__repr__ text
""" """
# GIVEN: Test object # GIVEN: Test object
model = Model() model = Model()
@ -223,7 +224,7 @@ class TestProjectorDB(TestCase):
def source_repr_test(self): def source_repr_test(self):
""" """
Test source.__repr__ text Test Source.__repr__ text
""" """
# GIVEN: Test object # GIVEN: Test object
source = Source() source = Source()
@ -236,3 +237,31 @@ class TestProjectorDB(TestCase):
# THEN: __repr__ should return a proper string # THEN: __repr__ should return a proper string
self.assertEqual(str(source), '<Source(pjlink_name="Test object", pjlink_code="11", text="Input text")>', self.assertEqual(str(source), '<Source(pjlink_name="Test object", pjlink_code="11", text="Input text")>',
'Source.__repr__() should have returned a proper representation string') 'Source.__repr__() should have returned a proper representation string')
def projector_repr_test(self):
"""
Test Projector.__repr__() text
"""
# GIVEN: Test object
projector = Projector()
# WHEN: projector() is populated
# NOTE: projector.pin, projector.other, projector.sources should all return None
# projector.source_list should return an empty list
projector.id = 0
projector.ip = '127.0.0.1'
projector.port = PJLINK_PORT
projector.name = 'Test One'
projector.location = 'Somewhere over the rainbow'
projector.notes = 'Not again'
projector.pjlink_name = 'TEST'
projector.manufacturer = 'IN YOUR DREAMS'
projector.model = 'OpenLP'
# THEN: __repr__ should return a proper string
self.assertEqual(str(projector),
'< Projector(id="0", ip="127.0.0.1", port="4352", pin="None", name="Test One", '
'location="Somewhere over the rainbow", notes="Not again", pjlink_name="TEST", '
'manufacturer="IN YOUR DREAMS", model="OpenLP", other="None", sources="None", '
'source_list="[]") >',
'Projector.__repr__() should have returned a proper representation string')

View File

@ -104,7 +104,7 @@ class TestBSExtract(TestCase):
result = instance.get_books_from_http('NIV') result = instance.get_books_from_http('NIV')
# THEN: The rest mocks should be called with known values and get_books_from_http should return None # THEN: The rest mocks should be called with known values and get_books_from_http should return None
self.mock_log.debug.assert_called_once_with('BSExtract.get_books_from_http("%s")', 'NIV') self.mock_log.debug.assert_called_once_with('BSExtract.get_books_from_http("{book}")'.format(book='NIV'))
self.mock_urllib.parse.quote.assert_called_once_with(b'NIV') self.mock_urllib.parse.quote.assert_called_once_with(b'NIV')
self.mock_get_soup_for_bible_ref.assert_called_once_with( self.mock_get_soup_for_bible_ref.assert_called_once_with(
'http://m.bibleserver.com/overlay/selectBook?translation=NIV') 'http://m.bibleserver.com/overlay/selectBook?translation=NIV')
@ -132,7 +132,7 @@ class TestBSExtract(TestCase):
result = instance.get_books_from_http('NIV') result = instance.get_books_from_http('NIV')
# THEN: The rest mocks should be called with known values and get_books_from_http should return None # THEN: The rest mocks should be called with known values and get_books_from_http should return None
self.mock_log.debug.assert_called_once_with('BSExtract.get_books_from_http("%s")', 'NIV') self.mock_log.debug.assert_called_once_with('BSExtract.get_books_from_http("{book}")'.format(book='NIV'))
self.mock_urllib.parse.quote.assert_called_once_with(b'NIV') self.mock_urllib.parse.quote.assert_called_once_with(b'NIV')
self.mock_get_soup_for_bible_ref.assert_called_once_with( self.mock_get_soup_for_bible_ref.assert_called_once_with(
'http://m.bibleserver.com/overlay/selectBook?translation=NIV') 'http://m.bibleserver.com/overlay/selectBook?translation=NIV')
@ -167,7 +167,7 @@ class TestBSExtract(TestCase):
# THEN: The rest mocks should be called with known values and get_books_from_http should return the two books # THEN: The rest mocks should be called with known values and get_books_from_http should return the two books
# in the test data # in the test data
self.mock_log.debug.assert_called_once_with('BSExtract.get_books_from_http("%s")', 'NIV') self.mock_log.debug.assert_called_once_with('BSExtract.get_books_from_http("{book}")'.format(book='NIV'))
self.mock_urllib.parse.quote.assert_called_once_with(b'NIV') self.mock_urllib.parse.quote.assert_called_once_with(b'NIV')
self.mock_get_soup_for_bible_ref.assert_called_once_with( self.mock_get_soup_for_bible_ref.assert_called_once_with(
'http://m.bibleserver.com/overlay/selectBook?translation=NIV') 'http://m.bibleserver.com/overlay/selectBook?translation=NIV')