add possibility to change bible meta data and the possibility to change the preferred bible language per bible - including first steps to edit the book names of the bible

This commit is contained in:
Armin Köhler 2012-03-12 06:48:14 +01:00
parent 905fc6d91f
commit 6d98d4b125
6 changed files with 435 additions and 12 deletions

View File

@ -55,6 +55,7 @@ from booknameform import BookNameForm
from languageform import LanguageForm
from bibleimportform import BibleImportForm
from bibleupgradeform import BibleUpgradeForm
from editbibleform import EditBibleForm
__all__ = [u'BookNameForm', u'LanguageForm', u'BibleImportForm',
u'BibleUpgradeForm']
u'BibleUpgradeForm', u'EditBibleForm']

View File

@ -0,0 +1,171 @@
# -*- coding: utf-8 -*-
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
###############################################################################
# OpenLP - Open Source Lyrics Projection #
# --------------------------------------------------------------------------- #
# Copyright (c) 2008-2012 Raoul Snyman #
# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan #
# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, #
# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias #
# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund #
# --------------------------------------------------------------------------- #
# This program is free software; you can redistribute it and/or modify it #
# under the terms of the GNU General Public License as published by the Free #
# Software Foundation; version 2 of the License. #
# #
# This program is distributed in the hope that it will be useful, but WITHOUT #
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
# more details. #
# #
# You should have received a copy of the GNU General Public License along #
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
from PyQt4 import QtCore, QtGui
from openlp.core.lib import build_icon, translate
from openlp.core.lib.ui import UiStrings, create_accept_reject_button_box
from openlp.plugins.bibles.lib import LanguageSelection, BibleStrings
from openlp.plugins.bibles.lib.db import BiblesResourcesDB
class Ui_EditBibleDialog(object):
def setupUi(self, editBibleDialog):
editBibleDialog.setObjectName(u'editBibleDialog')
editBibleDialog.resize(650, 400)
editBibleDialog.setWindowIcon(
build_icon(u':/icon/openlp-logo-16x16.png'))
editBibleDialog.setModal(True)
self.dialogLayout = QtGui.QVBoxLayout(editBibleDialog)
self.dialogLayout.setSpacing(8)
self.dialogLayout.setContentsMargins(8, 8, 8, 8)
self.dialogLayout.setObjectName(u'dialogLayout')
self.bibleTabWidget = QtGui.QTabWidget(editBibleDialog)
self.bibleTabWidget.setObjectName(u'BibleTabWidget')
# Meta tab
self.metaTab = QtGui.QWidget()
self.metaTab.setObjectName(u'metaTab')
self.metaTabLayout = QtGui.QFormLayout(self.metaTab)
self.metaTabLayout.setObjectName(u'metaTabLayout')
self.versionNameLabel = QtGui.QLabel(self.metaTab)
self.versionNameLabel.setObjectName(u'versionNameLabel')
self.metaTabLayout.setWidget(0, QtGui.QFormLayout.LabelRole,
self.versionNameLabel)
self.versionNameEdit = QtGui.QLineEdit(self.metaTab)
self.versionNameEdit.setObjectName(u'versionNameEdit')
self.versionNameLabel.setBuddy(self.versionNameEdit)
self.metaTabLayout.setWidget(0, QtGui.QFormLayout.FieldRole,
self.versionNameEdit)
self.copyrightLabel = QtGui.QLabel(self.metaTab)
self.copyrightLabel.setObjectName(u'copyrightLabel')
self.metaTabLayout.setWidget(1, QtGui.QFormLayout.LabelRole,
self.copyrightLabel)
self.copyrightEdit = QtGui.QLineEdit(self.metaTab)
self.copyrightEdit.setObjectName(u'copyrightEdit')
self.copyrightLabel.setBuddy(self.copyrightEdit)
self.metaTabLayout.setWidget(1, QtGui.QFormLayout.FieldRole,
self.copyrightEdit)
self.permissionsLabel = QtGui.QLabel(self.metaTab)
self.permissionsLabel.setObjectName(u'permissionsLabel')
self.metaTabLayout.setWidget(2, QtGui.QFormLayout.LabelRole,
self.permissionsLabel)
self.permissionsEdit = QtGui.QLineEdit(self.metaTab)
self.permissionsEdit.setObjectName(u'permissionsEdit')
self.permissionsLabel.setBuddy(self.permissionsEdit)
self.metaTabLayout.setWidget(2, QtGui.QFormLayout.FieldRole,
self.permissionsEdit)
self.languageSelectionLabel = QtGui.QLabel(self.metaTab)
self.languageSelectionLabel.setObjectName(u'languageSelectionLabel')
self.metaTabLayout.setWidget(3, QtGui.QFormLayout.LabelRole,
self.languageSelectionLabel)
self.languageSelectionComboBox = QtGui.QComboBox(self.metaTab)
self.languageSelectionComboBox.setObjectName(
u'languageSelectionComboBox')
self.languageSelectionComboBox.addItems([u'', u'', u'', u''])
self.metaTabLayout.setWidget(3, QtGui.QFormLayout.FieldRole,
self.languageSelectionComboBox)
self.bibleTabWidget.addTab(self.metaTab, u'')
# Book name tab
self.bookNameTab = QtGui.QWidget()
self.bookNameTab.setObjectName(u'bookNameTab')
self.bookNameTabLayout = QtGui.QHBoxLayout(self.bookNameTab)
self.bookNameTabLayout.setObjectName(u'bookNameTabLayout')
self.scrollArea = QtGui.QScrollArea(self.bookNameTab)
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName(u'scrollArea')
self.scrollArea.setHorizontalScrollBarPolicy(
QtCore.Qt.ScrollBarAlwaysOff)
self.bookNameGroupBox = QtGui.QWidget(self.scrollArea)
self.bookNameGroupBox.setObjectName(u'bookNameGroupBox')
self.bookNameGroupBoxLayout = QtGui.QFormLayout(self.bookNameGroupBox)
self.bookNameGroupBoxLayout.setObjectName(u'bookNameGroupBoxLayout')
self.bookNameLabel = {}
self.bookNameEdit= {}
x = 0
for book in BiblesResourcesDB.get_books():
self.bookNameLabel[book[u'abbreviation']] = QtGui.QLabel(
self.bookNameGroupBox)
self.bookNameLabel[book[u'abbreviation']].setObjectName(
u'bookNameLabel[%s]' % book[u'abbreviation'])
self.bookNameGroupBoxLayout.setWidget(x,
QtGui.QFormLayout.LabelRole,
self.bookNameLabel[book[u'abbreviation']])
self.bookNameEdit[book[u'abbreviation']] = QtGui.QLineEdit(
self.bookNameGroupBox)
self.bookNameEdit[book[u'abbreviation']].setObjectName(
u'bookNameEdit[%s]' % book[u'abbreviation'])
self.bookNameGroupBoxLayout.setWidget(x,
QtGui.QFormLayout.FieldRole,
self.bookNameEdit[book[u'abbreviation']])
x = x+1
self.scrollArea.setWidget(self.bookNameGroupBox)
self.bookNameTabLayout.addWidget(self.scrollArea)
self.bibleTabWidget.addTab(self.bookNameTab, u'')
# Last few bits
self.dialogLayout.addWidget(self.bibleTabWidget)
self.buttonBox = create_accept_reject_button_box(editBibleDialog)
self.dialogLayout.addWidget(self.buttonBox)
self.retranslateUi(editBibleDialog)
QtCore.QMetaObject.connectSlotsByName(editBibleDialog)
def retranslateUi(self, editBibleDialog):
self.booknames = BibleStrings().Booknames
editBibleDialog.setWindowTitle(
translate('BiblesPlugin.EditBibleForm', 'Song Editor'))
self.bibleTabWidget.setTabText(
self.bibleTabWidget.indexOf(self.metaTab),
translate('SongsPlugin.EditBibleForm', 'License Details'))
self.versionNameLabel.setText(
translate('BiblesPlugin.EditBibleForm', 'Version name:'))
self.copyrightLabel.setText(
translate('BiblesPlugin.EditBibleForm', 'Copyright:'))
self.permissionsLabel.setText(
translate('BiblesPlugin.EditBibleForm', 'Permissions:'))
self.bibleTabWidget.setTabText(
self.bibleTabWidget.indexOf(self.bookNameTab),
translate('SongsPlugin.EditBibleForm', 'Custom Book Names'))
self.languageSelectionLabel.setText(
translate('BiblesPlugin.EditBibleForm', 'Bookname language:'))
self.languageSelectionComboBox.setItemText(0,
translate('BiblesPlugin.EditBibleForm', 'General Settings'))
self.languageSelectionComboBox.setItemText(LanguageSelection.Bible+1,
translate('BiblesPlugin.EditBibleForm', 'Bible language'))
self.languageSelectionComboBox.setItemText(
LanguageSelection.Application+1,
translate('BiblesPlugin.EditBibleForm', 'Application language'))
self.languageSelectionComboBox.setItemText(LanguageSelection.English+1,
translate('BiblesPlugin.EditBibleForm', 'English'))
self.languageSelectionComboBox.setToolTip(
translate('BiblesPlugin.EditBibleForm', 'Multiple options:\n '
'General Settings - the option choosen in settings section\n'
'Bible language - the language in which the bible book names '
'was imported\n Application language - the language you have '
'choosen for Openlp\n English - use always English booknames'))
for book in BiblesResourcesDB.get_books():
self.bookNameLabel[book[u'abbreviation']].setText(
u'%s:' % unicode(self.booknames[book[u'abbreviation']]))

