Merged with trunk

This commit is contained in:
Stevan Pettit 2011-08-25 08:15:31 -04:00
commit 215abd2966
42 changed files with 25501 additions and 14321 deletions

View File

@ -223,7 +223,9 @@ class Manager(object):
query = self.session.query(object_class) query = self.session.query(object_class)
if filter_clause is not None: if filter_clause is not None:
query = query.filter(filter_clause) query = query.filter(filter_clause)
if order_by_ref is not None: if isinstance(order_by_ref, list):
return query.order_by(*order_by_ref).all()
elif order_by_ref is not None:
return query.order_by(order_by_ref).all() return query.order_by(order_by_ref).all()
return query.all() return query.all()

View File

@ -48,9 +48,10 @@ class SpellTextEdit(QtGui.QPlainTextEdit):
""" """
Spell checking widget based on QPlanTextEdit. Spell checking widget based on QPlanTextEdit.
""" """
def __init__(self, *args): def __init__(self, parent=None, formattingTagsAllowed=True):
global ENCHANT_AVAILABLE global ENCHANT_AVAILABLE
QtGui.QPlainTextEdit.__init__(self, *args) QtGui.QPlainTextEdit.__init__(self, parent)
self.formattingTagsAllowed = formattingTagsAllowed
# Default dictionary based on the current locale. # Default dictionary based on the current locale.
if ENCHANT_AVAILABLE: if ENCHANT_AVAILABLE:
try: try:
@ -110,16 +111,17 @@ class SpellTextEdit(QtGui.QPlainTextEdit):
spell_menu.addAction(action) spell_menu.addAction(action)
# Only add the spelling suggests to the menu if there are # Only add the spelling suggests to the menu if there are
# suggestions. # suggestions.
if len(spell_menu.actions()): if spell_menu.actions():
popupMenu.insertMenu(popupMenu.actions()[0], spell_menu) popupMenu.insertMenu(popupMenu.actions()[0], spell_menu)
tagMenu = QtGui.QMenu(translate('OpenLP.SpellTextEdit', tagMenu = QtGui.QMenu(translate('OpenLP.SpellTextEdit',
'Formatting Tags')) 'Formatting Tags'))
for html in FormattingTags.get_html_tags(): if self.formattingTagsAllowed:
action = SpellAction(html[u'desc'], tagMenu) for html in FormattingTags.get_html_tags():
action.correct.connect(self.htmlTag) action = SpellAction(html[u'desc'], tagMenu)
tagMenu.addAction(action) action.correct.connect(self.htmlTag)
popupMenu.insertSeparator(popupMenu.actions()[0]) tagMenu.addAction(action)
popupMenu.insertMenu(popupMenu.actions()[0], tagMenu) popupMenu.insertSeparator(popupMenu.actions()[0])
popupMenu.insertMenu(popupMenu.actions()[0], tagMenu)
popupMenu.exec_(event.globalPos()) popupMenu.exec_(event.globalPos())
def setLanguage(self, action): def setLanguage(self, action):

View File

