diff --git a/openlp/core/lib/spelltextedit.py b/openlp/core/lib/spelltextedit.py
index b0bb61e92..25e4e24ae 100644
--- a/openlp/core/lib/spelltextedit.py
+++ b/openlp/core/lib/spelltextedit.py
@@ -48,9 +48,10 @@ class SpellTextEdit(QtGui.QPlainTextEdit):
"""
Spell checking widget based on QPlanTextEdit.
"""
- def __init__(self, *args):
+ def __init__(self, parent=None, formattingTagsAllowed=True):
global ENCHANT_AVAILABLE
- QtGui.QPlainTextEdit.__init__(self, *args)
+ QtGui.QPlainTextEdit.__init__(self, parent)
+ self.formattingTagsAllowed = formattingTagsAllowed
# Default dictionary based on the current locale.
if ENCHANT_AVAILABLE:
try:
@@ -110,16 +111,17 @@ class SpellTextEdit(QtGui.QPlainTextEdit):
spell_menu.addAction(action)
# Only add the spelling suggests to the menu if there are
# suggestions.
- if len(spell_menu.actions()):
+ if spell_menu.actions():
popupMenu.insertMenu(popupMenu.actions()[0], spell_menu)
tagMenu = QtGui.QMenu(translate('OpenLP.SpellTextEdit',
'Formatting Tags'))
- for html in FormattingTags.get_html_tags():
- action = SpellAction(html[u'desc'], tagMenu)
- action.correct.connect(self.htmlTag)
- tagMenu.addAction(action)
- popupMenu.insertSeparator(popupMenu.actions()[0])
- popupMenu.insertMenu(popupMenu.actions()[0], tagMenu)
+ if self.formattingTagsAllowed:
+ for html in FormattingTags.get_html_tags():
+ action = SpellAction(html[u'desc'], tagMenu)
+ action.correct.connect(self.htmlTag)
+ tagMenu.addAction(action)
+ popupMenu.insertSeparator(popupMenu.actions()[0])
+ popupMenu.insertMenu(popupMenu.actions()[0], tagMenu)
popupMenu.exec_(event.globalPos())
def setLanguage(self, action):
diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py
index 510a94dfd..a6e909b97 100644
--- a/openlp/core/ui/mainwindow.py
+++ b/openlp/core/ui/mainwindow.py
@@ -28,6 +28,7 @@
import logging
import os
import sys
+import shutil
from tempfile import gettempdir
from PyQt4 import QtCore, QtGui
@@ -305,10 +306,10 @@ class Ui_MainWindow(object):
add_actions(self.fileExportMenu,
(self.exportThemeItem, self.exportLanguageItem))
add_actions(self.fileMenu, (self.fileNewItem, self.fileOpenItem,
- self.fileSaveItem, self.fileSaveAsItem, None,
- self.recentFilesMenu.menuAction(), None, self.printServiceOrderItem,
- None, self.fileImportMenu.menuAction(),
- self.fileExportMenu.menuAction(), self.fileExitItem))
+ self.fileSaveItem, self.fileSaveAsItem,
+ self.recentFilesMenu.menuAction(), None,
+ self.fileImportMenu.menuAction(), self.fileExportMenu.menuAction(),
+ None, self.printServiceOrderItem, self.fileExitItem))
add_actions(self.viewModeMenu, (self.modeDefaultItem,
self.modeSetupItem, self.modeLiveItem))
add_actions(self.viewMenu, (self.viewModeMenu.menuAction(),
@@ -726,11 +727,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
plugin.firstTime()
Receiver.send_message(u'openlp_process_events')
temp_dir = os.path.join(unicode(gettempdir()), u'openlp')
- if not os.path.exists(temp_dir):
- return
- for filename in os.listdir(temp_dir):
- delete_file(os.path.join(temp_dir, filename))
- os.removedirs(temp_dir)
+ shutil.rmtree(temp_dir, True)
def onFirstTimeWizardClicked(self):
"""
diff --git a/openlp/core/ui/printservicedialog.py b/openlp/core/ui/printservicedialog.py
index b0065df99..8287ef02a 100644
--- a/openlp/core/ui/printservicedialog.py
+++ b/openlp/core/ui/printservicedialog.py
@@ -108,7 +108,7 @@ class Ui_PrintServiceDialog(object):
self.footerLabel = QtGui.QLabel(self.optionsWidget)
self.footerLabel.setObjectName(u'footerLabel')
self.optionsLayout.addWidget(self.footerLabel)
- self.footerTextEdit = SpellTextEdit(self.optionsWidget)
+ self.footerTextEdit = SpellTextEdit(self.optionsWidget, False)
self.footerTextEdit.setObjectName(u'footerTextEdit')
self.optionsLayout.addWidget(self.footerTextEdit)
self.optionsGroupBox = QtGui.QGroupBox()
diff --git a/openlp/core/ui/printserviceform.py b/openlp/core/ui/printserviceform.py
index f50237619..55fc6eb3c 100644
--- a/openlp/core/ui/printserviceform.py
+++ b/openlp/core/ui/printserviceform.py
@@ -24,6 +24,7 @@
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
+import cgi
import datetime
import os
@@ -183,7 +184,7 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
self._addElement(u'style', custom_css, html_data.head,
attribute=(u'type', u'text/css'))
self._addElement(u'body', parent=html_data)
- self._addElement(u'h1', unicode(self.titleLineEdit.text()),
+ self._addElement(u'h1', cgi.escape(unicode(self.titleLineEdit.text())),
html_data.body, classId=u'serviceTitle')
for index, item in enumerate(self.serviceManager.serviceItems):
self._addPreviewItem(html_data.body, item[u'service_item'], index)
@@ -193,8 +194,9 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
classId=u'customNotes')
self._addElement(u'span', translate('OpenLP.ServiceManager',
'Custom Service Notes: '), div, classId=u'customNotesTitle')
- self._addElement(u'span', self.footerTextEdit.toPlainText(), div,
- classId=u'customNotesText')
+ self._addElement(u'span',
+ cgi.escape(self.footerTextEdit.toPlainText()),
+ div, classId=u'customNotesText')
self.document.setHtml(html.tostring(html_data))
self.previewWidget.updatePreview()
@@ -204,8 +206,8 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
item_title = self._addElement(u'h2', parent=div, classId=u'itemTitle')
self._addElement(u'img', parent=item_title,
attribute=(u'src', item.icon))
- self._addElement(u'span', u' ' + item.get_display_title(),
- item_title)
+ self._addElement(u'span',
+ u' ' + cgi.escape(item.get_display_title()), item_title)
if self.slideTextCheckBox.isChecked():
# Add the text of the service item.
if item.is_text():
@@ -230,8 +232,9 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
foot_text = item.foot_text
foot_text = foot_text.partition(u'
')[2]
if foot_text:
- foot = self._addElement(u'div', foot_text, parent=div,
- classId=u'itemFooter')
+ foot_text = cgi.escape(foot_text.replace(u'
', u'\n'))
+ self._addElement(u'div', foot_text.replace(u'\n', u'
'),
+ parent=div, classId=u'itemFooter')
# Add service items' notes.
if self.notesCheckBox.isChecked():
if item.notes:
@@ -239,8 +242,8 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
self._addElement(u'span',
translate('OpenLP.ServiceManager', 'Notes: '), p,
classId=u'itemNotesTitle')
- notes = self._addElement(u'span',
- item.notes.replace(u'\n', u'
'), p,
+ self._addElement(u'span',
+ cgi.escape(unicode(item.notes)).replace(u'\n', u'
'), p,
classId=u'itemNotesText')
# Add play length of media files.
if item.is_media() and self.metaDataCheckBox.isChecked():
diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py
index 0ef45af12..3ab2e9239 100644
--- a/openlp/core/ui/servicemanager.py
+++ b/openlp/core/ui/servicemanager.py
@@ -24,6 +24,7 @@
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
+import cgi
import cPickle
import logging
import os
@@ -719,6 +720,9 @@ class ServiceManager(QtGui.QWidget):
self.setModified()
def onStartTimeForm(self):
+ """
+ Opens a dialog to type in service item notes.
+ """
item = self.findServiceItem()[0]
self.startTimeForm.item = self.serviceItems[item]
if self.startTimeForm.exec_():
@@ -957,7 +961,7 @@ class ServiceManager(QtGui.QWidget):
if serviceitem.notes:
tips.append(u'%s: %s' %
(unicode(translate('OpenLP.ServiceManager', 'Notes')),
- unicode(serviceitem.notes)))
+ cgi.escape(unicode(serviceitem.notes))))
if item[u'service_item'] \
.is_capable(ItemCapabilities.AllowsVariableStartTime):
tips.append(item[u'service_item'].get_media_time())
diff --git a/openlp/core/ui/servicenoteform.py b/openlp/core/ui/servicenoteform.py
index 3bc55e242..ddfcb3381 100644
--- a/openlp/core/ui/servicenoteform.py
+++ b/openlp/core/ui/servicenoteform.py
@@ -27,7 +27,7 @@
from PyQt4 import QtCore, QtGui
-from openlp.core.lib import translate
+from openlp.core.lib import translate, SpellTextEdit
from openlp.core.lib.ui import create_accept_reject_button_box
class ServiceNoteForm(QtGui.QDialog):
@@ -52,7 +52,7 @@ class ServiceNoteForm(QtGui.QDialog):
self.dialogLayout.setContentsMargins(8, 8, 8, 8)
self.dialogLayout.setSpacing(8)
self.dialogLayout.setObjectName(u'verticalLayout')
- self.textEdit = QtGui.QTextEdit(self)
+ self.textEdit = SpellTextEdit(self, False)
self.textEdit.setObjectName(u'textEdit')
self.dialogLayout.addWidget(self.textEdit)
self.dialogLayout.addWidget(create_accept_reject_button_box(self))
diff --git a/openlp/core/utils/__init__.py b/openlp/core/utils/__init__.py
index b0a28962c..3612bb002 100644
--- a/openlp/core/utils/__init__.py
+++ b/openlp/core/utils/__init__.py
@@ -386,6 +386,17 @@ def split_filename(path):
else:
return os.path.split(path)
+def clean_filename(filename):
+ """
+ Removes invalid characters from the given ``filename``.
+
+ ``filename``
+ The "dirty" file name to clean.
+ """
+ if not isinstance(filename, unicode):
+ filename = unicode(filename, u'utf-8')
+ return re.sub(r'[/\\?*|<>\[\]":<>+%]+', u'_', filename).strip(u'_')
+
def delete_file(file_path_name):
"""
Deletes a file from the system.
@@ -492,4 +503,4 @@ from actions import ActionList
__all__ = [u'AppLocation', u'get_application_version', u'check_latest_version',
u'add_actions', u'get_filesystem_encoding', u'LanguageManager',
u'ActionList', u'get_web_page', u'file_is_unicode', u'get_uno_command',
- u'get_uno_instance', u'delete_file']
+ u'get_uno_instance', u'delete_file', u'clean_filename']
diff --git a/openlp/plugins/alerts/lib/alertstab.py b/openlp/plugins/alerts/lib/alertstab.py
index 0a1eb3e75..15577fd0e 100644
--- a/openlp/plugins/alerts/lib/alertstab.py
+++ b/openlp/plugins/alerts/lib/alertstab.py
@@ -44,85 +44,85 @@ class AlertsTab(SettingsTab):
self.fontGroupBox.setObjectName(u'fontGroupBox')
self.fontLayout = QtGui.QFormLayout(self.fontGroupBox)
self.fontLayout.setObjectName(u'fontLayout')
- self.FontLabel = QtGui.QLabel(self.fontGroupBox)
- self.FontLabel.setObjectName(u'FontLabel')
- self.FontComboBox = QtGui.QFontComboBox(self.fontGroupBox)
- self.FontComboBox.setObjectName(u'FontComboBox')
- self.fontLayout.addRow(self.FontLabel, self.FontComboBox)
- self.FontColorLabel = QtGui.QLabel(self.fontGroupBox)
- self.FontColorLabel.setObjectName(u'FontColorLabel')
- self.ColorLayout = QtGui.QHBoxLayout()
- self.ColorLayout.setObjectName(u'ColorLayout')
- self.FontColorButton = QtGui.QPushButton(self.fontGroupBox)
- self.FontColorButton.setObjectName(u'FontColorButton')
- self.ColorLayout.addWidget(self.FontColorButton)
- self.ColorLayout.addSpacing(20)
- self.BackgroundColorLabel = QtGui.QLabel(self.fontGroupBox)
- self.BackgroundColorLabel.setObjectName(u'BackgroundColorLabel')
- self.ColorLayout.addWidget(self.BackgroundColorLabel)
- self.BackgroundColorButton = QtGui.QPushButton(self.fontGroupBox)
- self.BackgroundColorButton.setObjectName(u'BackgroundColorButton')
- self.ColorLayout.addWidget(self.BackgroundColorButton)
- self.fontLayout.addRow(self.FontColorLabel, self.ColorLayout)
- self.FontSizeLabel = QtGui.QLabel(self.fontGroupBox)
- self.FontSizeLabel.setObjectName(u'FontSizeLabel')
- self.FontSizeSpinBox = QtGui.QSpinBox(self.fontGroupBox)
- self.FontSizeSpinBox.setObjectName(u'FontSizeSpinBox')
- self.fontLayout.addRow(self.FontSizeLabel, self.FontSizeSpinBox)
- self.TimeoutLabel = QtGui.QLabel(self.fontGroupBox)
- self.TimeoutLabel.setObjectName(u'TimeoutLabel')
- self.TimeoutSpinBox = QtGui.QSpinBox(self.fontGroupBox)
- self.TimeoutSpinBox.setMaximum(180)
- self.TimeoutSpinBox.setObjectName(u'TimeoutSpinBox')
- self.fontLayout.addRow(self.TimeoutLabel, self.TimeoutSpinBox)
+ self.fontLabel = QtGui.QLabel(self.fontGroupBox)
+ self.fontLabel.setObjectName(u'fontLabel')
+ self.fontComboBox = QtGui.QFontComboBox(self.fontGroupBox)
+ self.fontComboBox.setObjectName(u'fontComboBox')
+ self.fontLayout.addRow(self.fontLabel, self.fontComboBox)
+ self.fontColorLabel = QtGui.QLabel(self.fontGroupBox)
+ self.fontColorLabel.setObjectName(u'fontColorLabel')
+ self.colorLayout = QtGui.QHBoxLayout()
+ self.colorLayout.setObjectName(u'colorLayout')
+ self.fontColorButton = QtGui.QPushButton(self.fontGroupBox)
+ self.fontColorButton.setObjectName(u'fontColorButton')
+ self.colorLayout.addWidget(self.fontColorButton)
+ self.colorLayout.addSpacing(20)
+ self.backgroundColorLabel = QtGui.QLabel(self.fontGroupBox)
+ self.backgroundColorLabel.setObjectName(u'backgroundColorLabel')
+ self.colorLayout.addWidget(self.backgroundColorLabel)
+ self.backgroundColorButton = QtGui.QPushButton(self.fontGroupBox)
+ self.backgroundColorButton.setObjectName(u'backgroundColorButton')
+ self.colorLayout.addWidget(self.backgroundColorButton)
+ self.fontLayout.addRow(self.fontColorLabel, self.colorLayout)
+ self.fontSizeLabel = QtGui.QLabel(self.fontGroupBox)
+ self.fontSizeLabel.setObjectName(u'fontSizeLabel')
+ self.fontSizeSpinBox = QtGui.QSpinBox(self.fontGroupBox)
+ self.fontSizeSpinBox.setObjectName(u'fontSizeSpinBox')
+ self.fontLayout.addRow(self.fontSizeLabel, self.fontSizeSpinBox)
+ self.timeoutLabel = QtGui.QLabel(self.fontGroupBox)
+ self.timeoutLabel.setObjectName(u'timeoutLabel')
+ self.timeoutSpinBox = QtGui.QSpinBox(self.fontGroupBox)
+ self.timeoutSpinBox.setMaximum(180)
+ self.timeoutSpinBox.setObjectName(u'timeoutSpinBox')
+ self.fontLayout.addRow(self.timeoutLabel, self.timeoutSpinBox)
create_valign_combo(self, self.fontGroupBox, self.fontLayout)
self.leftLayout.addWidget(self.fontGroupBox)
self.leftLayout.addStretch()
- self.PreviewGroupBox = QtGui.QGroupBox(self.rightColumn)
- self.PreviewGroupBox.setObjectName(u'PreviewGroupBox')
- self.PreviewLayout = QtGui.QVBoxLayout(self.PreviewGroupBox)
- self.PreviewLayout.setObjectName(u'PreviewLayout')
- self.FontPreview = QtGui.QLineEdit(self.PreviewGroupBox)
- self.FontPreview.setObjectName(u'FontPreview')
- self.PreviewLayout.addWidget(self.FontPreview)
- self.rightLayout.addWidget(self.PreviewGroupBox)
+ self.previewGroupBox = QtGui.QGroupBox(self.rightColumn)
+ self.previewGroupBox.setObjectName(u'previewGroupBox')
+ self.previewLayout = QtGui.QVBoxLayout(self.previewGroupBox)
+ self.previewLayout.setObjectName(u'previewLayout')
+ self.fontPreview = QtGui.QLineEdit(self.previewGroupBox)
+ self.fontPreview.setObjectName(u'fontPreview')
+ self.previewLayout.addWidget(self.fontPreview)
+ self.rightLayout.addWidget(self.previewGroupBox)
self.rightLayout.addStretch()
# Signals and slots
- QtCore.QObject.connect(self.BackgroundColorButton,
+ QtCore.QObject.connect(self.backgroundColorButton,
QtCore.SIGNAL(u'pressed()'), self.onBackgroundColorButtonClicked)
- QtCore.QObject.connect(self.FontColorButton,
+ QtCore.QObject.connect(self.fontColorButton,
QtCore.SIGNAL(u'pressed()'), self.onFontColorButtonClicked)
- QtCore.QObject.connect(self.FontComboBox,
+ QtCore.QObject.connect(self.fontComboBox,
QtCore.SIGNAL(u'activated(int)'), self.onFontComboBoxClicked)
- QtCore.QObject.connect(self.TimeoutSpinBox,
+ QtCore.QObject.connect(self.timeoutSpinBox,
QtCore.SIGNAL(u'valueChanged(int)'), self.onTimeoutSpinBoxChanged)
- QtCore.QObject.connect(self.FontSizeSpinBox,
+ QtCore.QObject.connect(self.fontSizeSpinBox,
QtCore.SIGNAL(u'valueChanged(int)'), self.onFontSizeSpinBoxChanged)
def retranslateUi(self):
self.fontGroupBox.setTitle(
translate('AlertsPlugin.AlertsTab', 'Font'))
- self.FontLabel.setText(
+ self.fontLabel.setText(
translate('AlertsPlugin.AlertsTab', 'Font name:'))
- self.FontColorLabel.setText(
+ self.fontColorLabel.setText(
translate('AlertsPlugin.AlertsTab', 'Font color:'))
- self.BackgroundColorLabel.setText(
+ self.backgroundColorLabel.setText(
translate('AlertsPlugin.AlertsTab', 'Background color:'))
- self.FontSizeLabel.setText(
+ self.fontSizeLabel.setText(
translate('AlertsPlugin.AlertsTab', 'Font size:'))
- self.FontSizeSpinBox.setSuffix(UiStrings().FontSizePtUnit)
- self.TimeoutLabel.setText(
+ self.fontSizeSpinBox.setSuffix(UiStrings().FontSizePtUnit)
+ self.timeoutLabel.setText(
translate('AlertsPlugin.AlertsTab', 'Alert timeout:'))
- self.TimeoutSpinBox.setSuffix(UiStrings().Seconds)
- self.PreviewGroupBox.setTitle(UiStrings().Preview)
- self.FontPreview.setText(UiStrings().OLPV2)
+ self.timeoutSpinBox.setSuffix(UiStrings().Seconds)
+ self.previewGroupBox.setTitle(UiStrings().Preview)
+ self.fontPreview.setText(UiStrings().OLPV2)
def onBackgroundColorButtonClicked(self):
new_color = QtGui.QColorDialog.getColor(
QtGui.QColor(self.bg_color), self)
if new_color.isValid():
self.bg_color = new_color.name()
- self.BackgroundColorButton.setStyleSheet(
+ self.backgroundColorButton.setStyleSheet(
u'background-color: %s' % self.bg_color)
self.updateDisplay()
@@ -134,15 +134,15 @@ class AlertsTab(SettingsTab):
QtGui.QColor(self.font_color), self)
if new_color.isValid():
self.font_color = new_color.name()
- self.FontColorButton.setStyleSheet(
+ self.fontColorButton.setStyleSheet(
u'background-color: %s' % self.font_color)
self.updateDisplay()
def onTimeoutSpinBoxChanged(self):
- self.timeout = self.TimeoutSpinBox.value()
+ self.timeout = self.timeoutSpinBox.value()
def onFontSizeSpinBoxChanged(self):
- self.font_size = self.FontSizeSpinBox.value()
+ self.font_size = self.fontSizeSpinBox.value()
self.updateDisplay()
def load(self):
@@ -160,16 +160,16 @@ class AlertsTab(SettingsTab):
self.location = settings.value(
u'location', QtCore.QVariant(1)).toInt()[0]
settings.endGroup()
- self.FontSizeSpinBox.setValue(self.font_size)
- self.TimeoutSpinBox.setValue(self.timeout)
- self.FontColorButton.setStyleSheet(
+ self.fontSizeSpinBox.setValue(self.font_size)
+ self.timeoutSpinBox.setValue(self.timeout)
+ self.fontColorButton.setStyleSheet(
u'background-color: %s' % self.font_color)
- self.BackgroundColorButton.setStyleSheet(
+ self.backgroundColorButton.setStyleSheet(
u'background-color: %s' % self.bg_color)
self.verticalComboBox.setCurrentIndex(self.location)
font = QtGui.QFont()
font.setFamily(self.font_face)
- self.FontComboBox.setCurrentFont(font)
+ self.fontComboBox.setCurrentFont(font)
self.updateDisplay()
def save(self):
@@ -178,7 +178,7 @@ class AlertsTab(SettingsTab):
settings.setValue(u'background color', QtCore.QVariant(self.bg_color))
settings.setValue(u'font color', QtCore.QVariant(self.font_color))
settings.setValue(u'font size', QtCore.QVariant(self.font_size))
- self.font_face = self.FontComboBox.currentFont().family()
+ self.font_face = self.fontComboBox.currentFont().family()
settings.setValue(u'font face', QtCore.QVariant(self.font_face))
settings.setValue(u'timeout', QtCore.QVariant(self.timeout))
self.location = self.verticalComboBox.currentIndex()
@@ -187,10 +187,10 @@ class AlertsTab(SettingsTab):
def updateDisplay(self):
font = QtGui.QFont()
- font.setFamily(self.FontComboBox.currentFont().family())
+ font.setFamily(self.fontComboBox.currentFont().family())
font.setBold(True)
font.setPointSize(self.font_size)
- self.FontPreview.setFont(font)
- self.FontPreview.setStyleSheet(u'background-color: %s; color: %s' %
+ self.fontPreview.setFont(font)
+ self.fontPreview.setStyleSheet(u'background-color: %s; color: %s' %
(self.bg_color, self.font_color))
diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py
index 615d4231e..322e3219a 100644
--- a/openlp/plugins/bibles/forms/bibleupgradeform.py
+++ b/openlp/plugins/bibles/forms/bibleupgradeform.py
@@ -29,17 +29,17 @@ The bible import functions for OpenLP
import logging
import os
import shutil
+from tempfile import gettempdir
from PyQt4 import QtCore, QtGui
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
from openlp.core.utils import AppLocation, delete_file
from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, OldBibleDB, \
- BiblesResourcesDB, clean_filename
+ BiblesResourcesDB
from openlp.plugins.bibles.lib.http import BSExtract, BGExtract, CWExtract
log = logging.getLogger(__name__)
@@ -70,6 +70,7 @@ class BibleUpgradeForm(OpenLPWizard):
self.suffix = u'.sqlite'
self.settingsSection = u'bibles'
self.path = AppLocation.get_section_data_path(self.settingsSection)
+ self.temp_dir = os.path.join(gettempdir(), u'openlp')
self.files = self.manager.old_bible_databases
self.success = {}
self.newbibles = {}
@@ -91,20 +92,6 @@ class BibleUpgradeForm(OpenLPWizard):
log.debug(u'Stopping import')
self.stop_import_flag = True
- def onCheckBoxIndexChanged(self, index):
- """
- Show/Hide warnings if CheckBox state has changed
- """
- for number, filename in enumerate(self.files):
- if not self.checkBox[number].checkState() == QtCore.Qt.Checked:
- self.verticalWidget[number].hide()
- self.formWidget[number].hide()
- else:
- version_name = unicode(self.versionNameEdit[number].text())
- if self.manager.exists(version_name):
- self.verticalWidget[number].show()
- self.formWidget[number].show()
-
def reject(self):
"""
Stop the wizard on cancel button, close button or ESC key.
@@ -113,8 +100,6 @@ 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):
"""
@@ -124,7 +109,7 @@ class BibleUpgradeForm(OpenLPWizard):
self.preWizard()
self.performWizard()
self.postWizard()
- elif self.page(pageId) == self.selectPage and self.maxBibles == 0:
+ elif self.page(pageId) == self.selectPage and not self.files:
self.next()
def onBackupBrowseButtonClicked(self):
@@ -243,78 +228,13 @@ class BibleUpgradeForm(OpenLPWizard):
Add the content to the scrollArea.
"""
self.checkBox = {}
- self.versionNameEdit = {}
- self.versionNameLabel = {}
- self.versionInfoLabel = {}
- self.versionInfoPixmap = {}
- self.verticalWidget = {}
- self.horizontalLayout = {}
- self.formWidget = {}
- self.formLayoutAttention = {}
for number, filename in enumerate(self.files):
bible = OldBibleDB(self.mediaItem, path=self.path, file=filename[0])
self.checkBox[number] = QtGui.QCheckBox(self.scrollAreaContents)
- checkBoxName = u'checkBox[%d]' % number
- self.checkBox[number].setObjectName(checkBoxName)
+ self.checkBox[number].setObjectName(u'checkBox[%d]' % number)
self.checkBox[number].setText(bible.get_name())
self.checkBox[number].setCheckState(QtCore.Qt.Checked)
self.formLayout.addWidget(self.checkBox[number])
- self.verticalWidget[number] = QtGui.QWidget(self.scrollAreaContents)
- verticalWidgetName = u'verticalWidget[%d]' % number
- self.verticalWidget[number].setObjectName(verticalWidgetName)
- self.horizontalLayout[number] = QtGui.QHBoxLayout(
- self.verticalWidget[number])
- self.horizontalLayout[number].setContentsMargins(25, 0, 0, 0)
- horizontalLayoutName = u'horizontalLayout[%d]' % number
- self.horizontalLayout[number].setObjectName(horizontalLayoutName)
- self.versionInfoPixmap[number] = QtGui.QLabel(
- self.verticalWidget[number])
- versionInfoPixmapName = u'versionInfoPixmap[%d]' % number
- self.versionInfoPixmap[number].setObjectName(versionInfoPixmapName)
- self.versionInfoPixmap[number].setPixmap(QtGui.QPixmap(
- u':/bibles/bibles_upgrade_alert.png'))
- self.versionInfoPixmap[number].setAlignment(QtCore.Qt.AlignRight)
- self.horizontalLayout[number].addWidget(
- self.versionInfoPixmap[number])
- self.versionInfoLabel[number] = QtGui.QLabel(
- self.verticalWidget[number])
- versionInfoLabelName = u'versionInfoLabel[%d]' % number
- self.versionInfoLabel[number].setObjectName(versionInfoLabelName)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
- QtGui.QSizePolicy.Preferred)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(
- self.versionInfoLabel[number].sizePolicy().hasHeightForWidth())
- self.versionInfoLabel[number].setSizePolicy(sizePolicy)
- self.horizontalLayout[number].addWidget(
- self.versionInfoLabel[number])
- self.formLayout.addWidget(self.verticalWidget[number])
- self.formWidget[number] = QtGui.QWidget(self.scrollAreaContents)
- formWidgetName = u'formWidget[%d]' % number
- self.formWidget[number].setObjectName(formWidgetName)
- self.formLayoutAttention[number] = QtGui.QFormLayout(
- self.formWidget[number])
- self.formLayoutAttention[number].setContentsMargins(25, 0, 0, 5)
- formLayoutAttentionName = u'formLayoutAttention[%d]' % number
- self.formLayoutAttention[number].setObjectName(
- formLayoutAttentionName)
- self.versionNameLabel[number] = QtGui.QLabel(
- self.formWidget[number])
- self.versionNameLabel[number].setObjectName(u'VersionNameLabel')
- self.formLayoutAttention[number].setWidget(0,
- QtGui.QFormLayout.LabelRole, self.versionNameLabel[number])
- self.versionNameEdit[number] = QtGui.QLineEdit(
- self.formWidget[number])
- self.versionNameEdit[number].setObjectName(u'VersionNameEdit')
- self.formLayoutAttention[number].setWidget(0,
- 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.
- QtCore.QObject.connect(self.checkBox[number],
- QtCore.SIGNAL(u'stateChanged(int)'),
- self.onCheckBoxIndexChanged)
self.spacerItem = QtGui.QSpacerItem(20, 5, QtGui.QSizePolicy.Minimum,
QtGui.QSizePolicy.Expanding)
self.formLayout.addItem(self.spacerItem)
@@ -327,23 +247,6 @@ class BibleUpgradeForm(OpenLPWizard):
for number, filename in enumerate(self.files):
self.formLayout.removeWidget(self.checkBox[number])
self.checkBox[number].setParent(None)
- self.horizontalLayout[number].removeWidget(
- self.versionInfoPixmap[number])
- self.versionInfoPixmap[number].setParent(None)
- self.horizontalLayout[number].removeWidget(
- self.versionInfoLabel[number])
- self.versionInfoLabel[number].setParent(None)
- self.formLayout.removeWidget(self.verticalWidget[number])
- self.verticalWidget[number].setParent(None)
- self.formLayoutAttention[number].removeWidget(
- self.versionNameLabel[number])
- self.versionNameLabel[number].setParent(None)
- self.formLayoutAttention[number].removeWidget(
- self.versionNameEdit[number])
- self.formLayoutAttention[number].deleteLater()
- self.versionNameEdit[number].setParent(None)
- self.formLayout.removeWidget(self.formWidget[number])
- self.formWidget[number].setParent(None)
self.formLayout.removeItem(self.spacerItem)
def retranslateUi(self):
@@ -385,12 +288,6 @@ class BibleUpgradeForm(OpenLPWizard):
self.selectPage.setSubTitle(
translate('BiblesPlugin.UpgradeWizardForm',
'Please select the Bibles to upgrade'))
- for number, bible in enumerate(self.files):
- self.versionNameLabel[number].setText(
- translate('BiblesPlugin.UpgradeWizardForm', 'Version name:'))
- self.versionInfoLabel[number].setText(
- translate('BiblesPlugin.UpgradeWizardForm', 'This '
- 'Bible still exists. Please change the name or uncheck it.'))
self.progressPage.setTitle(translate('BiblesPlugin.UpgradeWizardForm',
'Upgrading'))
self.progressPage.setSubTitle(
@@ -425,58 +322,16 @@ class BibleUpgradeForm(OpenLPWizard):
return False
return True
elif self.currentPage() == self.selectPage:
+ check_directory_exists(self.temp_dir)
for number, filename in enumerate(self.files):
if not self.checkBox[number].checkState() == QtCore.Qt.Checked:
continue
- version_name = unicode(self.versionNameEdit[number].text())
- if not version_name:
- critical_error_message_box(UiStrings().EmptyField,
- translate('BiblesPlugin.UpgradeWizardForm',
- 'You need to specify a version name for your Bible.'))
- self.versionNameEdit[number].setFocus()
- return False
- elif self.manager.exists(version_name):
- critical_error_message_box(
- translate('BiblesPlugin.UpgradeWizardForm',
- 'Bible Exists'),
- translate('BiblesPlugin.UpgradeWizardForm',
- 'This Bible already exists. Please upgrade '
- 'a different Bible, delete the existing one or '
- 'uncheck.'))
- self.versionNameEdit[number].setFocus()
- return False
- elif os.path.exists(os.path.join(self.path, clean_filename(
- version_name))) and version_name == filename[1]:
- newfilename = u'old_database_%s' % filename[0]
- if not os.path.exists(os.path.join(self.path,
- newfilename)):
- os.rename(os.path.join(self.path, filename[0]),
- os.path.join(self.path, newfilename))
- self.files[number] = [newfilename, filename[1]]
- continue
- else:
- critical_error_message_box(
- translate('BiblesPlugin.UpgradeWizardForm',
- 'Bible Exists'),
- translate('BiblesPlugin.UpgradeWizardForm',
- 'This Bible already exists. Please upgrade '
- 'a different Bible, delete the existing one or '
- 'uncheck.'))
- self.verticalWidget[number].show()
- self.formWidget[number].show()
- self.versionNameEdit[number].setFocus()
- return False
- elif os.path.exists(os.path.join(self.path,
- clean_filename(version_name))):
- critical_error_message_box(
- translate('BiblesPlugin.UpgradeWizardForm',
- 'Bible Exists'),
- translate('BiblesPlugin.UpgradeWizardForm',
- 'This Bible already exists. Please upgrade '
- 'a different Bible, delete the existing one or '
- 'uncheck.'))
- self.versionNameEdit[number].setFocus()
- return False
+ # Move bibles to temp dir.
+ if not os.path.exists(os.path.join(self.temp_dir, filename[0])):
+ shutil.move(
+ os.path.join(self.path, filename[0]), self.temp_dir)
+ else:
+ delete_file(os.path.join(self.path, filename[0]))
return True
if self.currentPage() == self.progressPage:
return True
@@ -495,16 +350,8 @@ class BibleUpgradeForm(OpenLPWizard):
self.files = self.manager.old_bible_databases
self.addScrollArea()
self.retranslateUi()
- self.maxBibles = len(self.files)
for number, filename in enumerate(self.files):
self.checkBox[number].setCheckState(QtCore.Qt.Checked)
- oldname = filename[1]
- if self.manager.exists(oldname):
- self.verticalWidget[number].show()
- self.formWidget[number].show()
- else:
- self.verticalWidget[number].hide()
- self.formWidget[number].hide()
self.progressBar.show()
self.restart()
self.finishButton.setVisible(False)
@@ -516,9 +363,8 @@ class BibleUpgradeForm(OpenLPWizard):
Prepare the UI for the upgrade.
"""
OpenLPWizard.preWizard(self)
- self.progressLabel.setText(translate(
- 'BiblesPlugin.UpgradeWizardForm',
- 'Starting upgrade...'))
+ self.progressLabel.setText(
+ translate('BiblesPlugin.UpgradeWizardForm', 'Starting upgrade...'))
Receiver.send_message(u'openlp_process_events')
def performWizard(self):
@@ -527,48 +373,42 @@ class BibleUpgradeForm(OpenLPWizard):
"""
self.include_webbible = False
proxy_server = None
- if self.maxBibles == 0:
+ if not self.files:
self.progressLabel.setText(
translate('BiblesPlugin.UpgradeWizardForm', 'There are no '
'Bibles that need to be upgraded.'))
self.progressBar.hide()
return
- self.maxBibles = 0
+ max_bibles = 0
for number, file in enumerate(self.files):
if self.checkBox[number].checkState() == QtCore.Qt.Checked:
- self.maxBibles += 1
- number = 0
- for biblenumber, filename in enumerate(self.files):
+ max_bibles += 1
+ oldBible = None
+ for number, filename in enumerate(self.files):
+ # Close the previous bible's connection.
+ if oldBible is not None:
+ oldBible.close_connection()
+ # Set to None to make obvious that we have already closed the
+ # database.
+ oldBible = None
if self.stop_import_flag:
- bible_failed = True
+ self.success[number] = False
break
- bible_failed = False
- self.success[biblenumber] = False
- if not self.checkBox[biblenumber].checkState() == QtCore.Qt.Checked:
+ if not self.checkBox[number].checkState() == QtCore.Qt.Checked:
+ self.success[number] = False
continue
self.progressBar.reset()
- oldbible = OldBibleDB(self.mediaItem, path=self.path,
+ oldBible = OldBibleDB(self.mediaItem, path=self.temp_dir,
file=filename[0])
name = filename[1]
- if name is None:
- delete_file(os.path.join(self.path, filename[0]))
- self.incrementProgressBar(unicode(translate(
- 'BiblesPlugin.UpgradeWizardForm',
- 'Upgrading Bible %s of %s: "%s"\nFailed')) %
- (number + 1, self.maxBibles, name),
- self.progressBar.maximum() - self.progressBar.value())
- number += 1
- continue
self.progressLabel.setText(unicode(translate(
'BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\nUpgrading ...')) %
- (number + 1, self.maxBibles, name))
- if os.path.exists(os.path.join(self.path, filename[0])):
- name = unicode(self.versionNameEdit[biblenumber].text())
+ (number + 1, max_bibles, name))
self.newbibles[number] = BibleDB(self.mediaItem, path=self.path,
- name=name)
+ name=name, file=filename[0])
self.newbibles[number].register(self.plugin.upgrade_wizard)
- metadata = oldbible.get_metadata()
+ metadata = oldBible.get_metadata()
webbible = False
meta_data = {}
for meta in metadata:
@@ -595,7 +435,7 @@ class BibleUpgradeForm(OpenLPWizard):
u'name: "%s" failed' % (
meta_data[u'download source'],
meta_data[u'download name']))
- delete_database(self.path, clean_filename(name))
+ self.newbibles[number].session.close()
del self.newbibles[number]
critical_error_message_box(
translate('BiblesPlugin.UpgradeWizardForm',
@@ -606,9 +446,9 @@ class BibleUpgradeForm(OpenLPWizard):
self.incrementProgressBar(unicode(translate(
'BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\nFailed')) %
- (number + 1, self.maxBibles, name),
+ (number + 1, max_bibles, name),
self.progressBar.maximum() - self.progressBar.value())
- number += 1
+ self.success[number] = False
continue
bible = BiblesResourcesDB.get_webbible(
meta_data[u'download name'],
@@ -621,25 +461,25 @@ class BibleUpgradeForm(OpenLPWizard):
language_id = self.newbibles[number].get_language(name)
if not language_id:
log.warn(u'Upgrading from "%s" failed' % filename[0])
- delete_database(self.path, clean_filename(name))
+ self.newbibles[number].session.close()
del self.newbibles[number]
self.incrementProgressBar(unicode(translate(
'BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\nFailed')) %
- (number + 1, self.maxBibles, name),
+ (number + 1, max_bibles, name),
self.progressBar.maximum() - self.progressBar.value())
- number += 1
+ self.success[number] = False
continue
self.progressBar.setMaximum(len(books))
for book in books:
if self.stop_import_flag:
- bible_failed = True
+ self.success[number] = False
break
self.incrementProgressBar(unicode(translate(
'BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\n'
'Upgrading %s ...')) %
- (number + 1, self.maxBibles, name, book))
+ (number + 1, max_bibles, name, book))
book_ref_id = self.newbibles[number].\
get_book_ref_id_by_name(book, len(books), language_id)
if not book_ref_id:
@@ -647,24 +487,24 @@ class BibleUpgradeForm(OpenLPWizard):
u'name: "%s" aborted by user' % (
meta_data[u'download source'],
meta_data[u'download name']))
- delete_database(self.path, clean_filename(name))
+ self.newbibles[number].session.close()
del self.newbibles[number]
- bible_failed = True
+ self.success[number] = False
break
book_details = BiblesResourcesDB.get_book_by_id(book_ref_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)
+ # Try to import already downloaded verses.
+ oldbook = oldBible.get_book(book)
if oldbook:
- verses = oldbible.get_verses(oldbook[u'id'])
+ 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
+ self.success[number] = False
break
self.newbibles[number].create_verse(db_book.id,
int(verse[u'chapter']),
@@ -678,40 +518,40 @@ class BibleUpgradeForm(OpenLPWizard):
language_id = self.newbibles[number].get_language(name)
if not language_id:
log.warn(u'Upgrading books from "%s" failed' % name)
- delete_database(self.path, clean_filename(name))
+ self.newbibles[number].session.close()
del self.newbibles[number]
self.incrementProgressBar(unicode(translate(
'BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\nFailed')) %
- (number + 1, self.maxBibles, name),
+ (number + 1, max_bibles, name),
self.progressBar.maximum() - self.progressBar.value())
- number += 1
+ self.success[number] = False
continue
- books = oldbible.get_books()
+ books = oldBible.get_books()
self.progressBar.setMaximum(len(books))
for book in books:
if self.stop_import_flag:
- bible_failed = True
+ self.success[number] = False
break
self.incrementProgressBar(unicode(translate(
'BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\n'
'Upgrading %s ...')) %
- (number + 1, self.maxBibles, name, book[u'name']))
+ (number + 1, max_bibles, name, book[u'name']))
book_ref_id = self.newbibles[number].\
get_book_ref_id_by_name(book[u'name'], len(books),
language_id)
if not book_ref_id:
log.warn(u'Upgrading books from %s " '\
'failed - aborted by user' % name)
- delete_database(self.path, clean_filename(name))
+ self.newbibles[number].session.close()
del self.newbibles[number]
- bible_failed = True
+ self.success[number] = False
break
book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
db_book = self.newbibles[number].create_book(book[u'name'],
book_ref_id, book_details[u'testament_id'])
- verses = oldbible.get_verses(book[u'id'])
+ verses = oldBible.get_verses(book[u'id'])
if not verses:
log.warn(u'No verses found to import for book '
u'"%s"', book[u'name'])
@@ -719,31 +559,32 @@ class BibleUpgradeForm(OpenLPWizard):
continue
for verse in verses:
if self.stop_import_flag:
- bible_failed = True
+ self.success[number] = False
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()
- if not bible_failed:
+ if self.success.has_key(number) and not self.success[number]:
+ self.incrementProgressBar(unicode(translate(
+ 'BiblesPlugin.UpgradeWizardForm',
+ 'Upgrading Bible %s of %s: "%s"\nFailed')) %
+ (number + 1, max_bibles, name),
+ self.progressBar.maximum() - self.progressBar.value())
+ else:
+ self.success[number] = True
self.newbibles[number].create_meta(u'Version', name)
- oldbible.close_connection()
- delete_file(os.path.join(self.path, filename[0]))
self.incrementProgressBar(unicode(translate(
'BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\n'
'Complete')) %
- (number + 1, self.maxBibles, name))
- self.success[biblenumber] = True
- else:
- self.incrementProgressBar(unicode(translate(
- 'BiblesPlugin.UpgradeWizardForm',
- '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))
- number += 1
+ (number + 1, max_bibles, name))
+ if self.newbibles.has_key(number):
+ self.newbibles[number].session.close()
+ # Close the last bible's connection if possible.
+ if oldBible is not None:
+ oldBible.close_connection()
def postWizard(self):
"""
@@ -752,10 +593,14 @@ class BibleUpgradeForm(OpenLPWizard):
successful_import = 0
failed_import = 0
for number, filename in enumerate(self.files):
- if number in self.success and self.success[number] == True:
+ if self.success.has_key(number) and self.success[number]:
successful_import += 1
elif self.checkBox[number].checkState() == QtCore.Qt.Checked:
failed_import += 1
+ # Delete upgraded (but not complete, corrupted, ...) bible.
+ delete_file(os.path.join(self.path, filename[0]))
+ # Copy not upgraded bible back.
+ shutil.move(os.path.join(self.temp_dir, filename[0]), self.path)
if failed_import > 0:
failed_import_text = unicode(translate(
'BiblesPlugin.UpgradeWizardForm',
@@ -776,7 +621,8 @@ class BibleUpgradeForm(OpenLPWizard):
'Bible(s): %s successful%s')) % (successful_import,
failed_import_text))
else:
- self.progressLabel.setText(
- translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade '
- 'failed.'))
+ self.progressLabel.setText(translate(
+ 'BiblesPlugin.UpgradeWizardForm', 'Upgrade failed.'))
+ # Remove temp directory.
+ shutil.rmtree(self.temp_dir, True)
OpenLPWizard.postWizard(self)
diff --git a/openlp/plugins/bibles/forms/languageform.py b/openlp/plugins/bibles/forms/languageform.py
index 477c7ee1e..c5069815b 100644
--- a/openlp/plugins/bibles/forms/languageform.py
+++ b/openlp/plugins/bibles/forms/languageform.py
@@ -44,8 +44,8 @@ class LanguageForm(QDialog, Ui_LanguageDialog):
Class to manage a dialog which ask the user for a language.
"""
log.info(u'LanguageForm loaded')
-
- def __init__(self, parent = None):
+
+ def __init__(self, parent=None):
"""
Constructor
"""
@@ -57,12 +57,11 @@ class LanguageForm(QDialog, Ui_LanguageDialog):
if bible_name:
self.bibleLabel.setText(unicode(bible_name))
items = BiblesResourcesDB.get_languages()
- for item in items:
- self.languageComboBox.addItem(item[u'name'])
+ self.languageComboBox.addItems([item[u'name'] for item in items])
return QDialog.exec_(self)
-
+
def accept(self):
- if self.languageComboBox.currentText() == u'':
+ if not self.languageComboBox.currentText():
critical_error_message_box(
message=translate('BiblesPlugin.LanguageForm',
'You need to choose a language.'))
diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py
index 5273f670c..e5962664b 100644
--- a/openlp/plugins/bibles/lib/db.py
+++ b/openlp/plugins/bibles/lib/db.py
@@ -39,7 +39,7 @@ from sqlalchemy.orm.exc import UnmappedClassError
from openlp.core.lib import Receiver, translate
from openlp.core.lib.db import BaseModel, init_db, Manager
from openlp.core.lib.ui import critical_error_message_box
-from openlp.core.utils import AppLocation
+from openlp.core.utils import AppLocation, clean_filename
log = logging.getLogger(__name__)
@@ -63,19 +63,6 @@ class Verse(BaseModel):
"""
pass
-def clean_filename(filename):
- """
- Clean up the version name of the Bible and convert it into a valid
- file name.
-
- ``filename``
- The "dirty" file name or version name.
- """
- if not isinstance(filename, unicode):
- filename = unicode(filename, u'utf-8')
- filename = re.sub(r'[^\w]+', u'_', filename).strip(u'_')
- return filename + u'.sqlite'
-
def init_schema(url):
"""
Setup a bible database connection and initialise the database schema.
@@ -158,7 +145,7 @@ class BibleDB(QtCore.QObject, Manager):
self.name = kwargs[u'name']
if not isinstance(self.name, unicode):
self.name = unicode(self.name, u'utf-8')
- self.file = clean_filename(self.name)
+ self.file = clean_filename(self.name) + u'.sqlite'
if u'file' in kwargs:
self.file = kwargs[u'file']
Manager.__init__(self, u'bibles', init_schema, self.file)
@@ -210,7 +197,7 @@ class BibleDB(QtCore.QObject, Manager):
The book_reference_id from bibles_resources.sqlite of the book.
``testament``
- *Defaults to 1.* The testament_reference_id from
+ *Defaults to 1.* The testament_reference_id from
bibles_resources.sqlite of the testament this book belongs to.
"""
log.debug(u'BibleDB.create_book("%s", "%s")', name, bk_ref_id)
@@ -329,7 +316,7 @@ class BibleDB(QtCore.QObject, Manager):
return self.get_object_filtered(Book, Book.book_reference_id.like(id))
def get_book_ref_id_by_name(self, book, maxbooks, language_id=None):
- log.debug(u'BibleDB.get_book_ref_id_by_name:("%s", "%s")', book,
+ log.debug(u'BibleDB.get_book_ref_id_by_name:("%s", "%s")', book,
language_id)
if BiblesResourcesDB.get_book(book, True):
book_temp = BiblesResourcesDB.get_book(book, True)
@@ -471,7 +458,7 @@ class BibleDB(QtCore.QObject, Manager):
def get_language(self, bible_name=None):
"""
- If no language is given it calls a dialog window where the user could
+ If no language is given it calls a dialog window where the user could
select the bible language.
Return the language id of a bible.
@@ -521,9 +508,9 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
some resources which are used in the Bibles plugin.
A wrapper class around a small SQLite database which contains the download
resources, a biblelist from the different download resources, the books,
- chapter counts and verse counts for the web download Bibles, a language
- reference, the testament reference and some alternative book names. This
- class contains a singleton "cursor" so that only one connection to the
+ chapter counts and verse counts for the web download Bibles, a language
+ reference, the testament reference and some alternative book names. This
+ class contains a singleton "cursor" so that only one connection to the
SQLite database is ever used.
"""
cursor = None
@@ -582,7 +569,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
``name``
The name or abbreviation of the book.
-
+
``lower``
True if the comparsion should be only lowercase
"""
@@ -592,7 +579,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
if lower:
books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, '
u'abbreviation, chapters FROM book_reference WHERE '
- u'LOWER(name) = ? OR LOWER(abbreviation) = ?',
+ u'LOWER(name) = ? OR LOWER(abbreviation) = ?',
(name.lower(), name.lower()))
else:
books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, '
@@ -621,7 +608,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
if not isinstance(id, int):
id = int(id)
books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, '
- u'abbreviation, chapters FROM book_reference WHERE id = ?',
+ u'abbreviation, chapters FROM book_reference WHERE id = ?',
(id, ))
if books:
return {
@@ -645,12 +632,12 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
``chapter``
The chapter number.
"""
- log.debug(u'BiblesResourcesDB.get_chapter("%s", "%s")', book_id,
+ log.debug(u'BiblesResourcesDB.get_chapter("%s", "%s")', book_id,
chapter)
if not isinstance(chapter, int):
chapter = int(chapter)
chapters = BiblesResourcesDB.run_sql(u'SELECT id, book_reference_id, '
- u'chapter, verse_count FROM chapters WHERE book_reference_id = ?',
+ u'chapter, verse_count FROM chapters WHERE book_reference_id = ?',
(book_id,))
if chapters:
return {
@@ -687,7 +674,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
``chapter``
The number of the chapter.
"""
- log.debug(u'BiblesResourcesDB.get_verse_count("%s", "%s")', book_id,
+ log.debug(u'BiblesResourcesDB.get_verse_count("%s", "%s")', book_id,
chapter)
details = BiblesResourcesDB.get_chapter(book_id, chapter)
if details:
@@ -715,7 +702,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
}
else:
return None
-
+
@staticmethod
def get_webbibles(source):
"""
@@ -737,7 +724,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
u'id': bible[0],
u'name': bible[1],
u'abbreviation': bible[2],
- u'language_id': bible[3],
+ u'language_id': bible[3],
u'download_source_id': bible[4]
}
for bible in bibles
@@ -752,11 +739,11 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
``abbreviation``
The abbreviation of the webbible.
-
+
``source``
The source of the webbible.
"""
- log.debug(u'BiblesResourcesDB.get_webbibles("%s", "%s")', abbreviation,
+ log.debug(u'BiblesResourcesDB.get_webbibles("%s", "%s")', abbreviation,
source)
if not isinstance(abbreviation, unicode):
abbreviation = unicode(abbreviation)
@@ -765,14 +752,14 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
source = BiblesResourcesDB.get_download_source(source)
bible = BiblesResourcesDB.run_sql(u'SELECT id, name, abbreviation, '
u'language_id, download_source_id FROM webbibles WHERE '
- u'download_source_id = ? AND abbreviation = ?', (source[u'id'],
+ u'download_source_id = ? AND abbreviation = ?', (source[u'id'],
abbreviation))
if bible:
return {
u'id': bible[0][0],
u'name': bible[0][1],
u'abbreviation': bible[0][2],
- u'language_id': bible[0][3],
+ u'language_id': bible[0][3],
u'download_source_id': bible[0][4]
}
else:
@@ -785,11 +772,11 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
``name``
The name to search the id.
-
+
``language_id``
The language_id for which language should be searched
"""
- log.debug(u'BiblesResourcesDB.get_alternative_book_name("%s", "%s")',
+ log.debug(u'BiblesResourcesDB.get_alternative_book_name("%s", "%s")',
name, language_id)
if language_id:
books = BiblesResourcesDB.run_sql(u'SELECT book_reference_id, name '
@@ -806,7 +793,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
@staticmethod
def get_language(name):
"""
- Return a dict containing the language id, name and code by name or
+ Return a dict containing the language id, name and code by name or
abbreviation.
``name``
@@ -865,7 +852,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
class AlternativeBookNamesDB(QtCore.QObject, Manager):
"""
- This class represents a database-bound alternative book names system.
+ This class represents a database-bound alternative book names system.
"""
cursor = None
conn = None
@@ -874,7 +861,7 @@ class AlternativeBookNamesDB(QtCore.QObject, Manager):
def get_cursor():
"""
Return the cursor object. Instantiate one if it doesn't exist yet.
- If necessary loads up the database and creates the tables if the
+ If necessary loads up the database and creates the tables if the
database doesn't exist.
"""
if AlternativeBookNamesDB.cursor is None:
@@ -904,7 +891,7 @@ class AlternativeBookNamesDB(QtCore.QObject, Manager):
``parameters``
Any variable parameters to add to the query
-
+
``commit``
If a commit statement is necessary this should be True.
"""
@@ -921,11 +908,11 @@ class AlternativeBookNamesDB(QtCore.QObject, Manager):
``name``
The name to search the id.
-
+
``language_id``
The language_id for which language should be searched
"""
- log.debug(u'AlternativeBookNamesDB.get_book_reference_id("%s", "%s")',
+ log.debug(u'AlternativeBookNamesDB.get_book_reference_id("%s", "%s")',
name, language_id)
if language_id:
books = AlternativeBookNamesDB.run_sql(u'SELECT book_reference_id, '
@@ -962,11 +949,11 @@ class AlternativeBookNamesDB(QtCore.QObject, Manager):
class OldBibleDB(QtCore.QObject, Manager):
"""
- This class conects to the old bible databases to reimport them to the new
+ This class conects to the old bible databases to reimport them to the new
database scheme.
"""
cursor = None
-
+
def __init__(self, parent, **kwargs):
"""
The constructor loads up the database and creates and initialises the
diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py
index 354332083..934aa2d90 100644
--- a/openlp/plugins/bibles/lib/manager.py
+++ b/openlp/plugins/bibles/lib/manager.py
@@ -151,9 +151,10 @@ class BibleManager(object):
name = bible.get_name()
# Remove corrupted files.
if name is None:
+ bible.session.close()
delete_file(os.path.join(self.path, filename))
continue
- # Find old database versions
+ # Find old database versions.
if bible.is_old_database():
self.old_bible_databases.append([filename, name])
bible.session.close()
@@ -220,7 +221,7 @@ class BibleManager(object):
return [
{
u'name': book.name,
- u'book_reference_id': book.book_reference_id,
+ u'book_reference_id': book.book_reference_id,
u'chapters': self.db_cache[bible].get_chapter_count(book)
}
for book in self.db_cache[bible].get_books()
@@ -229,10 +230,10 @@ class BibleManager(object):
def get_chapter_count(self, bible, book):
"""
Returns the number of Chapters for a given book.
-
+
``bible``
Unicode. The Bible to get the list of books from.
-
+
``book``
The book object to get the chapter count for.
"""
@@ -295,7 +296,7 @@ class BibleManager(object):
if db_book:
book_id = db_book.book_reference_id
log.debug(u'Book name corrected to "%s"', db_book.name)
- new_reflist.append((book_id, item[1], item[2],
+ new_reflist.append((book_id, item[1], item[2],
item[3]))
else:
log.debug(u'OpenLP failed to find book %s', item[0])
diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py
index 82ee4430c..91009424c 100644
--- a/openlp/plugins/bibles/lib/mediaitem.py
+++ b/openlp/plugins/bibles/lib/mediaitem.py
@@ -395,6 +395,7 @@ class BibleMediaItem(MediaManagerItem):
log.debug(u'Reloading Bibles')
self.plugin.manager.reload_bibles()
self.loadBibles()
+ self.updateAutoCompleter()
def initialiseAdvancedBible(self, bible):
"""
@@ -612,7 +613,7 @@ class BibleMediaItem(MediaManagerItem):
if restore:
old_text = unicode(combo.currentText())
combo.clear()
- combo.addItems([unicode(i) for i in range(range_from, range_to + 1)])
+ combo.addItems(map(unicode, range(range_from, range_to + 1)))
if restore and combo.findText(old_text) != -1:
combo.setCurrentIndex(combo.findText(old_text))
diff --git a/openlp/plugins/bibles/resources/bibles_resources.sqlite b/openlp/plugins/bibles/resources/bibles_resources.sqlite
index 3235c9562..c0fa931d1 100644
Binary files a/openlp/plugins/bibles/resources/bibles_resources.sqlite and b/openlp/plugins/bibles/resources/bibles_resources.sqlite differ
diff --git a/openlp/plugins/songs/lib/openlyricsexport.py b/openlp/plugins/songs/lib/openlyricsexport.py
index 6ba1fabe7..ec5677ea4 100644
--- a/openlp/plugins/songs/lib/openlyricsexport.py
+++ b/openlp/plugins/songs/lib/openlyricsexport.py
@@ -35,6 +35,7 @@ import re
from lxml import etree
from openlp.core.lib import check_directory_exists, Receiver, translate
+from openlp.core.utils import clean_filename
from openlp.plugins.songs.lib import OpenLyrics
log = logging.getLogger(__name__)
@@ -72,8 +73,7 @@ class OpenLyricsExport(object):
tree = etree.ElementTree(etree.fromstring(xml))
filename = u'%s (%s)' % (song.title,
u', '.join([author.display_name for author in song.authors]))
- filename = re.sub(
- r'[/\\?*|<>\[\]":<>+%]+', u'_', filename).strip(u'_')
+ filename = clean_filename(filename)
# Ensure the filename isn't too long for some filesystems
filename = u'%s.xml' % filename[0:250 - len(self.save_path)]
# Pass a file object, because lxml does not cope with some special
diff --git a/openlp/plugins/songs/lib/songshowplusimport.py b/openlp/plugins/songs/lib/songshowplusimport.py
index 7f7527c6d..c50df8752 100644
--- a/openlp/plugins/songs/lib/songshowplusimport.py
+++ b/openlp/plugins/songs/lib/songshowplusimport.py
@@ -102,7 +102,6 @@ class SongShowPlusImport(SongImport):
if not isinstance(self.import_source, list):
return
self.import_wizard.progressBar.setMaximum(len(self.import_source))
-
for file in self.import_source:
self.sspVerseOrderList = []
otherCount = 0
@@ -111,7 +110,6 @@ class SongShowPlusImport(SongImport):
self.import_wizard.incrementProgressBar(
WizardStrings.ImportingType % file_name, 0)
songData = open(file, 'rb')
-
while True:
blockKey, = struct.unpack("I", songData.read(4))
# The file ends with 4 NUL's
@@ -126,8 +124,9 @@ class SongShowPlusImport(SongImport):
songData.read(2))
verseName = songData.read(verseNameLength)
lengthDescriptorSize, = struct.unpack("B", songData.read(1))
+ log.debug(lengthDescriptorSize)
# Detect if/how long the length descriptor is
- if lengthDescriptorSize == 12:
+ if lengthDescriptorSize == 12 or lengthDescriptorSize == 20:
lengthDescriptor, = struct.unpack("I", songData.read(4))
elif lengthDescriptorSize == 2:
lengthDescriptor = 1
@@ -135,6 +134,7 @@ class SongShowPlusImport(SongImport):
lengthDescriptor = 0
else:
lengthDescriptor, = struct.unpack("B", songData.read(1))
+ log.debug(lengthDescriptorSize)
data = songData.read(lengthDescriptor)
if blockKey == TITLE:
self.title = unicode(data, u'cp1252')