View File

@ -0,0 +1,151 @@
# -*- coding: utf-8 -*-
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
###############################################################################
# OpenLP - Open Source Lyrics Projection #
# --------------------------------------------------------------------------- #
# Copyright (c) 2008-2012 Raoul Snyman #
# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan #
# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, #
# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias #
# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund #
# --------------------------------------------------------------------------- #
# This program is free software; you can redistribute it and/or modify it #
# under the terms of the GNU General Public License as published by the Free #
# Software Foundation; version 2 of the License. #
# #
# This program is distributed in the hope that it will be useful, but WITHOUT #
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
# more details. #
# #
# You should have received a copy of the GNU General Public License along #
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
import logging
from PyQt4 import QtCore, QtGui
from openlp.core.lib import PluginStatus, Receiver, MediaType, translate, \
create_separated_list
from openlp.core.lib.ui import UiStrings, critical_error_message_box
from openlp.core.utils import AppLocation
from editbibledialog import Ui_EditBibleDialog
from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, BiblesResourcesDB
log = logging.getLogger(__name__)
class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog):
"""
Class to manage the editing of a bible
"""
log.info(u'%s EditBibleForm loaded', __name__)
def __init__(self, mediaitem, parent, manager):
"""
Constructor
"""
QtGui.QDialog.__init__(self, parent)
self.mediaitem = mediaitem
# can this be automated?
self.width = 400
self.setupUi(self)
self.manager = manager
def loadBible(self, bible):
"""
Loads a bible.
``bible``
The name of the bible.
"""
log.debug(u'Load Bible')
self.bible = bible
self.versionNameEdit.setText(
self.manager.get_meta_data(self.bible, u'Version').value)
self.copyrightEdit.setText(
self.manager.get_meta_data(self.bible, u'Copyright').value)
self.permissionsEdit.setText(
self.manager.get_meta_data(self.bible, u'Permissions').value)
self.bookname_language = self.manager.get_meta_data(
self.bible, u'Bookname language')
if self.bookname_language:
self.languageSelectionComboBox.setCurrentIndex(
int(self.bookname_language.value)+1)
self.books = {}
for book in BiblesResourcesDB.get_books():
self.books[book[u'abbreviation']] = self.manager.get_book_by_id(
self.bible, book[u'id'])
if self.books[book[u'abbreviation']]:
self.bookNameEdit[book[u'abbreviation']].setText(
self.books[book[u'abbreviation']].custom_name)
else:
self.bookNameGroupBoxLayout.removeWidget(
self.bookNameLabel[book[u'abbreviation']])
self.bookNameLabel[book[u'abbreviation']].setParent(None)
self.bookNameGroupBoxLayout.removeWidget(
self.bookNameEdit[book[u'abbreviation']])
self.bookNameEdit[book[u'abbreviation']].setParent(None)
def reject(self):
"""
Exit Dialog and do not save
"""
log.debug (u'BibleEditForm.reject')
self.bible = None
QtGui.QDialog.reject(self)
def accept(self):
"""
Exit Dialog and save data
"""
log.debug(u'BibleEditForm.accept')
self.version = unicode(self.versionNameEdit.text())
self.copyright = unicode(self.copyrightEdit.text())
self.permissions = unicode(self.permissionsEdit.text())
self.bookname_language = \
self.languageSelectionComboBox.currentIndex()-1
if self.validateInput():
self.manager.update_meta_data(self.bible, self.version,
self.copyright, self.permissions, self.bookname_language)
for abbr, book in self.books.iteritems():
if book:
custom_name = unicode(self.bookNameEdit[abbr].text())
if book.custom_name != custom_name:
book.custom_name = custom_name
self.manager.update_book(self.bible, book)
self.bible = None
QtGui.QDialog.accept(self)
def validateInput(self):
"""
Validate the Input before saving.
"""
if not self.version:
critical_error_message_box(UiStrings().EmptyField,
translate('BiblesPlugin.BibleEditForm',
'You need to specify a version name for your Bible.'))
self.versionNameEdit.setFocus()
return False
elif not self.copyright:
critical_error_message_box(UiStrings().EmptyField,
translate('BiblesPlugin.BibleEditForm',
'You need to set a copyright for your Bible. '
'Bibles in the Public Domain need to be marked as such.'))
self.copyrightEdit.setFocus()
return False
elif self.manager.exists(self.version) and \
self.manager.get_meta_data(self.bible, u'Version').value != \
self.version:
critical_error_message_box(
translate('BiblesPlugin.BibleEditForm', 'Bible Exists'),
translate('BiblesPlugin.BibleEditForm',
'This Bible already exists. Please import '
'a different Bible or first delete the existing one.'))
self.versionNameEdit.setFocus()
return False
return True