@ -28,6 +28,7 @@
import logging import logging
import os import os
import sys, string import sys, string
import shutil
from tempfile import gettempdir from tempfile import gettempdir
from datetime import datetime from datetime import datetime
@ -311,10 +312,10 @@ class Ui_MainWindow(object):
add_actions(self.fileExportMenu, (self.settingsExportItem, None, add_actions(self.fileExportMenu, (self.settingsExportItem, None,
self.exportThemeItem, self.exportLanguageItem)) self.exportThemeItem, self.exportLanguageItem))
add_actions(self.fileMenu, (self.fileNewItem, self.fileOpenItem, add_actions(self.fileMenu, (self.fileNewItem, self.fileOpenItem,
self.fileSaveItem, self.fileSaveAsItem, None, self.fileSaveItem, self.fileSaveAsItem,
self.recentFilesMenu.menuAction(), None, self.printServiceOrderItem, self.recentFilesMenu.menuAction(), None,
None, self.fileImportMenu.menuAction(), self.fileImportMenu.menuAction(), self.fileExportMenu.menuAction(),
self.fileExportMenu.menuAction(), self.fileExitItem)) None, self.printServiceOrderItem, self.fileExitItem))
add_actions(self.viewModeMenu, (self.modeDefaultItem, add_actions(self.viewModeMenu, (self.modeDefaultItem,
self.modeSetupItem, self.modeLiveItem)) self.modeSetupItem, self.modeLiveItem))
add_actions(self.viewMenu, (self.viewModeMenu.menuAction(), add_actions(self.viewMenu, (self.viewModeMenu.menuAction(),
@ -423,7 +424,7 @@ class Ui_MainWindow(object):
self.settingsShortcutsItem.setText( self.settingsShortcutsItem.setText(
translate('OpenLP.MainWindow', 'Configure &Shortcuts...')) translate('OpenLP.MainWindow', 'Configure &Shortcuts...'))
self.formattingTagItem.setText( self.formattingTagItem.setText(
translate('OpenLP.MainWindow', '&Configure Formatting Tags...')) translate('OpenLP.MainWindow', 'Configure &Formatting Tags...'))
self.settingsConfigureItem.setText( self.settingsConfigureItem.setText(
translate('OpenLP.MainWindow', '&Configure OpenLP...')) translate('OpenLP.MainWindow', '&Configure OpenLP...'))
self.settingsExportItem.setStatusTip(translate('OpenLP.MainWindow', self.settingsExportItem.setStatusTip(translate('OpenLP.MainWindow',
@ -750,11 +751,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
plugin.firstTime() plugin.firstTime()
Receiver.send_message(u'openlp_process_events') Receiver.send_message(u'openlp_process_events')
temp_dir = os.path.join(unicode(gettempdir()), u'openlp') temp_dir = os.path.join(unicode(gettempdir()), u'openlp')
if not os.path.exists(temp_dir): shutil.rmtree(temp_dir, True)
return
for filename in os.listdir(temp_dir):
delete_file(os.path.join(temp_dir, filename))
os.removedirs(temp_dir)
def onFirstTimeWizardClicked(self): def onFirstTimeWizardClicked(self):
""" """

View File

@ -108,7 +108,7 @@ class Ui_PrintServiceDialog(object):
self.footerLabel = QtGui.QLabel(self.optionsWidget) self.footerLabel = QtGui.QLabel(self.optionsWidget)
self.footerLabel.setObjectName(u'footerLabel') self.footerLabel.setObjectName(u'footerLabel')
self.optionsLayout.addWidget(self.footerLabel) self.optionsLayout.addWidget(self.footerLabel)
self.footerTextEdit = SpellTextEdit(self.optionsWidget) self.footerTextEdit = SpellTextEdit(self.optionsWidget, False)
self.footerTextEdit.setObjectName(u'footerTextEdit') self.footerTextEdit.setObjectName(u'footerTextEdit')
self.optionsLayout.addWidget(self.footerTextEdit) self.optionsLayout.addWidget(self.footerTextEdit)
self.optionsGroupBox = QtGui.QGroupBox() self.optionsGroupBox = QtGui.QGroupBox()

View File

@ -24,6 +24,7 @@
# with this program; if not, write to the Free Software Foundation, Inc., 59 # # with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Temple Place, Suite 330, Boston, MA 02111-1307 USA #
############################################################################### ###############################################################################
import cgi
import datetime import datetime
import os import os
@ -183,7 +184,7 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
self._addElement(u'style', custom_css, html_data.head, self._addElement(u'style', custom_css, html_data.head,
attribute=(u'type', u'text/css')) attribute=(u'type', u'text/css'))
self._addElement(u'body', parent=html_data) 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') html_data.body, classId=u'serviceTitle')
for index, item in enumerate(self.serviceManager.serviceItems): for index, item in enumerate(self.serviceManager.serviceItems):
self._addPreviewItem(html_data.body, item[u'service_item'], index) self._addPreviewItem(html_data.body, item[u'service_item'], index)
@ -193,8 +194,9 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
classId=u'customNotes') classId=u'customNotes')
self._addElement(u'span', translate('OpenLP.ServiceManager', self._addElement(u'span', translate('OpenLP.ServiceManager',
'Custom Service Notes: '), div, classId=u'customNotesTitle') 'Custom Service Notes: '), div, classId=u'customNotesTitle')
self._addElement(u'span', self.footerTextEdit.toPlainText(), div, self._addElement(u'span',
classId=u'customNotesText') cgi.escape(self.footerTextEdit.toPlainText()),
div, classId=u'customNotesText')
self.document.setHtml(html.tostring(html_data)) self.document.setHtml(html.tostring(html_data))
self.previewWidget.updatePreview() self.previewWidget.updatePreview()
@ -204,8 +206,8 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
item_title = self._addElement(u'h2', parent=div, classId=u'itemTitle') item_title = self._addElement(u'h2', parent=div, classId=u'itemTitle')
self._addElement(u'img', parent=item_title, self._addElement(u'img', parent=item_title,
attribute=(u'src', item.icon)) attribute=(u'src', item.icon))
self._addElement(u'span', u' ' + item.get_display_title(), self._addElement(u'span',
item_title) u' ' + cgi.escape(item.get_display_title()), item_title)
if self.slideTextCheckBox.isChecked(): if self.slideTextCheckBox.isChecked():
# Add the text of the service item. # Add the text of the service item.
if item.is_text(): if item.is_text():
@ -230,8 +232,9 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
foot_text = item.foot_text foot_text = item.foot_text
foot_text = foot_text.partition(u'<br>')[2] foot_text = foot_text.partition(u'<br>')[2]
if foot_text: if foot_text:
foot = self._addElement(u'div', foot_text, parent=div, foot_text = cgi.escape(foot_text.replace(u'<br>', u'\n'))
classId=u'itemFooter') self._addElement(u'div', foot_text.replace(u'\n', u'<br>'),
parent=div, classId=u'itemFooter')
# Add service items' notes. # Add service items' notes.
if self.notesCheckBox.isChecked(): if self.notesCheckBox.isChecked():
if item.notes: if item.notes:
@ -239,8 +242,8 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
self._addElement(u'span', self._addElement(u'span',
translate('OpenLP.ServiceManager', 'Notes: '), p, translate('OpenLP.ServiceManager', 'Notes: '), p,
classId=u'itemNotesTitle') classId=u'itemNotesTitle')
notes = self._addElement(u'span', self._addElement(u'span',
item.notes.replace(u'\n', u'<br>'), p, cgi.escape(unicode(item.notes)).replace(u'\n', u'<br>'), p,
classId=u'itemNotesText') classId=u'itemNotesText')
# Add play length of media files. # Add play length of media files.
if item.is_media() and self.metaDataCheckBox.isChecked(): if item.is_media() and self.metaDataCheckBox.isChecked():

View File

@ -24,6 +24,7 @@
# with this program; if not, write to the Free Software Foundation, Inc., 59 # # with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Temple Place, Suite 330, Boston, MA 02111-1307 USA #
############################################################################### ###############################################################################
import cgi
import cPickle import cPickle
import logging import logging
import os import os
@ -721,6 +722,9 @@ class ServiceManager(QtGui.QWidget):
self.setModified() self.setModified()
def onStartTimeForm(self): def onStartTimeForm(self):
"""
Opens a dialog to type in service item notes.
"""
item = self.findServiceItem()[0] item = self.findServiceItem()[0]
self.startTimeForm.item = self.serviceItems[item] self.startTimeForm.item = self.serviceItems[item]
if self.startTimeForm.exec_(): if self.startTimeForm.exec_():
@ -959,7 +963,7 @@ class ServiceManager(QtGui.QWidget):
if serviceitem.notes: if serviceitem.notes:
tips.append(u'<strong>%s: </strong> %s' % tips.append(u'<strong>%s: </strong> %s' %
(unicode(translate('OpenLP.ServiceManager', 'Notes')), (unicode(translate('OpenLP.ServiceManager', 'Notes')),
unicode(serviceitem.notes))) cgi.escape(unicode(serviceitem.notes))))
if item[u'service_item'] \ if item[u'service_item'] \
.is_capable(ItemCapabilities.AllowsVariableStartTime): .is_capable(ItemCapabilities.AllowsVariableStartTime):
tips.append(item[u'service_item'].get_media_time()) tips.append(item[u'service_item'].get_media_time())

View File

@ -27,7 +27,7 @@
from PyQt4 import QtCore, QtGui 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 from openlp.core.lib.ui import create_accept_reject_button_box
class ServiceNoteForm(QtGui.QDialog): class ServiceNoteForm(QtGui.QDialog):
@ -52,7 +52,7 @@ class ServiceNoteForm(QtGui.QDialog):
self.dialogLayout.setContentsMargins(8, 8, 8, 8) self.dialogLayout.setContentsMargins(8, 8, 8, 8)
self.dialogLayout.setSpacing(8) self.dialogLayout.setSpacing(8)
self.dialogLayout.setObjectName(u'verticalLayout') self.dialogLayout.setObjectName(u'verticalLayout')
self.textEdit = QtGui.QTextEdit(self) self.textEdit = SpellTextEdit(self, False)
self.textEdit.setObjectName(u'textEdit') self.textEdit.setObjectName(u'textEdit')
self.dialogLayout.addWidget(self.textEdit) self.dialogLayout.addWidget(self.textEdit)
self.dialogLayout.addWidget(create_accept_reject_button_box(self)) self.dialogLayout.addWidget(create_accept_reject_button_box(self))

View File

@ -386,6 +386,17 @@ def split_filename(path):
else: else:
return os.path.split(path) 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): def delete_file(file_path_name):
""" """
Deletes a file from the system. 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', __all__ = [u'AppLocation', u'get_application_version', u'check_latest_version',
u'add_actions', u'get_filesystem_encoding', u'LanguageManager', u'add_actions', u'get_filesystem_encoding', u'LanguageManager',
u'ActionList', u'get_web_page', u'file_is_unicode', u'get_uno_command', 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']

View File

@ -44,85 +44,85 @@ class AlertsTab(SettingsTab):
self.fontGroupBox.setObjectName(u'fontGroupBox') self.fontGroupBox.setObjectName(u'fontGroupBox')
self.fontLayout = QtGui.QFormLayout(self.fontGroupBox) self.fontLayout = QtGui.QFormLayout(self.fontGroupBox)
self.fontLayout.setObjectName(u'fontLayout') self.fontLayout.setObjectName(u'fontLayout')
self.FontLabel = QtGui.QLabel(self.fontGroupBox) self.fontLabel = QtGui.QLabel(self.fontGroupBox)
self.FontLabel.setObjectName(u'FontLabel') self.fontLabel.setObjectName(u'fontLabel')
self.FontComboBox = QtGui.QFontComboBox(self.fontGroupBox) self.fontComboBox = QtGui.QFontComboBox(self.fontGroupBox)
self.FontComboBox.setObjectName(u'FontComboBox') self.fontComboBox.setObjectName(u'fontComboBox')
self.fontLayout.addRow(self.FontLabel, self.FontComboBox) self.fontLayout.addRow(self.fontLabel, self.fontComboBox)
self.FontColorLabel = QtGui.QLabel(self.fontGroupBox) self.fontColorLabel = QtGui.QLabel(self.fontGroupBox)
self.FontColorLabel.setObjectName(u'FontColorLabel') self.fontColorLabel.setObjectName(u'fontColorLabel')
self.ColorLayout = QtGui.QHBoxLayout() self.colorLayout = QtGui.QHBoxLayout()
self.ColorLayout.setObjectName(u'ColorLayout') self.colorLayout.setObjectName(u'colorLayout')
self.FontColorButton = QtGui.QPushButton(self.fontGroupBox) self.fontColorButton = QtGui.QPushButton(self.fontGroupBox)
self.FontColorButton.setObjectName(u'FontColorButton') self.fontColorButton.setObjectName(u'fontColorButton')
self.ColorLayout.addWidget(self.FontColorButton) self.colorLayout.addWidget(self.fontColorButton)
self.ColorLayout.addSpacing(20) self.colorLayout.addSpacing(20)
self.BackgroundColorLabel = QtGui.QLabel(self.fontGroupBox) self.backgroundColorLabel = QtGui.QLabel(self.fontGroupBox)
self.BackgroundColorLabel.setObjectName(u'BackgroundColorLabel') self.backgroundColorLabel.setObjectName(u'backgroundColorLabel')
self.ColorLayout.addWidget(self.BackgroundColorLabel) self.colorLayout.addWidget(self.backgroundColorLabel)
self.BackgroundColorButton = QtGui.QPushButton(self.fontGroupBox) self.backgroundColorButton = QtGui.QPushButton(self.fontGroupBox)
self.BackgroundColorButton.setObjectName(u'BackgroundColorButton') self.backgroundColorButton.setObjectName(u'backgroundColorButton')
self.ColorLayout.addWidget(self.BackgroundColorButton) self.colorLayout.addWidget(self.backgroundColorButton)
self.fontLayout.addRow(self.FontColorLabel, self.ColorLayout) self.fontLayout.addRow(self.fontColorLabel, self.colorLayout)
self.FontSizeLabel = QtGui.QLabel(self.fontGroupBox) self.fontSizeLabel = QtGui.QLabel(self.fontGroupBox)
self.FontSizeLabel.setObjectName(u'FontSizeLabel') self.fontSizeLabel.setObjectName(u'fontSizeLabel')
self.FontSizeSpinBox = QtGui.QSpinBox(self.fontGroupBox) self.fontSizeSpinBox = QtGui.QSpinBox(self.fontGroupBox)
self.FontSizeSpinBox.setObjectName(u'FontSizeSpinBox') self.fontSizeSpinBox.setObjectName(u'fontSizeSpinBox')
self.fontLayout.addRow(self.FontSizeLabel, self.FontSizeSpinBox) self.fontLayout.addRow(self.fontSizeLabel, self.fontSizeSpinBox)
self.TimeoutLabel = QtGui.QLabel(self.fontGroupBox) self.timeoutLabel = QtGui.QLabel(self.fontGroupBox)
self.TimeoutLabel.setObjectName(u'TimeoutLabel') self.timeoutLabel.setObjectName(u'timeoutLabel')
self.TimeoutSpinBox = QtGui.QSpinBox(self.fontGroupBox) self.timeoutSpinBox = QtGui.QSpinBox(self.fontGroupBox)
self.TimeoutSpinBox.setMaximum(180) self.timeoutSpinBox.setMaximum(180)
self.TimeoutSpinBox.setObjectName(u'TimeoutSpinBox') self.timeoutSpinBox.setObjectName(u'timeoutSpinBox')
self.fontLayout.addRow(self.TimeoutLabel, self.TimeoutSpinBox) self.fontLayout.addRow(self.timeoutLabel, self.timeoutSpinBox)
create_valign_combo(self, self.fontGroupBox, self.fontLayout) create_valign_combo(self, self.fontGroupBox, self.fontLayout)
self.leftLayout.addWidget(self.fontGroupBox) self.leftLayout.addWidget(self.fontGroupBox)
self.leftLayout.addStretch() self.leftLayout.addStretch()
self.PreviewGroupBox = QtGui.QGroupBox(self.rightColumn) self.previewGroupBox = QtGui.QGroupBox(self.rightColumn)
self.PreviewGroupBox.setObjectName(u'PreviewGroupBox') self.previewGroupBox.setObjectName(u'previewGroupBox')
self.PreviewLayout = QtGui.QVBoxLayout(self.PreviewGroupBox) self.previewLayout = QtGui.QVBoxLayout(self.previewGroupBox)
self.PreviewLayout.setObjectName(u'PreviewLayout') self.previewLayout.setObjectName(u'previewLayout')
self.FontPreview = QtGui.QLineEdit(self.PreviewGroupBox) self.fontPreview = QtGui.QLineEdit(self.previewGroupBox)
self.FontPreview.setObjectName(u'FontPreview') self.fontPreview.setObjectName(u'fontPreview')
self.PreviewLayout.addWidget(self.FontPreview) self.previewLayout.addWidget(self.fontPreview)
self.rightLayout.addWidget(self.PreviewGroupBox) self.rightLayout.addWidget(self.previewGroupBox)
self.rightLayout.addStretch() self.rightLayout.addStretch()
# Signals and slots # Signals and slots
QtCore.QObject.connect(self.BackgroundColorButton, QtCore.QObject.connect(self.backgroundColorButton,
QtCore.SIGNAL(u'pressed()'), self.onBackgroundColorButtonClicked) QtCore.SIGNAL(u'pressed()'), self.onBackgroundColorButtonClicked)
QtCore.QObject.connect(self.FontColorButton, QtCore.QObject.connect(self.fontColorButton,
QtCore.SIGNAL(u'pressed()'), self.onFontColorButtonClicked) QtCore.SIGNAL(u'pressed()'), self.onFontColorButtonClicked)
QtCore.QObject.connect(self.FontComboBox, QtCore.QObject.connect(self.fontComboBox,
QtCore.SIGNAL(u'activated(int)'), self.onFontComboBoxClicked) 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.SIGNAL(u'valueChanged(int)'), self.onTimeoutSpinBoxChanged)
QtCore.QObject.connect(self.FontSizeSpinBox, QtCore.QObject.connect(self.fontSizeSpinBox,
QtCore.SIGNAL(u'valueChanged(int)'), self.onFontSizeSpinBoxChanged) QtCore.SIGNAL(u'valueChanged(int)'), self.onFontSizeSpinBoxChanged)
def retranslateUi(self): def retranslateUi(self):
self.fontGroupBox.setTitle( self.fontGroupBox.setTitle(
translate('AlertsPlugin.AlertsTab', 'Font')) translate('AlertsPlugin.AlertsTab', 'Font'))
self.FontLabel.setText( self.fontLabel.setText(
translate('AlertsPlugin.AlertsTab', 'Font name:')) translate('AlertsPlugin.AlertsTab', 'Font name:'))
self.FontColorLabel.setText( self.fontColorLabel.setText(
translate('AlertsPlugin.AlertsTab', 'Font color:')) translate('AlertsPlugin.AlertsTab', 'Font color:'))
self.BackgroundColorLabel.setText( self.backgroundColorLabel.setText(
translate('AlertsPlugin.AlertsTab', 'Background color:')) translate('AlertsPlugin.AlertsTab', 'Background color:'))
self.FontSizeLabel.setText( self.fontSizeLabel.setText(
translate('AlertsPlugin.AlertsTab', 'Font size:')) translate('AlertsPlugin.AlertsTab', 'Font size:'))
self.FontSizeSpinBox.setSuffix(UiStrings().FontSizePtUnit) self.fontSizeSpinBox.setSuffix(UiStrings().FontSizePtUnit)
self.TimeoutLabel.setText( self.timeoutLabel.setText(
translate('AlertsPlugin.AlertsTab', 'Alert timeout:')) translate('AlertsPlugin.AlertsTab', 'Alert timeout:'))
self.TimeoutSpinBox.setSuffix(UiStrings().Seconds) self.timeoutSpinBox.setSuffix(UiStrings().Seconds)
self.PreviewGroupBox.setTitle(UiStrings().Preview) self.previewGroupBox.setTitle(UiStrings().Preview)
self.FontPreview.setText(UiStrings().OLPV2) self.fontPreview.setText(UiStrings().OLPV2)
def onBackgroundColorButtonClicked(self): def onBackgroundColorButtonClicked(self):
new_color = QtGui.QColorDialog.getColor( new_color = QtGui.QColorDialog.getColor(
QtGui.QColor(self.bg_color), self) QtGui.QColor(self.bg_color), self)
if new_color.isValid(): if new_color.isValid():
self.bg_color = new_color.name() self.bg_color = new_color.name()
self.BackgroundColorButton.setStyleSheet( self.backgroundColorButton.setStyleSheet(
u'background-color: %s' % self.bg_color) u'background-color: %s' % self.bg_color)
self.updateDisplay() self.updateDisplay()
@ -134,15 +134,15 @@ class AlertsTab(SettingsTab):
QtGui.QColor(self.font_color), self) QtGui.QColor(self.font_color), self)
if new_color.isValid(): if new_color.isValid():
self.font_color = new_color.name() self.font_color = new_color.name()
self.FontColorButton.setStyleSheet( self.fontColorButton.setStyleSheet(
u'background-color: %s' % self.font_color) u'background-color: %s' % self.font_color)
self.updateDisplay() self.updateDisplay()
def onTimeoutSpinBoxChanged(self): def onTimeoutSpinBoxChanged(self):
self.timeout = self.TimeoutSpinBox.value() self.timeout = self.timeoutSpinBox.value()
def onFontSizeSpinBoxChanged(self): def onFontSizeSpinBoxChanged(self):
self.font_size = self.FontSizeSpinBox.value() self.font_size = self.fontSizeSpinBox.value()
self.updateDisplay() self.updateDisplay()
def load(self): def load(self):
@ -160,16 +160,16 @@ class AlertsTab(SettingsTab):
self.location = settings.value( self.location = settings.value(
u'location', QtCore.QVariant(1)).toInt()[0] u'location', QtCore.QVariant(1)).toInt()[0]
settings.endGroup() settings.endGroup()
self.FontSizeSpinBox.setValue(self.font_size) self.fontSizeSpinBox.setValue(self.font_size)
self.TimeoutSpinBox.setValue(self.timeout) self.timeoutSpinBox.setValue(self.timeout)
self.FontColorButton.setStyleSheet( self.fontColorButton.setStyleSheet(
u'background-color: %s' % self.font_color) u'background-color: %s' % self.font_color)
self.BackgroundColorButton.setStyleSheet( self.backgroundColorButton.setStyleSheet(
u'background-color: %s' % self.bg_color) u'background-color: %s' % self.bg_color)
self.verticalComboBox.setCurrentIndex(self.location) self.verticalComboBox.setCurrentIndex(self.location)
font = QtGui.QFont() font = QtGui.QFont()
font.setFamily(self.font_face) font.setFamily(self.font_face)
self.FontComboBox.setCurrentFont(font) self.fontComboBox.setCurrentFont(font)
self.updateDisplay() self.updateDisplay()
def save(self): def save(self):
@ -178,7 +178,7 @@ class AlertsTab(SettingsTab):
settings.setValue(u'background color', QtCore.QVariant(self.bg_color)) settings.setValue(u'background color', QtCore.QVariant(self.bg_color))
settings.setValue(u'font color', QtCore.QVariant(self.font_color)) settings.setValue(u'font color', QtCore.QVariant(self.font_color))
settings.setValue(u'font size', QtCore.QVariant(self.font_size)) 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'font face', QtCore.QVariant(self.font_face))
settings.setValue(u'timeout', QtCore.QVariant(self.timeout)) settings.setValue(u'timeout', QtCore.QVariant(self.timeout))
self.location = self.verticalComboBox.currentIndex() self.location = self.verticalComboBox.currentIndex()
@ -187,10 +187,10 @@ class AlertsTab(SettingsTab):
def updateDisplay(self): def updateDisplay(self):
font = QtGui.QFont() font = QtGui.QFont()
font.setFamily(self.FontComboBox.currentFont().family()) font.setFamily(self.fontComboBox.currentFont().family())
font.setBold(True) font.setBold(True)
font.setPointSize(self.font_size) font.setPointSize(self.font_size)
self.FontPreview.setFont(font) self.fontPreview.setFont(font)
self.FontPreview.setStyleSheet(u'background-color: %s; color: %s' % self.fontPreview.setStyleSheet(u'background-color: %s; color: %s' %
(self.bg_color, self.font_color)) (self.bg_color, self.font_color))

View File

@ -29,17 +29,17 @@ The bible import functions for OpenLP
import logging import logging
import os import os
import shutil import shutil
from tempfile import gettempdir
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from openlp.core.lib import Receiver, SettingsManager, translate, \ from openlp.core.lib import Receiver, SettingsManager, translate, \
check_directory_exists 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.lib.ui import UiStrings, critical_error_message_box
from openlp.core.ui.wizard import OpenLPWizard, WizardStrings from openlp.core.ui.wizard import OpenLPWizard, WizardStrings
from openlp.core.utils import AppLocation, delete_file from openlp.core.utils import AppLocation, delete_file
from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, OldBibleDB, \ from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, OldBibleDB, \
BiblesResourcesDB, clean_filename BiblesResourcesDB
from openlp.plugins.bibles.lib.http import BSExtract, BGExtract, CWExtract from openlp.plugins.bibles.lib.http import BSExtract, BGExtract, CWExtract
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -70,6 +70,7 @@ class BibleUpgradeForm(OpenLPWizard):
self.suffix = u'.sqlite' self.suffix = u'.sqlite'
self.settingsSection = u'bibles' self.settingsSection = u'bibles'
self.path = AppLocation.get_section_data_path(self.settingsSection) 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.files = self.manager.old_bible_databases
self.success = {} self.success = {}
self.newbibles = {} self.newbibles = {}
@ -91,20 +92,6 @@ class BibleUpgradeForm(OpenLPWizard):
log.debug(u'Stopping import') log.debug(u'Stopping import')
self.stop_import_flag = True 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): def reject(self):
""" """
Stop the wizard on cancel button, close button or ESC key. Stop the wizard on cancel button, close button or ESC key.
@ -113,8 +100,6 @@ class BibleUpgradeForm(OpenLPWizard):
self.stop_import_flag = True self.stop_import_flag = True
if not self.currentPage() == self.progressPage: if not self.currentPage() == self.progressPage:
self.done(QtGui.QDialog.Rejected) self.done(QtGui.QDialog.Rejected)
else:
self.postWizard()
def onCurrentIdChanged(self, pageId): def onCurrentIdChanged(self, pageId):
""" """
@ -124,7 +109,7 @@ class BibleUpgradeForm(OpenLPWizard):
self.preWizard() self.preWizard()
self.performWizard() self.performWizard()
self.postWizard() self.postWizard()
elif self.page(pageId) == self.selectPage and self.maxBibles == 0: elif self.page(pageId) == self.selectPage and not self.files:
self.next() self.next()
def onBackupBrowseButtonClicked(self): def onBackupBrowseButtonClicked(self):
@ -243,78 +228,13 @@ class BibleUpgradeForm(OpenLPWizard):
Add the content to the scrollArea. Add the content to the scrollArea.
""" """
self.checkBox = {} 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): for number, filename in enumerate(self.files):
bible = OldBibleDB(self.mediaItem, path=self.path, file=filename[0]) bible = OldBibleDB(self.mediaItem, path=self.path, file=filename[0])
self.checkBox[number] = QtGui.QCheckBox(self.scrollAreaContents) self.checkBox[number] = QtGui.QCheckBox(self.scrollAreaContents)
checkBoxName = u'checkBox[%d]' % number self.checkBox[number].setObjectName(u'checkBox[%d]' % number)
self.checkBox[number].setObjectName(checkBoxName)
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])
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, self.spacerItem = QtGui.QSpacerItem(20, 5, QtGui.QSizePolicy.Minimum,
QtGui.QSizePolicy.Expanding) QtGui.QSizePolicy.Expanding)
self.formLayout.addItem(self.spacerItem) self.formLayout.addItem(self.spacerItem)
@ -327,23 +247,6 @@ class BibleUpgradeForm(OpenLPWizard):
for number, filename in enumerate(self.files): for number, filename in enumerate(self.files):
self.formLayout.removeWidget(self.checkBox[number]) self.formLayout.removeWidget(self.checkBox[number])
self.checkBox[number].setParent(None) 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) self.formLayout.removeItem(self.spacerItem)
def retranslateUi(self): def retranslateUi(self):
@ -385,12 +288,6 @@ class BibleUpgradeForm(OpenLPWizard):
self.selectPage.setSubTitle( self.selectPage.setSubTitle(
translate('BiblesPlugin.UpgradeWizardForm', translate('BiblesPlugin.UpgradeWizardForm',
'Please select the Bibles to upgrade')) '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', self.progressPage.setTitle(translate('BiblesPlugin.UpgradeWizardForm',
'Upgrading')) 'Upgrading'))
self.progressPage.setSubTitle( self.progressPage.setSubTitle(
@ -425,58 +322,16 @@ class BibleUpgradeForm(OpenLPWizard):
return False return False
return True return True
elif self.currentPage() == self.selectPage: elif self.currentPage() == self.selectPage:
check_directory_exists(self.temp_dir)
for number, filename in enumerate(self.files): for number, filename in enumerate(self.files):
if not self.checkBox[number].checkState() == QtCore.Qt.Checked: if not self.checkBox[number].checkState() == QtCore.Qt.Checked:
continue continue
version_name = unicode(self.versionNameEdit[number].text()) # Move bibles to temp dir.
if not version_name: if not os.path.exists(os.path.join(self.temp_dir, filename[0])):
critical_error_message_box(UiStrings().EmptyField, shutil.move(
translate('BiblesPlugin.UpgradeWizardForm', os.path.join(self.path, filename[0]), self.temp_dir)
'You need to specify a version name for your Bible.')) else:
self.versionNameEdit[number].setFocus() delete_file(os.path.join(self.path, filename[0]))
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
return True return True
if self.currentPage() == self.progressPage: if self.currentPage() == self.progressPage:
return True return True
@ -495,16 +350,8 @@ class BibleUpgradeForm(OpenLPWizard):
self.files = self.manager.old_bible_databases self.files = self.manager.old_bible_databases
self.addScrollArea() self.addScrollArea()
self.retranslateUi() self.retranslateUi()
self.maxBibles = len(self.files)
for number, filename in enumerate(self.files): for number, filename in enumerate(self.files):
self.checkBox[number].setCheckState(QtCore.Qt.Checked) 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.progressBar.show()
self.restart() self.restart()
self.finishButton.setVisible(False) self.finishButton.setVisible(False)
@ -516,9 +363,8 @@ class BibleUpgradeForm(OpenLPWizard):
Prepare the UI for the upgrade. Prepare the UI for the upgrade.
""" """
OpenLPWizard.preWizard(self) OpenLPWizard.preWizard(self)
self.progressLabel.setText(translate( self.progressLabel.setText(
'BiblesPlugin.UpgradeWizardForm', translate('BiblesPlugin.UpgradeWizardForm', 'Starting upgrade...'))
'Starting upgrade...'))
Receiver.send_message(u'openlp_process_events') Receiver.send_message(u'openlp_process_events')
def performWizard(self): def performWizard(self):
@ -527,48 +373,42 @@ class BibleUpgradeForm(OpenLPWizard):
""" """
self.include_webbible = False self.include_webbible = False
proxy_server = None proxy_server = None
if self.maxBibles == 0: if not self.files:
self.progressLabel.setText( self.progressLabel.setText(
translate('BiblesPlugin.UpgradeWizardForm', 'There are no ' translate('BiblesPlugin.UpgradeWizardForm', 'There are no '
'Bibles that need to be upgraded.')) 'Bibles that need to be upgraded.'))
self.progressBar.hide() self.progressBar.hide()
return return
self.maxBibles = 0 max_bibles = 0
for number, file in enumerate(self.files): for number, file in enumerate(self.files):
if self.checkBox[number].checkState() == QtCore.Qt.Checked: if self.checkBox[number].checkState() == QtCore.Qt.Checked:
self.maxBibles += 1 max_bibles += 1
number = 0 oldBible = None
for biblenumber, filename in enumerate(self.files): 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: if self.stop_import_flag:
bible_failed = True self.success[number] = False
break break
bible_failed = False if not self.checkBox[number].checkState() == QtCore.Qt.Checked:
self.success[biblenumber] = False self.success[number] = False
if not self.checkBox[biblenumber].checkState() == QtCore.Qt.Checked:
continue continue
self.progressBar.reset() self.progressBar.reset()
oldbible = OldBibleDB(self.mediaItem, path=self.path, oldBible = OldBibleDB(self.mediaItem, path=self.temp_dir,
file=filename[0]) file=filename[0])
name = filename[1] 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( self.progressLabel.setText(unicode(translate(
'BiblesPlugin.UpgradeWizardForm', 'BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\nUpgrading ...')) % 'Upgrading Bible %s of %s: "%s"\nUpgrading ...')) %
(number + 1, self.maxBibles, name)) (number + 1, max_bibles, name))
if os.path.exists(os.path.join(self.path, filename[0])):
name = unicode(self.versionNameEdit[biblenumber].text())
self.newbibles[number] = BibleDB(self.mediaItem, path=self.path, self.newbibles[number] = BibleDB(self.mediaItem, path=self.path,
name=name) name=name, file=filename[0])
self.newbibles[number].register(self.plugin.upgrade_wizard) self.newbibles[number].register(self.plugin.upgrade_wizard)
metadata = oldbible.get_metadata() metadata = oldBible.get_metadata()
webbible = False webbible = False
meta_data = {} meta_data = {}
for meta in metadata: for meta in metadata:
@ -595,7 +435,7 @@ class BibleUpgradeForm(OpenLPWizard):
u'name: "%s" failed' % ( u'name: "%s" failed' % (
meta_data[u'download source'], meta_data[u'download source'],
meta_data[u'download name'])) meta_data[u'download name']))
delete_database(self.path, clean_filename(name)) self.newbibles[number].session.close()
del self.newbibles[number] del self.newbibles[number]
critical_error_message_box( critical_error_message_box(
translate('BiblesPlugin.UpgradeWizardForm', translate('BiblesPlugin.UpgradeWizardForm',
@ -606,9 +446,9 @@ class BibleUpgradeForm(OpenLPWizard):
self.incrementProgressBar(unicode(translate( self.incrementProgressBar(unicode(translate(
'BiblesPlugin.UpgradeWizardForm', 'BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\nFailed')) % 'Upgrading Bible %s of %s: "%s"\nFailed')) %
(number + 1, self.maxBibles, name), (number + 1, max_bibles, name),
self.progressBar.maximum() - self.progressBar.value()) self.progressBar.maximum() - self.progressBar.value())
number += 1 self.success[number] = False
continue continue
bible = BiblesResourcesDB.get_webbible( bible = BiblesResourcesDB.get_webbible(
meta_data[u'download name'], meta_data[u'download name'],
@ -621,25 +461,25 @@ class BibleUpgradeForm(OpenLPWizard):
language_id = self.newbibles[number].get_language(name) language_id = self.newbibles[number].get_language(name)
if not language_id: if not language_id:
log.warn(u'Upgrading from "%s" failed' % filename[0]) 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] del self.newbibles[number]
self.incrementProgressBar(unicode(translate( self.incrementProgressBar(unicode(translate(
'BiblesPlugin.UpgradeWizardForm', 'BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\nFailed')) % 'Upgrading Bible %s of %s: "%s"\nFailed')) %
(number + 1, self.maxBibles, name), (number + 1, max_bibles, name),
self.progressBar.maximum() - self.progressBar.value()) self.progressBar.maximum() - self.progressBar.value())
number += 1 self.success[number] = False
continue continue
self.progressBar.setMaximum(len(books)) self.progressBar.setMaximum(len(books))
for book in books: for book in books:
if self.stop_import_flag: if self.stop_import_flag:
bible_failed = True self.success[number] = False
break break
self.incrementProgressBar(unicode(translate( self.incrementProgressBar(unicode(translate(
'BiblesPlugin.UpgradeWizardForm', 'BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\n' 'Upgrading Bible %s of %s: "%s"\n'
'Upgrading %s ...')) % 'Upgrading %s ...')) %
(number + 1, self.maxBibles, name, book)) (number + 1, max_bibles, name, book))
book_ref_id = self.newbibles[number].\ book_ref_id = self.newbibles[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:
@ -647,24 +487,24 @@ class BibleUpgradeForm(OpenLPWizard):
u'name: "%s" aborted by user' % ( u'name: "%s" aborted by user' % (
meta_data[u'download source'], meta_data[u'download source'],
meta_data[u'download name'])) meta_data[u'download name']))
delete_database(self.path, clean_filename(name)) self.newbibles[number].session.close()
del self.newbibles[number] del self.newbibles[number]
bible_failed = True self.success[number] = False
break break
book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
db_book = self.newbibles[number].create_book(book, db_book = self.newbibles[number].create_book(book,
book_ref_id, book_details[u'testament_id']) book_ref_id, book_details[u'testament_id'])
# Try to import still downloaded verses # Try to import already downloaded verses.
oldbook = oldbible.get_book(book) oldbook = oldBible.get_book(book)
if oldbook: if oldbook:
verses = oldbible.get_verses(oldbook[u'id']) verses = oldBible.get_verses(oldbook[u'id'])
if not verses: if not verses:
log.warn(u'No verses found to import for book ' log.warn(u'No verses found to import for book '
u'"%s"', book) u'"%s"', book)
continue continue
for verse in verses: for verse in verses:
if self.stop_import_flag: if self.stop_import_flag:
bible_failed = True self.success[number] = False
break break
self.newbibles[number].create_verse(db_book.id, self.newbibles[number].create_verse(db_book.id,
int(verse[u'chapter']), int(verse[u'chapter']),
@ -678,40 +518,40 @@ class BibleUpgradeForm(OpenLPWizard):
language_id = self.newbibles[number].get_language(name) language_id = self.newbibles[number].get_language(name)
if not language_id: if not language_id:
log.warn(u'Upgrading books from "%s" failed' % name) 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] del self.newbibles[number]
self.incrementProgressBar(unicode(translate( self.incrementProgressBar(unicode(translate(
'BiblesPlugin.UpgradeWizardForm', 'BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\nFailed')) % 'Upgrading Bible %s of %s: "%s"\nFailed')) %
(number + 1, self.maxBibles, name), (number + 1, max_bibles, name),
self.progressBar.maximum() - self.progressBar.value()) self.progressBar.maximum() - self.progressBar.value())
number += 1 self.success[number] = False
continue continue
books = oldbible.get_books() books = oldBible.get_books()
self.progressBar.setMaximum(len(books)) self.progressBar.setMaximum(len(books))
for book in books: for book in books:
if self.stop_import_flag: if self.stop_import_flag:
bible_failed = True self.success[number] = False
break break
self.incrementProgressBar(unicode(translate( self.incrementProgressBar(unicode(translate(
'BiblesPlugin.UpgradeWizardForm', 'BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\n' 'Upgrading Bible %s of %s: "%s"\n'
'Upgrading %s ...')) % 'Upgrading %s ...')) %
(number + 1, self.maxBibles, name, book[u'name'])) (number + 1, max_bibles, name, book[u'name']))
book_ref_id = self.newbibles[number].\ book_ref_id = self.newbibles[number].\
get_book_ref_id_by_name(book[u'name'], len(books), get_book_ref_id_by_name(book[u'name'], len(books),
language_id) language_id)
if not book_ref_id: if not book_ref_id:
log.warn(u'Upgrading books from %s " '\ log.warn(u'Upgrading books from %s " '\
'failed - aborted by user' % name) 'failed - aborted by user' % name)
delete_database(self.path, clean_filename(name)) self.newbibles[number].session.close()
del self.newbibles[number] del self.newbibles[number]
bible_failed = True self.success[number] = False
break break
book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
db_book = self.newbibles[number].create_book(book[u'name'], db_book = self.newbibles[number].create_book(book[u'name'],
book_ref_id, book_details[u'testament_id']) 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: if not verses:
log.warn(u'No verses found to import for book ' log.warn(u'No verses found to import for book '
u'"%s"', book[u'name']) u'"%s"', book[u'name'])
@ -719,31 +559,32 @@ class BibleUpgradeForm(OpenLPWizard):
continue continue
for verse in verses: for verse in verses:
if self.stop_import_flag: if self.stop_import_flag:
bible_failed = True self.success[number] = False
break break
self.newbibles[number].create_verse(db_book.id, self.newbibles[number].create_verse(db_book.id,
int(verse[u'chapter']), int(verse[u'chapter']),
int(verse[u'verse']), unicode(verse[u'text'])) int(verse[u'verse']), unicode(verse[u'text']))
Receiver.send_message(u'openlp_process_events') Receiver.send_message(u'openlp_process_events')
self.newbibles[number].session.commit() 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) self.newbibles[number].create_meta(u'Version', name)
oldbible.close_connection()
delete_file(os.path.join(self.path, filename[0]))
self.incrementProgressBar(unicode(translate( self.incrementProgressBar(unicode(translate(
'BiblesPlugin.UpgradeWizardForm', 'BiblesPlugin.UpgradeWizardForm',
'Upgrading Bible %s of %s: "%s"\n' 'Upgrading Bible %s of %s: "%s"\n'
'Complete')) % 'Complete')) %
(number + 1, self.maxBibles, name)) (number + 1, max_bibles, name))
self.success[biblenumber] = True if self.newbibles.has_key(number):
else: self.newbibles[number].session.close()
self.incrementProgressBar(unicode(translate( # Close the last bible's connection if possible.
'BiblesPlugin.UpgradeWizardForm', if oldBible is not None:
'Upgrading Bible %s of %s: "%s"\nFailed')) % oldBible.close_connection()
(number + 1, self.maxBibles, name),
self.progressBar.maximum() - self.progressBar.value())
delete_database(self.path, clean_filename(name))
number += 1
def postWizard(self): def postWizard(self):
""" """
@ -752,10 +593,14 @@ class BibleUpgradeForm(OpenLPWizard):
successful_import = 0 successful_import = 0
failed_import = 0 failed_import = 0
for number, filename in enumerate(self.files): 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 successful_import += 1
elif self.checkBox[number].checkState() == QtCore.Qt.Checked: elif self.checkBox[number].checkState() == QtCore.Qt.Checked:
failed_import += 1 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: if failed_import > 0:
failed_import_text = unicode(translate( failed_import_text = unicode(translate(
'BiblesPlugin.UpgradeWizardForm', 'BiblesPlugin.UpgradeWizardForm',
@ -776,7 +621,8 @@ class BibleUpgradeForm(OpenLPWizard):
'Bible(s): %s successful%s')) % (successful_import, 'Bible(s): %s successful%s')) % (successful_import,
failed_import_text)) failed_import_text))
else: else:
self.progressLabel.setText( self.progressLabel.setText(translate(
translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade ' 'BiblesPlugin.UpgradeWizardForm', 'Upgrade failed.'))
'failed.')) # Remove temp directory.
shutil.rmtree(self.temp_dir, True)
OpenLPWizard.postWizard(self) OpenLPWizard.postWizard(self)

View File

@ -44,8 +44,8 @@ class LanguageForm(QDialog, Ui_LanguageDialog):
Class to manage a dialog which ask the user for a language. Class to manage a dialog which ask the user for a language.
""" """
log.info(u'LanguageForm loaded') log.info(u'LanguageForm loaded')
def __init__(self, parent = None): def __init__(self, parent=None):
""" """
Constructor Constructor
""" """
@ -57,12 +57,11 @@ class LanguageForm(QDialog, Ui_LanguageDialog):
if bible_name: if bible_name:
self.bibleLabel.setText(unicode(bible_name)) self.bibleLabel.setText(unicode(bible_name))
items = BiblesResourcesDB.get_languages() items = BiblesResourcesDB.get_languages()
for item in items: self.languageComboBox.addItems([item[u'name'] for item in items])
self.languageComboBox.addItem(item[u'name'])
return QDialog.exec_(self) return QDialog.exec_(self)
def accept(self): def accept(self):
if self.languageComboBox.currentText() == u'': if not self.languageComboBox.currentText():
critical_error_message_box( critical_error_message_box(
message=translate('BiblesPlugin.LanguageForm', message=translate('BiblesPlugin.LanguageForm',
'You need to choose a language.')) 'You need to choose a language.'))

View File

@ -39,7 +39,7 @@ from sqlalchemy.orm.exc import UnmappedClassError
from openlp.core.lib import Receiver, translate from openlp.core.lib import Receiver, translate
from openlp.core.lib.db import BaseModel, init_db, Manager from openlp.core.lib.db import BaseModel, init_db, Manager
from openlp.core.lib.ui import critical_error_message_box 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__) log = logging.getLogger(__name__)
@ -63,19 +63,6 @@ class Verse(BaseModel):
""" """
pass 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): def init_schema(url):
""" """
Setup a bible database connection and initialise the database schema. Setup a bible database connection and initialise the database schema.
@ -158,7 +145,7 @@ class BibleDB(QtCore.QObject, Manager):
self.name = kwargs[u'name'] self.name = kwargs[u'name']
if not isinstance(self.name, unicode): if not isinstance(self.name, unicode):
self.name = unicode(self.name, u'utf-8') 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: if u'file' in kwargs:
self.file = kwargs[u'file'] self.file = kwargs[u'file']
Manager.__init__(self, u'bibles', init_schema, self.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. The book_reference_id from bibles_resources.sqlite of the book.
``testament`` ``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. bibles_resources.sqlite of the testament this book belongs to.
""" """
log.debug(u'BibleDB.create_book("%s", "%s")', name, bk_ref_id) 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)) 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): 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) language_id)
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)
@ -471,7 +458,7 @@ class BibleDB(QtCore.QObject, Manager):
def get_language(self, bible_name=None): 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. select the bible language.
Return the language id of a bible. 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. some resources which are used in the Bibles plugin.
A wrapper class around a small SQLite database which contains the download A wrapper class around a small SQLite database which contains the download
resources, a biblelist from the different download resources, the books, resources, a biblelist from the different download resources, the books,
chapter counts and verse counts for the web download Bibles, a language chapter counts and verse counts for the web download Bibles, a language
reference, the testament reference and some alternative book names. This reference, the testament reference and some alternative book names. This
class contains a singleton "cursor" so that only one connection to the class contains a singleton "cursor" so that only one connection to the
SQLite database is ever used. SQLite database is ever used.
""" """
cursor = None cursor = None
@ -582,7 +569,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
``name`` ``name``
The name or abbreviation of the book. The name or abbreviation of the book.
``lower`` ``lower``
True if the comparsion should be only lowercase True if the comparsion should be only lowercase
""" """
@ -592,7 +579,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
if lower: if lower:
books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, '
u'abbreviation, chapters FROM book_reference WHERE ' u'abbreviation, chapters FROM book_reference WHERE '
u'LOWER(name) = ? OR LOWER(abbreviation) = ?', u'LOWER(name) = ? OR LOWER(abbreviation) = ?',
(name.lower(), name.lower())) (name.lower(), name.lower()))
else: else:
books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, '
@ -621,7 +608,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
if not isinstance(id, int): if not isinstance(id, int):
id = int(id) id = int(id)
books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' 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, )) (id, ))
if books: if books:
return { return {
@ -645,12 +632,12 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
``chapter`` ``chapter``
The chapter number. The chapter number.
""" """
log.debug(u'BiblesResourcesDB.get_chapter("%s", "%s")', book_id, log.debug(u'BiblesResourcesDB.get_chapter("%s", "%s")', book_id,
chapter) chapter)
if not isinstance(chapter, int): if not isinstance(chapter, int):
chapter = int(chapter) chapter = int(chapter)
chapters = BiblesResourcesDB.run_sql(u'SELECT id, book_reference_id, ' 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,)) (book_id,))
if chapters: if chapters:
return { return {
@ -687,7 +674,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
``chapter`` ``chapter``
The number of the 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) chapter)
details = BiblesResourcesDB.get_chapter(book_id, chapter) details = BiblesResourcesDB.get_chapter(book_id, chapter)
if details: if details:
@ -715,7 +702,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
} }
else: else:
return None return None
@staticmethod @staticmethod
def get_webbibles(source): def get_webbibles(source):
""" """
@ -737,7 +724,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
u'id': bible[0], u'id': bible[0],
u'name': bible[1], u'name': bible[1],
u'abbreviation': bible[2], u'abbreviation': bible[2],
u'language_id': bible[3], u'language_id': bible[3],
u'download_source_id': bible[4] u'download_source_id': bible[4]
} }
for bible in bibles for bible in bibles
@ -752,11 +739,11 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
``abbreviation`` ``abbreviation``
The abbreviation of the webbible. The abbreviation of the webbible.
``source`` ``source``
The source of the webbible. The source of the webbible.
""" """
log.debug(u'BiblesResourcesDB.get_webbibles("%s", "%s")', abbreviation, log.debug(u'BiblesResourcesDB.get_webbibles("%s", "%s")', abbreviation,
source) source)
if not isinstance(abbreviation, unicode): if not isinstance(abbreviation, unicode):
abbreviation = unicode(abbreviation) abbreviation = unicode(abbreviation)
@ -765,14 +752,14 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
source = BiblesResourcesDB.get_download_source(source) source = BiblesResourcesDB.get_download_source(source)
bible = BiblesResourcesDB.run_sql(u'SELECT id, name, abbreviation, ' bible = BiblesResourcesDB.run_sql(u'SELECT id, name, abbreviation, '
u'language_id, download_source_id FROM webbibles WHERE ' 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)) abbreviation))
if bible: if bible:
return { return {
u'id': bible[0][0], u'id': bible[0][0],
u'name': bible[0][1], u'name': bible[0][1],
u'abbreviation': bible[0][2], u'abbreviation': bible[0][2],
u'language_id': bible[0][3], u'language_id': bible[0][3],
u'download_source_id': bible[0][4] u'download_source_id': bible[0][4]
} }
else: else:
@ -785,11 +772,11 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
``name`` ``name``
The name to search the id. The name to search the id.
``language_id`` ``language_id``
The language_id for which language should be searched 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) name, language_id)
if language_id: if language_id:
books = BiblesResourcesDB.run_sql(u'SELECT book_reference_id, name ' books = BiblesResourcesDB.run_sql(u'SELECT book_reference_id, name '
@ -806,7 +793,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
@staticmethod @staticmethod
def get_language(name): 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. abbreviation.
``name`` ``name``
@ -865,7 +852,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
class AlternativeBookNamesDB(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 cursor = None
conn = None conn = None
@ -874,7 +861,7 @@ class AlternativeBookNamesDB(QtCore.QObject, Manager):
def get_cursor(): def get_cursor():
""" """
Return the cursor object. Instantiate one if it doesn't exist yet. 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. database doesn't exist.
""" """
if AlternativeBookNamesDB.cursor is None: if AlternativeBookNamesDB.cursor is None:
@ -904,7 +891,7 @@ class AlternativeBookNamesDB(QtCore.QObject, Manager):
``parameters`` ``parameters``
Any variable parameters to add to the query Any variable parameters to add to the query
``commit`` ``commit``
If a commit statement is necessary this should be True. If a commit statement is necessary this should be True.
""" """
@ -921,11 +908,11 @@ class AlternativeBookNamesDB(QtCore.QObject, Manager):
``name`` ``name``
The name to search the id. The name to search the id.
``language_id`` ``language_id``
The language_id for which language should be searched 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) name, language_id)
if language_id: if language_id:
books = AlternativeBookNamesDB.run_sql(u'SELECT book_reference_id, ' books = AlternativeBookNamesDB.run_sql(u'SELECT book_reference_id, '
@ -962,11 +949,11 @@ class AlternativeBookNamesDB(QtCore.QObject, Manager):
class OldBibleDB(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. database scheme.
""" """
cursor = None cursor = None
def __init__(self, parent, **kwargs): def __init__(self, parent, **kwargs):
""" """
The constructor loads up the database and creates and initialises the The constructor loads up the database and creates and initialises the

View File

@ -151,9 +151,10 @@ class BibleManager(object):
name = bible.get_name() name = bible.get_name()
# Remove corrupted files. # Remove corrupted files.
if name is None: if name is None:
bible.session.close()
delete_file(os.path.join(self.path, filename)) delete_file(os.path.join(self.path, filename))
continue continue
# Find old database versions # Find old database versions.
if bible.is_old_database(): if bible.is_old_database():
self.old_bible_databases.append([filename, name]) self.old_bible_databases.append([filename, name])
bible.session.close() bible.session.close()
@ -220,7 +221,7 @@ class BibleManager(object):
return [ return [
{ {
u'name': book.name, 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) u'chapters': self.db_cache[bible].get_chapter_count(book)
} }
for book in self.db_cache[bible].get_books() for book in self.db_cache[bible].get_books()
@ -229,10 +230,10 @@ class BibleManager(object):
def get_chapter_count(self, bible, book): def get_chapter_count(self, bible, book):
""" """
Returns the number of Chapters for a given book. Returns the number of Chapters for a given book.
``bible`` ``bible``
Unicode. The Bible to get the list of books from. Unicode. The Bible to get the list of books from.
``book`` ``book``
The book object to get the chapter count for. The book object to get the chapter count for.
""" """
@ -295,7 +296,7 @@ class BibleManager(object):
if db_book: if db_book:
book_id = db_book.book_reference_id book_id = db_book.book_reference_id
log.debug(u'Book name corrected to "%s"', db_book.name) 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])) item[3]))
else: else:
log.debug(u'OpenLP failed to find book %s', item[0]) log.debug(u'OpenLP failed to find book %s', item[0])

