diff --git a/openlp.pyw b/openlp.pyw
index afd0b01f8..0bd7c940d 100755
--- a/openlp.pyw
+++ b/openlp.pyw
@@ -133,6 +133,7 @@ class OpenLP(QtGui.QApplication):
u'general/update check', QtCore.QVariant(True)).toBool()
if update_check:
VersionThread(self.mainWindow).start()
+ Receiver.send_message(u'maindisplay_blank_check')
self.mainWindow.appStartup()
DelayStartThread(self.mainWindow).start()
return self.exec_()
diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py
index 2d3e55355..75bafc5e8 100644
--- a/openlp/core/lib/__init__.py
+++ b/openlp/core/lib/__init__.py
@@ -137,13 +137,12 @@ def image_to_byte(image):
# convert to base64 encoding so does not get missed!
return byte_array.toBase64()
-def resize_image(image, width, height, background=QtCore.Qt.black):
+def resize_image(image_path, width, height, background=QtCore.Qt.black):
"""
Resize an image to fit on the current screen.
- ``image``
- The image to resize. It has to be either a ``QImage`` instance or the
- path to the image.
+ ``image_path``
+ The path to the image to resize.
``width``
The new image width.
@@ -155,16 +154,24 @@ def resize_image(image, width, height, background=QtCore.Qt.black):
The background colour defaults to black.
"""
log.debug(u'resize_image - start')
- if isinstance(image, QtGui.QImage):
- preview = image
+ reader = QtGui.QImageReader(image_path)
+ # The image's ratio.
+ image_ratio = float(reader.size().width()) / float(reader.size().height())
+ resize_ratio = float(width) / float(height)
+ # Figure out the size we want to resize the image to (keep aspect ratio).
+ if image_ratio == resize_ratio:
+ size = QtCore.QSize(width, height)
+ elif image_ratio < resize_ratio:
+ # Use the image's height as reference for the new size.
+ size = QtCore.QSize(image_ratio * height, height)
else:
- preview = QtGui.QImage(image)
- if not preview.isNull():
- # Only resize if different size
- if preview.width() == width and preview.height == height:
- return preview
- preview = preview.scaled(width, height, QtCore.Qt.KeepAspectRatio,
- QtCore.Qt.SmoothTransformation)
+ # Use the image's width as reference for the new size.
+ size = QtCore.QSize(width, 1 / (image_ratio / width))
+ reader.setScaledSize(size)
+ preview = reader.read()
+ if image_ratio == resize_ratio:
+ # We neither need to centre the image nor add "bars" to the image.
+ return preview
realw = preview.width()
realh = preview.height()
# and move it to the centre of the preview space
diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py
index 602b3c55b..61e1213db 100644
--- a/openlp/core/lib/mediamanageritem.py
+++ b/openlp/core/lib/mediamanageritem.py
@@ -91,7 +91,8 @@ class MediaManagerItem(QtGui.QWidget):
Constructor to create the media manager item.
"""
QtGui.QWidget.__init__(self, parent)
- self.whitespace = re.compile(r'\W+', re.UNICODE)
+ self.hide()
+ self.whitespace = re.compile(r'[\W_]+', re.UNICODE)
self.plugin = plugin
visible_title = self.plugin.getString(StringContent.VisibleName)
self.title = unicode(visible_title[u'title'])
@@ -390,21 +391,26 @@ class MediaManagerItem(QtGui.QWidget):
self.iconFromFile(image, thumb)
return True
- def iconFromFile(self, image, thumb):
+ def iconFromFile(self, image_path, thumb_path):
"""
Create a thumbnail icon from a given image.
- ``image``
+ ``image_path``
The image file to create the icon from.
- ``thumb``
- The filename to save the thumbnail to
+ ``thumb_path``
+ The filename to save the thumbnail to.
"""
- icon = build_icon(unicode(image))
- pixmap = icon.pixmap(QtCore.QSize(88, 50))
- ext = os.path.splitext(thumb)[1].lower()
- pixmap.save(thumb, ext[1:])
- return icon
+ ext = os.path.splitext(thumb_path)[1].lower()
+ reader = QtGui.QImageReader(image_path)
+ ratio = float(reader.size().width()) / float(reader.size().height())
+ reader.setScaledSize(QtCore.QSize(int(ratio * 88), 88))
+ thumb = reader.read()
+ thumb.save(thumb_path, ext[1:])
+ if os.path.exists(thumb_path):
+ return build_icon(unicode(thumb_path))
+ # Fallback for files with animation support.
+ return build_icon(unicode(image_path))
def loadList(self, list):
raise NotImplementedError(u'MediaManagerItem.loadList needs to be '
@@ -453,7 +459,8 @@ class MediaManagerItem(QtGui.QWidget):
"""
if QtCore.QSettings().value(u'advanced/single click preview',
QtCore.QVariant(False)).toBool() and self.quickPreviewAllowed \
- and self.listView.selectedIndexes():
+ and self.listView.selectedIndexes() \
+ and self.auto_select_id == -1:
self.onPreviewClick(True)
def onPreviewClick(self, keepFocus=False):
diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py
index 65ed76dfe..910c52d2c 100644
--- a/openlp/core/lib/plugin.py
+++ b/openlp/core/lib/plugin.py
@@ -300,6 +300,12 @@ class Plugin(QtCore.QObject):
if self.mediaItem:
self.mediadock.remove_dock(self.mediaItem)
+ def appStartup(self):
+ """
+ Perform tasks on application starup
+ """
+ pass
+
def usesTheme(self, theme):
"""
Called to find out if a plugin is currently using a theme.
diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py
index 4acf88202..f9af00f6e 100644
--- a/openlp/core/lib/renderer.py
+++ b/openlp/core/lib/renderer.py
@@ -67,7 +67,7 @@ class Renderer(object):
``theme_manager``
The ThemeManager instance, used to get the current theme details.
"""
- log.debug(u'Initilisation started')
+ log.debug(u'Initialisation started')
self.theme_manager = theme_manager
self.image_manager = image_manager
self.screens = ScreenList.get_instance()
@@ -86,6 +86,8 @@ class Renderer(object):
"""
log.debug(u'Update Display')
self._calculate_default(self.screens.current[u'size'])
+ if self.display:
+ self.display.close()
self.display = MainDisplay(None, self.image_manager, False)
self.display.setup()
self.bg_frame = None
@@ -241,7 +243,7 @@ class Renderer(object):
``screen``
The QSize of the screen.
"""
- log.debug(u'calculate default %s', screen)
+ log.debug(u'_calculate default %s', screen)
self.width = screen.width()
self.height = screen.height()
self.screen_ratio = float(self.height) / float(self.width)
@@ -286,7 +288,7 @@ class Renderer(object):
``rect_footer``
The footer text block.
"""
- log.debug(u'set_text_rectangle %s , %s' % (rect_main, rect_footer))
+ log.debug(u'_set_text_rectangle %s , %s' % (rect_main, rect_footer))
self._rect = rect_main
self._rect_footer = rect_footer
self.page_width = self._rect.width()
@@ -339,7 +341,7 @@ class Renderer(object):
# Text too long so go to next page.
if self.web_frame.contentsSize().height() > self.page_height:
if force_page and line_count > 0:
- Receiver.send_message(u'theme_line_count', line_count)
+ Receiver.send_message(u'theme_line_count', line_count - 1)
line_count = -1
while html_text.endswith(u'
'):
html_text = html_text[:-4]
diff --git a/openlp/core/ui/exceptionform.py b/openlp/core/ui/exceptionform.py
index 69f3c14af..f240561ff 100644
--- a/openlp/core/ui/exceptionform.py
+++ b/openlp/core/ui/exceptionform.py
@@ -106,7 +106,7 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog):
"""
Saving exception log and system informations to a file.
"""
- report = unicode(translate('OpenLP.ExceptionForm',
+ report_text = unicode(translate('OpenLP.ExceptionForm',
'**OpenLP Bug Report**\n'
'Version: %s\n\n'
'--- Details of the Exception. ---\n\n%s\n\n '
@@ -122,21 +122,21 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog):
filename = unicode(QtCore.QDir.toNativeSeparators(filename))
SettingsManager.set_last_dir(self.settingsSection, os.path.dirname(
filename))
- report = report % self._createReport()
+ report_text = report_text % self._createReport()
try:
- file = open(filename, u'w')
+ report_file = open(filename, u'w')
try:
- file.write(report)
+ report_file.write(report_text)
except UnicodeError:
- file.close()
- file = open(filename, u'wb')
- file.write(report.encode(u'utf-8'))
+ report_file.close()
+ report_file = open(filename, u'wb')
+ report_file.write(report_text.encode(u'utf-8'))
finally:
- file.close()
+ report_file.close()
except IOError:
log.exception(u'Failed to write crash report')
finally:
- file.close()
+ report_file.close()
def onSendReportButtonPressed(self):
"""
diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py
index 715bb3b5b..0db8bb26f 100644
--- a/openlp/core/ui/maindisplay.py
+++ b/openlp/core/ui/maindisplay.py
@@ -63,6 +63,7 @@ class MainDisplay(QtGui.QGraphicsView):
self.setStyleSheet(u'border: 0px; margin: 0px; padding: 0px;')
self.setWindowFlags(QtCore.Qt.FramelessWindowHint | QtCore.Qt.Tool |
QtCore.Qt.WindowStaysOnTopHint)
+ self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
if self.isLive:
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'maindisplay_hide'), self.hideDisplay)
@@ -148,7 +149,6 @@ class MainDisplay(QtGui.QGraphicsView):
self.__hideMouse()
# To display or not to display?
if not self.screen[u'primary']:
- self.show()
self.primary = False
else:
self.primary = True
diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py
index 6a5a753f3..b4a3b3640 100644
--- a/openlp/core/ui/mainwindow.py
+++ b/openlp/core/ui/mainwindow.py
@@ -655,7 +655,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
# Give all the plugins a chance to perform some tasks at startup
Receiver.send_message(u'openlp_process_events')
for plugin in self.pluginManager.plugins:
- if hasattr(plugin, u'appStartup'):
+ if plugin.isActive():
Receiver.send_message(u'openlp_process_events')
plugin.appStartup()
Receiver.send_message(u'openlp_process_events')
@@ -678,13 +678,12 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
def blankCheck(self):
"""
Check and display message if screen blank on setup.
- Triggered by delay thread.
"""
settings = QtCore.QSettings()
+ self.liveController.mainDisplaySetBackground()
if settings.value(u'%s/screen blank' % self.generalSettingsSection,
QtCore.QVariant(False)).toBool():
- self.liveController.mainDisplaySetBackground()
- if settings.value(u'blank warning',
+ if settings.value(u'%s/blank warning' % self.generalSettingsSection,
QtCore.QVariant(False)).toBool():
QtGui.QMessageBox.question(self,
translate('OpenLP.MainWindow',
diff --git a/openlp/core/ui/pluginform.py b/openlp/core/ui/pluginform.py
index c93b08ccb..b4c87488c 100644
--- a/openlp/core/ui/pluginform.py
+++ b/openlp/core/ui/pluginform.py
@@ -132,6 +132,7 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog):
Receiver.send_message(u'cursor_busy')
self.activePlugin.toggleStatus(PluginStatus.Active)
Receiver.send_message(u'cursor_normal')
+ self.activePlugin.appStartup()
else:
self.activePlugin.toggleStatus(PluginStatus.Inactive)
status_text = unicode(
diff --git a/openlp/core/ui/screen.py b/openlp/core/ui/screen.py
index 2b6e10644..b970158b2 100644
--- a/openlp/core/ui/screen.py
+++ b/openlp/core/ui/screen.py
@@ -79,7 +79,7 @@ class ScreenList(object):
``number``
The number of the screen, which size has changed.
"""
- log.info(u'screenResolutionChanged %d' % number)
+ log.info(u'screen_resolution_changed %d' % number)
for screen in self.screen_list:
if number == screen[u'number']:
newScreen = {
@@ -104,6 +104,9 @@ class ScreenList(object):
``changed_screen``
The screen's number which has been (un)plugged.
"""
+ # Do not log at start up.
+ if changed_screen != -1:
+ log.info(u'screen_count_changed %d' % self.desktop.numScreens())
# Remove unplugged screens.
for screen in copy.deepcopy(self.screen_list):
if screen[u'number'] == self.desktop.numScreens():
@@ -116,8 +119,7 @@ class ScreenList(object):
u'size': self.desktop.screenGeometry(number),
u'primary': (self.desktop.primaryScreen() == number)
})
- # We do not want to send this message, when the method is called the
- # first time.
+ # We do not want to send this message at start up.
if changed_screen != -1:
# Reload setting tabs to apply possible changes.
Receiver.send_message(u'config_screen_changed')
@@ -241,6 +243,7 @@ class ScreenList(object):
height = settings.value(u'height',
QtCore.QVariant(self.current[u'size'].height())).toInt()[0]
self.override[u'size'] = QtCore.QRect(x, y, width, height)
+ self.override[u'primary'] = False
settings.endGroup()
if override_display:
self.set_override_display()
diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py
index 349b0a4a3..8a018d915 100644
--- a/openlp/core/ui/servicemanager.py
+++ b/openlp/core/ui/servicemanager.py
@@ -959,6 +959,7 @@ class ServiceManager(QtGui.QWidget):
treewidgetitem.setToolTip(0, serviceitem.notes)
treewidgetitem.setData(0, QtCore.Qt.UserRole,
QtCore.QVariant(item[u'order']))
+ treewidgetitem.setSelected(item[u'selected'])
# Add the children to their parent treewidgetitem.
for count, frame in enumerate(serviceitem.get_frames()):
child = QtGui.QTreeWidgetItem(treewidgetitem)
@@ -1030,16 +1031,35 @@ class ServiceManager(QtGui.QWidget):
# force reset of renderer as theme data has changed
self.mainwindow.renderer.themedata = None
if self.serviceItems:
+ for item in self.serviceItems:
+ item[u'selected'] = False
+ serviceIterator = QtGui.QTreeWidgetItemIterator(
+ self.serviceManagerList)
+ selectedItem = None
+ while serviceIterator.value():
+ if serviceIterator.value().isSelected():
+ selectedItem = serviceIterator.value()
+ serviceIterator += 1
+ if selectedItem is not None:
+ if selectedItem.parent() is None:
+ pos = selectedItem.data(0, QtCore.Qt.UserRole).toInt()[0]
+ else:
+ pos = selectedItem.parent().data(0, QtCore.Qt.UserRole). \
+ toInt()[0]
+ self.serviceItems[pos - 1][u'selected'] = True
tempServiceItems = self.serviceItems
self.serviceManagerList.clear()
self.serviceItems = []
self.isNew = True
for item in tempServiceItems:
self.addServiceItem(
- item[u'service_item'], False, expand=item[u'expanded'])
+ item[u'service_item'], False, expand=item[u'expanded'],
+ repaint=False, selected=item[u'selected'])
# Set to False as items may have changed rendering
# does not impact the saved song so True may also be valid
self.setModified()
+ # Repaint it once only at the end
+ self.repaintServiceList(-1, -1)
Receiver.send_message(u'cursor_normal')
def serviceItemUpdate(self, message):
@@ -1069,7 +1089,7 @@ class ServiceManager(QtGui.QWidget):
self.setModified()
def addServiceItem(self, item, rebuild=False, expand=None, replace=False,
- repaint=True):
+ repaint=True, selected=False):
"""
Add a Service item to the list
@@ -1097,17 +1117,17 @@ class ServiceManager(QtGui.QWidget):
for inditem in item:
self.serviceItems.append({u'service_item': inditem,
u'order': len(self.serviceItems) + 1,
- u'expanded': expand})
+ u'expanded': expand, u'selected': selected})
else:
self.serviceItems.append({u'service_item': item,
u'order': len(self.serviceItems) + 1,
- u'expanded': expand})
+ u'expanded': expand, u'selected': selected})
if repaint:
self.repaintServiceList(len(self.serviceItems) - 1, -1)
else:
self.serviceItems.insert(self.dropPosition,
{u'service_item': item, u'order': self.dropPosition,
- u'expanded': expand})
+ u'expanded': expand, u'selected': selected})
self.repaintServiceList(self.dropPosition, -1)
# if rebuilding list make sure live is fixed.
if rebuild:
diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py
index a59f00f21..d490f3bce 100644
--- a/openlp/core/ui/slidecontroller.py
+++ b/openlp/core/ui/slidecontroller.py
@@ -59,6 +59,7 @@ class SlideController(QtGui.QWidget):
"""
QtGui.QWidget.__init__(self, parent)
self.isLive = isLive
+ self.display = None
self.screens = ScreenList.get_instance()
self.ratio = float(self.screens.current[u'size'].width()) / \
float(self.screens.current[u'size'].height())
@@ -422,6 +423,8 @@ class SlideController(QtGui.QWidget):
screen previews.
"""
# rebuild display as screen size changed
+ if self.display:
+ self.display.close()
self.display = MainDisplay(self, self.image_manager, self.isLive)
self.display.alertTab = self.alertTab
self.display.setup()
@@ -742,8 +745,10 @@ class SlideController(QtGui.QWidget):
self.onThemeDisplay(True)
elif display_type == u'hidden':
self.onHideDisplay(True)
- else:
+ elif display_type == u'blanked':
self.onBlankDisplay(True)
+ else:
+ Receiver.send_message(u'maindisplay_show')
def onSlideBlank(self):
"""
diff --git a/openlp/core/ui/themeform.py b/openlp/core/ui/themeform.py
index bae3e8692..921cab048 100644
--- a/openlp/core/ui/themeform.py
+++ b/openlp/core/ui/themeform.py
@@ -202,7 +202,7 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard):
Updates the lines on a page on the wizard
"""
self.mainLineCountLabel.setText(unicode(translate('OpenLP.ThemeForm',
- '(%d lines per slide)')) % int(lines))
+ '(approximately %d lines per slide)')) % int(lines))
def resizeEvent(self, event=None):
"""
diff --git a/openlp/core/utils/__init__.py b/openlp/core/utils/__init__.py
index 4ef445e36..ec20346d8 100644
--- a/openlp/core/utils/__init__.py
+++ b/openlp/core/utils/__init__.py
@@ -69,7 +69,6 @@ class VersionThread(QtCore.QThread):
Run the thread.
"""
time.sleep(1)
- Receiver.send_message(u'maindisplay_blank_check')
app_version = get_application_version()
version = check_latest_version(app_version)
remote_version = {}
diff --git a/openlp/core/utils/languagemanager.py b/openlp/core/utils/languagemanager.py
index 0c0a4ed56..475d0a47a 100644
--- a/openlp/core/utils/languagemanager.py
+++ b/openlp/core/utils/languagemanager.py
@@ -77,6 +77,8 @@ class LanguageManager(object):
AppLocation.LanguageDir))
file_names = trans_dir.entryList(QtCore.QStringList(u'*.qm'),
QtCore.QDir.Files, QtCore.QDir.Name)
+ # Remove qm files from the list which start with "qt_".
+ file_names = file_names.filter(QtCore.QRegExp("^(?!qt_)"))
for name in file_names:
file_names.replaceInStrings(name, trans_dir.filePath(name))
return file_names
diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py
index 0fdcdfd11..7913aac31 100644
--- a/openlp/plugins/bibles/forms/bibleupgradeform.py
+++ b/openlp/plugins/bibles/forms/bibleupgradeform.py
@@ -33,7 +33,8 @@ import shutil
from PyQt4 import QtCore, QtGui
-from openlp.core.lib import Receiver, SettingsManager, translate
+from openlp.core.lib import Receiver, SettingsManager, translate, \
+ check_directory_exists
from openlp.core.lib.db import delete_database
from openlp.core.lib.ui import UiStrings, critical_error_message_box
from openlp.core.ui.wizard import OpenLPWizard, WizardStrings
@@ -94,7 +95,7 @@ class BibleUpgradeForm(OpenLPWizard):
def onCheckBoxIndexChanged(self, index):
"""
- Show/ Hide warnings if CheckBox state has changed
+ Show/Hide warnings if CheckBox state has changed
"""
for number, filename in enumerate(self.files):
if not self.checkBox[number].checkState() == QtCore.Qt.Checked:
@@ -114,6 +115,8 @@ class BibleUpgradeForm(OpenLPWizard):
self.stop_import_flag = True
if not self.currentPage() == self.progressPage:
self.done(QtGui.QDialog.Rejected)
+ else:
+ self.postWizard()
def onCurrentIdChanged(self, pageId):
"""
@@ -126,14 +129,6 @@ class BibleUpgradeForm(OpenLPWizard):
elif self.page(pageId) == self.selectPage and self.maxBibles == 0:
self.next()
- def onFinishButton(self):
- """
- Some cleanup while finishing
- """
- for number, filename in enumerate(self.files):
- if number in self.success and self.success[number] == True:
- delete_file(os.path.join(self.path, filename[0]))
-
def onBackupBrowseButtonClicked(self):
"""
Show the file open dialog for the OSIS file.
@@ -154,17 +149,19 @@ class BibleUpgradeForm(OpenLPWizard):
self.backupDirectoryEdit.setEnabled(not checked)
self.backupBrowseButton.setEnabled(not checked)
- def backupOldBibles(self, backupdirectory):
+ def backupOldBibles(self, backup_directory):
"""
Backup old bible databases in a given folder.
"""
+ check_directory_exists(backup_directory)
+ success = True
for filename in self.files:
try:
- shutil.copy(os.path.join(self.path, filename[0]),
- backupdirectory)
+ shutil.copy(os.path.join(self.path, filename[0]),
+ backup_directory)
except:
- return False
- return True
+ success = False
+ return success
def customInit(self):
"""
@@ -177,8 +174,6 @@ class BibleUpgradeForm(OpenLPWizard):
"""
Set up the signals used in the bible importer.
"""
- QtCore.QObject.connect(self.finishButton,
- QtCore.SIGNAL(u'clicked()'), self.onFinishButton)
QtCore.QObject.connect(self.backupBrowseButton,
QtCore.SIGNAL(u'clicked()'), self.onBackupBrowseButtonClicked)
QtCore.QObject.connect(self.noBackupCheckBox,
@@ -318,7 +313,7 @@ class BibleUpgradeForm(OpenLPWizard):
QtGui.QFormLayout.FieldRole, self.versionNameEdit[number])
self.versionNameEdit[number].setText(bible.get_name())
self.formLayout.addWidget(self.formWidget[number])
- #Set up the Signal for the checkbox
+ # Set up the Signal for the checkbox.
QtCore.QObject.connect(self.checkBox[number],
QtCore.SIGNAL(u'stateChanged(int)'),
self.onCheckBoxIndexChanged)
@@ -414,29 +409,22 @@ class BibleUpgradeForm(OpenLPWizard):
return True
elif self.currentPage() == self.backupPage:
if not self.noBackupCheckBox.checkState() == QtCore.Qt.Checked:
- if not unicode(self.backupDirectoryEdit.text()):
+ backup_path = unicode(self.backupDirectoryEdit.text())
+ if not backup_path:
critical_error_message_box(UiStrings().EmptyField,
translate('BiblesPlugin.UpgradeWizardForm',
'You need to specify a Backup Directory for your '
'Bibles.'))
self.backupDirectoryEdit.setFocus()
return False
- elif not os.path.exists(unicode(
- self.backupDirectoryEdit.text())):
- critical_error_message_box(UiStrings().Error,
- translate('BiblesPlugin.UpgradeWizardForm',
- 'The given path is not an existing directory.'))
- self.backupDirectoryEdit.setFocus()
- return False
else:
- if not self.backupOldBibles(unicode(
- self.backupDirectoryEdit.text())):
+ if not self.backupOldBibles(backup_path):
critical_error_message_box(UiStrings().Error,
- translate('BiblesPlugin.UpgradeWizardForm',
- 'The backup was not successfull.\nTo backup your '
- 'Bibles you need the permission to write in the given '
- 'directory. If you have a permissions to write and '
- 'this error still occurs, please report a bug.'))
+ translate('BiblesPlugin.UpgradeWizardForm',
+ 'The backup was not successful.\nTo backup your '
+ 'Bibles you need permission to write to the given '
+ 'directory. If you have write permissions and this '
+ 'error still occurs, please report a bug.'))
return False
return True
elif self.currentPage() == self.selectPage:
@@ -540,7 +528,7 @@ class BibleUpgradeForm(OpenLPWizard):
"""
Perform the actual upgrade.
"""
- include_webbible = False
+ self.include_webbible = False
proxy_server = None
if self.maxBibles == 0:
self.progressLabel.setText(
@@ -582,19 +570,19 @@ class BibleUpgradeForm(OpenLPWizard):
name = unicode(self.versionNameEdit[biblenumber].text())
self.newbibles[number] = BibleDB(self.mediaItem, path=self.path,
name=name)
+ self.newbibles[number].register(self.plugin.upgrade_wizard)
metadata = oldbible.get_metadata()
webbible = False
meta_data = {}
for meta in metadata:
meta_data[meta[u'key']] = meta[u'value']
- if not meta[u'key'] == u'Version':
+ if not meta[u'key'] == u'Version' and not meta[u'key'] == \
+ u'dbversion':
self.newbibles[number].create_meta(meta[u'key'],
meta[u'value'])
- else:
- self.newbibles[number].create_meta(meta[u'key'], name)
if meta[u'key'] == u'download source':
webbible = True
- include_webbible = True
+ self.include_webbible = True
if meta.has_key(u'proxy server'):
proxy_server = meta[u'proxy server']
if webbible:
@@ -606,12 +594,11 @@ class BibleUpgradeForm(OpenLPWizard):
handler = BSExtract(proxy_server)
books = handler.get_books_from_http(meta_data[u'download name'])
if not books:
- log.exception(u'Upgrading books from %s - download '\
+ log.error(u'Upgrading books from %s - download '\
u'name: "%s" failed' % (
meta_data[u'download source'],
meta_data[u'download name']))
- delete_database(self.path,
- clean_filename(self.newbibles[number].get_name()))
+ delete_database(self.path, clean_filename(name))
del self.newbibles[number]
critical_error_message_box(
translate('BiblesPlugin.UpgradeWizardForm',
@@ -630,16 +617,15 @@ class BibleUpgradeForm(OpenLPWizard):
bible = BiblesResourcesDB.get_webbible(
meta_data[u'download name'],
meta_data[u'download source'].lower())
- if bible[u'language_id']:
+ if bible and bible[u'language_id']:
language_id = bible[u'language_id']
self.newbibles[number].create_meta(u'language_id',
language_id)
else:
language_id = self.newbibles[number].get_language(name)
if not language_id:
- log.exception(u'Upgrading from "%s" failed' % filename[0])
- delete_database(self.path,
- clean_filename(self.newbibles[number].get_name()))
+ log.warn(u'Upgrading from "%s" failed' % filename[0])
+ delete_database(self.path, clean_filename(name))
del self.newbibles[number]
self.incrementProgressBar(unicode(translate(
'BiblesPlugin.UpgradeWizardForm',
@@ -661,27 +647,42 @@ class BibleUpgradeForm(OpenLPWizard):
book_ref_id = self.newbibles[number].\
get_book_ref_id_by_name(book, len(books), language_id)
if not book_ref_id:
- log.exception(u'Upgrading books from %s - download '\
+ log.warn(u'Upgrading books from %s - download '\
u'name: "%s" aborted by user' % (
meta_data[u'download source'],
meta_data[u'download name']))
- delete_database(self.path,
- clean_filename(self.newbibles[number].get_name()))
+ delete_database(self.path, clean_filename(name))
del self.newbibles[number]
bible_failed = True
break
book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
- self.newbibles[number].create_book(book, book_ref_id,
- book_details[u'testament_id'])
+ db_book = self.newbibles[number].create_book(book,
+ book_ref_id, book_details[u'testament_id'])
+ # Try to import still downloaded verses
+ oldbook = oldbible.get_book(book)
+ if oldbook:
+ verses = oldbible.get_verses(oldbook[u'id'])
+ if not verses:
+ log.warn(u'No verses found to import for book '
+ u'"%s"', book)
+ continue
+ for verse in verses:
+ if self.stop_import_flag:
+ bible_failed = True
+ break
+ self.newbibles[number].create_verse(db_book.id,
+ int(verse[u'chapter']),
+ int(verse[u'verse']), unicode(verse[u'text']))
+ Receiver.send_message(u'openlp_process_events')
+ self.newbibles[number].session.commit()
else:
language_id = self.newbibles[number].get_object(BibleMeta,
u'language_id')
if not language_id:
language_id = self.newbibles[number].get_language(name)
if not language_id:
- log.exception(u'Upgrading books from "%s" failed' % name)
- delete_database(self.path,
- clean_filename(self.newbibles[number].get_name()))
+ log.warn(u'Upgrading books from "%s" failed' % name)
+ delete_database(self.path, clean_filename(name))
del self.newbibles[number]
self.incrementProgressBar(unicode(translate(
'BiblesPlugin.UpgradeWizardForm',
@@ -705,10 +706,9 @@ class BibleUpgradeForm(OpenLPWizard):
get_book_ref_id_by_name(book[u'name'], len(books),
language_id)
if not book_ref_id:
- log.exception(u'Upgrading books from %s " '\
+ log.warn(u'Upgrading books from %s " '\
'failed - aborted by user' % name)
- delete_database(self.path,
- clean_filename(self.newbibles[number].get_name()))
+ delete_database(self.path, clean_filename(name))
del self.newbibles[number]
bible_failed = True
break
@@ -717,7 +717,7 @@ class BibleUpgradeForm(OpenLPWizard):
book_ref_id, book_details[u'testament_id'])
verses = oldbible.get_verses(book[u'id'])
if not verses:
- log.exception(u'No verses found to import for book '
+ log.warn(u'No verses found to import for book '
u'"%s"', book[u'name'])
self.newbibles[number].delete_book(db_book)
continue
@@ -731,6 +731,8 @@ class BibleUpgradeForm(OpenLPWizard):
Receiver.send_message(u'openlp_process_events')
self.newbibles[number].session.commit()
if not bible_failed:
+ self.newbibles[number].create_meta(u'Version', name)
+ delete_file(os.path.join(self.path, filename[0]))
self.incrementProgressBar(unicode(translate(
'BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\n'
@@ -743,10 +745,13 @@ class BibleUpgradeForm(OpenLPWizard):
'Upgrading Bible %s of %s: "%s"\nFailed')) %
(number + 1, self.maxBibles, name),
self.progressBar.maximum() - self.progressBar.value())
- delete_database(self.path,
- clean_filename(name))
+ delete_database(self.path, clean_filename(name))
number += 1
- self.mediaItem.reloadBibles()
+
+ def postWizard(self):
+ """
+ Clean up the UI after the import has finished.
+ """
successful_import = 0
failed_import = 0
for number, filename in enumerate(self.files):
@@ -761,7 +766,7 @@ class BibleUpgradeForm(OpenLPWizard):
else:
failed_import_text = u''
if successful_import > 0:
- if include_webbible:
+ if self.include_webbible:
self.progressLabel.setText(unicode(
translate('BiblesPlugin.UpgradeWizardForm', 'Upgrading '
'Bible(s): %s successful%s\nPlease note, that verses from '
@@ -777,3 +782,4 @@ class BibleUpgradeForm(OpenLPWizard):
self.progressLabel.setText(
translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade '
'failed.'))
+ OpenLPWizard.postWizard(self)
diff --git a/openlp/plugins/bibles/forms/booknameform.py b/openlp/plugins/bibles/forms/booknameform.py
index 28e4c9df1..b07f28bf1 100644
--- a/openlp/plugins/bibles/forms/booknameform.py
+++ b/openlp/plugins/bibles/forms/booknameform.py
@@ -70,15 +70,15 @@ class BookNameForm(QDialog, Ui_BookNameDialog):
self.onCheckBoxIndexChanged)
def onCheckBoxIndexChanged(self, index):
- '''
+ """
Reload Combobox if CheckBox state has changed
- '''
+ """
self.reloadComboBox()
def reloadComboBox(self):
- '''
+ """
Reload the Combobox items
- '''
+ """
self.correspondingComboBox.clear()
items = BiblesResourcesDB.get_books()
for item in items:
diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py
index 776521aa6..41dc947f9 100644
--- a/openlp/plugins/bibles/lib/db.py
+++ b/openlp/plugins/bibles/lib/db.py
@@ -381,6 +381,7 @@ class BibleDB(QtCore.QObject, Manager):
"""
log.debug(u'BibleDB.get_verses("%s")', reference_list)
verse_list = []
+ book_error = False
for book_id, chapter, start_verse, end_verse in reference_list:
db_book = self.get_book_by_book_ref_id(book_id)
if db_book:
@@ -398,12 +399,13 @@ class BibleDB(QtCore.QObject, Manager):
verse_list.extend(verses)
else:
log.debug(u'OpenLP failed to find book with id "%s"', book_id)
- if show_error:
- critical_error_message_box(
- translate('BiblesPlugin', 'No Book Found'),
- translate('BiblesPlugin', 'No matching book '
- 'could be found in this Bible. Check that you '
- 'have spelled the name of the book correctly.'))
+ book_error = True
+ if book_error and show_error:
+ critical_error_message_box(
+ translate('BiblesPlugin', 'No Book Found'),
+ translate('BiblesPlugin', 'No matching book '
+ 'could be found in this Bible. Check that you '
+ 'have spelled the name of the book correctly.'))
return verse_list
def verse_search(self, text):
@@ -1043,6 +1045,28 @@ class OldBibleDB(QtCore.QObject, Manager):
else:
return None
+ def get_book(self, name):
+ """
+ Return a book by name or abbreviation.
+
+ ``name``
+ The name or abbreviation of the book.
+ """
+ if not isinstance(name, unicode):
+ name = unicode(name)
+ books = self.run_sql(u'SELECT id, testament_id, name, '
+ u'abbreviation FROM book WHERE LOWER(name) = ? OR '
+ u'LOWER(abbreviation) = ?', (name.lower(), name.lower()))
+ if books:
+ return {
+ u'id': books[0][0],
+ u'testament_id': books[0][1],
+ u'name': unicode(books[0][2]),
+ u'abbreviation': unicode(books[0][3])
+ }
+ else:
+ return None
+
def get_books(self):
"""
Returns the books of the Bible.
diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py
index 5fc742cce..76a99ea50 100644
--- a/openlp/plugins/bibles/lib/http.py
+++ b/openlp/plugins/bibles/lib/http.py
@@ -72,9 +72,8 @@ class BGExtract(object):
log.debug(u'BGExtract.get_bible_chapter("%s", "%s", "%s")', version,
bookname, chapter)
urlbookname = urllib.quote(bookname.encode("utf-8"))
- url_params = urllib.urlencode(
- {u'search': u'%s %s' % (urlbookname, chapter),
- u'version': u'%s' % version})
+ url_params = u'search=%s+%s&version=%s' % (urlbookname, chapter,
+ version)
cleaner = [(re.compile(' |
|\'\+\''), lambda match: '')]
soup = get_soup_for_bible_ref(
u'http://www.biblegateway.com/passage/?%s' % url_params,
@@ -97,10 +96,10 @@ class BGExtract(object):
verse_list = {}
# Cater for inconsistent mark up in the first verse of a chapter.
first_verse = verses.find(u'versenum')
- if first_verse:
+ if first_verse and len(first_verse.contents):
verse_list[1] = unicode(first_verse.contents[0])
for verse in verses(u'sup', u'versenum'):
- raw_verse_num = verse.next
+ raw_verse_num = verse.next
clean_verse_num = 0
# Not all verses exist in all translations and may or may not be
# represented by a verse number. If they are not fine, if they are
@@ -110,7 +109,7 @@ class BGExtract(object):
try:
clean_verse_num = int(str(raw_verse_num))
except ValueError:
- log.exception(u'Illegal verse number in %s %s %s:%s',
+ log.warn(u'Illegal verse number in %s %s %s:%s',
version, bookname, chapter, unicode(raw_verse_num))
if clean_verse_num:
verse_text = raw_verse_num.next
@@ -140,16 +139,17 @@ class BGExtract(object):
"""
log.debug(u'BGExtract.get_books_from_http("%s")', version)
url_params = urllib.urlencode(
- {u'search': 'Bible-List', u'version': u'%s' % version})
- reference_url = u'http://www.biblegateway.com/passage/?%s' % url_params
+ {u'action': 'getVersionInfo', u'vid': u'%s' % version})
+ reference_url = u'http://www.biblegateway.com/versions/?%s#books' % \
+ url_params
page = get_web_page(reference_url)
if not page:
send_error_message(u'download')
return None
page_source = page.read()
page_source = unicode(page_source, 'utf8')
- page_source_temp = re.search(u'