View File

@ -81,6 +81,7 @@ def init_schema(url):
Column(u'book_reference_id', types.Integer, index=True),
Column(u'testament_reference_id', types.Integer),
Column(u'name', types.Unicode(50), index=True),
#Column(u'custom_name', types.Unicode(50), index=True),
)
verse_table = Table(u'verse', metadata,
Column(u'id', types.Integer, primary_key=True, index=True),
@ -205,6 +206,18 @@ class BibleDB(QtCore.QObject, Manager):
self.save_object(book)
return book
def update_book(self, book):
"""
Update a book in the database.
``book``
The book object
"""
log.debug(u'BibleDB.update_book("%s")', book.name)
if self.save_object(book):
return True
return False
def delete_book(self, db_book):
"""
Delete a book from the database.
@ -286,6 +299,26 @@ class BibleDB(QtCore.QObject, Manager):
log.debug(u'BibleDB.save_meta("%s/%s")', key, value)
self.save_object(BibleMeta.populate(key=key, value=value))
def update_meta(self, key, value):
"""
Utility method to update BibleMeta objects in a Bible database.
``key``
The key for this instance.
``value``
The value for this instance.
"""
if not isinstance(value, unicode):
value = unicode(value)
log.debug(u'BibleDB.update_meta("%s/%s")', key, value)
meta = self.get_object(BibleMeta, key)
if meta:
meta.value = value
self.save_object(meta)
else:
self.save_object(BibleMeta.populate(key=key, value=value))
def get_book(self, book):
"""
Return a book object from the database.

View File

@ -31,7 +31,8 @@ import os
from PyQt4 import QtCore
from openlp.core.lib import Receiver, SettingsManager, translate
from openlp.core.lib.ui import critical_error_message_box
from openlp.core.lib.ui import critical_error_message_box, \
create_accept_reject_button_box
from openlp.core.utils import AppLocation, delete_file
from openlp.plugins.bibles.lib import parse_reference, \
get_reference_separator, LanguageSelection
@ -141,13 +142,14 @@ class BibleManager(object):
BibleDB class.
"""
log.debug(u'Reload bibles')
files = SettingsManager.get_files(self.settingsSection, self.suffix)
if u'alternative_book_names.sqlite' in files:
files.remove(u'alternative_book_names.sqlite')
log.debug(u'Bible Files %s', files)
self.files = SettingsManager.get_files(self.settingsSection,
self.suffix)
if u'alternative_book_names.sqlite' in self.files:
self.files.remove(u'alternative_book_names.sqlite')
log.debug(u'Bible Files %s', self.files)
self.db_cache = {}
self.old_bible_databases = []
for filename in files:
for filename in self.files:
bible = BibleDB(self.parent, path=self.path, file=filename)
name = bible.get_name()
# Remove corrupted files.
@ -204,6 +206,22 @@ class BibleManager(object):
self.db_cache[name] = importer
return importer
def delete_bible(self, name):
"""
Delete a bible completly.
``name``
The name of the bible.
"""
for filename in self.files:
bible = BibleDB(self.parent, path=self.path, file=filename)
# Remove the bible files
if name == bible.get_name():
bible.session.close()
if delete_file(os.path.join(self.path, filename)):
return True
return False
def get_bibles(self):
"""
Returns a dict with all available Bibles.
@ -400,18 +418,38 @@ class BibleManager(object):
"""
Saves the bibles meta data.
"""
log.debug(u'save_meta data %s,%s, %s,%s',
log.debug(u'save_meta data %s, %s, %s, %s',
bible, version, copyright, permissions)
self.db_cache[bible].create_meta(u'Version', version)
self.db_cache[bible].create_meta(u'Copyright', copyright)
self.db_cache[bible].create_meta(u'Permissions', permissions)
def update_meta_data(self, bible, version, copyright, permissions,
bookname_language):
"""
Saves the bibles meta data.
"""
log.debug(u'update_meta data %s, %s, %s, %s',
bible, version, copyright, permissions)
self.db_cache[bible].update_meta(u'Version', version)
self.db_cache[bible].update_meta(u'Copyright', copyright)
self.db_cache[bible].update_meta(u'Permissions', permissions)
self.db_cache[bible].update_meta(u'Bookname language',
bookname_language)
def get_meta_data(self, bible, key):
"""
Returns the meta data for a given key.
"""
log.debug(u'get_meta %s,%s', bible, key)
return self.db_cache[bible].get_object(BibleMeta, key)
def update_book(self, bible, book):
"""
Update a book of the bible.
"""
log.debug(u'BibleManager.update_book("%s", "%s")', bible, book.name)
self.db_cache[bible].update_book(book)
def exists(self, name):
"""

View File

@ -36,9 +36,10 @@ from openlp.core.lib.searchedit import SearchEdit
from openlp.core.lib.ui import UiStrings, add_widget_completer, \
media_item_combo_box, critical_error_message_box, \
find_and_set_in_combo_box, build_icon
from openlp.plugins.bibles.forms import BibleImportForm
from openlp.plugins.bibles.forms import BibleImportForm, EditBibleForm
from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \
VerseReferenceList, get_reference_separator, LanguageSelection, BibleStrings
VerseReferenceList, get_reference_separator, LanguageSelection, \
BibleStrings
from openlp.plugins.bibles.lib.db import BiblesResourcesDB
log = logging.getLogger(__name__)
@ -109,8 +110,8 @@ class BibleMediaItem(MediaManagerItem):
MediaManagerItem.requiredIcons(self)
self.hasImportIcon = True
self.hasNewIcon = False
self.hasEditIcon = False
self.hasDeleteIcon = False
self.hasEditIcon = True
self.hasDeleteIcon = True
self.addToServiceItem = False
def addSearchTab(self, prefix, name):
@ -532,6 +533,34 @@ class BibleMediaItem(MediaManagerItem):
if self.import_wizard.exec_():
self.reloadBibles()
def onEditClick(self):
if self.quickTab.isVisible():
bible = unicode(self.quickVersionComboBox.currentText())
elif self.advancedTab.isVisible():
bible = unicode(self.advancedVersionComboBox.currentText())
if bible != u'':
self.editBibleForm = EditBibleForm(self, self.plugin.formparent,
self.plugin.manager)
self.editBibleForm.loadBible(bible)
if self.editBibleForm.exec_():
self.reloadBibles()
def onDeleteClick(self):
if self.quickTab.isVisible():
bible = unicode(self.quickVersionComboBox.currentText())
elif self.advancedTab.isVisible():
bible = unicode(self.advancedVersionComboBox.currentText())
if bible != u'':
if QtGui.QMessageBox.question(self, UiStrings().ConfirmDelete,
unicode(translate('BiblesPlugin.MediaItem',
'Are you sure you want to delete "%s"?')) % bible,
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes |
QtGui.QMessageBox.No),
QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No:
return
self.plugin.manager.delete_bible(bible)
self.reloadBibles()
def onSearchTabBarCurrentChanged(self, index):
if index == 0:
self.advancedTab.setVisible(False)