View File

@ -395,6 +395,7 @@ class BibleMediaItem(MediaManagerItem):
log.debug(u'Reloading Bibles') log.debug(u'Reloading Bibles')
self.plugin.manager.reload_bibles() self.plugin.manager.reload_bibles()
self.loadBibles() self.loadBibles()
self.updateAutoCompleter()
def initialiseAdvancedBible(self, bible): def initialiseAdvancedBible(self, bible):
""" """
@ -612,7 +613,7 @@ class BibleMediaItem(MediaManagerItem):
if restore: if restore:
old_text = unicode(combo.currentText()) old_text = unicode(combo.currentText())
combo.clear() 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: if restore and combo.findText(old_text) != -1:
combo.setCurrentIndex(combo.findText(old_text)) combo.setCurrentIndex(combo.findText(old_text))

View File

@ -35,6 +35,7 @@ import re
from lxml import etree from lxml import etree
from openlp.core.lib import check_directory_exists, Receiver, translate from openlp.core.lib import check_directory_exists, Receiver, translate
from openlp.core.utils import clean_filename
from openlp.plugins.songs.lib import OpenLyrics from openlp.plugins.songs.lib import OpenLyrics
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -72,8 +73,7 @@ class OpenLyricsExport(object):
tree = etree.ElementTree(etree.fromstring(xml)) tree = etree.ElementTree(etree.fromstring(xml))
filename = u'%s (%s)' % (song.title, filename = u'%s (%s)' % (song.title,
u', '.join([author.display_name for author in song.authors])) u', '.join([author.display_name for author in song.authors]))
filename = re.sub( filename = clean_filename(filename)
r'[/\\?*|<>\[\]":<>+%]+', u'_', filename).strip(u'_')
# Ensure the filename isn't too long for some filesystems # Ensure the filename isn't too long for some filesystems
filename = u'%s.xml' % filename[0:250 - len(self.save_path)] filename = u'%s.xml' % filename[0:250 - len(self.save_path)]
# Pass a file object, because lxml does not cope with some special # Pass a file object, because lxml does not cope with some special

