From 599e87695590eb18829cbc1dcf14651f916ddbc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Wed, 23 Mar 2011 20:18:51 +0100 Subject: [PATCH] Bug fixes Changed book handling from name to book_reference_id Comment out unused function to fill the testament table in the local bible database --- openlp/plugins/bibles/lib/csvbible.py | 9 +- openlp/plugins/bibles/lib/db.py | 111 +++++++++++++++---------- openlp/plugins/bibles/lib/http.py | 84 ++++++++++--------- openlp/plugins/bibles/lib/manager.py | 67 +++++++-------- openlp/plugins/bibles/lib/mediaitem.py | 4 +- openlp/plugins/bibles/lib/openlp1.py | 5 +- openlp/plugins/bibles/lib/osis.py | 14 ++-- 7 files changed, 163 insertions(+), 131 deletions(-) diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index 8884c436a..2a3949dea 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -70,7 +70,7 @@ import chardet import csv from openlp.core.lib import Receiver, translate -from openlp.plugins.bibles.lib.db import BibleDB, Testament, BiblesResourcesDB +from openlp.plugins.bibles.lib.db import BibleDB, BiblesResourcesDB#, Testament log = logging.getLogger(__name__) @@ -87,13 +87,16 @@ class CSVBible(BibleDB): log.info(self.__class__.__name__) BibleDB.__init__(self, parent, **kwargs) self.parent = parent + #TODO: Delete unused code + ''' try: self.testamentsfile = kwargs[u'testamentsfile'] except KeyError: self.testamentsfile = None + ''' self.booksfile = kwargs[u'booksfile'] self.versesfile = kwargs[u'versefile'] - + ''' def setup_testaments(self): """ Overrides parent method so we can handle importing a testament file. @@ -127,7 +130,7 @@ class CSVBible(BibleDB): 'BibleDB.Wizard', 'Importing testaments... done.')), 2) else: BibleDB.setup_testaments(self) - + ''' def do_import(self): """ Import the bible books and verses. diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 2d1d1efad..b4a5b0d3b 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -48,13 +48,14 @@ class BibleMeta(BaseModel): """ pass - +#TODO: Delete unused code +''' class Testament(BaseModel): """ Bible Testaments """ pass - +''' class Book(BaseModel): """ @@ -89,10 +90,13 @@ def init_schema(url): Column(u'key', types.Unicode(255), primary_key=True, index=True), Column(u'value', types.Unicode(255)), ) + #TODO: Delete unused code + ''' testament_table = Table(u'testament', metadata, Column(u'id', types.Integer, primary_key=True), Column(u'name', types.Unicode(50)), ) + ''' book_table = Table(u'book', metadata, Column(u'id', types.Integer, primary_key=True), Column(u'book_reference_id', types.Integer), @@ -101,7 +105,8 @@ def init_schema(url): ) verse_table = Table(u'verse', metadata, Column(u'id', types.Integer, primary_key=True, index=True), - Column(u'book_id', types.Integer, ForeignKey(u'book.id'), index=True), + Column(u'book_id', types.Integer, ForeignKey( + u'book.id'), index=True), Column(u'chapter', types.Integer, index=True), Column(u'verse', types.Integer, index=True), Column(u'text', types.UnicodeText, index=True), @@ -111,10 +116,13 @@ def init_schema(url): class_mapper(BibleMeta) except UnmappedClassError: mapper(BibleMeta, meta_table) + #TODO: Delete unused code + ''' try: class_mapper(Testament) except UnmappedClassError: mapper(Testament, testament_table) + ''' try: class_mapper(Book) except UnmappedClassError: @@ -239,9 +247,12 @@ class BibleDB(QtCore.QObject, Manager): """ self.wizard = wizard self.create_meta(u'dbversion', u'2') - self.setup_testaments() + #TODO: Delete unused code + #self.setup_testaments() return self.name + #TODO: Delete unused code + ''' def setup_testaments(self): """ Initialise the testaments section of a bible with suitable defaults. @@ -249,6 +260,7 @@ class BibleDB(QtCore.QObject, Manager): self.save_object(Testament.populate(name=u'Old Testament')) self.save_object(Testament.populate(name=u'New Testament')) self.save_object(Testament.populate(name=u'Apocrypha')) + ''' def create_book(self, name, bk_ref_id, testament=1): """ @@ -264,7 +276,7 @@ class BibleDB(QtCore.QObject, Manager): *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, bk_ref_id) + log.debug(u'BibleDB.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) @@ -284,7 +296,7 @@ class BibleDB(QtCore.QObject, Manager): A dict of the verses to be inserted. The key is the verse number, and the value is the verse text. """ - log.debug(u'create_chapter %s,%s', book_id, chapter) + log.debug(u'BibleDBcreate_chapter("%s", "%s")', book_id, chapter) # Text list has book and chapter as first two elements of the array. for verse_number, verse_text in textlist.iteritems(): verse = Verse.populate( @@ -336,7 +348,7 @@ class BibleDB(QtCore.QObject, Manager): """ if not isinstance(value, unicode): value = unicode(value) - log.debug(u'save_meta %s/%s', key, value) + log.debug(u'BibleDB.save_meta("%s/%s")', key, value) self.save_object(BibleMeta.populate(key=key, value=value)) def get_book(self, book): @@ -346,7 +358,7 @@ class BibleDB(QtCore.QObject, Manager): ``book`` The name of the book to return. """ - log.debug(u'BibleDb.get_book("%s")', book) + log.debug(u'BibleDB.get_book("%s")', book) db_book = self.get_object_filtered(Book, Book.name.like(book + u'%')) return db_book @@ -361,15 +373,15 @@ class BibleDB(QtCore.QObject, Manager): """ Return a book object from the database. - ``book`` - The name of the book to return. + ``id`` + The reference id of the book to return. """ - log.debug(u'BibleDb.get_book_by_book_ref_id("%s")', id) + log.debug(u'BibleDB.get_book_by_book_ref_id("%s")', id) db_book = self.get_object_filtered(Book, Book.book_reference_id.like(id)) return db_book - def get_verses(self, reference_list, en_reference_list): + def get_verses(self, reference_list): """ This is probably the most used function. It retrieves the list of verses based on the user's query. @@ -378,27 +390,24 @@ class BibleDB(QtCore.QObject, Manager): This is the list of references the media manager item wants. It is a list of tuples, with the following format:: - (book, chapter, start_verse, end_verse) + (book_reference_id, 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 function then runs through the list, and returns an amalgamated list of ``Verse`` objects. For example:: - [(u'Genesis', 1, 1, 1), (u'Genesis', 2, 2, 3)] + [(u'35', 1, 1, 1), (u'35', 2, 2, 3)] """ - log.debug(u'BibleDB.get_verses: %s - %s', reference_list, - en_reference_list) + log.debug(u'BibleDB.get_verses("%s")', reference_list) verse_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) + for book_id, chapter, start_verse, end_verse in reference_list: + db_book = self.get_book_by_book_ref_id(book_id) if db_book: - book = db_book.name - log.debug(u'Book name corrected to "%s"', book) + book_id = db_book.book_reference_id + log.debug(u'Book name corrected to "%s"', db_book.name) if end_verse == -1: - end_verse = self.get_verse_count(en_book, chapter) + end_verse = self.get_verse_count(book_id, chapter) verses = self.session.query(Verse)\ .filter_by(book_id=db_book.id)\ .filter_by(chapter=chapter)\ @@ -443,23 +452,23 @@ class BibleDB(QtCore.QObject, Manager): verses = verses.all() return verses - def get_chapter_count(self, book): + def get_chapter_count(self, book_id): """ Return the number of chapters in a book. ``book`` The book to get the chapter count for. """ - log.debug(u'BibleDB.get_chapter_count("%s")', book) + log.debug(u'BibleDB.get_chapter_count("%s")', book_id) count = self.session.query(Verse.chapter).join(Book)\ - .filter(Book.name==book)\ + .filter(Book.book_reference_id==book_id)\ .distinct().count() if not count: return 0 else: return count - def get_verse_count(self, book, chapter): + def get_verse_count(self, book_id, chapter): """ Return the number of verses in a chapter. @@ -469,9 +478,9 @@ class BibleDB(QtCore.QObject, Manager): ``chapter`` The chapter to get the verse count for. """ - log.debug(u'BibleDB.get_verse_count("%s", %s)', book, chapter) + log.debug(u'BibleDB.get_verse_count("%s", "%s")', book_id, chapter) count = self.session.query(Verse).join(Book)\ - .filter(Book.name==book)\ + .filter(Book.book_reference_id==book_id)\ .filter(Verse.chapter==chapter)\ .count() if not count: @@ -538,6 +547,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): """ Return a list of all the books of the Bible. """ + log.debug(u'BiblesResourcesDB.get_books()') books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' u'abbreviation, chapters FROM book_reference ORDER BY id') book_list = [] @@ -559,7 +569,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): ``name`` The name or abbreviation of the book. """ - log.debug(u'get_book: %s', name) + log.debug(u'BiblesResourcesDB.get_book("%s")', name) if not isinstance(name, unicode): name = unicode(name) books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' @@ -584,6 +594,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): ``id`` The id of the book. """ + log.debug(u'BiblesResourcesDB.get_book_by_id("%s")', id) if not isinstance(id, int): id = int(id) books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' @@ -601,22 +612,22 @@ class BiblesResourcesDB(QtCore.QObject, Manager): return None @staticmethod - def get_chapter(name, chapter): + def get_chapter(book_id, chapter): """ Return the chapter details for a specific chapter of a book. - ``name`` - The name or abbreviation of a book. + ``book_id`` + The id of a book. ``chapter`` The chapter number. """ - if not isinstance(name, int): + log.debug(u'BiblesResourcesDB.get_chapter("%s", "%s")', book_id, chapter) + if not isinstance(chapter, int): chapter = int(chapter) - book = BiblesResourcesDB.get_book(name) chapters = BiblesResourcesDB.run_sql(u'SELECT id, book_reference_id, ' u'chapter, verse_count FROM chapters WHERE book_reference_id = ?', - (book[u'id'],)) + (book_id,)) if chapters: return { u'id': chapters[chapter-1][0], @@ -628,30 +639,33 @@ class BiblesResourcesDB(QtCore.QObject, Manager): return None @staticmethod - def get_chapter_count(book): + def get_chapter_count(book_id): """ Return the number of chapters in a book. - ``book`` - The name or abbreviation of the book. + ``book_id`` + The id of the book. """ - details = BiblesResourcesDB.get_book(book) + log.debug(u'BiblesResourcesDB.get_chapter_count("%s")', book_id) + details = BiblesResourcesDB.get_book_by_id(book_id) if details: return details[u'chapters'] return 0 @staticmethod - def get_verse_count(book, chapter): + def get_verse_count(book_id, chapter): """ Return the number of verses in a chapter. ``book`` - The name or abbreviation of the book. + The id of the book. ``chapter`` The number of the chapter. """ - details = BiblesResourcesDB.get_chapter(book, chapter) + log.debug(u'BiblesResourcesDB.get_verse_count("%s", "%s")', book_id, + chapter) + details = BiblesResourcesDB.get_chapter(book_id, chapter) if details: return details[u'verse_count'] return 0 @@ -664,6 +678,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): ``name`` The name or abbreviation of the book. """ + log.debug(u'BiblesResourcesDB.get_download_source("%s")', source) if not isinstance(source, unicode): source = unicode(source) source = source.title() @@ -685,6 +700,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): ``source`` The source of the webbible. """ + log.debug(u'BiblesResourcesDB.get_webbibles("%s")', source) if not isinstance(source, unicode): source = unicode(source) source = BiblesResourcesDB.get_download_source(source) @@ -716,6 +732,8 @@ class BiblesResourcesDB(QtCore.QObject, Manager): ``source`` The source of the webbible. """ + log.debug(u'BiblesResourcesDB.get_webbibles("%s", "%s")', abbreviation, + source) if not isinstance(abbreviation, unicode): abbreviation = unicode(abbreviation) if not isinstance(source, unicode): @@ -742,6 +760,8 @@ class BiblesResourcesDB(QtCore.QObject, Manager): """ Return a book_reference_id if the name matches. """ + log.debug(u'BiblesResourcesDB.get_spelling("%s", "%s")', name, + language_id) if language_id: id = BiblesResourcesDB.run_sql(u'SELECT book_reference_id ' u'FROM spelling WHERE name = ? and language_id = ? ORDER BY id', @@ -763,6 +783,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): ``name`` The name or abbreviation of the language. """ + log.debug(u'BiblesResourcesDB.get_language("%s", "%s")', name) if not isinstance(name, unicode): name = unicode(name) name = name.title() @@ -782,6 +803,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): """ Return a dict containing all languages with id, name and code. """ + log.debug(u'BiblesResourcesDB.get_languages()') languages = BiblesResourcesDB.run_sql(u'SELECT id, name, code FROM ' u'language ORDER by name') if languages: @@ -801,6 +823,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): """ Return a list of all testaments and their id of the Bible. """ + log.debug(u'BiblesResourcesDB.get_testament_reference()') testaments = BiblesResourcesDB.run_sql(u'SELECT id, name FROM ' u'testament_reference ORDER BY id') testament_list = [] @@ -889,7 +912,7 @@ class SpellingDB(QtCore.QObject, Manager): ``language_id`` The language which the spelling of the book name is. """ - log.debug(u'create_spelling %s, book_reference_id:%s, language_id:%s', + log.debug(u'SpellingDBcreate_spelling("%s", "%s", "%s"', name, book_reference_id, language_id) spelling = Spelling.populate(name=name, book_reference_id=book_reference_id, language_id=language_id) diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index 9d91298d0..39a2e3699 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -42,7 +42,7 @@ 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, \ - SpellingDB, Book + SpellingDB, Book, BibleMeta log = logging.getLogger(__name__) @@ -51,7 +51,7 @@ class BGExtract(object): Extract verses from BibleGateway """ def __init__(self, proxyurl=None): - log.debug(u'init %s', proxyurl) + log.debug(u'BGExtract.init("%s")', proxyurl) self.proxyurl = proxyurl socket.setdefaulttimeout(30) @@ -68,9 +68,11 @@ class BGExtract(object): ``chapter`` Chapter number. """ - log.debug(u'get_bible_chapter %s, %s, %s', version, bookname, chapter) + log.debug(u'BGExtract.get_bible_chapter("%s", "%s", "%s")', version, + bookname, chapter) + urlbookname = urllib.quote(bookname.encode("utf-8")) url_params = urllib.urlencode( - {u'search': u'%s %s' % (bookname, chapter), + {u'search': u'%s %s' % (urlbookname, chapter), u'version': u'%s' % version}) cleaner = [(re.compile(' |
|\'\+\''), lambda match: '')] soup = get_soup_for_bible_ref( @@ -135,7 +137,7 @@ class BGExtract(object): ``version`` The version of the bible like NIV for New International Version """ - log.debug(u'get_books_from_http %s', version) + log.debug(u'BGExtract.get_books_from_http("%s")', version) url_params = urllib.urlencode( {u'search': 'Bible-List', u'version': u'%s' % version}) reference_url = u'http://www.biblegateway.com/passage/?%s' % url_params @@ -161,7 +163,6 @@ class BGExtract(object): 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') @@ -171,7 +172,6 @@ class BGExtract(object): book = book.find(u'td') if book: books.append(book.contents[0]) - log.debug(book.contents[0]) return books @@ -180,7 +180,7 @@ class BSExtract(object): Extract verses from Bibleserver.com """ def __init__(self, proxyurl=None): - log.debug(u'init %s', proxyurl) + log.debug(u'BSExtract.init("%s")', proxyurl) self.proxyurl = proxyurl socket.setdefaulttimeout(30) @@ -197,9 +197,11 @@ class BSExtract(object): ``chapter`` Chapter number """ - log.debug(u'get_bible_chapter %s,%s,%s', version, bookname, chapter) + log.debug(u'BSExtract.get_bible_chapter("%s", "%s", "%s")', version, + bookname, chapter) + urlbookname = urllib.quote(bookname.encode("utf-8")) chapter_url = u'http://m.bibleserver.com/text/%s/%s%s' % \ - (version, bookname, chapter) + (version, urlbookname, chapter) header = (u'Accept-Language', u'en') soup = get_soup_for_bible_ref(chapter_url, header) if not soup: @@ -227,7 +229,7 @@ class BSExtract(object): ``version`` The version of the bible like NIV for New International Version """ - log.debug(u'get_books_from_http %s', version) + log.debug(u'BSExtract.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) @@ -250,7 +252,7 @@ class CWExtract(object): Extract verses from CrossWalk/BibleStudyTools """ def __init__(self, proxyurl=None): - log.debug(u'init %s', proxyurl) + log.debug(u'CWExtract.init("%s")', proxyurl) self.proxyurl = proxyurl socket.setdefaulttimeout(30) @@ -267,10 +269,13 @@ class CWExtract(object): ``chapter`` Chapter number """ - log.debug(u'get_bible_chapter %s,%s,%s', version, bookname, chapter) + log.debug(u'CWExtract.get_bible_chapter("%s", "%s", "%s")', version, + bookname, chapter) urlbookname = bookname.replace(u' ', u'-') + urlbookname = urlbookname.lower() + urlbookname = urllib.quote(urlbookname.encode("utf-8")) chapter_url = u'http://www.biblestudytools.com/%s/%s/%s.html' % \ - (version, urlbookname.lower(), chapter) + (version, urlbookname, chapter) soup = get_soup_for_bible_ref(chapter_url) if not soup: return None @@ -320,7 +325,7 @@ class CWExtract(object): ``version`` The version of the bible like NIV for New International Version """ - log.debug(u'get_books_from_http %s', version) + log.debug(u'CWExtract.get_books_from_http("%s")', version) chapter_url = u'http://www.biblestudytools.com/%s/'\ % (version) soup = get_soup_for_bible_ref(chapter_url) @@ -337,7 +342,6 @@ class CWExtract(object): for book in content: book = book.find(u'a') books.append(book.contents[0]) - log.debug(book.contents[0]) return books @@ -377,8 +381,10 @@ class HTTPBible(BibleDB): Run the import. This method overrides the parent class method. Returns ``True`` on success, ``False`` on failure. """ - self.wizard.progressBar.setMaximum(2) - self.wizard.incrementProgressBar('Registering bible...') + self.wizard.progressBar.setMaximum(68) + self.wizard.incrementProgressBar(unicode(translate( + 'BiblesPlugin.HTTPBible', + 'Registering bible and loading books...'))) self.create_meta(u'download source', self.download_source) self.create_meta(u'download name', self.download_name) if self.proxy_server: @@ -400,6 +406,9 @@ class HTTPBible(BibleDB): log.exception(u'Importing books from %s - download name: "%s" '\ 'failed' % (self.download_source, self.download_name)) return False + self.wizard.progressBar.setMaximum(len(books)+2) + self.wizard.incrementProgressBar(unicode(translate( + 'BiblesPlugin.HTTPBible', 'Registering Language...'))) bible = BiblesResourcesDB.get_webbible(self.download_name, self.download_source.lower()) if bible[u'language_id']: @@ -415,6 +424,9 @@ class HTTPBible(BibleDB): # Store the language_id. self.create_meta(u'language_id', language_id) for book in books: + self.wizard.incrementProgressBar(unicode(translate( + 'BiblesPlugin.HTTPBible', 'Importing %s...', + 'Importing ...')) % book) book_ref_id = self.parent.manager.get_book_ref_id_by_name(book, language_id) if not book_ref_id: @@ -427,7 +439,7 @@ class HTTPBible(BibleDB): self.create_book(book, book_ref_id, book_details[u'testament_id']) return True - def get_verses(self, reference_list, en_reference_list): + def get_verses(self, 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 @@ -439,26 +451,19 @@ class HTTPBible(BibleDB): This is the list of references the media manager item wants. It is 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) + (book_reference_id, 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 function then runs through the list, and returns an amalgamated list of ``Verse`` objects. For example:: - [(u'Genesis', 1, 1, 1), (u'Genesis', 2, 2, 3)] + [(u'35', 1, 1, 1), (u'35', 2, 2, 3)] """ + log.debug(u'HTTPBible.get_verses("%s")', reference_list) for reference in reference_list: - log.debug(u'Reference: %s', reference) - book = reference[0] - db_book = self.get_book(book) + book_id = reference[0] + db_book = self.get_book_by_book_ref_id(book_id) if not db_book: critical_error_message_box( translate('BiblesPlugin', 'No Book Found'), @@ -467,7 +472,7 @@ class HTTPBible(BibleDB): 'have spelled the name of the book correctly.')) return [] book = db_book.name - if BibleDB.get_verse_count(self, book, reference[1]) == 0: + if BibleDB.get_verse_count(self, book_id, reference[1]) == 0: Receiver.send_message(u'cursor_busy') search_results = self.get_chapter(book, reference[1]) if search_results and search_results.has_verselist(): @@ -484,13 +489,13 @@ 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, en_reference_list) + return BibleDB.get_verses(self, reference_list) def get_chapter(self, book, chapter): """ Receive the request and call the relevant handler methods. """ - log.debug(u'get_chapter %s, %s', book, chapter) + log.debug(u'HTTPBible.get_chapter("%s", "%s")', book, chapter) log.debug(u'source = %s', self.download_source) if self.download_source.lower() == u'crosswalk': handler = CWExtract(self.proxy_server) @@ -504,15 +509,17 @@ class HTTPBible(BibleDB): """ Return the list of books. """ + log.debug(u'HTTPBible.get_books("%s")', Book.name) return self.get_all_objects(Book, order_by_ref=Book.id) - def get_chapter_count(self, book): + def get_chapter_count(self, book_id): """ Return the number of chapters in a particular book. """ - return BiblesResourcesDB.get_chapter_count(book) + log.debug(u'HTTPBible.get_chapter_count("%s")', book_id) + return BiblesResourcesDB.get_chapter_count(book_id) - def get_verse_count(self, book, chapter): + def get_verse_count(self, book_id, chapter): """ Return the number of verses for the specified chapter and book. @@ -522,7 +529,8 @@ class HTTPBible(BibleDB): ``chapter`` The chapter whose verses are being counted. """ - return BiblesResourcesDB.get_verse_count(book, chapter) + log.debug(u'HTTPBible.get_verse_count("%s", %s)', book_id, chapter) + return BiblesResourcesDB.get_verse_count(book_id, chapter) def get_soup_for_bible_ref(reference_url, header=None, pre_parse_regex=None, pre_parse_substitute=None, cleaner=None): diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 58e7b052f..5f0890f0e 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -30,10 +30,11 @@ 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.utils import AppLocation, delete_file from openlp.plugins.bibles.lib import parse_reference from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, SpellingDB, \ - Spelling, BiblesResourcesDB + BiblesResourcesDB from csvbible import CSVBible from http import HTTPBible from opensong import OpenSongBible @@ -223,14 +224,10 @@ class BibleManager(object): 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_ref) + u'chapters': self.db_cache[bible].get_chapter_count(book.book_reference_id) }) return books @@ -240,8 +237,6 @@ class BibleManager(object): """ 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): @@ -251,11 +246,11 @@ 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) + db_book = self.db_cache[bible].get_book(book) + book_ref_id = db_book.book_reference_id + return self.db_cache[bible].get_verse_count(book_ref_id, chapter) - def get_verses(self, bible, versetext, secondbible=False): + def get_verses(self, bible, versetext, firstbible=False): """ Parses a scripture reference, fetches the verses from the Bible specified, and returns a list of ``Verse`` objects. @@ -286,31 +281,29 @@ class BibleManager(object): return None reflist = parse_reference(versetext) if reflist: - # if we use a second bible we have to rename the book names - if secondbible: - log.debug(u'BibleManager.get_verses("secondbible true")') - meta = self.db_cache[bible].get_object(BibleMeta, - u'language_id') - language_id = meta.value - new_reflist = [] - for item in reflist: - if item: - book = self.get_book_ref(item[0]) - book_ref_id = self.parent.manager.\ - get_book_ref_id_by_name(book, language_id) - book = self.db_cache[bible].get_book_by_book_ref_id( - book_ref_id) - new_reflist.append((book.name, item[1], item[2], - item[3])) - reflist = new_reflist - log.debug(u'BibleManager.get_verses("reflist: %s")', reflist) - en_reflist = [] + new_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'BibleManager.get_verses("en_reflist: %s")', en_reflist) - return self.db_cache[bible].get_verses(reflist, en_reflist) + if firstbible: + db_book = self.db_cache[firstbible].get_book(item[0]) + db_book = self.db_cache[bible].get_book_by_book_ref_id( + db_book.book_reference_id) + else: + db_book = self.db_cache[bible].get_book(item[0]) + if db_book: + book_id = db_book.book_reference_id + log.debug(u'Book name corrected to "%s"', db_book.name) + new_reflist.append((book_id, item[1], item[2], + item[3])) + else: + log.debug(u'OpenLP failed to find book %s', item[0]) + 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.')) + reflist = new_reflist + return self.db_cache[bible].get_verses(reflist) else: Receiver.send_message(u'openlp_information_message', { u'title': translate('BiblesPlugin.BibleManager', @@ -332,7 +325,8 @@ class BibleManager(object): 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']) + log.debug(u'BibleManager.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): @@ -360,7 +354,6 @@ class BibleManager(object): 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 diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index d2753cfc5..43a20325f 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -482,7 +482,7 @@ class BibleMediaItem(MediaManagerItem): self.search_results = self.parent.manager.get_verses(bible, versetext) if second_bible: self.second_search_results = self.parent.manager.get_verses( - second_bible, versetext, True) + second_bible, versetext, bible) if self.advancedClearComboBox.currentIndex() == 0: self.listView.clear() if self.listView.count() != 0: @@ -509,7 +509,7 @@ class BibleMediaItem(MediaManagerItem): self.search_results = self.parent.manager.get_verses(bible, text) if second_bible and self.search_results: self.second_search_results = self.parent.manager.get_verses( - second_bible, text, True) + second_bible, text, bible) else: # We are doing a 'Text Search'. Receiver.send_message(u'cursor_busy') diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index 2d7ed903b..4cdb1e3fc 100644 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -85,7 +85,8 @@ class OpenLP1Bible(BibleDB): 'failed' % self.filename) return False book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) - self.create_book(name, book_ref_id, book_details[u'testament_id']) + db_book = self.create_book(name, book_ref_id, + book_details[u'testament_id']) # Update the progess bar. self.wizard.incrementProgressBar(WizardStrings.ImportingType % name) # Import the verses for this book. @@ -99,7 +100,7 @@ class OpenLP1Bible(BibleDB): chapter = int(verse[0]) verse_number = int(verse[1]) text = unicode(verse[2], u'cp1252') - self.create_verse(book_id, chapter, verse_number, text) + self.create_verse(db_book.id, chapter, verse_number, text) Receiver.send_message(u'openlp_process_events') self.session.commit() connection.close() diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 277b73a23..df9083da2 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -92,7 +92,8 @@ class OSISBible(BibleDB): osis = None success = True last_chapter = 0 - testament = 1 + #TODO: Delete unused code + #testament = 1 match_count = 0 self.wizard.incrementProgressBar(translate('BiblesPlugin.OsisImport', 'Detecting encoding (this may take a few minutes)...')) @@ -128,15 +129,18 @@ class OSISBible(BibleDB): verse_text = match.group(4) if not db_book or db_book.name != self.books[book][0]: log.debug(u'New book: "%s"', self.books[book][0]) - if book == u'Matt' or book == u'Jdt': - testament += 1 - book_ref_id = self.parent.manager.get_book_ref_id_by_name( + #TODO: Delete unused code + #if book == u'Matt' or book == u'Jdt': + # testament += 1 + book_ref_id = self.parent.manager.\ + get_book_ref_id_by_name( unicode(self.books[book][0]), language_id) if not book_ref_id: log.exception(u'Importing books from %s " '\ 'failed' % self.filename) return False - book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) + book_details = BiblesResourcesDB.get_book_by_id( + book_ref_id) db_book = self.create_book( unicode(self.books[book][0]), book_ref_id,