diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py deleted file mode 100644 index fc246b93d..000000000 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ /dev/null @@ -1,575 +0,0 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2016 OpenLP Developers # -# --------------------------------------------------------------------------- # -# 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 # -############################################################################### -""" -The bible import functions for OpenLP -""" -import logging -import os -import shutil -from tempfile import gettempdir - -from PyQt5 import QtCore, QtWidgets - -from openlp.core.common import Registry, AppLocation, UiStrings, Settings, check_directory_exists, translate, \ - delete_file -from openlp.core.lib.ui import critical_error_message_box -from openlp.core.ui.lib.wizard import OpenLPWizard, WizardStrings -from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, OldBibleDB, BiblesResourcesDB -from openlp.plugins.bibles.lib.http import BSExtract, BGExtract, CWExtract - -log = logging.getLogger(__name__) - - -class BibleUpgradeForm(OpenLPWizard): - """ - This is the Bible Upgrade Wizard, which allows easy importing of Bibles into OpenLP from older OpenLP2 database - versions. - """ - log.info('BibleUpgradeForm loaded') - - def __init__(self, parent, manager, bible_plugin): - """ - Instantiate the wizard, and run any extra setup we need to. - - :param parent: The QWidget-derived parent of the wizard. - :param manager: The Bible manager. - :param bible_plugin: The Bible plugin. - """ - self.manager = manager - self.media_item = bible_plugin.media_item - self.suffix = '.sqlite' - self.settings_section = 'bibles' - self.path = AppLocation.get_section_data_path(self.settings_section) - self.temp_dir = os.path.join(gettempdir(), 'openlp') - self.files = self.manager.old_bible_databases - self.success = {} - self.new_bibles = {} - super(BibleUpgradeForm, self).__init__( - parent, bible_plugin, 'bibleUpgradeWizard', ':/wizards/wizard_importbible.bmp') - - def setupUi(self, image): - """ - Set up the UI for the bible wizard. - """ - super(BibleUpgradeForm, self).setupUi(image) - Registry().register_function('openlp_stop_wizard', self.stop_import) - - def stop_import(self): - """ - Stops the import of the Bible. - """ - log.debug('Stopping import') - self.stop_import_flag = True - - def reject(self): - """ - Stop the wizard on cancel button, close button or ESC key. - """ - log.debug('Wizard cancelled by user') - self.stop_import_flag = True - if not self.currentPage() == self.progress_page: - self.done(QtWidgets.QDialog.Rejected) - - def onCurrentIdChanged(self, page_id): - """ - Perform necessary functions depending on which wizard page is active. - """ - if self.page(page_id) == self.progress_page: - self.pre_wizard() - self.perform_wizard() - self.post_wizard() - elif self.page(page_id) == self.selectPage and not self.files: - self.next() - - def on_backup_browse_button_clicked(self): - """ - Show the file open dialog for the OSIS file. - """ - filename = QtWidgets.QFileDialog.getExistingDirectory(self, translate('BiblesPlugin.UpgradeWizardForm', - 'Select a Backup Directory'), '') - if filename: - self.backupDirectoryEdit.setText(filename) - - def on_no_backup_check_box_toggled(self, checked): - """ - Enable or disable the backup directory widgets. - """ - self.backupDirectoryEdit.setEnabled(not checked) - self.backupBrowseButton.setEnabled(not checked) - - def backup_old_bibles(self, backup_directory): - """ - Backup old bible databases in a given folder. - """ - check_directory_exists(backup_directory) - success = True - for filename in self.files: - try: - shutil.copy(os.path.join(self.path, filename[0]), backup_directory) - except: - success = False - return success - - def custom_init(self): - """ - Perform any custom initialisation for bible upgrading. - """ - self.manager.set_process_dialog(self) - self.restart() - - def custom_signals(self): - """ - Set up the signals used in the bible importer. - """ - self.backupBrowseButton.clicked.connect(self.on_backup_browse_button_clicked) - self.noBackupCheckBox.toggled.connect(self.on_no_backup_check_box_toggled) - - def add_custom_pages(self): - """ - Add the bible import specific wizard pages. - """ - # Backup Page - self.backup_page = QtWidgets.QWizardPage() - self.backup_page.setObjectName('BackupPage') - self.backupLayout = QtWidgets.QVBoxLayout(self.backup_page) - self.backupLayout.setObjectName('BackupLayout') - self.backupInfoLabel = QtWidgets.QLabel(self.backup_page) - self.backupInfoLabel.setOpenExternalLinks(True) - self.backupInfoLabel.setTextFormat(QtCore.Qt.RichText) - self.backupInfoLabel.setWordWrap(True) - self.backupInfoLabel.setObjectName('backupInfoLabel') - self.backupLayout.addWidget(self.backupInfoLabel) - self.selectLabel = QtWidgets.QLabel(self.backup_page) - self.selectLabel.setObjectName('select_label') - self.backupLayout.addWidget(self.selectLabel) - self.formLayout = QtWidgets.QFormLayout() - self.formLayout.setContentsMargins(0, 0, 0, 0) - self.formLayout.setObjectName('FormLayout') - self.backupDirectoryLabel = QtWidgets.QLabel(self.backup_page) - self.backupDirectoryLabel.setObjectName('backupDirectoryLabel') - self.backupDirectoryLayout = QtWidgets.QHBoxLayout() - self.backupDirectoryLayout.setObjectName('BackupDirectoryLayout') - self.backupDirectoryEdit = QtWidgets.QLineEdit(self.backup_page) - self.backupDirectoryEdit.setObjectName('BackupFolderEdit') - self.backupDirectoryLayout.addWidget(self.backupDirectoryEdit) - self.backupBrowseButton = QtWidgets.QToolButton(self.backup_page) - self.backupBrowseButton.setIcon(self.open_icon) - self.backupBrowseButton.setObjectName('BackupBrowseButton') - self.backupDirectoryLayout.addWidget(self.backupBrowseButton) - self.formLayout.addRow(self.backupDirectoryLabel, self.backupDirectoryLayout) - self.backupLayout.addLayout(self.formLayout) - self.noBackupCheckBox = QtWidgets.QCheckBox(self.backup_page) - self.noBackupCheckBox.setObjectName('NoBackupCheckBox') - self.backupLayout.addWidget(self.noBackupCheckBox) - self.spacer = QtWidgets.QSpacerItem(10, 0, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) - self.backupLayout.addItem(self.spacer) - self.addPage(self.backup_page) - # Select Page - self.selectPage = QtWidgets.QWizardPage() - self.selectPage.setObjectName('SelectPage') - self.pageLayout = QtWidgets.QVBoxLayout(self.selectPage) - self.pageLayout.setObjectName('pageLayout') - self.scrollArea = QtWidgets.QScrollArea(self.selectPage) - self.scrollArea.setWidgetResizable(True) - self.scrollArea.setObjectName('scrollArea') - self.scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.scrollAreaContents = QtWidgets.QWidget(self.scrollArea) - self.scrollAreaContents.setObjectName('scrollAreaContents') - self.formLayout = QtWidgets.QVBoxLayout(self.scrollAreaContents) - self.formLayout.setSpacing(2) - self.formLayout.setObjectName('formLayout') - self.addScrollArea() - self.pageLayout.addWidget(self.scrollArea) - self.addPage(self.selectPage) - - def addScrollArea(self): - """ - Add the content to the scrollArea. - """ - self.checkBox = {} - for number, filename in enumerate(self.files): - bible = OldBibleDB(self.media_item, path=self.path, file=filename[0]) - self.checkBox[number] = QtWidgets.QCheckBox(self.scrollAreaContents) - self.checkBox[number].setObjectName('checkBox[{count:d}]'.format(count=number)) - self.checkBox[number].setText(bible.get_name()) - self.checkBox[number].setCheckState(QtCore.Qt.Checked) - self.formLayout.addWidget(self.checkBox[number]) - self.spacer_item = QtWidgets.QSpacerItem(20, 5, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.formLayout.addItem(self.spacer_item) - self.scrollArea.setWidget(self.scrollAreaContents) - - def clearScrollArea(self): - """ - Remove the content from the scrollArea. - """ - for number, filename in enumerate(self.files): - self.formLayout.removeWidget(self.checkBox[number]) - self.checkBox[number].setParent(None) - self.formLayout.removeItem(self.spacer_item) - - def retranslateUi(self): - """ - Allow for localisation of the bible import wizard. - """ - self.setWindowTitle(translate('BiblesPlugin.UpgradeWizardForm', 'Bible Upgrade Wizard')) - self.title_label.setText(WizardStrings.HeaderStyle % translate('OpenLP.Ui', - 'Welcome to the Bible Upgrade Wizard')) - self.information_label.setText( - translate('BiblesPlugin.UpgradeWizardForm', - 'This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. ' - 'Click the next button below to start the upgrade process.')) - self.backup_page.setTitle(translate('BiblesPlugin.UpgradeWizardForm', 'Select Backup Directory')) - self.backup_page.setSubTitle( - translate('BiblesPlugin.UpgradeWizardForm', 'Please select a backup directory for your Bibles')) - self.backupInfoLabel.setText( - translate('BiblesPlugin.UpgradeWizardForm', - 'Previous releases of OpenLP 2.0 are unable to use upgraded Bibles.' - ' This will create a backup of your current Bibles so that you can ' - 'simply copy the files back to your OpenLP data directory if you ' - 'need to revert to a previous release of OpenLP. Instructions on ' - 'how to restore the files can be found in our Frequently Asked Questions.')) - self.selectLabel.setText( - translate('BiblesPlugin.UpgradeWizardForm', 'Please select a backup location for your Bibles.')) - self.backupDirectoryLabel.setText(translate('BiblesPlugin.UpgradeWizardForm', 'Backup Directory:')) - self.noBackupCheckBox.setText( - translate('BiblesPlugin.UpgradeWizardForm', 'There is no need to backup my Bibles')) - self.selectPage.setTitle(translate('BiblesPlugin.UpgradeWizardForm', 'Select Bibles')) - self.selectPage.setSubTitle( - translate('BiblesPlugin.UpgradeWizardForm', 'Please select the Bibles to upgrade')) - self.progress_page.setTitle(translate('BiblesPlugin.UpgradeWizardForm', 'Upgrading')) - self.progress_page.setSubTitle( - translate('BiblesPlugin.UpgradeWizardForm', 'Please wait while your Bibles are upgraded.')) - self.progress_label.setText(WizardStrings.Ready) - self.progress_bar.setFormat('%p%') - - def validateCurrentPage(self): - """ - Validate the current page before moving on to the next page. - """ - if self.currentPage() == self.welcome_page: - return True - elif self.currentPage() == self.backup_page: - if not self.noBackupCheckBox.checkState() == QtCore.Qt.Checked: - backup_path = self.backupDirectoryEdit.text() - if not backup_path: - critical_error_message_box( - UiStrings().EmptyField, - translate('BiblesPlugin.UpgradeWizardForm', 'You need to specify a backup directory for ' - 'your Bibles.')) - self.backupDirectoryEdit.setFocus() - return False - else: - if not self.backup_old_bibles(backup_path): - critical_error_message_box( - UiStrings().Error, - translate('BiblesPlugin.UpgradeWizardForm', 'The backup was not successful.\nTo backup ' - 'your Bibles you need permission to write to the given directory.')) - return False - return True - elif self.currentPage() == self.selectPage: - check_directory_exists(self.temp_dir) - for number, filename in enumerate(self.files): - if not self.checkBox[number].checkState() == QtCore.Qt.Checked: - continue - # Move bibles to temp dir. - if not os.path.exists(os.path.join(self.temp_dir, filename[0])): - shutil.move(os.path.join(self.path, filename[0]), self.temp_dir) - else: - delete_file(os.path.join(self.path, filename[0])) - return True - if self.currentPage() == self.progress_page: - return True - - def set_defaults(self): - """ - Set default values for the wizard pages. - """ - log.debug('BibleUpgrade set_defaults') - settings = Settings() - settings.beginGroup(self.plugin.settings_section) - self.stop_import_flag = False - self.success.clear() - self.new_bibles.clear() - self.clearScrollArea() - self.files = self.manager.old_bible_databases - self.addScrollArea() - self.retranslateUi() - for number, filename in enumerate(self.files): - self.checkBox[number].setCheckState(QtCore.Qt.Checked) - self.progress_bar.show() - self.restart() - self.finish_button.setVisible(False) - self.cancel_button.setVisible(True) - settings.endGroup() - - def pre_wizard(self): - """ - Prepare the UI for the upgrade. - """ - super(BibleUpgradeForm, self).pre_wizard() - self.progress_label.setText(translate('BiblesPlugin.UpgradeWizardForm', 'Starting upgrade...')) - self.application.process_events() - - def perform_wizard(self): - """ - Perform the actual upgrade. - """ - self.includeWebBible = False - proxy_server = None - if not self.files: - self.progress_label.setText( - translate('BiblesPlugin.UpgradeWizardForm', 'There are no Bibles that need to be upgraded.')) - self.progress_bar.hide() - return - max_bibles = 0 - for number, file in enumerate(self.files): - if self.checkBox[number].checkState() == QtCore.Qt.Checked: - max_bibles += 1 - old_bible = None - for number, filename in enumerate(self.files): - # Close the previous bible's connection. - if old_bible is not None: - old_bible.close_connection() - # Set to None to make obvious that we have already closed the - # database. - old_bible = None - if self.stop_import_flag: - self.success[number] = False - break - if not self.checkBox[number].checkState() == QtCore.Qt.Checked: - self.success[number] = False - continue - self.progress_bar.reset() - old_bible = OldBibleDB(self.media_item, path=self.temp_dir, file=filename[0]) - name = filename[1] - self.progress_label.setText( - translate('BiblesPlugin.UpgradeWizardForm', - 'Upgrading Bible {count} of {total}: "{name}"\n' - 'Upgrading ...').format(count=number + 1, - total=max_bibles, - name=name)) - self.new_bibles[number] = BibleDB(self.media_item, path=self.path, name=name, file=filename[0]) - self.new_bibles[number].register(self.plugin.upgrade_wizard) - metadata = old_bible.get_metadata() - web_bible = False - meta_data = {} - for meta in metadata: - # Upgrade the names of the metadata keys - if meta['key'] == 'Version': - meta['key'] = 'name' - if meta['key'] == 'Bookname language': - meta['key'] = 'book_name_language' - meta['key'] = meta['key'].lower().replace(' ', '_') - # Copy the metadata - meta_data[meta['key']] = meta['value'] - if meta['key'] != 'name' and meta['key'] != 'dbversion': - self.new_bibles[number].save_meta(meta['key'], meta['value']) - if meta['key'] == 'download_source': - web_bible = True - self.includeWebBible = True - proxy_server = meta.get('proxy_server') - if web_bible: - if meta_data['download_source'].lower() == 'crosswalk': - handler = CWExtract(proxy_server) - elif meta_data['download_source'].lower() == 'biblegateway': - handler = BGExtract(proxy_server) - elif meta_data['download_source'].lower() == 'bibleserver': - handler = BSExtract(proxy_server) - books = handler.get_books_from_http(meta_data['download_name']) - if not books: - log.error('Upgrading books from {uri} - ' - 'download name: "{name}" failed'.format(uri=meta_data['download_source'], - name=meta_data['download_name'])) - self.new_bibles[number].session.close() - del self.new_bibles[number] - critical_error_message_box( - translate('BiblesPlugin.UpgradeWizardForm', 'Download Error'), - translate('BiblesPlugin.UpgradeWizardForm', - 'To upgrade your Web Bibles an Internet connection is required.')) - text = translate('BiblesPlugin.UpgradeWizardForm', - 'Upgrading Bible {count} of {total}: "{name}"\n' - 'Failed').format(count=number + 1, total=max_bibles, name=name) - self.increment_progress_bar(text, self.progress_bar.maximum() - self.progress_bar.value()) - self.success[number] = False - continue - bible = BiblesResourcesDB.get_webbible( - meta_data['download_name'], - meta_data['download_source'].lower()) - if bible and bible['language_id']: - language_id = bible['language_id'] - self.new_bibles[number].save_meta('language_id', language_id) - else: - language_id = self.new_bibles[number].get_language(name) - if not language_id: - log.warning('Upgrading from "{name}" failed'.format(name=filename[0])) - self.new_bibles[number].session.close() - del self.new_bibles[number] - self.increment_progress_bar( - translate('BiblesPlugin.UpgradeWizardForm', - 'Upgrading Bible {count} of {total}: "{name}"\n' - 'Failed').format(count=number + 1, total=max_bibles, name=name), - self.progress_bar.maximum() - self.progress_bar.value()) - self.success[number] = False - continue - self.progress_bar.setMaximum(len(books)) - for book in books: - if self.stop_import_flag: - self.success[number] = False - break - self.increment_progress_bar( - translate('BiblesPlugin.UpgradeWizardForm', - 'Upgrading Bible {count} of {total}: "{name}"\n' - 'Upgrading {book} ...').format(count=number + 1, total=max_bibles, - name=name, book=book)) - book_ref_id = self.new_bibles[number].\ - get_book_ref_id_by_name(book, len(books), language_id) - if not book_ref_id: - log.warning('Upgrading books from {source} - download name: "{name}" ' - 'aborted by user'.format(source=meta_data['download_source'], - name=meta_data['download_name'])) - self.new_bibles[number].session.close() - del self.new_bibles[number] - self.success[number] = False - break - book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) - db_book = self.new_bibles[number].create_book(book, book_ref_id, book_details['testament_id']) - # Try to import already downloaded verses. - oldbook = old_bible.get_book(book) - if oldbook: - verses = old_bible.get_verses(oldbook['id']) - if not verses: - log.warning('No verses found to import for book "{book}"'.format(book=book)) - continue - for verse in verses: - if self.stop_import_flag: - self.success[number] = False - break - self.new_bibles[number].create_verse(db_book.id, int(verse['chapter']), - int(verse['verse']), str(verse['text'])) - self.application.process_events() - self.new_bibles[number].session.commit() - else: - language_id = self.new_bibles[number].get_object(BibleMeta, 'language_id') - if not language_id: - language_id = self.new_bibles[number].get_language(name) - if not language_id: - log.warning('Upgrading books from "{name}" failed'.format(name=name)) - self.new_bibles[number].session.close() - del self.new_bibles[number] - self.increment_progress_bar( - translate('BiblesPlugin.UpgradeWizardForm', - 'Upgrading Bible {count} of {total}: "{name}"\n' - 'Failed').format(count=number + 1, total=max_bibles, name=name), - self.progress_bar.maximum() - self.progress_bar.value()) - self.success[number] = False - continue - books = old_bible.get_books() - self.progress_bar.setMaximum(len(books)) - for book in books: - if self.stop_import_flag: - self.success[number] = False - break - self.increment_progress_bar( - translate('BiblesPlugin.UpgradeWizardForm', - 'Upgrading Bible {count} of {total}: "{name}"\n' - 'Upgrading {book} ...').format(count=number + 1, total=max_bibles, - name=name, book=book['name'])) - book_ref_id = self.new_bibles[number].get_book_ref_id_by_name(book['name'], len(books), language_id) - if not book_ref_id: - log.warning('Upgrading books from {name} " failed - aborted by user'.format(name=name)) - self.new_bibles[number].session.close() - del self.new_bibles[number] - self.success[number] = False - break - book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) - db_book = self.new_bibles[number].create_book(book['name'], book_ref_id, - book_details['testament_id']) - verses = old_bible.get_verses(book['id']) - if not verses: - log.warning('No verses found to import for book "{book}"'.format(book=book['name'])) - self.new_bibles[number].delete_book(db_book) - continue - for verse in verses: - if self.stop_import_flag: - self.success[number] = False - break - self.new_bibles[number].create_verse(db_book.id, int(verse['chapter']), int(verse['verse']), - str(verse['text'])) - self.application.process_events() - self.new_bibles[number].session.commit() - if not self.success.get(number, True): - self.increment_progress_bar( - translate('BiblesPlugin.UpgradeWizardForm', - 'Upgrading Bible {count} of {total}: "{name}"\n' - 'Failed').format(count=number + 1, total=max_bibles, name=name), - self.progress_bar.maximum() - self.progress_bar.value()) - else: - self.success[number] = True - self.new_bibles[number].save_meta('name', name) - self.increment_progress_bar( - translate('BiblesPlugin.UpgradeWizardForm', - 'Upgrading Bible {count} of {total}: "{name}"\n' - 'Complete').format(count=number + 1, total=max_bibles, name=name)) - if number in self.new_bibles: - self.new_bibles[number].session.close() - # Close the last bible's connection if possible. - if old_bible is not None: - old_bible.close_connection() - - def post_wizard(self): - """ - Clean up the UI after the import has finished. - """ - successful_import = 0 - failed_import = 0 - for number, filename in enumerate(self.files): - if self.success.get(number): - successful_import += 1 - elif self.checkBox[number].checkState() == QtCore.Qt.Checked: - failed_import += 1 - # Delete upgraded (but not complete, corrupted, ...) bible. - delete_file(os.path.join(self.path, filename[0])) - # Copy not upgraded bible back. - shutil.move(os.path.join(self.temp_dir, filename[0]), self.path) - if failed_import > 0: - failed_import_text = translate('BiblesPlugin.UpgradeWizardForm', - ', {name} failed').format(name=failed_import) - else: - failed_import_text = '' - if successful_import > 0: - if self.includeWebBible: - self.progress_label.setText( - translate('BiblesPlugin.UpgradeWizardForm', - 'Upgrading Bible(s): {count:d} successful{failed}\nPlease note that verses ' - 'from Web Bibles will be downloaded on demand and so an Internet connection is required.' - ).format(count=successful_import, failed=failed_import_text)) - else: - self.progress_label.setText( - translate('BiblesPlugin.UpgradeWizardForm', - 'Upgrading Bible(s): {count:d} successful{failed}').format(count=successful_import, - failed=failed_import_text)) - else: - self.progress_label.setText(translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade failed.')) - # Remove temp directory. - shutil.rmtree(self.temp_dir, True) - super(BibleUpgradeForm, self).post_wizard()