View File

@ -102,7 +102,6 @@ class SongShowPlusImport(SongImport):
if not isinstance(self.import_source, list): if not isinstance(self.import_source, list):
return return
self.import_wizard.progressBar.setMaximum(len(self.import_source)) self.import_wizard.progressBar.setMaximum(len(self.import_source))
for file in self.import_source: for file in self.import_source:
self.sspVerseOrderList = [] self.sspVerseOrderList = []
otherCount = 0 otherCount = 0
@ -111,7 +110,6 @@ class SongShowPlusImport(SongImport):
self.import_wizard.incrementProgressBar( self.import_wizard.incrementProgressBar(
WizardStrings.ImportingType % file_name, 0) WizardStrings.ImportingType % file_name, 0)
songData = open(file, 'rb') songData = open(file, 'rb')
while True: while True:
blockKey, = struct.unpack("I", songData.read(4)) blockKey, = struct.unpack("I", songData.read(4))
# The file ends with 4 NUL's # The file ends with 4 NUL's
@ -126,8 +124,9 @@ class SongShowPlusImport(SongImport):
songData.read(2)) songData.read(2))
verseName = songData.read(verseNameLength) verseName = songData.read(verseNameLength)
lengthDescriptorSize, = struct.unpack("B", songData.read(1)) lengthDescriptorSize, = struct.unpack("B", songData.read(1))
log.debug(lengthDescriptorSize)
# Detect if/how long the length descriptor is # Detect if/how long the length descriptor is
if lengthDescriptorSize == 12: if lengthDescriptorSize == 12 or lengthDescriptorSize == 20:
lengthDescriptor, = struct.unpack("I", songData.read(4)) lengthDescriptor, = struct.unpack("I", songData.read(4))
elif lengthDescriptorSize == 2: elif lengthDescriptorSize == 2:
lengthDescriptor = 1 lengthDescriptor = 1
@ -135,6 +134,7 @@ class SongShowPlusImport(SongImport):
lengthDescriptor = 0 lengthDescriptor = 0
else: else:
lengthDescriptor, = struct.unpack("B", songData.read(1)) lengthDescriptor, = struct.unpack("B", songData.read(1))
log.debug(lengthDescriptorSize)
data = songData.read(lengthDescriptor) data = songData.read(lengthDescriptor)
if blockKey == TITLE: if blockKey == TITLE:
self.title = unicode(data, u'cp1252') self.title = unicode(data, u'cp1252')

