diff --git a/openlp/plugins/bibles/forms/__init__.py b/openlp/plugins/bibles/forms/__init__.py index 15f14de9e..d0966c7ce 100644 --- a/openlp/plugins/bibles/forms/__init__.py +++ b/openlp/plugins/bibles/forms/__init__.py @@ -52,5 +52,6 @@ from the .ui files later if necessary. """ from bibleimportform import BibleImportForm +from bibleimportrequestform import BibleImportRequest __all__ = ['BibleImportForm'] diff --git a/openlp/plugins/bibles/forms/bibleimportrequestdialog.py b/openlp/plugins/bibles/forms/bibleimportrequestdialog.py new file mode 100644 index 000000000..d58c1df9f --- /dev/null +++ b/openlp/plugins/bibles/forms/bibleimportrequestdialog.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2011 Raoul Snyman # +# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Armin Köhler, Andreas Preikschat, # +# Christian Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Carsten Tinggaard, 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 translate +from openlp.core.lib.ui import create_accept_reject_button_box + +class Ui_BibleImportRequest(object): + def setupUi(self, bibleImportRequest): + bibleImportRequest.setObjectName("BibleImportRequest") + bibleImportRequest.resize(400, 175) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, + QtGui.QSizePolicy.MinimumExpanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(bibleImportRequest.sizePolicy() + .hasHeightForWidth()) + bibleImportRequest.setSizePolicy(sizePolicy) + self.widget = QtGui.QWidget(bibleImportRequest) + self.widget.setGeometry(QtCore.QRect(10, 15, 381, 151)) + self.widget.setObjectName("widget") + self.verticalLayout = QtGui.QVBoxLayout(self.widget) + self.verticalLayout.setObjectName("verticalLayout") + self.headlineLabel = QtGui.QLabel(self.widget) + font = QtGui.QFont() + font.setFamily("Arial") + font.setPointSize(11) + font.setWeight(75) + font.setBold(True) + self.headlineLabel.setFont(font) + self.headlineLabel.setObjectName("HeadlineLabel") + self.verticalLayout.addWidget(self.HeadlineLabel) + self.infoLabel = QtGui.QLabel(self.widget) + self.infoLabel.setObjectName("InfoLabel") + self.verticalLayout.addWidget(self.infoLabel) + self.formLayout = QtGui.QFormLayout() + self.formLayout.setObjectName("formLayout") + self.requestLabel = QtGui.QLabel(self.widget) + self.requestLabel.setObjectName("RequestLabel") + self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, + self.requestLabel) + self.requestComboBox = QtGui.QComboBox(self.widget) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, + QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.requestComboBox.sizePolicy() + .hasHeightForWidth()) + self.requestComboBox.setSizePolicy(sizePolicy) + self.requestComboBox.setObjectName("RequestComboBox") + self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, + self.requestComboBox) + self.verticalLayout.addLayout(self.formLayout) + spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, + QtGui.QSizePolicy.Expanding) + self.verticalLayout.addItem(spacerItem) + self.formLayout.addWidget( + create_accept_reject_button_box(bibleImportRequest)) + self.retranslateUi(bibleImportRequest) + QtCore.QMetaObject.connectSlotsByName(bibleImportRequest) + + def retranslateUi(self, bibleImportRequest): + bibleImportRequest.setWindowTitle( + translate("BiblesPlugin.bibleImportRequest", "Dialog")) + self.headlineLabel.setText( + translate("BiblesPlugin.bibleImportRequest", "Choose Book:")) + self.infoLabel.setText(translate("BiblesPlugin.bibleImportRequest", + "The following books cannot be clearly attributed. \n" + "Please choose the book it is.")) + self.requestLabel.setText(translate("BiblesPlugin.bibleImportRequest", + "Book:")) diff --git a/openlp/plugins/bibles/forms/bibleimportrequestform.py b/openlp/plugins/bibles/forms/bibleimportrequestform.py new file mode 100644 index 000000000..caac8e83b --- /dev/null +++ b/openlp/plugins/bibles/forms/bibleimportrequestform.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2011 Raoul Snyman # +# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Armin Köhler, Andreas Preikschat, # +# Christian Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Carsten Tinggaard, 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 # +############################################################################### + +""" +Module implementing BibleImportRequest. +""" +import logging + +from PyQt4.QtGui import QDialog + +from openlp.core.lib import translate +from openlp.core.lib.ui import critical_error_message_box +from openlp.plugins.bibles.forms.bibleimportrequestdialog import \ + Ui_BibleImportRequest +from openlp.plugins.bibles.lib.db import BiblesResourcesDB + +log = logging.getLogger(__name__) + +class BibleImportRequest(QDialog, Ui_BibleImportRequest): + """ + Class documentation goes here. + """ + log.info(u'BibleImportRequest loaded') + + def __init__(self, parent = None): + """ + Constructor + """ + QDialog.__init__(self, parent) + self.setupUi(self) + + def exec_(self, case, name=None): + items = [] + self.requestComboBox.addItem(u'') + if case == u'language': + self.headlineLabel.setText(translate( + "BiblesPlugin.BibleImportRequest", "Choose Language:")) + self.infoLabel.setText(translate("BiblesPlugin.BibleImportRequest", + "Please choose the language the bible is.")) + self.requestLabel.setText( + translate("BiblesPlugin.BibleImportRequest", "Language:")) + items = BiblesResourcesDB.get_languages() + elif case == u'book': + self.requestLabel.setText( + translate("BiblesPlugin.BibleImportRequest", name)) + items = BiblesResourcesDB.get_books() + for item in items: + self.requestComboBox.addItem(item[u'name']) + return QDialog.exec_(self) + + def accept(self): + if self.requestComboBox.currentText() == u"": + critical_error_message_box( + message=translate('BiblesPlugin.BibleImportRequest', + 'You need to choose an item.')) + self.requestComboBox.setFocus() + return False + else: + return QDialog.accept(self) diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index b96382df2..b5644db81 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -135,6 +135,7 @@ class CSVBible(BibleDB): self.wizard.progressBar.setMinimum(0) self.wizard.progressBar.setMaximum(66) success = True + #TODO: include create_meta language books_file = None book_list = {} # Populate the Tables @@ -148,6 +149,8 @@ class CSVBible(BibleDB): self.wizard.incrementProgressBar(unicode( translate('BibleDB.Wizard', 'Importing books... %s')) % unicode(line[2], details['encoding'])) + #TODO: change create_book to the new database model + #(name, bk_ref_id, testament) self.create_book(unicode(line[2], details['encoding']), unicode(line[3], details['encoding']), int(line[1])) book_list[int(line[0])] = unicode(line[2], details['encoding']) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 3eb7c3af1..68edc55ef 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -95,9 +95,9 @@ def init_schema(url): ) book_table = Table(u'book', metadata, Column(u'id', types.Integer, primary_key=True), - Column(u'testament_id', types.Integer, ForeignKey(u'testament.id')), + Column(u'book_reference_id', types.Integer), + Column(u'testament_reference_id', types.Integer), Column(u'name', types.Unicode(50), index=True), - Column(u'abbreviation', types.Unicode(5), index=True), ) verse_table = Table(u'verse', metadata, Column(u'id', types.Integer, primary_key=True, index=True), @@ -114,8 +114,7 @@ def init_schema(url): try: class_mapper(Testament) except UnmappedClassError: - mapper(Testament, testament_table, - properties={'books': relation(Book, backref='testament')}) + mapper(Testament, testament_table) try: class_mapper(Book) except UnmappedClassError: @@ -251,22 +250,23 @@ class BibleDB(QtCore.QObject, Manager): self.save_object(Testament.populate(name=u'New Testament')) self.save_object(Testament.populate(name=u'Apocrypha')) - def create_book(self, name, abbrev, testament=1): + def create_book(self, name, bk_ref_id, testament=1): """ Add a book to the database. ``name`` The name of the book. - ``abbrev`` - The abbreviation of the book. + ``bk_ref_id`` + The book_reference_id from bibles_resources.sqlite of the book. ``testament`` - *Defaults to 1.* The id of the testament this book belongs to. + *Defaults to 1.* The testament_reference_id from + bibles_resources.sqlite of the testament this book belongs to. """ - log.debug(u'create_book %s,%s', name, abbrev) - book = Book.populate(name=name, abbreviation=abbrev, - testament_id=testament) + log.debug(u'create_book %s,%s', name, bk_ref_id) + book = Book.populate(name=name, book_reference_id=bk_ref_id, + testament_reference_id=testament) self.save_object(book) return book @@ -334,6 +334,8 @@ class BibleDB(QtCore.QObject, Manager): ``value`` The value for this instance. """ + if not isinstance(value, unicode): + value = unicode(value) log.debug(u'save_meta %s/%s', key, value) self.save_object(BibleMeta.populate(key=key, value=value)) @@ -346,9 +348,6 @@ class BibleDB(QtCore.QObject, Manager): """ log.debug(u'BibleDb.get_book("%s")', book) db_book = self.get_object_filtered(Book, Book.name.like(book + u'%')) - if db_book is None: - db_book = self.get_object_filtered(Book, - Book.abbreviation.like(book + u'%')) return db_book def get_books(self): @@ -358,7 +357,7 @@ class BibleDB(QtCore.QObject, Manager): """ return self.get_all_objects(Book, order_by_ref=Book.id) - def get_verses(self, reference_list): + def get_verses(self, reference_list, en_reference_list): """ This is probably the most used function. It retrieves the list of verses based on the user's query. @@ -376,15 +375,18 @@ class BibleDB(QtCore.QObject, Manager): [(u'Genesis', 1, 1, 1), (u'Genesis', 2, 2, 3)] """ - log.debug(u'BibleDB.get_verses: %s', reference_list) + log.debug(u'BibleDB.get_verses: %s - %s', reference_list, + en_reference_list) verse_list = [] - for book, chapter, start_verse, end_verse in reference_list: + for (book, chapter, start_verse, end_verse), (en_book, en_chapter, + en_start_verse, en_end_verse) in zip(reference_list, + en_reference_list): db_book = self.get_book(book) if db_book: book = db_book.name log.debug(u'Book name corrected to "%s"', book) if end_verse == -1: - end_verse = self.get_verse_count(book, chapter) + end_verse = self.get_verse_count(en_book, chapter) verses = self.session.query(Verse)\ .filter_by(book_id=db_book.id)\ .filter_by(chapter=chapter)\ @@ -545,9 +547,9 @@ class BiblesResourcesDB(QtCore.QObject, Manager): ``name`` The name or abbreviation of the book. """ + log.debug(u'get_book: %s', name) if not isinstance(name, unicode): name = unicode(name) - name = name.title() books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' u'abbreviation, chapters FROM book_reference WHERE name = ? OR ' u'abbreviation = ?', (name, name)) @@ -562,6 +564,30 @@ class BiblesResourcesDB(QtCore.QObject, Manager): else: return None + @staticmethod + def get_book_by_id(id): + """ + Return a book by id. + + ``id`` + The id of the book. + """ + if not isinstance(id, int): + id = int(id) + books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' + u'abbreviation, chapters FROM book_reference WHERE id = ?', + (id, )) + if books: + return { + u'id': books[0][0], + u'testament_id': books[0][1], + u'name': unicode(books[0][2]), + u'abbreviation': unicode(books[0][3]), + u'chapters': books[0][4] + } + else: + return None + @staticmethod def get_chapter(name, chapter): """ @@ -644,8 +670,8 @@ class BiblesResourcesDB(QtCore.QObject, Manager): """ Return the bibles a webbible provide for download. - ``name`` - The name of the webbible. + ``source`` + The source of the webbible. """ if not isinstance(source, unicode): source = unicode(source) @@ -668,7 +694,39 @@ class BiblesResourcesDB(QtCore.QObject, Manager): return None @staticmethod - def get_spelling(name, language_id=None): + def get_webbible(abbreviation, source): + """ + Return the bibles a webbible provide for download. + + ``abbreviation`` + The abbreviation of the webbible. + + ``source`` + The source of the webbible. + """ + if not isinstance(abbreviation, unicode): + abbreviation = unicode(abbreviation) + if not isinstance(source, unicode): + source = unicode(source) + source = BiblesResourcesDB.get_download_source(source) + bible = BiblesResourcesDB.run_sql(u'SELECT id, name, abbreviation, ' + u'language_id, download_source_id FROM webbibles WHERE ' + u'download_source_id = ? AND abbreviation = ?', (source[u'id'], + abbreviation)) + if bible: + bibles_temp = { + u'id': bible[0][0], + u'name': bible[0][1], + u'abbreviation': bible[0][2], + u'language_id': bible[0][3], + u'download_source_id': bible[0][4] + } + return bibles_temp + else: + return None + + @staticmethod + def get_spelling(name, language_id=None): """ Return a book_reference_id if the name matches. """ @@ -678,7 +736,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): (name, language_id)) else: id = BiblesResourcesDB.run_sql(u'SELECT book_reference_id ' - u'FROM spelling WHERE name = ? ORDER BY id', (name, )) + u'FROM spelling WHERE name = ? ORDER BY id', (name, )) if id: return int(id[0][0]) else: @@ -707,6 +765,25 @@ class BiblesResourcesDB(QtCore.QObject, Manager): else: return None + @staticmethod + def get_languages(): + """ + Return a dict containing all languages with id, name and code. + """ + languages = BiblesResourcesDB.run_sql(u'SELECT id, name, code FROM ' + u'language ORDER by name') + if languages: + languages_temp = [] + for language in languages: + languages_temp.append({ + u'id': language[0], + u'name': unicode(language[1]), + u'code': unicode(language[2]) + }) + return languages_temp + else: + return None + @staticmethod def get_testament_reference(): """ @@ -766,7 +843,7 @@ class SpellingDB(QtCore.QObject, Manager): def get_book_reference_id(self, name, language=None): """ - Return the book_reference_id of a name. + Return the book_reference_id of a book by name. ``name`` The name to search the id. @@ -785,7 +862,7 @@ class SpellingDB(QtCore.QObject, Manager): if not id: return None else: - return id + return id[0] def create_spelling(self, name, book_reference_id, language_id): """ diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index d2202909c..29c86e0bd 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -41,7 +41,8 @@ from openlp.core.lib import Receiver, translate from openlp.core.lib.ui import critical_error_message_box from openlp.core.utils import AppLocation, get_web_page from openlp.plugins.bibles.lib import SearchResults -from openlp.plugins.bibles.lib.db import BibleDB, BiblesResourcesDB, Book +from openlp.plugins.bibles.lib.db import BibleDB, BiblesResourcesDB, \ + SpellingDB, Book log = logging.getLogger(__name__) @@ -123,6 +124,52 @@ class BGExtract(object): return None return SearchResults(bookname, chapter, verse_list) + def get_books_from_http(self, version): + """ + Load a list of all books a bible contaions from BibleGateway website. + + ``version`` + The version of the bible like NIV for New International Version + """ + log.debug(u'get_books_from_http %s', version) + url_params = urllib.urlencode( + {u'search': 'Bible-List', u'version': u'%s' % version}) + reference_url = u'http://www.biblegateway.com/passage/?%s' % url_params + page = get_web_page(reference_url) + if not page: + send_error_message(u'download') + return None + page_source = page.read() + page_source = unicode(page_source, 'utf8') + page_source_temp = re.search(u'.*?
', \ + page_source, re.DOTALL) + if page_source_temp: + soup = page_source_temp.group(0) + else: + soup = None + try: + soup = BeautifulSoup(soup) + except HTMLParseError: + log.exception(u'BeautifulSoup could not parse the bible page.') + if not soup: + send_error_message(u'parse') + return None + Receiver.send_message(u'openlp_process_events') + content = soup.find(u'table', {u'id': u'booklist'}) + content = content.findAll(u'tr') + #log.debug(content) + if not content: + log.exception(u'No books found in the Biblegateway response.') + send_error_message(u'parse') + return None + books = [] + for book in content: + book = book.find(u'td') + if book: + books.append(book.contents[0]) + log.debug(book.contents[0]) + return books + class BSExtract(object): """ @@ -168,6 +215,31 @@ class BSExtract(object): verses[versenumber] = verse.contents[1].rstrip(u'\n') return SearchResults(bookname, chapter, verses) + def get_books_from_http(self, version): + """ + Load a list of all books a bible contains from Bibleserver mobile + website. + + ``version`` + The version of the bible like NIV for New International Version + """ + log.debug(u'get_books_from_http %s', version) + chapter_url = u'http://m.bibleserver.com/overlay/selectBook?'\ + 'translation=%s' % (version) + soup = get_soup_for_bible_ref(chapter_url) + if not soup: + return None + content = soup.find(u'ul') + if not content: + log.exception(u'No books found in the Bibleserver response.') + send_error_message(u'parse') + return None + content = content.findAll(u'li') + books = [] + for book in content: + books.append(book.contents[0].contents[0]) + return books + class CWExtract(object): """ @@ -237,6 +309,33 @@ class CWExtract(object): verses[versenumber] = versetext return SearchResults(bookname, chapter, verses) + def get_books_from_http(self, version): + """ + Load a list of all books a bible contain from the Crosswalk website. + + ``version`` + The version of the bible like NIV for New International Version + """ + log.debug(u'get_books_from_http %s', version) + chapter_url = u'http://www.biblestudytools.com/%s/'\ + % (version) + soup = get_soup_for_bible_ref(chapter_url) + if not soup: + return None + content = soup.find(u'div', {u'class': u'Body'}) + content = content.find(u'ul', {u'class': u'parent'}) + if not content: + log.exception(u'No books found in the Crosswalk response.') + send_error_message(u'parse') + return None + content = content.findAll(u'li') + books = [] + for book in content: + book = book.find(u'a') + books.append(book.contents[0]) + log.debug(book.contents[0]) + return books + class HTTPBible(BibleDB): log.info(u'%s HTTPBible loaded' , __name__) @@ -252,6 +351,7 @@ class HTTPBible(BibleDB): Init confirms the bible exists and stores the database path. """ BibleDB.__init__(self, parent, **kwargs) + self.parent = parent self.download_source = kwargs[u'download_source'] self.download_name = kwargs[u'download_name'] # TODO: Clean up proxy stuff. We probably want one global proxy per @@ -259,6 +359,8 @@ class HTTPBible(BibleDB): self.proxy_server = None self.proxy_username = None self.proxy_password = None + if u'path' in kwargs: + self.path = kwargs[u'path'] if u'proxy_server' in kwargs: self.proxy_server = kwargs[u'proxy_server'] if u'proxy_username' in kwargs: @@ -283,9 +385,37 @@ class HTTPBible(BibleDB): if self.proxy_password: # Store the proxy password. self.create_meta(u'proxy password', self.proxy_password) + if self.download_source.lower() == u'crosswalk': + handler = CWExtract(self.proxy_server) + elif self.download_source.lower() == u'biblegateway': + handler = BGExtract(self.proxy_server) + elif self.download_source.lower() == u'bibleserver': + handler = BSExtract(self.proxy_server) + books = handler.get_books_from_http(self.download_name) + if not books: + log.exception(u'Importing books from %s - download name: "%s" '\ + 'failed' % (self.download_source, self.download_name)) + return False + bible = BiblesResourcesDB.get_webbible(self.download_name, + self.download_source.lower()) + if bible[u'language_id']: + language_id = bible[u'language_id'] + else: + language = self.parent.mediaItem.importRequest(u'language') + language = BiblesResourcesDB.get_language(language) + language_id = language[u'id'] + # Store the language_id. + self.create_meta(u'language_id', language_id) + for book in books: + book_ref_id = self.parent.manager.get_book_ref_id_by_name(book, + language_id) + book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) + log.debug(u'Book details: Name:%s; id:%s; testament_id:%s', + book, book_ref_id, book_details[u'testament_id']) + self.create_book(book, book_ref_id, book_details[u'testament_id']) return True - def get_verses(self, reference_list): + def get_verses(self, reference_list, en_reference_list): """ A reimplementation of the ``BibleDB.get_verses`` method, this one is specifically for web Bibles. It first checks to see if the particular @@ -298,6 +428,13 @@ class HTTPBible(BibleDB): a list of tuples, with the following format:: (book, chapter, start_verse, end_verse) + + ``en_reference_list`` + This is the list of references the media manager item wants. It is + a list of tuples, with the following format with englisch book + names:: + + (book, chapter, start_verse, end_verse) Therefore, when you are looking for multiple items, simply break them up into references like this, bundle them into a list. This @@ -311,17 +448,12 @@ class HTTPBible(BibleDB): book = reference[0] db_book = self.get_book(book) if not db_book: - book_details = BiblesResourcesDB.get_book(book) - if not book_details: - critical_error_message_box( - translate('BiblesPlugin', 'No Book Found'), - translate('BiblesPlugin', 'No matching ' - 'book could be found in this Bible. Check that you ' - 'have spelled the name of the book correctly.')) - return [] - db_book = self.create_book(book_details[u'name'], - book_details[u'abbreviation'], - book_details[u'testament_id']) + critical_error_message_box( + translate('BiblesPlugin', 'No Book Found'), + translate('BiblesPlugin', 'No matching ' + 'book could be found in this Bible. Check that you ' + 'have spelled the name of the book correctly.')) + return [] book = db_book.name if BibleDB.get_verse_count(self, book, reference[1]) == 0: Receiver.send_message(u'cursor_busy') @@ -340,7 +472,7 @@ class HTTPBible(BibleDB): Receiver.send_message(u'openlp_process_events') Receiver.send_message(u'cursor_normal') Receiver.send_message(u'openlp_process_events') - return BibleDB.get_verses(self, reference_list) + return BibleDB.get_verses(self, reference_list, en_reference_list) def get_chapter(self, book, chapter): """ @@ -360,8 +492,7 @@ class HTTPBible(BibleDB): """ Return the list of books. """ - return [Book.populate(name=book['name']) - for book in BiblesResourcesDB.get_books()] + return self.get_all_objects(Book, order_by_ref=Book.id) def get_chapter_count(self, book): """ diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 6a12c3877..de66c38e0 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -220,19 +220,28 @@ class BibleManager(object): Unicode. The Bible to get the list of books from. """ log.debug(u'BibleManager.get_books("%s")', bible) - return [ + language_id = self.get_meta_data(bible, u'language_id') + books = [] + for book in self.db_cache[bible].get_books(): + book_id = self.get_book_ref_id_by_name(book.name, int( + language_id.value)) + book_temp = BiblesResourcesDB.get_book_by_id(book_id) + book_ref = book_temp[u'name'] + books.append( { u'name': book.name, - u'chapters': self.db_cache[bible].get_chapter_count(book.name) - } - for book in self.db_cache[bible].get_books() - ] + u'chapters': self.db_cache[bible].get_chapter_count(book_ref) + }) + return books def get_chapter_count(self, bible, book): """ Returns the number of Chapters for a given book. """ - log.debug(u'get_book_chapter_count %s', book) + log.debug(u'BibleManager.get_book_chapter_count ("%s", "%s")', bible, + book) + language_id = self.get_meta_data(bible, u'language_id') + book = self.get_book_ref(book, int(language_id.value)) return self.db_cache[bible].get_chapter_count(book) def get_verse_count(self, bible, book, chapter): @@ -242,6 +251,8 @@ class BibleManager(object): """ log.debug(u'BibleManager.get_verse_count("%s", "%s", %s)', bible, book, chapter) + language_id = self.get_meta_data(bible, u'language_id') + book = self.get_book_ref(book, int(language_id.value)) return self.db_cache[bible].get_verse_count(book, chapter) def get_verses(self, bible, versetext): @@ -275,7 +286,14 @@ class BibleManager(object): return None reflist = parse_reference(versetext) if reflist: - return self.db_cache[bible].get_verses(reflist) + log.debug(u'reflist:%s', reflist) + en_reflist = [] + for item in reflist: + if item: + book = self.get_book_ref(item[0]) + en_reflist.append((book, item[1], item[2], item[3])) + log.debug(u'en_reflist:%s', en_reflist) + return self.db_cache[bible].get_verses(reflist, en_reflist) else: Receiver.send_message(u'openlp_information_message', { u'title': translate('BiblesPlugin.BibleManager', @@ -293,6 +311,40 @@ class BibleManager(object): }) return None + def get_book_ref(self, book, language_id=None): + log.debug(u'BibleManager.get_book_ref("%s", "%s")', book, language_id) + book_id = self.get_book_ref_id_by_name(book, language_id) + book_temp = BiblesResourcesDB.get_book_by_id(book_id) + log.debug(u'get_book_ref - Return:%s', book_temp[u'name']) + return book_temp[u'name'] + + def get_book_ref_id_by_name(self, book, language_id=None): + log.debug(u'BibleManager.get_book_ref_id_by_name:("%s", "%s")', book, + language_id) + if BiblesResourcesDB.get_book(book): + book_temp = BiblesResourcesDB.get_book(book) + book_id = book_temp[u'id'] + elif BiblesResourcesDB.get_spelling(book, language_id): + book_id = BiblesResourcesDB.get_spelling(book, language_id) + elif self.spelling_cache[u'spelling'].get_book_reference_id(book, + language_id): + book_id = self.spelling_cache[u'spelling'].\ + get_book_reference_id(book, language_id) + else: + book_ref = self.parent.mediaItem.importRequest(u'book', book) + log.debug(book_ref) + book_temp = BiblesResourcesDB.get_book(book_ref) + log.debug(book_temp) + book_id = book_temp[u'id'] + if book_id: + self.spelling_cache[u'spelling'].create_spelling(book, book_id, + language_id) + if book_id: + log.debug(u'get_book_ref_id_by_name - Return:%s', book_id) + return book_id + else: + return None + def verse_search(self, bible, second_bible, text): """ Does a verse search for the given bible and text. diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 2b2f6597e..58fa0eec7 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -36,6 +36,7 @@ from openlp.core.lib.ui import UiStrings, add_widget_completer, \ from openlp.plugins.bibles.forms import BibleImportForm from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \ get_reference_match +from openlp.plugins.bibles.forms import BibleImportRequest log = logging.getLogger(__name__) @@ -286,6 +287,11 @@ class BibleMediaItem(MediaManagerItem): if self.import_wizard.exec_(): self.reloadBibles() + def importRequest(self, case, name=None): + self.import_request = BibleImportRequest(self) + if self.import_request.exec_(case, name): + return unicode(self.import_request.RequestComboBox.currentText()) + def loadBibles(self): log.debug(u'Loading Bibles') self.quickVersionComboBox.clear() diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index 2d19db20c..f0e12481a 100644 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -56,6 +56,7 @@ class OpenLP1Bible(BibleDB): cursor = connection.cursor() except: return False + #TODO: include create_meta language # Create all books. cursor.execute(u'SELECT id, testament_id, name, abbreviation FROM book') books = cursor.fetchall() @@ -68,6 +69,8 @@ class OpenLP1Bible(BibleDB): testament_id = int(book[1]) name = unicode(book[2], u'cp1252') abbreviation = unicode(book[3], u'cp1252') + #TODO: change create_book to the new database model + #(name, bk_ref_id, testament) self.create_book(name, abbreviation, testament_id) # Update the progess bar. self.wizard.incrementProgressBar(WizardStrings.ImportingType % name) diff --git a/openlp/plugins/bibles/lib/opensong.py b/openlp/plugins/bibles/lib/opensong.py index a7f1eff33..62cf12eaf 100644 --- a/openlp/plugins/bibles/lib/opensong.py +++ b/openlp/plugins/bibles/lib/opensong.py @@ -61,9 +61,12 @@ class OpenSongBible(BibleDB): file = open(self.filename, u'r') opensong = objectify.parse(file) bible = opensong.getroot() + #TODO: include create_meta language for book in bible.b: if self.stop_import_flag: break + #TODO: change create_book to the new database model + #(name, bk_ref_id, testament) db_book = self.create_book(unicode(book.attrib[u'n']), unicode(book.attrib[u'n'][:4])) for chapter in book.c: diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 78e2551d9..05a57bbe4 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -104,6 +104,7 @@ class OSISBible(BibleDB): finally: if detect_file: detect_file.close() + #TODO: include create_meta language with try - except scheme try: osis = codecs.open(self.filename, u'r', details['encoding']) for file_record in osis: @@ -120,6 +121,8 @@ class OSISBible(BibleDB): log.debug(u'New book: "%s"', self.books[book][0]) if book == u'Matt' or book == u'Jdt': testament += 1 + #TODO: change create_book to the new database model + #(name, bk_ref_id, testament) db_book = self.create_book( unicode(self.books[book][0]), unicode(self.books[book][1]), diff --git a/openlp/plugins/bibles/resources/bibles_resources.sqlite b/openlp/plugins/bibles/resources/bibles_resources.sqlite index 3049657ec..102fe25b7 100644 Binary files a/openlp/plugins/bibles/resources/bibles_resources.sqlite and b/openlp/plugins/bibles/resources/bibles_resources.sqlite differ