- Fix Bug #792811 - Traceback UnicodeEncodeError while importing a webbible

- If upgrade fails new bible databases which are failed now should be deleted always. If upgrade was successfull the old database is deleted immediately. So never should stay an old and a new version from one bible.
- changed behaviour if the user cancel the import so that after a traceback it is possible to cancel the dialog.
- Fix Bug #792831 - now the right parent is used for dialogs and error messages
- Biblegateway.com has changed it's Bible-Book-List Layout. Addapt the regex for importing the booklist of a bible from biblegateway to the new html layout.
- changed log usage
- remove unnecessary code
- small fixes

bzr-revno: 1614
Fixes: https://launchpad.net/bugs/792811, https://launchpad.net/bugs/792831
This commit is contained in:
Armin Köhler 2011-06-05 20:17:09 +01:00 committed by Tim Bentley
commit d89b60a96f
3 changed files with 43 additions and 45 deletions

View File

@ -115,6 +115,8 @@ 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):
""" """
@ -127,14 +129,6 @@ class BibleUpgradeForm(OpenLPWizard):
elif self.page(pageId) == self.selectPage and self.maxBibles == 0: elif self.page(pageId) == self.selectPage and self.maxBibles == 0:
self.next() self.next()
def onFinishButton(self):
"""
Some cleanup while finishing
"""
for number, filename in enumerate(self.files):
if number in self.success and self.success[number] == True:
delete_file(os.path.join(self.path, filename[0]))
def onBackupBrowseButtonClicked(self): def onBackupBrowseButtonClicked(self):
""" """
Show the file open dialog for the OSIS file. Show the file open dialog for the OSIS file.
@ -180,8 +174,6 @@ class BibleUpgradeForm(OpenLPWizard):
""" """
Set up the signals used in the bible importer. Set up the signals used in the bible importer.
""" """
QtCore.QObject.connect(self.finishButton,
QtCore.SIGNAL(u'clicked()'), self.onFinishButton)
QtCore.QObject.connect(self.backupBrowseButton, QtCore.QObject.connect(self.backupBrowseButton,
QtCore.SIGNAL(u'clicked()'), self.onBackupBrowseButtonClicked) QtCore.SIGNAL(u'clicked()'), self.onBackupBrowseButtonClicked)
QtCore.QObject.connect(self.noBackupCheckBox, QtCore.QObject.connect(self.noBackupCheckBox,
@ -536,7 +528,7 @@ class BibleUpgradeForm(OpenLPWizard):
""" """
Perform the actual upgrade. Perform the actual upgrade.
""" """
include_webbible = False self.include_webbible = False
proxy_server = None proxy_server = None
if self.maxBibles == 0: if self.maxBibles == 0:
self.progressLabel.setText( self.progressLabel.setText(
@ -578,19 +570,19 @@ class BibleUpgradeForm(OpenLPWizard):
name = unicode(self.versionNameEdit[biblenumber].text()) 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)
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:
meta_data[meta[u'key']] = meta[u'value'] meta_data[meta[u'key']] = meta[u'value']
if not meta[u'key'] == u'Version': if not meta[u'key'] == u'Version' and not meta[u'key'] == \
u'dbversion':
self.newbibles[number].create_meta(meta[u'key'], self.newbibles[number].create_meta(meta[u'key'],
meta[u'value']) meta[u'value'])
else:
self.newbibles[number].create_meta(meta[u'key'], name)
if meta[u'key'] == u'download source': if meta[u'key'] == u'download source':
webbible = True webbible = True
include_webbible = True self.include_webbible = True
if meta.has_key(u'proxy server'): if meta.has_key(u'proxy server'):
proxy_server = meta[u'proxy server'] proxy_server = meta[u'proxy server']
if webbible: if webbible:
@ -606,8 +598,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, delete_database(self.path, clean_filename(name))
clean_filename(self.newbibles[number].get_name()))
del self.newbibles[number] del self.newbibles[number]
critical_error_message_box( critical_error_message_box(
translate('BiblesPlugin.UpgradeWizardForm', translate('BiblesPlugin.UpgradeWizardForm',
@ -626,7 +617,7 @@ class BibleUpgradeForm(OpenLPWizard):
bible = BiblesResourcesDB.get_webbible( bible = BiblesResourcesDB.get_webbible(
meta_data[u'download name'], meta_data[u'download name'],
meta_data[u'download source'].lower()) meta_data[u'download source'].lower())
if bible[u'language_id']: if bible and bible[u'language_id']:
language_id = bible[u'language_id'] language_id = bible[u'language_id']
self.newbibles[number].create_meta(u'language_id', self.newbibles[number].create_meta(u'language_id',
language_id) language_id)
@ -634,8 +625,7 @@ 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, delete_database(self.path, clean_filename(name))
clean_filename(self.newbibles[number].get_name()))
del self.newbibles[number] del self.newbibles[number]
self.incrementProgressBar(unicode(translate( self.incrementProgressBar(unicode(translate(
'BiblesPlugin.UpgradeWizardForm', 'BiblesPlugin.UpgradeWizardForm',
@ -661,8 +651,7 @@ 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, delete_database(self.path, clean_filename(name))
clean_filename(self.newbibles[number].get_name()))
del self.newbibles[number] del self.newbibles[number]
bible_failed = True bible_failed = True
break break
@ -693,8 +682,7 @@ 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, delete_database(self.path, clean_filename(name))
clean_filename(self.newbibles[number].get_name()))
del self.newbibles[number] del self.newbibles[number]
self.incrementProgressBar(unicode(translate( self.incrementProgressBar(unicode(translate(
'BiblesPlugin.UpgradeWizardForm', 'BiblesPlugin.UpgradeWizardForm',
@ -720,8 +708,7 @@ class BibleUpgradeForm(OpenLPWizard):
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, delete_database(self.path, clean_filename(name))
clean_filename(self.newbibles[number].get_name()))
del self.newbibles[number] del self.newbibles[number]
bible_failed = True bible_failed = True
break break
@ -744,6 +731,8 @@ class BibleUpgradeForm(OpenLPWizard):
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 not bible_failed:
self.newbibles[number].create_meta(u'Version', name)
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'
@ -756,10 +745,13 @@ class BibleUpgradeForm(OpenLPWizard):
'Upgrading Bible %s of %s: "%s"\nFailed')) % 'Upgrading Bible %s of %s: "%s"\nFailed')) %
(number + 1, self.maxBibles, name), (number + 1, self.maxBibles, name),
self.progressBar.maximum() - self.progressBar.value()) self.progressBar.maximum() - self.progressBar.value())
delete_database(self.path, delete_database(self.path, clean_filename(name))
clean_filename(name))
number += 1 number += 1
self.mediaItem.reloadBibles()
def postWizard(self):
"""
Clean up the UI after the import has finished.
"""
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):
@ -774,7 +766,7 @@ class BibleUpgradeForm(OpenLPWizard):
else: else:
failed_import_text = u'' failed_import_text = u''
if successful_import > 0: if successful_import > 0:
if include_webbible: if self.include_webbible:
self.progressLabel.setText(unicode( self.progressLabel.setText(unicode(
translate('BiblesPlugin.UpgradeWizardForm', 'Upgrading ' translate('BiblesPlugin.UpgradeWizardForm', 'Upgrading '
'Bible(s): %s successful%s\nPlease note, that verses from ' 'Bible(s): %s successful%s\nPlease note, that verses from '
@ -790,3 +782,4 @@ class BibleUpgradeForm(OpenLPWizard):
self.progressLabel.setText( self.progressLabel.setText(
translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade ' translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade '
'failed.')) 'failed.'))
OpenLPWizard.postWizard(self)

View File

@ -109,7 +109,7 @@ class BGExtract(object):
try: try:
clean_verse_num = int(str(raw_verse_num)) clean_verse_num = int(str(raw_verse_num))
except ValueError: except ValueError:
log.exception(u'Illegal verse number in %s %s %s:%s', log.warn(u'Illegal verse number in %s %s %s:%s',
version, bookname, chapter, unicode(raw_verse_num)) version, bookname, chapter, unicode(raw_verse_num))
if clean_verse_num: if clean_verse_num:
verse_text = raw_verse_num.next verse_text = raw_verse_num.next
@ -139,16 +139,17 @@ class BGExtract(object):
""" """
log.debug(u'BGExtract.get_books_from_http("%s")', version) log.debug(u'BGExtract.get_books_from_http("%s")', version)
url_params = urllib.urlencode( url_params = urllib.urlencode(
{u'search': 'Bible-List', u'version': u'%s' % version}) {u'action': 'getVersionInfo', u'vid': u'%s' % version})
reference_url = u'http://www.biblegateway.com/passage/?%s' % url_params reference_url = u'http://www.biblegateway.com/versions/?%s#books' % \
url_params
page = get_web_page(reference_url) page = get_web_page(reference_url)
if not page: if not page:
send_error_message(u'download') send_error_message(u'download')
return None return None
page_source = page.read() page_source = page.read()
page_source = unicode(page_source, 'utf8') page_source = unicode(page_source, 'utf8')
page_source_temp = re.search(u'<table id="booklist".*?>.*?</table>', \ page_source_temp = re.search(u'<table .*?class="infotable".*?>.*?'\
page_source, re.DOTALL) u'</table>', page_source, re.DOTALL)
if page_source_temp: if page_source_temp:
soup = page_source_temp.group(0) soup = page_source_temp.group(0)
else: else:
@ -156,15 +157,17 @@ class BGExtract(object):
try: try:
soup = BeautifulSoup(soup) soup = BeautifulSoup(soup)
except HTMLParseError: except HTMLParseError:
log.exception(u'BeautifulSoup could not parse the Bible page.') log.error(u'BeautifulSoup could not parse the Bible page.')
send_error_message(u'parse')
return None
if not soup: if not soup:
send_error_message(u'parse') send_error_message(u'parse')
return None return None
Receiver.send_message(u'openlp_process_events') Receiver.send_message(u'openlp_process_events')
content = soup.find(u'table', {u'id': u'booklist'}) content = soup.find(u'table', {u'class': u'infotable'})
content = content.findAll(u'tr') content = content.findAll(u'tr')
if not content: if not content:
log.exception(u'No books found in the Biblegateway response.') log.error(u'No books found in the Biblegateway response.')
send_error_message(u'parse') send_error_message(u'parse')
return None return None
books = [] books = []
@ -199,9 +202,10 @@ class BSExtract(object):
""" """
log.debug(u'BSExtract.get_bible_chapter("%s", "%s", "%s")', version, log.debug(u'BSExtract.get_bible_chapter("%s", "%s", "%s")', version,
bookname, chapter) bookname, chapter)
urlversion = urllib.quote(version.encode("utf-8"))
urlbookname = urllib.quote(bookname.encode("utf-8")) urlbookname = urllib.quote(bookname.encode("utf-8"))
chapter_url = u'http://m.bibleserver.com/text/%s/%s%s' % \ chapter_url = u'http://m.bibleserver.com/text/%s/%s%d' % \
(version, urlbookname, chapter) (urlversion, urlbookname, chapter)
header = (u'Accept-Language', u'en') header = (u'Accept-Language', u'en')
soup = get_soup_for_bible_ref(chapter_url, header) soup = get_soup_for_bible_ref(chapter_url, header)
if not soup: if not soup:
@ -209,7 +213,7 @@ class BSExtract(object):
Receiver.send_message(u'openlp_process_events') Receiver.send_message(u'openlp_process_events')
content = soup.find(u'div', u'content') content = soup.find(u'div', u'content')
if not content: if not content:
log.exception(u'No verses found in the Bibleserver response.') log.error(u'No verses found in the Bibleserver response.')
send_error_message(u'parse') send_error_message(u'parse')
return None return None
content = content.find(u'div').findAll(u'div') content = content.find(u'div').findAll(u'div')
@ -230,14 +234,15 @@ class BSExtract(object):
The version of the Bible like NIV for New International Version The version of the Bible like NIV for New International Version
""" """
log.debug(u'BSExtract.get_books_from_http("%s")', version) log.debug(u'BSExtract.get_books_from_http("%s")', version)
urlversion = urllib.quote(version.encode("utf-8"))
chapter_url = u'http://m.bibleserver.com/overlay/selectBook?'\ chapter_url = u'http://m.bibleserver.com/overlay/selectBook?'\
'translation=%s' % (version) 'translation=%s' % (urlversion)
soup = get_soup_for_bible_ref(chapter_url) soup = get_soup_for_bible_ref(chapter_url)
if not soup: if not soup:
return None return None
content = soup.find(u'ul') content = soup.find(u'ul')
if not content: if not content:
log.exception(u'No books found in the Bibleserver response.') log.error(u'No books found in the Bibleserver response.')
send_error_message(u'parse') send_error_message(u'parse')
return None return None
content = content.findAll(u'li') content = content.findAll(u'li')
@ -281,7 +286,7 @@ class CWExtract(object):
Receiver.send_message(u'openlp_process_events') Receiver.send_message(u'openlp_process_events')
htmlverses = soup.findAll(u'span', u'versetext') htmlverses = soup.findAll(u'span', u'versetext')
if not htmlverses: if not htmlverses:
log.debug(u'No verses found in the CrossWalk response.') log.error(u'No verses found in the CrossWalk response.')
send_error_message(u'parse') send_error_message(u'parse')
return None return None
verses = {} verses = {}
@ -333,7 +338,7 @@ class CWExtract(object):
content = soup.find(u'div', {u'class': u'Body'}) content = soup.find(u'div', {u'class': u'Body'})
content = content.find(u'ul', {u'class': u'parent'}) content = content.find(u'ul', {u'class': u'parent'})
if not content: if not content:
log.exception(u'No books found in the Crosswalk response.') log.error(u'No books found in the Crosswalk response.')
send_error_message(u'parse') send_error_message(u'parse')
return None return None
content = content.findAll(u'li') content = content.findAll(u'li')