View File

@ -246,8 +246,9 @@ class OpenLyrics(object):
# Append the necessary meta data to the song. # Append the necessary meta data to the song.
song_xml.set(u'xmlns', u'http://openlyrics.info/namespace/2009/song') song_xml.set(u'xmlns', u'http://openlyrics.info/namespace/2009/song')
song_xml.set(u'version', OpenLyrics.IMPLEMENTED_VERSION) song_xml.set(u'version', OpenLyrics.IMPLEMENTED_VERSION)
song_xml.set(u'createdIn', get_application_version()[u'version']) application_name = u'OpenLP ' + get_application_version()[u'version']
song_xml.set(u'modifiedIn', get_application_version()[u'version']) song_xml.set(u'createdIn', application_name)
song_xml.set(u'modifiedIn', application_name)
song_xml.set(u'modifiedDate', song_xml.set(u'modifiedDate',
datetime.datetime.now().strftime(u'%Y-%m-%dT%H:%M:%S')) datetime.datetime.now().strftime(u'%Y-%m-%dT%H:%M:%S'))
properties = etree.SubElement(song_xml, u'properties') properties = etree.SubElement(song_xml, u'properties')

View File

@ -34,26 +34,33 @@ class Ui_SongUsageDeleteDialog(object):
def setupUi(self, songUsageDeleteDialog): def setupUi(self, songUsageDeleteDialog):
songUsageDeleteDialog.setObjectName(u'songUsageDeleteDialog') songUsageDeleteDialog.setObjectName(u'songUsageDeleteDialog')
songUsageDeleteDialog.resize(291, 243) songUsageDeleteDialog.resize(291, 243)
self.layoutWidget = QtGui.QWidget(songUsageDeleteDialog) self.verticalLayout = QtGui.QVBoxLayout(songUsageDeleteDialog)
self.layoutWidget.setGeometry(QtCore.QRect(20, 10, 247, 181)) self.verticalLayout.setSpacing(8)
self.layoutWidget.setObjectName(u'layoutWidget') self.verticalLayout.setContentsMargins(8, 8, 8, 8)
self.verticalLayout = QtGui.QVBoxLayout(self.layoutWidget)
self.verticalLayout.setObjectName(u'verticalLayout') self.verticalLayout.setObjectName(u'verticalLayout')
self.deleteCalendar = QtGui.QCalendarWidget(self.layoutWidget) self.deleteLabel = QtGui.QLabel(songUsageDeleteDialog)
self.deleteLabel.setObjectName(u'deleteLabel')
self.verticalLayout.addWidget(self.deleteLabel)
self.deleteCalendar = QtGui.QCalendarWidget(songUsageDeleteDialog)
self.deleteCalendar.setFirstDayOfWeek(QtCore.Qt.Sunday) self.deleteCalendar.setFirstDayOfWeek(QtCore.Qt.Sunday)
self.deleteCalendar.setGridVisible(True) self.deleteCalendar.setGridVisible(True)
self.deleteCalendar.setVerticalHeaderFormat( self.deleteCalendar.setVerticalHeaderFormat(
QtGui.QCalendarWidget.NoVerticalHeader) QtGui.QCalendarWidget.NoVerticalHeader)
self.deleteCalendar.setObjectName(u'deleteCalendar') self.deleteCalendar.setObjectName(u'deleteCalendar')
self.verticalLayout.addWidget(self.deleteCalendar) self.verticalLayout.addWidget(self.deleteCalendar)
self.buttonBox = create_accept_reject_button_box( self.buttonBox = QtGui.QDialogButtonBox(songUsageDeleteDialog)
songUsageDeleteDialog, True) self.buttonBox.setStandardButtons(
self.buttonBox.setGeometry(QtCore.QRect(30, 210, 245, 25)) QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel)
self.buttonBox.setObjectName(u'buttonBox') self.buttonBox.setObjectName(u'buttonBox')
self.verticalLayout.addWidget(self.buttonBox)
self.retranslateUi(songUsageDeleteDialog) self.retranslateUi(songUsageDeleteDialog)
QtCore.QMetaObject.connectSlotsByName(songUsageDeleteDialog)
def retranslateUi(self, songUsageDeleteDialog): def retranslateUi(self, songUsageDeleteDialog):
songUsageDeleteDialog.setWindowTitle( songUsageDeleteDialog.setWindowTitle(
translate('SongUsagePlugin.SongUsageDeleteForm', translate('SongUsagePlugin.SongUsageDeleteForm',
'Delete Song Usage Data')) 'Delete Song Usage Data'))
self.deleteLabel.setText(
translate('SongUsagePlugin.SongUsageDeleteForm',
'Select the date up to which the song usage data should be '
'deleted. All data recorded before this date will be '
'permanently deleted.'))

View File

@ -25,7 +25,7 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Temple Place, Suite 330, Boston, MA 02111-1307 USA #
############################################################################### ###############################################################################
from PyQt4 import QtGui from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate, Receiver from openlp.core.lib import translate, Receiver
from openlp.plugins.songusage.lib.db import SongUsageItem from openlp.plugins.songusage.lib.db import SongUsageItem
@ -42,23 +42,32 @@ class SongUsageDeleteForm(QtGui.QDialog, Ui_SongUsageDeleteDialog):
self.manager = manager self.manager = manager
QtGui.QDialog.__init__(self, parent) QtGui.QDialog.__init__(self, parent)
self.setupUi(self) self.setupUi(self)
QtCore.QObject.connect(
self.buttonBox, QtCore.SIGNAL(u'clicked(QAbstractButton*)'),
self.onButtonBoxClicked)
def accept(self): def onButtonBoxClicked(self, button):
ret = QtGui.QMessageBox.question(self, if self.buttonBox.standardButton(button) == QtGui.QDialogButtonBox.Ok:
translate('SongUsagePlugin.SongUsageDeleteForm', ret = QtGui.QMessageBox.question(self,
'Delete Selected Song Usage Events?'), translate('SongUsagePlugin.SongUsageDeleteForm',
translate('SongUsagePlugin.SongUsageDeleteForm', 'Delete Selected Song Usage Events?'),
'Are you sure you want to delete selected Song Usage data?'), translate('SongUsagePlugin.SongUsageDeleteForm',
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok | 'Are you sure you want to delete selected Song Usage '
QtGui.QMessageBox.Cancel), 'data?'),
QtGui.QMessageBox.Cancel) QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes |
if ret == QtGui.QMessageBox.Ok: QtGui.QMessageBox.No),
deleteDate = self.deleteCalendar.selectedDate().toPyDate() QtGui.QMessageBox.No)
self.manager.delete_all_objects(SongUsageItem, if ret == QtGui.QMessageBox.Yes:
SongUsageItem.usagedate <= deleteDate) deleteDate = self.deleteCalendar.selectedDate().toPyDate()
Receiver.send_message(u'openlp_information_message', { self.manager.delete_all_objects(SongUsageItem,
u'title': translate('SongUsagePlugin.SongUsageDeleteForm', SongUsageItem.usagedate <= deleteDate)
'Deletion Successful'), Receiver.send_message(u'openlp_information_message', {
u'message': translate('SongUsagePlugin.SongUsageDeleteForm', u'title': translate('SongUsagePlugin.SongUsageDeleteForm',
'All requested data has been deleted successfully. ')}) 'Deletion Successful'),
self.close() u'message': translate(
'SongUsagePlugin.SongUsageDeleteForm',
'All requested data has been deleted successfully. ')}
)
self.accept()
else:
self.reject()

View File

@ -35,12 +35,14 @@ class Ui_SongUsageDetailDialog(object):
songUsageDetailDialog.setObjectName(u'songUsageDetailDialog') songUsageDetailDialog.setObjectName(u'songUsageDetailDialog')
songUsageDetailDialog.resize(609, 413) songUsageDetailDialog.resize(609, 413)
self.verticalLayout = QtGui.QVBoxLayout(songUsageDetailDialog) self.verticalLayout = QtGui.QVBoxLayout(songUsageDetailDialog)
self.verticalLayout.setSpacing(8)
self.verticalLayout.setContentsMargins(8, 8, 8, 8)
self.verticalLayout.setObjectName(u'verticalLayout') self.verticalLayout.setObjectName(u'verticalLayout')
self.dateRangeGroupBox = QtGui.QGroupBox(songUsageDetailDialog) self.dateRangeGroupBox = QtGui.QGroupBox(songUsageDetailDialog)
self.dateRangeGroupBox.setObjectName(u'dateRangeGroupBox') self.dateRangeGroupBox.setObjectName(u'dateRangeGroupBox')
self.verticalLayout2 = QtGui.QVBoxLayout(self.dateRangeGroupBox) self.dateHorizontalLayout = QtGui.QHBoxLayout(self.dateRangeGroupBox)
self.verticalLayout2.setObjectName(u'verticalLayout2') self.dateHorizontalLayout.setSpacing(8)
self.dateHorizontalLayout = QtGui.QHBoxLayout() self.dateHorizontalLayout.setContentsMargins(8, 8, 8, 8)
self.dateHorizontalLayout.setObjectName(u'dateHorizontalLayout') self.dateHorizontalLayout.setObjectName(u'dateHorizontalLayout')
self.fromDate = QtGui.QCalendarWidget(self.dateRangeGroupBox) self.fromDate = QtGui.QCalendarWidget(self.dateRangeGroupBox)
self.fromDate.setObjectName(u'fromDate') self.fromDate.setObjectName(u'fromDate')
@ -53,26 +55,25 @@ class Ui_SongUsageDetailDialog(object):
self.toDate = QtGui.QCalendarWidget(self.dateRangeGroupBox) self.toDate = QtGui.QCalendarWidget(self.dateRangeGroupBox)
self.toDate.setObjectName(u'toDate') self.toDate.setObjectName(u'toDate')
self.dateHorizontalLayout.addWidget(self.toDate) self.dateHorizontalLayout.addWidget(self.toDate)
self.verticalLayout2.addLayout(self.dateHorizontalLayout) self.verticalLayout.addWidget(self.dateRangeGroupBox)
self.fileGroupBox = QtGui.QGroupBox(self.dateRangeGroupBox) self.fileGroupBox = QtGui.QGroupBox(self.dateRangeGroupBox)
self.fileGroupBox.setObjectName(u'fileGroupBox') self.fileGroupBox.setObjectName(u'fileGroupBox')
self.verticalLayout4 = QtGui.QVBoxLayout(self.fileGroupBox) self.fileHorizontalLayout = QtGui.QHBoxLayout(self.fileGroupBox)
self.verticalLayout4.setObjectName(u'verticalLayout4') self.fileHorizontalLayout.setSpacing(8)
self.horizontalLayout = QtGui.QHBoxLayout() self.fileHorizontalLayout.setContentsMargins(8, 8, 8, 8)
self.horizontalLayout.setObjectName(u'horizontalLayout') self.fileHorizontalLayout.setObjectName(u'fileHorizontalLayout')
self.fileLineEdit = QtGui.QLineEdit(self.fileGroupBox) self.fileLineEdit = QtGui.QLineEdit(self.fileGroupBox)
self.fileLineEdit.setObjectName(u'fileLineEdit') self.fileLineEdit.setObjectName(u'fileLineEdit')
self.fileLineEdit.setReadOnly(True) self.fileLineEdit.setReadOnly(True)
self.fileLineEdit.setEnabled(False) self.fileHorizontalLayout.addWidget(self.fileLineEdit)
self.horizontalLayout.addWidget(self.fileLineEdit)
self.saveFilePushButton = QtGui.QPushButton(self.fileGroupBox) self.saveFilePushButton = QtGui.QPushButton(self.fileGroupBox)
self.saveFilePushButton.setMaximumWidth(
self.saveFilePushButton.size().height())
self.saveFilePushButton.setIcon( self.saveFilePushButton.setIcon(
build_icon(u':/general/general_open.png')) build_icon(u':/general/general_open.png'))
self.saveFilePushButton.setObjectName(u'saveFilePushButton') self.saveFilePushButton.setObjectName(u'saveFilePushButton')
self.horizontalLayout.addWidget(self.saveFilePushButton) self.fileHorizontalLayout.addWidget(self.saveFilePushButton)
self.verticalLayout4.addLayout(self.horizontalLayout) self.verticalLayout.addWidget(self.fileGroupBox)
self.verticalLayout2.addWidget(self.fileGroupBox)
self.verticalLayout.addWidget(self.dateRangeGroupBox)
self.buttonBox = create_accept_reject_button_box( self.buttonBox = create_accept_reject_button_box(
songUsageDetailDialog, True) songUsageDetailDialog, True)
self.verticalLayout.addWidget(self.buttonBox) self.verticalLayout.addWidget(self.buttonBox)

View File

@ -96,6 +96,7 @@ class SongUsagePlugin(Plugin):
self.songUsageActiveButton = QtGui.QToolButton( self.songUsageActiveButton = QtGui.QToolButton(
self.formparent.statusBar) self.formparent.statusBar)
self.songUsageActiveButton.setCheckable(True) self.songUsageActiveButton.setCheckable(True)
self.songUsageActiveButton.setAutoRaise(True)
self.songUsageActiveButton.setStatusTip(translate('SongUsagePlugin', self.songUsageActiveButton.setStatusTip(translate('SongUsagePlugin',
'Toggle the tracking of song usage.')) 'Toggle the tracking of song usage.'))
self.songUsageActiveButton.setObjectName(u'songUsageActiveButton') self.songUsageActiveButton.setObjectName(u'songUsageActiveButton')

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -186,25 +186,6 @@ def update_export_at_pootle(source_filename):
page = urllib.urlopen(REVIEW_URL) page = urllib.urlopen(REVIEW_URL)
page.close() page.close()
def download_file(source_filename, dest_filename):
"""
Download a file and save it to disk.
``source_filename``
The file to download.
``dest_filename``
The new local file name.
"""
print_verbose(u'Downloading from: %s' % (SERVER_URL + source_filename))
page = urllib.urlopen(SERVER_URL + source_filename)
content = page.read().decode('utf8')
page.close()
file = open(dest_filename, u'w')
file.write(content.encode('utf8'))
file.close()
def download_translations(): def download_translations():
""" """
This method downloads the translation files from the Pootle server. This method downloads the translation files from the Pootle server.
@ -219,7 +200,7 @@ def download_translations():
filename = os.path.join(os.path.abspath(u'..'), u'resources', u'i18n', filename = os.path.join(os.path.abspath(u'..'), u'resources', u'i18n',
language_file) language_file)
print_verbose(u'Get Translation File: %s' % filename) print_verbose(u'Get Translation File: %s' % filename)
download_file(language_file, filename) urllib.urlretrieve(SERVER_URL + language_file, filename)
print_quiet(u' Done.') print_quiet(u' Done.')
def prepare_project(): def prepare_project():
@ -304,7 +285,7 @@ def create_translation(language):
if not language.endswith(u'.ts'): if not language.endswith(u'.ts'):
language += u'.ts' language += u'.ts'
filename = os.path.join(os.path.abspath(u'..'), u'resources', u'i18n', language) filename = os.path.join(os.path.abspath(u'..'), u'resources', u'i18n', language)
download_file(u'en.ts', filename) urllib.urlretrieve(SERVER_URL + u'en.ts', filename)
print_quiet(u' ** Please Note **') print_quiet(u' ** Please Note **')
print_quiet(u' In order to get this file into OpenLP and onto the ' print_quiet(u' In order to get this file into OpenLP and onto the '
u'Pootle translation server you will need to subscribe to the ' u'Pootle translation server you will need to subscribe to the '