예제 #1
0
    def get_book_ref_id_by_name(self, book, maxbooks=66, language_id=None):
        """
        Find the book id from the name or abbreviation of the book. If it doesn't currently exist, ask the user.

        :param book: The name or abbreviation of the book
        :param maxbooks: The number of books in the bible
        :param language_id: The language_id of the bible
        :return: The id of the bible, or None
        """
        self.log_debug(
            'BibleDB.get_book_ref_id_by_name:("{book}", "{lang}")'.format(
                book=book, lang=language_id))
        book_temp = BiblesResourcesDB.get_book(book, True)
        if book_temp:
            return book_temp['id']
        book_id = BiblesResourcesDB.get_alternative_book_name(book)
        if book_id:
            return book_id
        book_id = AlternativeBookNamesDB.get_book_reference_id(book)
        if book_id:
            return book_id
        from openlp.plugins.bibles.forms import BookNameForm
        book_name = BookNameForm(self.wizard)
        if book_name.exec(book, self.get_books(),
                          maxbooks) and book_name.book_id:
            AlternativeBookNamesDB.create_alternative_book_name(
                book, book_name.book_id, language_id)
            return book_name.book_id
예제 #2
0
 def buildDisplayResults(self, bible, second_bible, search_results):
     """
     Displays the search results in the media manager. All data needed for
     further action is saved for/in each row.
     """
     verse_separator = get_reference_separator('sep_v_display')
     version = self.plugin.manager.get_meta_data(bible, 'name').value
     copyright = self.plugin.manager.get_meta_data(bible, 'copyright').value
     permissions = self.plugin.manager.get_meta_data(bible, 'permissions').value
     second_version = ''
     second_copyright = ''
     second_permissions = ''
     if second_bible:
         second_version = self.plugin.manager.get_meta_data(second_bible, 'name').value
         second_copyright = self.plugin.manager.get_meta_data(second_bible, 'copyright').value
         second_permissions = self.plugin.manager.get_meta_data(second_bible, 'permissions').value
     items = []
     language_selection = self.plugin.manager.get_language_selection(bible)
     for count, verse in enumerate(search_results):
         book = None
         if language_selection == LanguageSelection.Bible:
             book = verse.book.name
         elif language_selection == LanguageSelection.Application:
             book_names = BibleStrings().BookNames
             data = BiblesResourcesDB.get_book_by_id(verse.book.book_reference_id)
             book = str(book_names[data['abbreviation']])
         elif language_selection == LanguageSelection.English:
             data = BiblesResourcesDB.get_book_by_id(verse.book.book_reference_id)
             book = data['name']
         data = {
             'book': book,
             'chapter': verse.chapter,
             'verse': verse.verse,
             'bible': bible,
             'version': version,
             'copyright': copyright,
             'permissions': permissions,
             'text': verse.text,
             'second_bible': second_bible,
             'second_version': second_version,
             'second_copyright': second_copyright,
             'second_permissions': second_permissions,
             'second_text': ''
         }
         if second_bible:
             try:
                 data['second_text'] = self.second_search_results[count].text
             except IndexError:
                 log.exception('The second_search_results does not have as many verses as the search_results.')
                 break
             bible_text = '%s %d%s%d (%s, %s)' % (book, verse.chapter, verse_separator, verse.verse, version,
                 second_version)
         else:
             bible_text = '%s %d%s%d (%s)' % (book, verse.chapter, verse_separator, verse.verse, version)
         bible_verse = QtGui.QListWidgetItem(bible_text)
         bible_verse.setData(QtCore.Qt.UserRole, data)
         items.append(bible_verse)
     return items
예제 #3
0
 def do_import(self, bible_name=None):
     """
     Run the import. This method overrides the parent class method. Returns ``True`` on success, ``False`` on
     failure.
     """
     self.wizard.progress_bar.setMaximum(68)
     self.wizard.increment_progress_bar(translate('BiblesPlugin.HTTPBible', 'Registering Bible and loading books...'))
     self.save_meta('download_source', self.download_source)
     self.save_meta('download_name', self.download_name)
     if self.proxy_server:
         self.save_meta('proxy_server', self.proxy_server)
     if self.proxy_username:
         # Store the proxy userid.
         self.save_meta('proxy_username', self.proxy_username)
     if self.proxy_password:
         # Store the proxy password.
         self.save_meta('proxy_password', self.proxy_password)
     if self.download_source.lower() == 'crosswalk':
         handler = CWExtract(self.proxy_server)
     elif self.download_source.lower() == 'biblegateway':
         handler = BGExtract(self.proxy_server)
     elif self.download_source.lower() == 'bibleserver':
         handler = BSExtract(self.proxy_server)
     books = handler.get_books_from_http(self.download_name)
     if not books:
         log.exception('Importing books from %s - download name: "%s" '\
             'failed' % (self.download_source, self.download_name))
         return False
     self.wizard.progress_bar.setMaximum(len(books) + 2)
     self.wizard.increment_progress_bar(translate( 'BiblesPlugin.HTTPBible', 'Registering Language...'))
     bible = BiblesResourcesDB.get_webbible(self.download_name, self.download_source.lower())
     if bible['language_id']:
         language_id = bible['language_id']
         self.save_meta('language_id', language_id)
     else:
         language_id = self.get_language(bible_name)
     if not language_id:
         log.exception('Importing books from %s failed' % self.filename)
         return False
     for book in books:
         if self.stop_import_flag:
             break
         self.wizard.increment_progress_bar(translate(
             'BiblesPlugin.HTTPBible', 'Importing %s...', 'Importing <book name>...') % book)
         book_ref_id = self.get_book_ref_id_by_name(book, len(books), language_id)
         if not book_ref_id:
             log.exception('Importing books from %s - download name: "%s" '\
                 'failed' % (self.download_source, self.download_name))
             return False
         book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
         log.debug('Book details: Name:%s; id:%s; testament_id:%s',
             book, book_ref_id, book_details['testament_id'])
         self.create_book(book, book_ref_id, book_details['testament_id'])
     if self.stop_import_flag:
         return False
     else:
         return True
예제 #4
0
    def initialiseAdvancedBible(self, bible, last_book_id=None):
        """
        This initialises the given bible, which means that its book names and
        their chapter numbers is added to the combo boxes on the
        'Advanced Search' Tab. This is not of any importance of the
        'Quick Search' Tab.

        ``bible``
            The bible to initialise (unicode).

        ``last_book_id``
            The "book reference id" of the book which is choosen at the moment.
            (int)
        """
        log.debug('initialiseAdvancedBible %s, %s', bible, last_book_id)
        book_data = self.plugin.manager.get_books(bible)
        secondbible = self.advancedSecondComboBox.currentText()
        if secondbible != '':
            secondbook_data = self.plugin.manager.get_books(secondbible)
            book_data_temp = []
            for book in book_data:
                for secondbook in secondbook_data:
                    if book['book_reference_id'] == \
                        secondbook['book_reference_id']:
                        book_data_temp.append(book)
            book_data = book_data_temp
        self.advancedBookComboBox.clear()
        first = True
        initialise_chapter_verse = False
        language_selection = self.plugin.manager.get_language_selection(bible)
        book_names = BibleStrings().BookNames
        for book in book_data:
            row = self.advancedBookComboBox.count()
            if language_selection == LanguageSelection.Bible:
                self.advancedBookComboBox.addItem(book['name'])
            elif language_selection == LanguageSelection.Application:
                data = BiblesResourcesDB.get_book_by_id(book['book_reference_id'])
                self.advancedBookComboBox.addItem(book_names[data['abbreviation']])
            elif language_selection == LanguageSelection.English:
                data = BiblesResourcesDB.get_book_by_id(book['book_reference_id'])
                self.advancedBookComboBox.addItem(data['name'])
            self.advancedBookComboBox.setItemData(row, book['book_reference_id'])
            if first:
                first = False
                first_book = book
                initialise_chapter_verse = True
            if last_book_id and last_book_id == int(book['book_reference_id']):
                index = self.advancedBookComboBox.findData(book['book_reference_id'])
                if index == -1:
                    # Not Found.
                    index = 0
                self.advancedBookComboBox.setCurrentIndex(index)
                initialise_chapter_verse = False
        if initialise_chapter_verse:
            self.initialiseChapterVerse(bible, first_book['name'],
                first_book['book_reference_id'])
예제 #5
0
 def retranslateUi(self, edit_bible_dialog):
     self.book_names = BibleStrings().BookNames
     edit_bible_dialog.setWindowTitle(translate('BiblesPlugin.EditBibleForm', 'Bible Editor'))
     # Meta tab
     self.bible_tab_widget.setTabText(
         self.bible_tab_widget.indexOf(self.meta_tab), translate('SongsPlugin.EditBibleForm', 'Meta Data'))
     self.license_details_group_box.setTitle(translate('BiblesPlugin.EditBibleForm', 'License Details'))
     self.version_name_label.setText(translate('BiblesPlugin.EditBibleForm', 'Version name:'))
     self.copyright_label.setText(translate('BiblesPlugin.EditBibleForm', 'Copyright:'))
     self.permissions_label.setText(translate('BiblesPlugin.EditBibleForm', 'Permissions:'))
     self.language_selection_group_box.setTitle(translate('BiblesPlugin.EditBibleForm', 'Default Bible Language'))
     self.language_selection_label.setText(
         translate('BiblesPlugin.EditBibleForm', 'Book name language in search field, search results and '
                                                 'on display:'))
     self.language_selection_combo_box.setItemText(0, translate('BiblesPlugin.EditBibleForm', 'Global Settings'))
     self.language_selection_combo_box.setItemText(
         LanguageSelection.Bible + 1,
         translate('BiblesPlugin.EditBibleForm', 'Bible Language'))
     self.language_selection_combo_box.setItemText(
         LanguageSelection.Application + 1, translate('BiblesPlugin.EditBibleForm', 'Application Language'))
     self.language_selection_combo_box.setItemText(
         LanguageSelection.English + 1,
         translate('BiblesPlugin.EditBibleForm', 'English'))
     # Book name tab
     self.bible_tab_widget.setTabText(
         self.bible_tab_widget.indexOf(self.book_name_tab),
         translate('SongsPlugin.EditBibleForm', 'Custom Book Names'))
     for book in BiblesResourcesDB.get_books():
         self.book_name_label[book['abbreviation']].setText('%s:' % str(self.book_names[book['abbreviation']]))
예제 #6
0
    def find_and_create_book(self,
                             name,
                             no_of_books,
                             language_id,
                             guess_id=None):
        """
        Find the OpenLP book id and then create the book in this bible db

        :param name: Name of the book. If None, then fall back to the guess_id Str
        :param no_of_books: The total number of books contained in this bible Int
        :param language_id: The OpenLP id of the language of this bible Int
        :param guess_id: The guessed id of the book, used if name is None Int
        :return:
        """
        if name:
            book_ref_id = self.get_book_ref_id_by_name(name, no_of_books,
                                                       language_id)
        else:
            self.log_debug('No book name supplied. Falling back to guess_id')
            book_ref_id = guess_id
        if not book_ref_id:
            raise ValidationError(msg='Could not resolve book_ref_id in "{}"'.
                                  format(self.filename))
        book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
        if book_details is None:
            raise ValidationError(
                msg=
                'book_ref_id: {book_ref} Could not be found in the BibleResourcesDB while '
                'importing {file}'.format(book_ref=book_ref_id,
                                          file=self.filename))
        return self.create_book(name, book_ref_id,
                                book_details['testament_id'])
예제 #7
0
 def exec_(self, bible_name):
     self.languageComboBox.addItem(u'')
     if bible_name:
         self.bibleLabel.setText(unicode(bible_name))
     items = BiblesResourcesDB.get_languages()
     self.languageComboBox.addItems([item[u'name'] for item in items])
     return QDialog.exec_(self)
예제 #8
0
 def exec(self, bible_name):
     self.language_combo_box.addItem('')
     if bible_name:
         self.bible_label.setText(str(bible_name))
     items = BiblesResourcesDB.get_languages()
     self.language_combo_box.addItems([item['name'] for item in items])
     return QDialog.exec(self)
예제 #9
0
 def exec_(self, bible_name):
     self.language_combo_box.addItem('')
     if bible_name:
         self.bible_label.setText(str(bible_name))
     items = BiblesResourcesDB.get_languages()
     self.language_combo_box.addItems([item['name'] for item in items])
     return QDialog.exec_(self)
예제 #10
0
 def retranslateUi(self, edit_bible_dialog):
     self.book_names = BibleStrings().BookNames
     edit_bible_dialog.setWindowTitle(translate('BiblesPlugin.EditBibleForm', 'Bible Editor'))
     # Meta tab
     self.bible_tab_widget.setTabText( self.bible_tab_widget.indexOf(self.meta_tab),
         translate('SongsPlugin.EditBibleForm', 'Meta Data'))
     self.license_details_group_box.setTitle(translate('BiblesPlugin.EditBibleForm', 'License Details'))
     self.version_name_label.setText(translate('BiblesPlugin.EditBibleForm', 'Version name:'))
     self.copyright_label.setText(translate('BiblesPlugin.EditBibleForm', 'Copyright:'))
     self.permissions_label.setText(translate('BiblesPlugin.EditBibleForm', 'Permissions:'))
     self.language_selection_group_box.setTitle(translate('BiblesPlugin.EditBibleForm', 'Default Bible Language'))
     self.language_selection_label.setText(translate('BiblesPlugin.EditBibleForm',
         'Book name language in search field, search results and on display:'))
     self.language_selection_combo_box.setItemText(0, translate('BiblesPlugin.EditBibleForm', 'Global Settings'))
     self.language_selection_combo_box.setItemText(LanguageSelection.Bible + 1,
         translate('BiblesPlugin.EditBibleForm', 'Bible Language'))
     self.language_selection_combo_box.setItemText(LanguageSelection.Application + 1,
         translate('BiblesPlugin.EditBibleForm', 'Application Language'))
     self.language_selection_combo_box.setItemText(LanguageSelection.English + 1,
         translate('BiblesPlugin.EditBibleForm', 'English'))
     # Book name tab
     self.bible_tab_widget.setTabText(self.bible_tab_widget.indexOf(self.book_name_tab),
         translate('SongsPlugin.EditBibleForm', 'Custom Book Names'))
     for book in BiblesResourcesDB.get_books():
         self.book_name_label[book['abbreviation']].setText('%s:' % str(self.book_names[book['abbreviation']]))
예제 #11
0
 def do_import(self, bible_name=None):
     """
     Run the import. This method overrides the parent class method. Returns ``True`` on success, ``False`` on
     failure.
     """
     self.wizard.progress_bar.setMaximum(68)
     self.wizard.increment_progress_bar(
         translate("BiblesPlugin.HTTPBible", "Registering Bible and loading books...")
     )
     self.save_meta("download_source", self.download_source)
     self.save_meta("download_name", self.download_name)
     if self.proxy_server:
         self.save_meta("proxy_server", self.proxy_server)
     if self.proxy_username:
         # Store the proxy userid.
         self.save_meta("proxy_username", self.proxy_username)
     if self.proxy_password:
         # Store the proxy password.
         self.save_meta("proxy_password", self.proxy_password)
     if self.download_source.lower() == "crosswalk":
         handler = CWExtract(self.proxy_server)
     elif self.download_source.lower() == "biblegateway":
         handler = BGExtract(self.proxy_server)
     elif self.download_source.lower() == "bibleserver":
         handler = BSExtract(self.proxy_server)
     books = handler.get_books_from_http(self.download_name)
     if not books:
         log.error(
             'Importing books from %s - download name: "%s" failed' % (self.download_source, self.download_name)
         )
         return False
     self.wizard.progress_bar.setMaximum(len(books) + 2)
     self.wizard.increment_progress_bar(translate("BiblesPlugin.HTTPBible", "Registering Language..."))
     if self.language_id:
         self.save_meta("language_id", self.language_id)
     else:
         self.language_id = self.get_language(bible_name)
     if not self.language_id:
         log.error("Importing books from %s failed" % self.filename)
         return False
     for book in books:
         if self.stop_import_flag:
             break
         self.wizard.increment_progress_bar(
             translate("BiblesPlugin.HTTPBible", "Importing %s...", "Importing <book name>...") % book
         )
         book_ref_id = self.get_book_ref_id_by_name(book, len(books), self.language_id)
         if not book_ref_id:
             log.error(
                 'Importing books from %s - download name: "%s" failed' % (self.download_source, self.download_name)
             )
             return False
         book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
         log.debug("Book details: Name:%s; id:%s; testament_id:%s", book, book_ref_id, book_details["testament_id"])
         self.create_book(book, book_ref_id, book_details["testament_id"])
     if self.stop_import_flag:
         return False
     else:
         return True
예제 #12
0
    def get_chapter_count(self, book):
        """
        Return the number of chapters in a particular book.

        :param book: The book object to get the chapter count for.
        """
        log.debug('HTTPBible.get_chapter_count("%s")', book.name)
        return BiblesResourcesDB.get_chapter_count(book.book_reference_id)
예제 #13
0
파일: http.py 프로젝트: imkernel/openlp
    def get_chapter_count(self, book):
        """
        Return the number of chapters in a particular book.

        :param book: The book object to get the chapter count for.
        """
        log.debug('HTTPBible.get_chapter_count("{name}")'.format(name=book.name))
        return BiblesResourcesDB.get_chapter_count(book.book_reference_id)
예제 #14
0
 def do_import(self, bible_name=None):
     """
     Loads a Bible from file.
     """
     log.debug('Starting Zefania import from "{name}"'.format(name=self.file_path))
     success = True
     try:
         xmlbible = self.parse_xml(self.file_path, elements=REMOVABLE_ELEMENTS, tags=REMOVABLE_TAGS)
         # Find bible language
         language = xmlbible.xpath("/XMLBIBLE/INFORMATION/language/text()")
         language_id = self.get_language_id(language[0] if language else None, bible_name=str(self.file_path))
         if not language_id:
             return False
         no_of_books = int(xmlbible.xpath('count(//BIBLEBOOK)'))
         self.wizard.progress_bar.setMaximum(int(xmlbible.xpath('count(//CHAPTER)')))
         for BIBLEBOOK in xmlbible:
             if self.stop_import_flag:
                 break
             bname = BIBLEBOOK.get('bname')
             bnumber = BIBLEBOOK.get('bnumber')
             if not bname and not bnumber:
                 continue
             if bname:
                 book_ref_id = self.get_book_ref_id_by_name(bname, no_of_books, language_id)
             else:
                 log.debug('Could not find a name, will use number, basically a guess.')
                 book_ref_id = int(bnumber)
             if not book_ref_id:
                 log.error('Importing books from "{name}" failed'.format(name=self.file_path))
                 return False
             book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
             db_book = self.create_book(book_details['name'], book_ref_id, book_details['testament_id'])
             for CHAPTER in BIBLEBOOK:
                 if self.stop_import_flag:
                     break
                 chapter_number = CHAPTER.get("cnumber")
                 for VERS in CHAPTER:
                     verse_number = VERS.get("vnumber")
                     self.create_verse(
                         db_book.id, int(chapter_number), int(verse_number), VERS.text.replace('<BR/>', '\n'))
                 self.wizard.increment_progress_bar(
                     translate('BiblesPlugin.Zefnia',
                               'Importing {book} {chapter}...').format(book=db_book.name,
                                                                       chapter=chapter_number))
         self.session.commit()
         self.application.process_events()
     except Exception as e:
         critical_error_message_box(
             message=translate('BiblesPlugin.ZefaniaImport',
                               'Incorrect Bible file type supplied. Zefania Bibles may be '
                               'compressed. You must decompress them before import.'))
         log.exception(str(e))
         success = False
     if self.stop_import_flag:
         return False
     else:
         return success
예제 #15
0
파일: http.py 프로젝트: imkernel/openlp
    def get_verse_count(self, book_id, chapter):
        """
        Return the number of verses for the specified chapter and book.

        :param book_id: The name of the book.
        :param chapter: The chapter whose verses are being counted.
        """
        log.debug('HTTPBible.get_verse_count("{ref}", {chapter})'.format(ref=book_id, chapter=chapter))
        return BiblesResourcesDB.get_verse_count(book_id, chapter)
예제 #16
0
    def get_verse_count(self, book_id, chapter):
        """
        Return the number of verses for the specified chapter and book.

        :param book_id: The name of the book.
        :param chapter: The chapter whose verses are being counted.
        """
        log.debug('HTTPBible.get_verse_count("%s", %s)', book_id, chapter)
        return BiblesResourcesDB.get_verse_count(book_id, chapter)
예제 #17
0
    def load_bible(self, bible):
        """
        Loads a bible.

        ``bible``

        :param bible: The name of the bible.
        """
        log.debug('Load Bible')
        self.bible = bible
        book_name_language = self.manager.get_meta_data(self.bible, 'book_name_language')
        """
        Try loading the metadata, if the field does not exist in the metadata, continue executing the code,
        missing fields will be created on "self.accept" (save).
        """
        meta = self.manager.get_meta_data(self.bible, 'name')
        copyright = self.manager.get_meta_data(self.bible, 'copyright')
        permission = self.manager.get_meta_data(self.bible, 'permissions')
        full_license = self.manager.get_meta_data(self.bible, 'full_license')
        if meta:
            self.version_name_edit.setText(meta.value)
        if copyright:
            self.copyright_edit.setText(copyright.value)
        if permission:
            self.permissions_edit.setText(permission.value)
        if full_license:
            self.full_license_edit.setPlainText(full_license.value)
        # Set placeholder texts for the fields.
        self.version_name_edit.setPlaceholderText(UiStrings().RequiredShowInFooter)
        self.copyright_edit.setPlaceholderText(UiStrings().RequiredShowInFooter)
        self.permissions_edit.setPlaceholderText(UiStrings().OptionalShowInFooter)
        self.full_license_edit.setPlaceholderText(UiStrings().OptionalHideInFooter)
        if book_name_language and book_name_language.value != 'None':
            self.language_selection_combo_box.setCurrentIndex(int(book_name_language.value) + 1)
        self.books = {}
        self.web_bible = self.manager.get_meta_data(self.bible, 'download_source')
        if self.web_bible:
            self.book_name_notice.setText(
                translate('BiblesPlugin.EditBibleForm',
                          'This is a Web Download Bible.\nIt is not possible to customize the Book Names.'))
            self.scroll_area.hide()
        else:
            self.book_name_notice.setText(
                translate('BiblesPlugin.EditBibleForm',
                          'To use the customized book names, "Bible language" must be selected on the Meta Data tab '
                          'or, if "Global settings" is selected, on the Bible page in Configure OpenLP.'))
            for book in BiblesResourcesDB.get_books():
                self.books[book['abbreviation']] = self.manager.get_book_by_id(self.bible, book['id'])
                if self.books[book['abbreviation']] and not self.web_bible:
                    self.book_name_edit[book['abbreviation']].setText(self.books[book['abbreviation']].name)
                else:
                    # It is necessary to remove the Widget otherwise there still
                    # exists the vertical spacing in QFormLayout
                    self.book_name_widget_layout.removeWidget(self.book_name_label[book['abbreviation']])
                    self.book_name_label[book['abbreviation']].hide()
                    self.book_name_widget_layout.removeWidget(self.book_name_edit[book['abbreviation']])
                    self.book_name_edit[book['abbreviation']].hide()
예제 #18
0
파일: zefania.py 프로젝트: imkernel/openlp
 def do_import(self, bible_name=None):
     """
     Loads a Bible from file.
     """
     log.debug('Starting Zefania import from "{name}"'.format(name=self.filename))
     success = True
     try:
         xmlbible = self.parse_xml(self.filename, elements=REMOVABLE_ELEMENTS, tags=REMOVABLE_TAGS)
         # Find bible language
         language = xmlbible.xpath("/XMLBIBLE/INFORMATION/language/text()")
         language_id = self.get_language_id(language[0] if language else None, bible_name=self.filename)
         if not language_id:
             return False
         no_of_books = int(xmlbible.xpath('count(//BIBLEBOOK)'))
         self.wizard.progress_bar.setMaximum(int(xmlbible.xpath('count(//CHAPTER)')))
         for BIBLEBOOK in xmlbible:
             if self.stop_import_flag:
                 break
             bname = BIBLEBOOK.get('bname')
             bnumber = BIBLEBOOK.get('bnumber')
             if not bname and not bnumber:
                 continue
             if bname:
                 book_ref_id = self.get_book_ref_id_by_name(bname, no_of_books, language_id)
             else:
                 log.debug('Could not find a name, will use number, basically a guess.')
                 book_ref_id = int(bnumber)
             if not book_ref_id:
                 log.error('Importing books from "{name}" failed'.format(name=self.filename))
                 return False
             book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
             db_book = self.create_book(book_details['name'], book_ref_id, book_details['testament_id'])
             for CHAPTER in BIBLEBOOK:
                 if self.stop_import_flag:
                     break
                 chapter_number = CHAPTER.get("cnumber")
                 for VERS in CHAPTER:
                     verse_number = VERS.get("vnumber")
                     self.create_verse(
                         db_book.id, int(chapter_number), int(verse_number), VERS.text.replace('<BR/>', '\n'))
                 self.wizard.increment_progress_bar(
                     translate('BiblesPlugin.Zefnia',
                               'Importing {book} {chapter}...').format(book=db_book.name,
                                                                       chapter=chapter_number))
         self.session.commit()
         self.application.process_events()
     except Exception as e:
         critical_error_message_box(
             message=translate('BiblesPlugin.ZefaniaImport',
                               'Incorrect Bible file type supplied. Zefania Bibles may be '
                               'compressed. You must decompress them before import.'))
         log.exception(str(e))
         success = False
     if self.stop_import_flag:
         return False
     else:
         return success
예제 #19
0
    def get_chapter_count(self, book):
        """
        Return the number of chapters in a particular book.

        ``book``
            The book object to get the chapter count for.
        """
        log.debug('HTTPBible.get_chapter_count("%s")', book.name)
        return BiblesResourcesDB.get_chapter_count(book.book_reference_id)
예제 #20
0
 def do_import(self, bible_name=None):
     """
     Run the import. This method overrides the parent class method. Returns ``True`` on success, ``False`` on
     failure.
     """
     self.wizard.progress_bar.setMaximum(68)
     self.wizard.increment_progress_bar(translate('BiblesPlugin.HTTPBible',
                                                  'Registering Bible and loading books...'))
     self.save_meta('download_source', self.download_source)
     self.save_meta('download_name', self.download_name)
     if self.proxy_server:
         self.save_meta('proxy_server', self.proxy_server)
     if self.proxy_username:
         # Store the proxy userid.
         self.save_meta('proxy_username', self.proxy_username)
     if self.proxy_password:
         # Store the proxy password.
         self.save_meta('proxy_password', self.proxy_password)
     if self.download_source.lower() == 'crosswalk':
         handler = CWExtract(self.proxy_server)
     elif self.download_source.lower() == 'biblegateway':
         handler = BGExtract(self.proxy_server)
     elif self.download_source.lower() == 'bibleserver':
         handler = BSExtract(self.proxy_server)
     books = handler.get_books_from_http(self.download_name)
     if not books:
         log.error('Importing books from %s - download name: "%s" failed' %
                   (self.download_source, self.download_name))
         return False
     self.wizard.progress_bar.setMaximum(len(books) + 2)
     self.wizard.increment_progress_bar(translate('BiblesPlugin.HTTPBible', 'Registering Language...'))
     if self.language_id:
         self.save_meta('language_id', self.language_id)
     else:
         self.language_id = self.get_language(bible_name)
     if not self.language_id:
         log.error('Importing books from %s failed' % self.filename)
         return False
     for book in books:
         if self.stop_import_flag:
             break
         self.wizard.increment_progress_bar(translate(
             'BiblesPlugin.HTTPBible', 'Importing %s...', 'Importing <book name>...') % book)
         book_ref_id = self.get_book_ref_id_by_name(book, len(books), self.language_id)
         if not book_ref_id:
             log.error('Importing books from %s - download name: "%s" failed' %
                       (self.download_source, self.download_name))
             return False
         book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
         log.debug('Book details: Name:%s; id:%s; testament_id:%s',
                   book, book_ref_id, book_details['testament_id'])
         self.create_book(book, book_ref_id, book_details['testament_id'])
     if self.stop_import_flag:
         return False
     else:
         return True
예제 #21
0
파일: http.py 프로젝트: ipic/projecao
 def do_import(self, bible_name=None):
     """
     Run the import. This method overrides the parent class method. Returns ``True`` on success, ``False`` on
     failure.
     """
     self.wizard.progress_bar.setMaximum(68)
     self.wizard.increment_progress_bar(
         translate('BiblesPlugin.HTTPBible',
                   'Registering Bible and loading books...'))
     self.save_meta('download_source', self.download_source)
     self.save_meta('download_name', self.download_name)
     if self.download_source.lower() == 'crosswalk':
         handler = CWExtract()
     elif self.download_source.lower() == 'biblegateway':
         handler = BGExtract()
     elif self.download_source.lower() == 'bibleserver':
         handler = BSExtract()
     books = handler.get_books_from_http(self.download_name)
     if not books:
         log.error(
             'Importing books from {source} - download name: "{name}" '
             'failed'.format(source=self.download_source,
                             name=self.download_name))
         return False
     self.wizard.progress_bar.setMaximum(len(books) + 2)
     self.wizard.increment_progress_bar(
         translate('BiblesPlugin.HTTPBible', 'Registering Language...'))
     self.language_id = self.get_language_id(bible_name=bible_name)
     if not self.language_id:
         return False
     for book in books:
         if self.stop_import_flag:
             break
         self.wizard.increment_progress_bar(
             translate('BiblesPlugin.HTTPBible', 'Importing {book}...',
                       'Importing <book name>...').format(book=book))
         book_ref_id = self.get_book_ref_id_by_name(book, len(books),
                                                    self.language_id)
         if not book_ref_id:
             log.error(
                 'Importing books from {source} - download name: "{name}" '
                 'failed'.format(source=self.download_source,
                                 name=self.download_name))
             return False
         book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
         log.debug('Book details: Name:{book}; id:{ref}; '
                   'testament_id:{detail}'.format(
                       book=book,
                       ref=book_ref_id,
                       detail=book_details['testament_id']))
         self.create_book(book, book_ref_id, book_details['testament_id'])
     if self.stop_import_flag:
         return False
     else:
         return True
예제 #22
0
파일: http.py 프로젝트: imkernel/openlp
 def do_import(self, bible_name=None):
     """
     Run the import. This method overrides the parent class method. Returns ``True`` on success, ``False`` on
     failure.
     """
     self.wizard.progress_bar.setMaximum(68)
     self.wizard.increment_progress_bar(translate('BiblesPlugin.HTTPBible',
                                                  'Registering Bible and loading books...'))
     self.save_meta('download_source', self.download_source)
     self.save_meta('download_name', self.download_name)
     if self.proxy_server:
         self.save_meta('proxy_server', self.proxy_server)
     if self.proxy_username:
         # Store the proxy userid.
         self.save_meta('proxy_username', self.proxy_username)
     if self.proxy_password:
         # Store the proxy password.
         self.save_meta('proxy_password', self.proxy_password)
     if self.download_source.lower() == 'crosswalk':
         handler = CWExtract(self.proxy_server)
     elif self.download_source.lower() == 'biblegateway':
         handler = BGExtract(self.proxy_server)
     elif self.download_source.lower() == 'bibleserver':
         handler = BSExtract(self.proxy_server)
     books = handler.get_books_from_http(self.download_name)
     if not books:
         log.error('Importing books from {source} - download name: "{name}" '
                   'failed'.format(source=self.download_source, name=self.download_name))
         return False
     self.wizard.progress_bar.setMaximum(len(books) + 2)
     self.wizard.increment_progress_bar(translate('BiblesPlugin.HTTPBible', 'Registering Language...'))
     self.language_id = self.get_language_id(bible_name=bible_name)
     if not self.language_id:
         return False
     for book in books:
         if self.stop_import_flag:
             break
         self.wizard.increment_progress_bar(translate('BiblesPlugin.HTTPBible',
                                                      'Importing {book}...',
                                                      'Importing <book name>...').format(book=book))
         book_ref_id = self.get_book_ref_id_by_name(book, len(books), self.language_id)
         if not book_ref_id:
             log.error('Importing books from {source} - download name: "{name}" '
                       'failed'.format(source=self.download_source, name=self.download_name))
             return False
         book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
         log.debug('Book details: Name:{book}; id:{ref}; '
                   'testament_id:{detail}'.format(book=book,
                                                  ref=book_ref_id,
                                                  detail=book_details['testament_id']))
         self.create_book(book, book_ref_id, book_details['testament_id'])
     if self.stop_import_flag:
         return False
     else:
         return True
예제 #23
0
 def updateAutoCompleter(self):
     """
     This updates the bible book completion list for the search field. The
     completion depends on the bible. It is only updated when we are doing a
     reference search, otherwise the auto completion list is removed.
     """
     log.debug('updateAutoCompleter')
     # Save the current search type to the configuration.
     Settings().setValue('%s/last search type' % self.settings_section, self.quickSearchEdit.current_search_type())
     # Save the current bible to the configuration.
     Settings().setValue(self.settings_section + '/quick bible', self.quickVersionComboBox.currentText())
     books = []
     # We have to do a 'Reference Search'.
     if self.quickSearchEdit.current_search_type() == BibleSearch.Reference:
         bibles = self.plugin.manager.get_bibles()
         bible = self.quickVersionComboBox.currentText()
         if bible:
             book_data = bibles[bible].get_books()
             secondbible = self.quickSecondComboBox.currentText()
             if secondbible != '':
                 secondbook_data = bibles[secondbible].get_books()
                 book_data_temp = []
                 for book in book_data:
                     for secondbook in secondbook_data:
                         if book.book_reference_id == secondbook.book_reference_id:
                             book_data_temp.append(book)
                 book_data = book_data_temp
             language_selection = self.plugin.manager.get_language_selection(bible)
             if language_selection == LanguageSelection.Bible:
                 books = [book.name + ' ' for book in book_data]
             elif language_selection == LanguageSelection.Application:
                 book_names = BibleStrings().BookNames
                 for book in book_data:
                     data = BiblesResourcesDB.get_book_by_id(book.book_reference_id)
                     books.append(str(book_names[data['abbreviation']]) + ' ')
             elif language_selection == LanguageSelection.English:
                 for book in book_data:
                     data = BiblesResourcesDB.get_book_by_id(book.book_reference_id)
                     books.append(data['name'] + ' ')
             books.sort(key=get_locale_key)
     set_case_insensitive_completer(books, self.quickSearchEdit)
예제 #24
0
    def get_verse_count(self, book_id, chapter):
        """
        Return the number of verses for the specified chapter and book.

        ``book``
            The name of the book.

        ``chapter``
            The chapter whose verses are being counted.
        """
        log.debug('HTTPBible.get_verse_count("%s", %s)', book_id, chapter)
        return BiblesResourcesDB.get_verse_count(book_id, chapter)
예제 #25
0
    def load_bible(self, bible):
        """
        Loads a bible.

        ``bible``

        :param bible: The name of the bible.
        """
        log.debug('Load Bible')
        self.bible = bible
        self.version_name_edit.setText(
            self.manager.get_meta_data(self.bible, 'name').value)
        self.copyright_edit.setText(
            self.manager.get_meta_data(self.bible, 'copyright').value)
        self.permissions_edit.setText(
            self.manager.get_meta_data(self.bible, 'permissions').value)
        book_name_language = self.manager.get_meta_data(
            self.bible, 'book_name_language')
        if book_name_language and book_name_language.value != 'None':
            self.language_selection_combo_box.setCurrentIndex(
                int(book_name_language.value) + 1)
        self.books = {}
        self.web_bible = self.manager.get_meta_data(self.bible,
                                                    'download_source')
        if self.web_bible:
            self.book_name_notice.setText(
                translate(
                    'BiblesPlugin.EditBibleForm',
                    'This is a Web Download Bible.\nIt is not possible to customize the Book Names.'
                ))
            self.scroll_area.hide()
        else:
            self.book_name_notice.setText(
                translate(
                    'BiblesPlugin.EditBibleForm',
                    'To use the customized book names, "Bible language" must be selected on the Meta Data tab '
                    'or, if "Global settings" is selected, on the Bible page in Configure OpenLP.'
                ))
            for book in BiblesResourcesDB.get_books():
                self.books[book['abbreviation']] = self.manager.get_book_by_id(
                    self.bible, book['id'])
                if self.books[book['abbreviation']] and not self.web_bible:
                    self.book_name_edit[book['abbreviation']].setText(
                        self.books[book['abbreviation']].name)
                else:
                    # It is necessary to remove the Widget otherwise there still
                    # exists the vertical spacing in QFormLayout
                    self.book_name_widget_layout.removeWidget(
                        self.book_name_label[book['abbreviation']])
                    self.book_name_label[book['abbreviation']].hide()
                    self.book_name_widget_layout.removeWidget(
                        self.book_name_edit[book['abbreviation']])
                    self.book_name_edit[book['abbreviation']].hide()
예제 #26
0
파일: sword.py 프로젝트: imkernel/openlp
 def do_import(self, bible_name=None):
     """
     Loads a Bible from SWORD module.
     """
     log.debug('Starting SWORD import from "{key}"'.format(key=self.sword_key))
     success = True
     try:
         pysword_modules = modules.SwordModules(self.sword_path)
         pysword_module_json = pysword_modules.parse_modules()[self.sword_key]
         bible = pysword_modules.get_bible_from_module(self.sword_key)
         language = pysword_module_json['lang']
         language = language[language.find('.') + 1:]
         language_id = self.get_language_id(language, bible_name=self.filename)
         if not language_id:
             return False
         books = bible.get_structure().get_books()
         # Count number of books
         num_books = 0
         if 'ot' in books:
             num_books += len(books['ot'])
         if 'nt' in books:
             num_books += len(books['nt'])
         self.wizard.progress_bar.setMaximum(num_books)
         # Import the bible
         for testament in books.keys():
             for book in books[testament]:
                 book_ref_id = self.get_book_ref_id_by_name(book.name, num_books, language_id)
                 book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
                 db_book = self.create_book(book_details['name'], book_ref_id, book_details['testament_id'])
                 for chapter_number in range(1, book.num_chapters + 1):
                     if self.stop_import_flag:
                         break
                     verses = bible.get_iter(book.name, chapter_number)
                     verse_number = 0
                     for verse in verses:
                         verse_number += 1
                         self.create_verse(db_book.id, chapter_number, verse_number, verse)
                 self.wizard.increment_progress_bar(
                     translate('BiblesPlugin.Sword', 'Importing {name}...').format(name=db_book.name))
         self.session.commit()
         self.application.process_events()
     except Exception as e:
         critical_error_message_box(
             message=translate('BiblesPlugin.SwordImport', 'An unexpected error happened while importing the SWORD '
                                                           'bible, please report this to the OpenLP developers.\n'
                                                           '{error}').format(error=e))
         log.exception(str(e))
         success = False
     if self.stop_import_flag:
         return False
     else:
         return success
예제 #27
0
    def loadBibleResource(self, download_type):
        """
        Loads a web bible from bible_resources.sqlite.

        ``download_type``
            The WebDownload type e.g. bibleserver.
        """
        self.web_bible_list[download_type] = {}
        bibles = BiblesResourcesDB.get_webbibles(WebDownload.Names[download_type])
        for bible in bibles:
            version = bible[u'name']
            name = bible[u'abbreviation']
            self.web_bible_list[download_type][version] = name.strip()
예제 #28
0
    def get_book_ref_id_by_name(self, book, maxbooks=66, language_id=None):
        """
        Find the book id from the name or abbreviation of the book. If it doesn't currently exist, ask the user.

        :param book: The name or abbreviation of the book
        :param maxbooks: The number of books in the bible
        :param language_id: The language_id of the bible
        :return: The id of the bible, or None
        """
        self.log_debug('BibleDB.get_book_ref_id_by_name:("{book}", "{lang}")'.format(book=book, lang=language_id))
        book_temp = BiblesResourcesDB.get_book(book, True)
        if book_temp:
            return book_temp['id']
        book_id = BiblesResourcesDB.get_alternative_book_name(book)
        if book_id:
            return book_id
        book_id = AlternativeBookNamesDB.get_book_reference_id(book)
        if book_id:
            return book_id
        from openlp.plugins.bibles.forms import BookNameForm
        book_name = BookNameForm(self.wizard)
        if book_name.exec(book, self.get_books(), maxbooks) and book_name.book_id:
            AlternativeBookNamesDB.create_alternative_book_name(book, book_name.book_id, language_id)
            return book_name.book_id
예제 #29
0
 def reload_combo_box(self):
     """
     Reload the Combobox items
     """
     self.corresponding_combo_box.clear()
     items = BiblesResourcesDB.get_books()
     for item in items:
         add_book = True
         for book in self.books:
             if book.book_reference_id == item['id']:
                 add_book = False
                 break
         if self.old_testament_check_box.checkState() == QtCore.Qt.Unchecked and item['testament_id'] == 1:
             add_book = False
         elif self.new_testament_check_box.checkState() == QtCore.Qt.Unchecked and item['testament_id'] == 2:
             add_book = False
         elif self.apocrypha_check_box.checkState() == QtCore.Qt.Unchecked and item['testament_id'] == 3:
             add_book = False
         if add_book:
             self.corresponding_combo_box.addItem(self.book_names[item['abbreviation']])
예제 #30
0
파일: http.py 프로젝트: ipic/projecao
    def get_books_from_http(self, version):
        """
        Load a list of all books a Bible contains from BiblesResourcesDB.

        :param version: The version of the Bible like NIV for New International Version
        """
        log.debug('BSExtract.get_books_from_http("{version}")'.format(
            version=version))
        # Parsing the book list from the website is near impossible, so we use the list from BiblesResourcesDB
        bible = BIBLESERVER_TRANSLATIONS[version]
        all_books = BiblesResourcesDB.get_books()
        books = []
        for book in all_books:
            if book['testament_id'] == 1 and 'OT' in bible['sections']:
                books.append(book['name'])
            elif book['testament_id'] == 2 and 'NT' in bible['sections']:
                books.append(book['name'])
            elif book['testament_id'] == 3 and 'Apocrypha' in bible['sections']:
                books.append(book['name'])
        return books
예제 #31
0
 def reloadComboBox(self):
     """
     Reload the Combobox items
     """
     self.correspondingComboBox.clear()
     items = BiblesResourcesDB.get_books()
     for item in items:
         addBook = True
         for book in self.books:
             if book.book_reference_id == item[u'id']:
                 addBook = False
                 break
         if self.oldTestamentCheckBox.checkState() == QtCore.Qt.Unchecked and item[u'testament_id'] == 1:
             addBook = False
         elif self.newTestamentCheckBox.checkState() == QtCore.Qt.Unchecked and item[u'testament_id'] == 2:
             addBook = False
         elif self.apocryphaCheckBox.checkState() == QtCore.Qt.Unchecked and item[u'testament_id'] == 3:
             addBook = False
         if addBook:
             self.correspondingComboBox.addItem(self.book_names[item[u'abbreviation']])
예제 #32
0
    def load_bible(self, bible):
        """
        Loads a bible.

        ``bible``

        :param bible: The name of the bible.
        """
        log.debug('Load Bible')
        self.bible = bible
        self.version_name_edit.setText(self.manager.get_meta_data(self.bible, 'name').value)
        self.copyright_edit.setText(self.manager.get_meta_data(self.bible, 'copyright').value)
        self.permissions_edit.setText(self.manager.get_meta_data(self.bible, 'permissions').value)
        book_name_language = self.manager.get_meta_data(self.bible, 'book_name_language')
        if book_name_language and book_name_language.value != 'None':
            self.language_selection_combo_box.setCurrentIndex(int(book_name_language.value) + 1)
        self.books = {}
        self.web_bible = self.manager.get_meta_data(self.bible, 'download_source')
        if self.web_bible:
            self.book_name_notice.setText(
                translate('BiblesPlugin.EditBibleForm',
                          'This is a Web Download Bible.\nIt is not possible to customize the Book Names.'))
            self.scroll_area.hide()
        else:
            self.book_name_notice.setText(
                translate('BiblesPlugin.EditBibleForm',
                          'To use the customized book names, "Bible language" must be selected on the Meta Data tab '
                          'or, if "Global settings" is selected, on the Bible page in Configure OpenLP.'))
            for book in BiblesResourcesDB.get_books():
                self.books[book['abbreviation']] = self.manager.get_book_by_id(self.bible, book['id'])
                if self.books[book['abbreviation']] and not self.web_bible:
                    self.book_name_edit[book['abbreviation']].setText(self.books[book['abbreviation']].name)
                else:
                    # It is necessary to remove the Widget otherwise there still
                    # exists the vertical spacing in QFormLayout
                    self.book_name_widget_layout.removeWidget(self.book_name_label[book['abbreviation']])
                    self.book_name_label[book['abbreviation']].hide()
                    self.book_name_widget_layout.removeWidget(self.book_name_edit[book['abbreviation']])
                    self.book_name_edit[book['abbreviation']].hide()
예제 #33
0
    def find_and_create_book(self, name, no_of_books, language_id, guess_id=None):
        """
        Find the OpenLP book id and then create the book in this bible db

        :param name: Name of the book. If None, then fall back to the guess_id Str
        :param no_of_books: The total number of books contained in this bible Int
        :param language_id: The OpenLP id of the language of this bible Int
        :param guess_id: The guessed id of the book, used if name is None Int
        :return:
        """
        if name:
            book_ref_id = self.get_book_ref_id_by_name(name, no_of_books, language_id)
        else:
            self.log_debug('No book name supplied. Falling back to guess_id')
            book_ref_id = guess_id
        if not book_ref_id:
            raise ValidationError(msg='Could not resolve book_ref_id in "{}"'.format(self.filename))
        book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
        if book_details is None:
            raise ValidationError(msg='book_ref_id: {book_ref} Could not be found in the BibleResourcesDB while '
                                      'importing {file}'.format(book_ref=book_ref_id, file=self.filename))
        return self.create_book(name, book_ref_id, book_details['testament_id'])
예제 #34
0
 def setupUi(self, edit_bible_dialog):
     edit_bible_dialog.setObjectName('edit_bible_dialog')
     edit_bible_dialog.resize(520, 400)
     edit_bible_dialog.setWindowIcon(build_icon(':/icon/openlp-logo-16x16.png'))
     edit_bible_dialog.setModal(True)
     self.dialog_layout = QtGui.QVBoxLayout(edit_bible_dialog)
     self.dialog_layout.setSpacing(8)
     self.dialog_layout.setContentsMargins(8, 8, 8, 8)
     self.dialog_layout.setObjectName('dialog_layout')
     self.bible_tab_widget = QtGui.QTabWidget(edit_bible_dialog)
     self.bible_tab_widget.setObjectName('BibleTabWidget')
     # Meta tab
     self.meta_tab = QtGui.QWidget()
     self.meta_tab.setObjectName('meta_tab')
     self.meta_tab_layout = QtGui.QVBoxLayout(self.meta_tab)
     self.meta_tab_layout.setObjectName('meta_tab_layout')
     self.license_details_group_box = QtGui.QGroupBox(self.meta_tab)
     self.license_details_group_box.setObjectName('license_details_group_box')
     self.license_details_layout = QtGui.QFormLayout(self.license_details_group_box)
     self.license_details_layout.setObjectName('license_details_layout')
     self.version_name_label = QtGui.QLabel(self.license_details_group_box)
     self.version_name_label.setObjectName('version_name_label')
     self.version_name_edit = QtGui.QLineEdit(self.license_details_group_box)
     self.version_name_edit.setObjectName('version_name_edit')
     self.version_name_label.setBuddy(self.version_name_edit)
     self.license_details_layout.addRow(self.version_name_label, self.version_name_edit)
     self.copyright_label = QtGui.QLabel(self.license_details_group_box)
     self.copyright_label.setObjectName('copyright_label')
     self.copyright_edit = QtGui.QLineEdit(self.license_details_group_box)
     self.copyright_edit.setObjectName('copyright_edit')
     self.copyright_label.setBuddy(self.copyright_edit)
     self.license_details_layout.addRow(self.copyright_label, self.copyright_edit)
     self.permissions_label = QtGui.QLabel(self.license_details_group_box)
     self.permissions_label.setObjectName('permissions_label')
     self.permissions_edit = QtGui.QLineEdit(self.license_details_group_box)
     self.permissions_edit.setObjectName('permissions_edit')
     self.permissions_label.setBuddy(self.permissions_edit)
     self.license_details_layout.addRow(self.permissions_label, self.permissions_edit)
     self.meta_tab_layout.addWidget(self.license_details_group_box)
     self.language_selection_group_box = QtGui.QGroupBox(self.meta_tab)
     self.language_selection_group_box.setObjectName('language_selection_group_box')
     self.language_selection_layout = QtGui.QVBoxLayout(self.language_selection_group_box)
     self.language_selection_label = QtGui.QLabel(self.language_selection_group_box)
     self.language_selection_label.setObjectName('language_selection_label')
     self.language_selection_combo_box = QtGui.QComboBox(self.language_selection_group_box)
     self.language_selection_combo_box.setObjectName('language_selection_combo_box')
     self.language_selection_combo_box.addItems(['', '', '', ''])
     self.language_selection_layout.addWidget(self.language_selection_label)
     self.language_selection_layout.addWidget(self.language_selection_combo_box)
     self.meta_tab_layout.addWidget(self.language_selection_group_box)
     self.meta_tab_layout.addStretch()
     self.bible_tab_widget.addTab(self.meta_tab, '')
     # Book name tab
     self.book_name_tab = QtGui.QWidget()
     self.book_name_tab.setObjectName('book_name_tab')
     self.book_name_tab_layout = QtGui.QVBoxLayout(self.book_name_tab)
     self.book_name_tab_layout.setObjectName('book_name_tab_layout')
     self.book_name_notice = QtGui.QLabel(self.book_name_tab)
     self.book_name_notice.setObjectName('book_name_notice')
     self.book_name_notice.setWordWrap(True)
     self.book_name_tab_layout.addWidget(self.book_name_notice)
     self.scroll_area = QtGui.QScrollArea(self.book_name_tab)
     self.scroll_area.setWidgetResizable(True)
     self.scroll_area.setObjectName('scroll_area')
     self.scroll_area.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
     self.book_name_widget = QtGui.QWidget(self.scroll_area)
     self.book_name_widget.setObjectName('book_name_widget')
     self.book_name_widget_layout = QtGui.QFormLayout(self.book_name_widget)
     self.book_name_widget_layout.setObjectName('book_name_widget_layout')
     self.book_name_label = {}
     self.book_name_edit= {}
     for book in BiblesResourcesDB.get_books():
         self.book_name_label[book['abbreviation']] = QtGui.QLabel(self.book_name_widget)
         self.book_name_label[book['abbreviation']].setObjectName('book_name_label[%s]' % book['abbreviation'])
         self.book_name_edit[book['abbreviation']] = QtGui.QLineEdit(self.book_name_widget)
         self.book_name_edit[book['abbreviation']].setObjectName('book_name_edit[%s]' % book['abbreviation'])
         self.book_name_widget_layout.addRow(
             self.book_name_label[book['abbreviation']],
             self.book_name_edit[book['abbreviation']])
     self.scroll_area.setWidget(self.book_name_widget)
     self.book_name_tab_layout.addWidget(self.scroll_area)
     self.book_name_tab_layout.addStretch()
     self.bible_tab_widget.addTab(self.book_name_tab, '')
     # Last few bits
     self.dialog_layout.addWidget(self.bible_tab_widget)
     self.button_box = create_button_box(edit_bible_dialog, 'button_box', ['cancel', 'save'])
     self.dialog_layout.addWidget(self.button_box)
     self.retranslateUi(edit_bible_dialog)
     QtCore.QMetaObject.connectSlotsByName(edit_bible_dialog)
예제 #35
0
 def do_import(self, bible_name=None):
     """
     Imports an openlp.org v1 bible.
     """
     connection = None
     cursor = None
     try:
         connection = sqlite.connect(self.filename.encode(sys.getfilesystemencoding()))
         cursor = connection.cursor()
     except sqlite.DatabaseError:
         log.exception(u'File "%s" is encrypted or not a sqlite database, '
             'therefore not an openlp.org 1.x database either' % self.filename)
         # Please add an user error here!
         # This file is not an openlp.org 1.x bible database.
         return False
     #Create the bible language
     language_id = self.get_language(bible_name)
     if not language_id:
         log.exception(u'Importing books from "%s" failed' % self.filename)
         return False
     # Create all books.
     try:
         cursor.execute(u'SELECT id, testament_id, name, abbreviation FROM book')
     except sqlite.DatabaseError as error:
         log.exception(u'DatabaseError: %s' % error)
         # Please add an user error here!
         # This file is not an openlp.org 1.x bible database.
         return False
     books = cursor.fetchall()
     self.wizard.progressBar.setMaximum(len(books) + 1)
     for book in books:
         if self.stop_import_flag:
             connection.close()
             return False
         book_id = int(book[0])
         testament_id = int(book[1])
         name = unicode(book[2], u'cp1252')
         abbreviation = unicode(book[3], u'cp1252')
         book_ref_id = self.get_book_ref_id_by_name(name, len(books),
             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)
         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.
         cursor.execute(u'SELECT chapter, verse, text || \'\' AS text FROM '
             'verse WHERE book_id=%s' % book_id)
         verses = cursor.fetchall()
         for verse in verses:
             if self.stop_import_flag:
                 connection.close()
                 return False
             chapter = int(verse[0])
             verse_number = int(verse[1])
             text = unicode(verse[2], u'cp1252')
             self.create_verse(db_book.id, chapter, verse_number, text)
             self.application.process_events()
         self.session.commit()
     connection.close()
     return True
예제 #36
0
파일: osis.py 프로젝트: jkunle/paul
 def do_import(self, bible_name=None):
     """
     Loads a Bible from file.
     """
     log.debug('Starting OSIS import from "%s"' % self.filename)
     if not isinstance(self.filename, str):
         self.filename = str(self.filename, 'utf8')
     import_file = None
     success = True
     try:
         # NOTE: We don't need to do any of the normal encoding detection here, because lxml does it's own encoding
         # detection, and the two mechanisms together interfere with each other.
         import_file = open(self.filename, 'rb')
         osis_bible_tree = etree.parse(import_file,
                                       parser=etree.XMLParser(recover=True))
         namespace = {
             'ns': 'http://www.bibletechnologies.net/2003/OSIS/namespace'
         }
         # Find bible language
         language_id = None
         language = osis_bible_tree.xpath("//ns:osisText/@xml:lang",
                                          namespaces=namespace)
         if language:
             language_id = BiblesResourcesDB.get_language(language[0])
         # The language couldn't be detected, ask the user
         if not language_id:
             language_id = self.get_language(bible_name)
         if not language_id:
             log.error('Importing books from "%s" failed' % self.filename)
             return False
         self.save_meta('language_id', language_id)
         num_books = int(
             osis_bible_tree.xpath("count(//ns:div[@type='book'])",
                                   namespaces=namespace))
         self.wizard.increment_progress_bar(
             translate(
                 'BiblesPlugin.OsisImport',
                 'Removing unused tags (this may take a few minutes)...'))
         # We strip unused tags from the XML, this should leave us with only chapter, verse and div tags.
         # Strip tags we don't use - remove content
         etree.strip_elements(osis_bible_tree, (
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}note',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}milestone',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}title',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}abbr',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}catchWord',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}index',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}rdg',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}rdgGroup',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}figure'
         ),
                              with_tail=False)
         # Strip tags we don't use - keep content
         etree.strip_tags(osis_bible_tree, (
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}p',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}l',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}lg',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}q',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}a',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}w',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}divineName',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}foreign',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}hi',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}inscription',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}mentioned',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}name',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}reference',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}seg',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}transChange',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}salute',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}signed',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}closer',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}speech',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}speaker',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}list',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}item',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}table',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}head',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}row',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}cell',
             '{http://www.bibletechnologies.net/2003/OSIS/namespace}caption'
         ))
         # Precompile a few xpath-querys
         verse_in_chapter = etree.XPath('count(//ns:chapter[1]/ns:verse)',
                                        namespaces=namespace)
         text_in_verse = etree.XPath('count(//ns:verse[1]/text())',
                                     namespaces=namespace)
         # Find books in the bible
         bible_books = osis_bible_tree.xpath("//ns:div[@type='book']",
                                             namespaces=namespace)
         for book in bible_books:
             if self.stop_import_flag:
                 break
             # Remove div-tags in the book
             etree.strip_tags(book, (
                 '{http://www.bibletechnologies.net/2003/OSIS/namespace}div'
             ))
             book_ref_id = self.get_book_ref_id_by_name(
                 book.get('osisID'), num_books, language_id)
             if not book_ref_id:
                 book_ref_id = self.get_book_ref_id_by_localised_name(
                     book.get('osisID'))
             if not book_ref_id:
                 log.error('Importing books from "%s" failed' %
                           self.filename)
                 return False
             book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
             db_book = self.create_book(book_details['name'], book_ref_id,
                                        book_details['testament_id'])
             # Find out if chapter-tags contains the verses, or if it is used as milestone/anchor
             if int(verse_in_chapter(book)) > 0:
                 # The chapter tags contains the verses
                 for chapter in book:
                     chapter_number = chapter.get("osisID").split('.')[1]
                     # Find out if verse-tags contains the text, or if it is used as milestone/anchor
                     if int(text_in_verse(chapter)) == 0:
                         # verse-tags are used as milestone
                         for verse in chapter:
                             # If this tag marks the start of a verse, the verse text is between this tag and
                             # the next tag, which the "tail" attribute gives us.
                             if verse.get('sID'):
                                 verse_number = verse.get("osisID").split(
                                     '.')[2]
                                 verse_text = verse.tail
                                 if verse_text:
                                     self.create_verse(
                                         db_book.id, chapter_number,
                                         verse_number, verse_text.strip())
                     else:
                         # Verse-tags contains the text
                         for verse in chapter:
                             verse_number = verse.get("osisID").split(
                                 '.')[2]
                             if verse.text:
                                 self.create_verse(db_book.id,
                                                   chapter_number,
                                                   verse_number,
                                                   verse.text.strip())
                     self.wizard.increment_progress_bar(
                         translate('BiblesPlugin.OsisImport',
                                   'Importing %(bookname)s %(chapter)s...')
                         % {
                             'bookname': db_book.name,
                             'chapter': chapter_number
                         })
             else:
                 # The chapter tags is used as milestones. For now we assume verses is also milestones
                 chapter_number = 0
                 for element in book:
                     if element.tag == '{http://www.bibletechnologies.net/2003/OSIS/namespace}chapter' \
                             and element.get('sID'):
                         chapter_number = element.get("osisID").split(
                             '.')[1]
                         self.wizard.increment_progress_bar(
                             translate(
                                 'BiblesPlugin.OsisImport',
                                 'Importing %(bookname)s %(chapter)s...') %
                             {
                                 'bookname': db_book.name,
                                 'chapter': chapter_number
                             })
                     elif element.tag == '{http://www.bibletechnologies.net/2003/OSIS/namespace}verse' \
                             and element.get('sID'):
                         # If this tag marks the start of a verse, the verse text is between this tag and
                         # the next tag, which the "tail" attribute gives us.
                         verse_number = element.get("osisID").split('.')[2]
                         verse_text = element.tail
                         if verse_text:
                             self.create_verse(db_book.id, chapter_number,
                                               verse_number,
                                               verse_text.strip())
             self.session.commit()
         self.application.process_events()
     except (ValueError, IOError):
         log.exception('Loading bible from OSIS file failed')
         trace_error_handler(log)
         success = False
     except etree.XMLSyntaxError as e:
         log.exception('Loading bible from OSIS file failed')
         trace_error_handler(log)
         success = False
         critical_error_message_box(message=translate(
             'BiblesPlugin.OsisImport',
             'The file is not a valid OSIS-XML file: \n%s' % e.msg))
     finally:
         if import_file:
             import_file.close()
     if self.stop_import_flag:
         return False
     else:
         return success
예제 #37
0
 def setupUi(self, edit_bible_dialog):
     edit_bible_dialog.setObjectName('edit_bible_dialog')
     edit_bible_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg'))
     edit_bible_dialog.resize(520, 400)
     edit_bible_dialog.setModal(True)
     self.dialog_layout = QtWidgets.QVBoxLayout(edit_bible_dialog)
     self.dialog_layout.setSpacing(8)
     self.dialog_layout.setContentsMargins(8, 8, 8, 8)
     self.dialog_layout.setObjectName('dialog_layout')
     self.bible_tab_widget = QtWidgets.QTabWidget(edit_bible_dialog)
     self.bible_tab_widget.setObjectName('BibleTabWidget')
     # Meta tab
     self.meta_tab = QtWidgets.QWidget()
     self.meta_tab.setObjectName('meta_tab')
     self.meta_tab_layout = QtWidgets.QVBoxLayout(self.meta_tab)
     self.meta_tab_layout.setObjectName('meta_tab_layout')
     self.license_details_group_box = QtWidgets.QGroupBox(self.meta_tab)
     self.license_details_group_box.setObjectName('license_details_group_box')
     self.license_details_layout = QtWidgets.QFormLayout(self.license_details_group_box)
     self.license_details_layout.setObjectName('license_details_layout')
     self.version_name_label = QtWidgets.QLabel(self.license_details_group_box)
     self.version_name_label.setObjectName('version_name_label')
     self.version_name_edit = QtWidgets.QLineEdit(self.license_details_group_box)
     self.version_name_edit.setObjectName('version_name_edit')
     self.version_name_label.setBuddy(self.version_name_edit)
     self.license_details_layout.addRow(self.version_name_label, self.version_name_edit)
     self.copyright_label = QtWidgets.QLabel(self.license_details_group_box)
     self.copyright_label.setObjectName('copyright_label')
     self.copyright_edit = QtWidgets.QLineEdit(self.license_details_group_box)
     self.copyright_edit.setObjectName('copyright_edit')
     self.copyright_label.setBuddy(self.copyright_edit)
     self.license_details_layout.addRow(self.copyright_label, self.copyright_edit)
     self.permissions_label = QtWidgets.QLabel(self.license_details_group_box)
     self.permissions_label.setObjectName('permissions_label')
     self.permissions_edit = QtWidgets.QLineEdit(self.license_details_group_box)
     self.permissions_edit.setObjectName('permissions_edit')
     self.permissions_label.setBuddy(self.permissions_edit)
     self.license_details_layout.addRow(self.permissions_label, self.permissions_edit)
     self.meta_tab_layout.addWidget(self.license_details_group_box)
     self.language_selection_group_box = QtWidgets.QGroupBox(self.meta_tab)
     self.language_selection_group_box.setObjectName('language_selection_group_box')
     self.language_selection_layout = QtWidgets.QVBoxLayout(self.language_selection_group_box)
     self.language_selection_label = QtWidgets.QLabel(self.language_selection_group_box)
     self.language_selection_label.setObjectName('language_selection_label')
     self.language_selection_combo_box = QtWidgets.QComboBox(self.language_selection_group_box)
     self.language_selection_combo_box.setObjectName('language_selection_combo_box')
     self.language_selection_combo_box.addItems(['', '', '', ''])
     self.language_selection_layout.addWidget(self.language_selection_label)
     self.language_selection_layout.addWidget(self.language_selection_combo_box)
     self.meta_tab_layout.addWidget(self.language_selection_group_box)
     self.meta_tab_layout.addStretch()
     self.bible_tab_widget.addTab(self.meta_tab, '')
     # Book name tab
     self.book_name_tab = QtWidgets.QWidget()
     self.book_name_tab.setObjectName('book_name_tab')
     self.book_name_tab_layout = QtWidgets.QVBoxLayout(self.book_name_tab)
     self.book_name_tab_layout.setObjectName('book_name_tab_layout')
     self.book_name_notice = QtWidgets.QLabel(self.book_name_tab)
     self.book_name_notice.setObjectName('book_name_notice')
     self.book_name_notice.setWordWrap(True)
     self.book_name_tab_layout.addWidget(self.book_name_notice)
     self.scroll_area = QtWidgets.QScrollArea(self.book_name_tab)
     self.scroll_area.setWidgetResizable(True)
     self.scroll_area.setObjectName('scroll_area')
     self.scroll_area.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
     self.book_name_widget = QtWidgets.QWidget(self.scroll_area)
     self.book_name_widget.setObjectName('book_name_widget')
     self.book_name_widget_layout = QtWidgets.QFormLayout(self.book_name_widget)
     self.book_name_widget_layout.setObjectName('book_name_widget_layout')
     self.book_name_label = {}
     self.book_name_edit = {}
     for book in BiblesResourcesDB.get_books():
         self.book_name_label[book['abbreviation']] = QtWidgets.QLabel(self.book_name_widget)
         self.book_name_label[book['abbreviation']].setObjectName('book_name_label[%s]' % book['abbreviation'])
         self.book_name_edit[book['abbreviation']] = QtWidgets.QLineEdit(self.book_name_widget)
         self.book_name_edit[book['abbreviation']].setObjectName('book_name_edit[%s]' % book['abbreviation'])
         self.book_name_widget_layout.addRow(
             self.book_name_label[book['abbreviation']],
             self.book_name_edit[book['abbreviation']])
     self.scroll_area.setWidget(self.book_name_widget)
     self.book_name_tab_layout.addWidget(self.scroll_area)
     self.book_name_tab_layout.addStretch()
     self.bible_tab_widget.addTab(self.book_name_tab, '')
     # Last few bits
     self.dialog_layout.addWidget(self.bible_tab_widget)
     self.button_box = create_button_box(edit_bible_dialog, 'button_box', ['cancel', 'save'])
     self.dialog_layout.addWidget(self.button_box)
     self.retranslateUi(edit_bible_dialog)
     QtCore.QMetaObject.connectSlotsByName(edit_bible_dialog)
예제 #38
0
 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 %s of %s: "%s"\nUpgrading ...') %
             (number + 1, max_bibles, 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 %s - download name: "%s" failed'
                     % (meta_data['download_source'],
                        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.'
                     ))
                 self.increment_progress_bar(
                     translate('BiblesPlugin.UpgradeWizardForm',
                               'Upgrading Bible %s of %s: "%s"\nFailed') %
                     (number + 1, max_bibles, name),
                     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 "%s" failed' % filename[0])
                 self.new_bibles[number].session.close()
                 del self.new_bibles[number]
                 self.increment_progress_bar(
                     translate('BiblesPlugin.UpgradeWizardForm',
                               'Upgrading Bible %s of %s: "%s"\nFailed') %
                     (number + 1, max_bibles, 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 %s of %s: "%s"\nUpgrading %s ...')
                     % (number + 1, max_bibles, name, 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 %s - download name: "%s" aborted by user'
                         % (meta_data['download_source'],
                            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 "%s"',
                             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 "%s" failed' % name)
                 self.new_bibles[number].session.close()
                 del self.new_bibles[number]
                 self.increment_progress_bar(
                     translate('BiblesPlugin.UpgradeWizardForm',
                               'Upgrading Bible %s of %s: "%s"\nFailed') %
                     (number + 1, max_bibles, 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 %s of %s: "%s"\nUpgrading %s ...')
                     % (number + 1, max_bibles, name, 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 %s " failed - aborted by user'
                         % 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 "%s"',
                                 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 %s of %s: "%s"\nFailed') %
                 (number + 1, max_bibles, 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 %s of %s: "%s"\nComplete') %
                 (number + 1, max_bibles, 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()
예제 #39
0
파일: zefania.py 프로젝트: jkunle/paul
 def do_import(self, bible_name=None):
     """
     Loads a Bible from file.
     """
     log.debug('Starting Zefania import from "%s"' % self.filename)
     if not isinstance(self.filename, str):
         self.filename = str(self.filename, 'utf8')
     import_file = None
     success = True
     try:
         # NOTE: We don't need to do any of the normal encoding detection here, because lxml does it's own encoding
         # detection, and the two mechanisms together interfere with each other.
         import_file = open(self.filename, 'rb')
         zefania_bible_tree = etree.parse(import_file, parser=etree.XMLParser(recover=True))
         # Find bible language
         language_id = None
         language = zefania_bible_tree.xpath("/XMLBIBLE/INFORMATION/language/text()")
         if language:
             language_id = BiblesResourcesDB.get_language(language[0])
         # The language couldn't be detected, ask the user
         if not language_id:
             language_id = self.get_language(bible_name)
         if not language_id:
             log.error('Importing books from "%s" failed' % self.filename)
             return False
         self.save_meta('language_id', language_id)
         num_books = int(zefania_bible_tree.xpath("count(//BIBLEBOOK)"))
         # Strip tags we don't use - keep content
         etree.strip_tags(zefania_bible_tree, ('STYLE', 'GRAM', 'NOTE', 'SUP', 'XREF'))
         # Strip tags we don't use - remove content
         etree.strip_elements(zefania_bible_tree, ('PROLOG', 'REMARK', 'CAPTION', 'MEDIA'), with_tail=False)
         xmlbible = zefania_bible_tree.getroot()
         for BIBLEBOOK in xmlbible:
             if self.stop_import_flag:
                 break
             bname = BIBLEBOOK.get('bname')
             bnumber = BIBLEBOOK.get('bnumber')
             if not bname and not bnumber:
                 continue
             if bname:
                 book_ref_id = self.get_book_ref_id_by_name(bname, num_books, language_id)
                 if not book_ref_id:
                     book_ref_id = self.get_book_ref_id_by_localised_name(bname)
             else:
                 log.debug('Could not find a name, will use number, basically a guess.')
                 book_ref_id = int(bnumber)
             if not book_ref_id:
                 log.error('Importing books from "%s" failed' % self.filename)
                 return False
             book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
             db_book = self.create_book(book_details['name'], book_ref_id, book_details['testament_id'])
             for CHAPTER in BIBLEBOOK:
                 if self.stop_import_flag:
                     break
                 chapter_number = CHAPTER.get("cnumber")
                 for VERS in CHAPTER:
                     verse_number = VERS.get("vnumber")
                     self.create_verse(db_book.id, chapter_number, verse_number, VERS.text.replace('<BR/>', '\n'))
                 self.wizard.increment_progress_bar(
                     translate('BiblesPlugin.Zefnia', 'Importing %(bookname)s %(chapter)s...') %
                     {'bookname': db_book.name, 'chapter': chapter_number})
         self.session.commit()
         self.application.process_events()
     except Exception as e:
         critical_error_message_box(
             message=translate('BiblesPlugin.ZefaniaImport',
                               'Incorrect Bible file type supplied. Zefania Bibles may be '
                               'compressed. You must decompress them before import.'))
         log.exception(str(e))
         success = False
     finally:
         if import_file:
             import_file.close()
     if self.stop_import_flag:
         return False
     else:
         return success
예제 #40
0
 def do_import(self, bible_name=None):
     """
     Loads a Bible from file.
     """
     log.debug('Starting OSIS import from "%s"' % self.filename)
     if not isinstance(self.filename, str):
         self.filename = str(self.filename, 'utf8')
     import_file = None
     success = True
     try:
         # NOTE: We don't need to do any of the normal encoding detection here, because lxml does it's own encoding
         # detection, and the two mechanisms together interfere with each other.
         import_file = open(self.filename, 'rb')
         osis_bible_tree = etree.parse(import_file, parser=etree.XMLParser(recover=True))
         namespace = {'ns': 'http://www.bibletechnologies.net/2003/OSIS/namespace'}
         # Find bible language
         language_id = None
         language = osis_bible_tree.xpath("//ns:osisText/@xml:lang", namespaces=namespace)
         if language:
             language_id = BiblesResourcesDB.get_language(language[0])
         # The language couldn't be detected, ask the user
         if not language_id:
             language_id = self.get_language(bible_name)
         if not language_id:
             log.error('Importing books from "%s" failed' % self.filename)
             return False
         self.save_meta('language_id', language_id)
         num_books = int(osis_bible_tree.xpath("count(//ns:div[@type='book'])", namespaces=namespace))
         self.wizard.increment_progress_bar(translate('BiblesPlugin.OsisImport',
                                                      'Removing unused tags (this may take a few minutes)...'))
         # We strip unused tags from the XML, this should leave us with only chapter, verse and div tags.
         # Strip tags we don't use - remove content
         etree.strip_elements(osis_bible_tree, ('{http://www.bibletechnologies.net/2003/OSIS/namespace}note',
                                                '{http://www.bibletechnologies.net/2003/OSIS/namespace}milestone',
                                                '{http://www.bibletechnologies.net/2003/OSIS/namespace}title',
                                                '{http://www.bibletechnologies.net/2003/OSIS/namespace}abbr',
                                                '{http://www.bibletechnologies.net/2003/OSIS/namespace}catchWord',
                                                '{http://www.bibletechnologies.net/2003/OSIS/namespace}index',
                                                '{http://www.bibletechnologies.net/2003/OSIS/namespace}rdg',
                                                '{http://www.bibletechnologies.net/2003/OSIS/namespace}rdgGroup',
                                                '{http://www.bibletechnologies.net/2003/OSIS/namespace}figure'),
                              with_tail=False)
         # Strip tags we don't use - keep content
         etree.strip_tags(osis_bible_tree, ('{http://www.bibletechnologies.net/2003/OSIS/namespace}p',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}l',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}lg',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}q',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}a',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}w',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}divineName',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}foreign',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}hi',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}inscription',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}mentioned',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}name',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}reference',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}seg',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}transChange',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}salute',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}signed',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}closer',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}speech',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}speaker',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}list',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}item',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}table',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}head',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}row',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}cell',
                                            '{http://www.bibletechnologies.net/2003/OSIS/namespace}caption'))
         # Precompile a few xpath-querys
         verse_in_chapter = etree.XPath('count(//ns:chapter[1]/ns:verse)', namespaces=namespace)
         text_in_verse = etree.XPath('count(//ns:verse[1]/text())', namespaces=namespace)
         # Find books in the bible
         bible_books = osis_bible_tree.xpath("//ns:div[@type='book']", namespaces=namespace)
         for book in bible_books:
             if self.stop_import_flag:
                 break
             # Remove div-tags in the book
             etree.strip_tags(book, ('{http://www.bibletechnologies.net/2003/OSIS/namespace}div'))
             book_ref_id = self.get_book_ref_id_by_name(book.get('osisID'), num_books, language_id)
             if not book_ref_id:
                 book_ref_id = self.get_book_ref_id_by_localised_name(book.get('osisID'))
             if not book_ref_id:
                 log.error('Importing books from "%s" failed' % self.filename)
                 return False
             book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
             db_book = self.create_book(book_details['name'], book_ref_id, book_details['testament_id'])
             # Find out if chapter-tags contains the verses, or if it is used as milestone/anchor
             if int(verse_in_chapter(book)) > 0:
                 # The chapter tags contains the verses
                 for chapter in book:
                     chapter_number = chapter.get("osisID").split('.')[1]
                     # Find out if verse-tags contains the text, or if it is used as milestone/anchor
                     if int(text_in_verse(chapter)) == 0:
                         # verse-tags are used as milestone
                         for verse in chapter:
                             # If this tag marks the start of a verse, the verse text is between this tag and
                             # the next tag, which the "tail" attribute gives us.
                             if verse.get('sID'):
                                 verse_number = verse.get("osisID").split('.')[2]
                                 verse_text = verse.tail
                                 if verse_text:
                                     self.create_verse(db_book.id, chapter_number, verse_number, verse_text.strip())
                     else:
                         # Verse-tags contains the text
                         for verse in chapter:
                             verse_number = verse.get("osisID").split('.')[2]
                             if verse.text:
                                 self.create_verse(db_book.id, chapter_number, verse_number, verse.text.strip())
                     self.wizard.increment_progress_bar(
                         translate('BiblesPlugin.OsisImport', 'Importing %(bookname)s %(chapter)s...') %
                         {'bookname': db_book.name, 'chapter': chapter_number})
             else:
                 # The chapter tags is used as milestones. For now we assume verses is also milestones
                 chapter_number = 0
                 for element in book:
                     if element.tag == '{http://www.bibletechnologies.net/2003/OSIS/namespace}chapter' \
                             and element.get('sID'):
                         chapter_number = element.get("osisID").split('.')[1]
                         self.wizard.increment_progress_bar(
                             translate('BiblesPlugin.OsisImport', 'Importing %(bookname)s %(chapter)s...') %
                             {'bookname': db_book.name, 'chapter': chapter_number})
                     elif element.tag == '{http://www.bibletechnologies.net/2003/OSIS/namespace}verse' \
                             and element.get('sID'):
                         # If this tag marks the start of a verse, the verse text is between this tag and
                         # the next tag, which the "tail" attribute gives us.
                         verse_number = element.get("osisID").split('.')[2]
                         verse_text = element.tail
                         if verse_text:
                             self.create_verse(db_book.id, chapter_number, verse_number, verse_text.strip())
             self.session.commit()
         self.application.process_events()
     except (ValueError, IOError):
         log.exception('Loading bible from OSIS file failed')
         trace_error_handler(log)
         success = False
     except etree.XMLSyntaxError as e:
         log.exception('Loading bible from OSIS file failed')
         trace_error_handler(log)
         success = False
         critical_error_message_box(message=translate('BiblesPlugin.OsisImport',
                                                      'The file is not a valid OSIS-XML file: \n%s' % e.msg))
     finally:
         if import_file:
             import_file.close()
     if self.stop_import_flag:
         return False
     else:
         return success
예제 #41
0
 def do_import(self, bible_name=None):
     """
     Loads a Bible from file.
     """
     log.debug(u'Starting OSIS import from "%s"' % self.filename)
     detect_file = None
     db_book = None
     osis = None
     success = True
     last_chapter = 0
     match_count = 0
     self.wizard.incrementProgressBar(translate('BiblesPlugin.OsisImport',
         'Detecting encoding (this may take a few minutes)...'))
     try:
         detect_file = open(self.filename, u'r')
         details = chardet.detect(detect_file.read(1048576))
         detect_file.seek(0)
         lines_in_file = int(len(detect_file.readlines()))
     except IOError:
         log.exception(u'Failed to detect OSIS file encoding')
         return
     finally:
         if detect_file:
             detect_file.close()
     try:
         osis = codecs.open(self.filename, u'r', details['encoding'])
         repl = replacement
         language_id = False
         # Decide if the bible propably contains only NT or AT and NT or
         # AT, NT and Apocrypha
         if lines_in_file < 11500:
             book_count = 27
             chapter_count = 260
         elif lines_in_file < 34200:
             book_count = 66
             chapter_count = 1188
         else:
             book_count = 67
             chapter_count = 1336
         for file_record in osis:
             if self.stop_import_flag:
                 break
             # Try to find the bible language
             if not language_id:
                 language_match = self.language_regex.search(file_record)
                 if language_match:
                     language = BiblesResourcesDB.get_language(
                         language_match.group(1))
                     if language:
                         language_id = language[u'id']
                         self.save_meta(u'language_id', language_id)
                     continue
             match = self.verse_regex.search(file_record)
             if match:
                 # Set meta language_id if not detected till now
                 if not language_id:
                     language_id = self.get_language(bible_name)
                     if not language_id:
                         log.exception(u'Importing books from "%s" failed' % self.filename)
                         return False
                 match_count += 1
                 book = unicode(match.group(1))
                 chapter = int(match.group(2))
                 verse = int(match.group(3))
                 verse_text = match.group(4)
                 book_ref_id = self.get_book_ref_id_by_name(book, book_count, 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)
                 if not db_book or db_book.name != book_details[u'name']:
                     log.debug(u'New book: "%s"' % book_details[u'name'])
                     db_book = self.create_book(
                         book_details[u'name'],
                         book_ref_id,
                         book_details[u'testament_id'])
                 if last_chapter == 0:
                     self.wizard.progressBar.setMaximum(chapter_count)
                 if last_chapter != chapter:
                     if last_chapter != 0:
                         self.session.commit()
                     self.wizard.incrementProgressBar(translate('BiblesPlugin.OsisImport', 'Importing %s %s...',
                         'Importing <book name> <chapter>...') % (book_details[u'name'], chapter))
                     last_chapter = chapter
                 # All of this rigmarol below is because the mod2osis
                 # tool from the Sword library embeds XML in the OSIS
                 # but neglects to enclose the verse text (with XML) in
                 # <[CDATA[ ]]> tags.
                 verse_text = self.note_regex.sub(u'', verse_text)
                 verse_text = self.title_regex.sub(u'', verse_text)
                 verse_text = self.milestone_regex.sub(u'', verse_text)
                 verse_text = self.fi_regex.sub(u'', verse_text)
                 verse_text = self.rf_regex.sub(u'', verse_text)
                 verse_text = self.lb_regex.sub(u' ', verse_text)
                 verse_text = self.lg_regex.sub(u'', verse_text)
                 verse_text = self.l_regex.sub(u' ', verse_text)
                 verse_text = self.w_regex.sub(u'', verse_text)
                 verse_text = self.q1_regex.sub(u'"', verse_text)
                 verse_text = self.q2_regex.sub(u'\'', verse_text)
                 verse_text = self.q_regex.sub(u'', verse_text)
                 verse_text = self.divine_name_regex.sub(repl, verse_text)
                 verse_text = self.trans_regex.sub(u'', verse_text)
                 verse_text = verse_text.replace(u'</lb>', u'') \
                     .replace(u'</l>', u'').replace(u'<lg>', u'') \
                     .replace(u'</lg>', u'').replace(u'</q>', u'') \
                     .replace(u'</div>', u'').replace(u'</w>', u'')
                 verse_text = self.spaces_regex.sub(u' ', verse_text)
                 self.create_verse(db_book.id, chapter, verse, verse_text)
                 self.application.process_events()
         self.session.commit()
         if match_count == 0:
             success = False
     except (ValueError, IOError):
         log.exception(u'Loading bible from OSIS file failed')
         success = False
     finally:
         if osis:
             osis.close()
     if self.stop_import_flag:
         return False
     else:
         return success
예제 #42
0
 def do_import(self, bible_name=None):
     """
     Loads a Bible from file.
     """
     log.debug('Starting OpenSong import from "%s"' % self.filename)
     if not isinstance(self.filename, str):
         self.filename = str(self.filename, 'utf8')
     file = None
     success = True
     try:
         # NOTE: We don't need to do any of the normal encoding detection here, because lxml does it's own encoding
         # detection, and the two mechanisms together interfere with each other.
         file = open(self.filename, 'r')
         opensong = objectify.parse(file)
         bible = opensong.getroot()
         language_id = self.get_language(bible_name)
         if not language_id:
             log.exception('Importing books from "%s" failed' % self.filename)
             return False
         for book in bible.b:
             if self.stop_import_flag:
                 break
             book_ref_id = self.get_book_ref_id_by_name(str(book.attrib['n']), len(bible.b), language_id)
             if not book_ref_id:
                 log.exception('Importing books from "%s" failed' % self.filename)
                 return False
             book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
             db_book = self.create_book(str(book.attrib['n']), book_ref_id, book_details['testament_id'])
             chapter_number = 0
             for chapter in book.c:
                 if self.stop_import_flag:
                     break
                 number = chapter.attrib['n']
                 if number:
                     chapter_number = int(number.split()[-1])
                 else:
                     chapter_number += 1
                 verse_number = 0
                 for verse in chapter.v:
                     if self.stop_import_flag:
                         break
                     number = verse.attrib['n']
                     if number:
                         try:
                             number = int(number)
                         except ValueError:
                             verse_parts = number.split('-')
                             if len(verse_parts) > 1:
                                 number = int(verse_parts[0])
                         except TypeError:
                             log.warn('Illegal verse number: %s', str(verse.attrib['n']))
                         verse_number = number
                     else:
                         verse_number += 1
                     self.create_verse(db_book.id, chapter_number, verse_number, self.get_text(verse))
                 self.wizard.increment_progress_bar(translate('BiblesPlugin.Opensong', 'Importing %s %s...',
                     'Importing <book name> <chapter>...')) % (db_book.name, chapter_number)
             self.session.commit()
         self.application.process_events()
     except etree.XMLSyntaxError as inst:
         critical_error_message_box(message=translate('BiblesPlugin.OpenSongImport',
             'Incorrect Bible file type supplied. OpenSong Bibles may be '
             'compressed. You must decompress them before import.'))
         log.exception(inst)
         success = False
     except (IOError, AttributeError):
         log.exception('Loading Bible from OpenSong file failed')
         success = False
     finally:
         if file:
             file.close()
     if self.stop_import_flag:
         return False
     else:
         return success
예제 #43
0
 def do_import(self, bible_name=None):
     """
     Import the bible books and verses.
     """
     self.wizard.progress_bar.setValue(0)
     self.wizard.progress_bar.setMinimum(0)
     self.wizard.progress_bar.setMaximum(66)
     success = True
     language_id = self.get_language(bible_name)
     if not language_id:
         log.exception('Importing books from "%s" failed' % self.filename)
         return False
     books_file = None
     book_list = {}
     # Populate the Tables
     try:
         details = get_file_encoding(self.booksfile)
         books_file = open(self.booksfile, 'r')
         if not books_file.read(3) == '\xEF\xBB\xBF':
             # no BOM was found
             books_file.seek(0)
         books_reader = csv.reader(books_file, delimiter=',', quotechar='"')
         for line in books_reader:
             if self.stop_import_flag:
                 break
             self.wizard.increment_progress_bar(translate('BiblesPlugin.CSVBible', 'Importing books... %s') %
                 str(line[2], details['encoding']))
             book_ref_id = self.get_book_ref_id_by_name(str(line[2], details['encoding']), 67, language_id)
             if not book_ref_id:
                 log.exception('Importing books from "%s" failed' % self.booksfile)
                 return False
             book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
             self.create_book(str(line[2], details['encoding']), book_ref_id, book_details['testament_id'])
             book_list[int(line[0])] = str(line[2], details['encoding'])
         self.application.process_events()
     except (IOError, IndexError):
         log.exception('Loading books from file failed')
         success = False
     finally:
         if books_file:
             books_file.close()
     if self.stop_import_flag or not success:
         return False
     self.wizard.progress_bar.setValue(0)
     self.wizard.progress_bar.setMaximum(67)
     verse_file = None
     try:
         book_ptr = None
         details = get_file_encoding(self.versesfile)
         verse_file = open(self.versesfile, 'rb')
         if not verse_file.read(3) == '\xEF\xBB\xBF':
             # no BOM was found
             verse_file.seek(0)
         verse_reader = csv.reader(verse_file, delimiter=',', quotechar='"')
         for line in verse_reader:
             if self.stop_import_flag:
                 break
             try:
                 line_book = book_list[int(line[0])]
             except ValueError:
                 line_book = str(line[0], details['encoding'])
             if book_ptr != line_book:
                 book = self.get_book(line_book)
                 book_ptr = book.name
                 self.wizard.increment_progress_bar(translate('BiblesPlugin.CSVBible',
                     'Importing verses from %s... Importing verses from <book name>...') % book.name)
                 self.session.commit()
             try:
                 verse_text = str(line[3], details['encoding'])
             except UnicodeError:
                 verse_text = str(line[3], 'cp1252')
             self.create_verse(book.id, line[1], line[2], verse_text)
         self.wizard.increment_progress_bar(translate('BiblesPlugin.CSVBible', 'Importing verses... done.'))
         self.application.process_events()
         self.session.commit()
     except IOError:
         log.exception('Loading verses from file failed')
         success = False
     finally:
         if verse_file:
             verse_file.close()
     if self.stop_import_flag:
         return False
     else:
         return success
예제 #44
0
 def do_import(self, bible_name=None):
     """
     Loads a Bible from file.
     """
     log.debug('Starting OpenSong import from "%s"' % self.filename)
     if not isinstance(self.filename, str):
         self.filename = str(self.filename, 'utf8')
     import_file = None
     success = True
     try:
         # NOTE: We don't need to do any of the normal encoding detection here, because lxml does it's own encoding
         # detection, and the two mechanisms together interfere with each other.
         import_file = open(self.filename, 'rb')
         opensong = objectify.parse(import_file)
         bible = opensong.getroot()
         # Check that we're not trying to import a Zefania XML bible, it is sometimes refered to as 'OpenSong'
         if bible.tag.upper() == 'XMLBIBLE':
             critical_error_message_box(message=translate(
                 'BiblesPlugin.OpenSongImport',
                 'Incorrect Bible file type supplied. This looks like a Zefania XML bible, '
                 'please use the Zefania import option.'))
             return False
         # No language info in the opensong format, so ask the user
         language_id = self.get_language(bible_name)
         if not language_id:
             log.error('Importing books from "%s" failed' % self.filename)
             return False
         for book in bible.b:
             if self.stop_import_flag:
                 break
             book_ref_id = self.get_book_ref_id_by_name(
                 str(book.attrib['n']), len(bible.b), language_id)
             if not book_ref_id:
                 log.error('Importing books from "%s" failed' %
                           self.filename)
                 return False
             book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
             db_book = self.create_book(book.attrib['n'], book_ref_id,
                                        book_details['testament_id'])
             chapter_number = 0
             for chapter in book.c:
                 if self.stop_import_flag:
                     break
                 number = chapter.attrib['n']
                 if number:
                     chapter_number = int(number.split()[-1])
                 else:
                     chapter_number += 1
                 verse_number = 0
                 for verse in chapter.v:
                     if self.stop_import_flag:
                         break
                     number = verse.attrib['n']
                     if number:
                         try:
                             number = int(number)
                         except ValueError:
                             verse_parts = number.split('-')
                             if len(verse_parts) > 1:
                                 number = int(verse_parts[0])
                         except TypeError:
                             log.warning('Illegal verse number: %s',
                                         str(verse.attrib['n']))
                         verse_number = number
                     else:
                         verse_number += 1
                     self.create_verse(db_book.id, chapter_number,
                                       verse_number, self.get_text(verse))
                 self.wizard.increment_progress_bar(
                     translate('BiblesPlugin.Opensong',
                               'Importing %(bookname)s %(chapter)s...') % {
                                   'bookname': db_book.name,
                                   'chapter': chapter_number
                               })
             self.session.commit()
         self.application.process_events()
     except etree.XMLSyntaxError as inst:
         trace_error_handler(log)
         critical_error_message_box(message=translate(
             'BiblesPlugin.OpenSongImport',
             'Incorrect Bible file type supplied. OpenSong Bibles may be '
             'compressed. You must decompress them before import.'))
         log.exception(inst)
         success = False
     except (IOError, AttributeError):
         log.exception('Loading Bible from OpenSong file failed')
         success = False
     finally:
         if import_file:
             import_file.close()
     if self.stop_import_flag:
         return False
     else:
         return success
예제 #45
0
 def do_import(self, bible_name=None):
     """
     Loads a Bible from SWORD module.
     """
     log.debug(
         'Starting SWORD import from "{key}"'.format(key=self.sword_key))
     success = True
     try:
         pysword_modules = modules.SwordModules(self.sword_path)
         pysword_module_json = pysword_modules.parse_modules()[
             self.sword_key]
         bible = pysword_modules.get_bible_from_module(self.sword_key)
         language = pysword_module_json['lang']
         language = language[language.find('.') + 1:]
         language_id = self.get_language_id(language,
                                            bible_name=str(self.file_path))
         if not language_id:
             return False
         books = bible.get_structure().get_books()
         # Count number of books
         num_books = 0
         if 'ot' in books:
             num_books += len(books['ot'])
         if 'nt' in books:
             num_books += len(books['nt'])
         self.wizard.progress_bar.setMaximum(num_books)
         # Import the bible
         for testament in books.keys():
             for book in books[testament]:
                 book_ref_id = self.get_book_ref_id_by_name(
                     book.name, num_books, language_id)
                 book_details = BiblesResourcesDB.get_book_by_id(
                     book_ref_id)
                 db_book = self.create_book(book_details['name'],
                                            book_ref_id,
                                            book_details['testament_id'])
                 for chapter_number in range(1, book.num_chapters + 1):
                     if self.stop_import_flag:
                         break
                     verses = bible.get_iter(book.name, chapter_number)
                     verse_number = 0
                     for verse in verses:
                         verse_number += 1
                         self.create_verse(db_book.id, chapter_number,
                                           verse_number, verse)
                 self.wizard.increment_progress_bar(
                     translate(
                         'BiblesPlugin.Sword',
                         'Importing {name}...').format(name=db_book.name))
         self.session.commit()
         self.application.process_events()
     except Exception as e:
         critical_error_message_box(message=translate(
             'BiblesPlugin.SwordImport',
             'An unexpected error happened while importing the SWORD '
             'bible, please report this to the OpenLP developers.\n'
             '{error}').format(error=e))
         log.exception(str(e))
         success = False
     if self.stop_import_flag:
         return False
     else:
         return success
예제 #46
0
 def do_import(self, bible_name=None):
     """
     Import the bible books and verses.
     """
     self.wizard.progress_bar.setValue(0)
     self.wizard.progress_bar.setMinimum(0)
     self.wizard.progress_bar.setMaximum(66)
     success = True
     language_id = self.get_language(bible_name)
     if not language_id:
         log.error('Importing books from "%s" failed' % self.filename)
         return False
     books_file = None
     book_list = {}
     # Populate the Tables
     try:
         details = get_file_encoding(self.books_file)
         books_file = open(self.books_file,
                           'r',
                           encoding=details['encoding'])
         books_reader = csv.reader(books_file, delimiter=',', quotechar='"')
         for line in books_reader:
             if self.stop_import_flag:
                 break
             self.wizard.increment_progress_bar(
                 translate('BiblesPlugin.CSVBible', 'Importing books... %s')
                 % line[2])
             book_ref_id = self.get_book_ref_id_by_name(
                 line[2], 67, language_id)
             if not book_ref_id:
                 log.error('Importing books from "%s" failed' %
                           self.books_file)
                 return False
             book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
             self.create_book(line[2], book_ref_id,
                              book_details['testament_id'])
             book_list.update({int(line[0]): line[2]})
         self.application.process_events()
     except (IOError, IndexError):
         log.exception('Loading books from file failed')
         success = False
     finally:
         if books_file:
             books_file.close()
     if self.stop_import_flag or not success:
         return False
     self.wizard.progress_bar.setValue(0)
     self.wizard.progress_bar.setMaximum(67)
     verse_file = None
     try:
         book_ptr = None
         details = get_file_encoding(self.verses_file)
         verse_file = open(self.verses_file,
                           'r',
                           encoding=details['encoding'])
         verse_reader = csv.reader(verse_file, delimiter=',', quotechar='"')
         for line in verse_reader:
             if self.stop_import_flag:
                 break
             try:
                 line_book = book_list[int(line[0])]
             except ValueError:
                 line_book = line[0]
             if book_ptr != line_book:
                 book = self.get_book(line_book)
                 book_ptr = book.name
                 self.wizard.increment_progress_bar(
                     translate('BiblesPlugin.CSVBible',
                               'Importing verses from %s...' % book.name,
                               'Importing verses from <book name>...'))
                 self.session.commit()
             verse_text = line[3]
             self.create_verse(book.id, line[1], line[2], verse_text)
         self.wizard.increment_progress_bar(
             translate('BiblesPlugin.CSVBible',
                       'Importing verses... done.'))
         self.application.process_events()
         self.session.commit()
     except IOError:
         log.exception('Loading verses from file failed')
         success = False
     finally:
         if verse_file:
             verse_file.close()
     if self.stop_import_flag:
         return False
     else:
         return success
예제 #47
0
    def load_bible(self, bible):
        """
        Loads a bible.

        ``bible``

        :param bible: The name of the bible.
        """
        log.debug('Load Bible')
        self.bible = bible
        book_name_language = self.manager.get_meta_data(
            self.bible, 'book_name_language')
        """
        Try loading the metadata, if the field does not exist in the metadata, continue executing the code,
        missing fields will be created on "self.accept" (save).
        """
        meta = self.manager.get_meta_data(self.bible, 'name')
        copyright = self.manager.get_meta_data(self.bible, 'copyright')
        permission = self.manager.get_meta_data(self.bible, 'permissions')
        full_license = self.manager.get_meta_data(self.bible, 'full_license')
        if meta:
            self.version_name_edit.setText(meta.value)
        if copyright:
            self.copyright_edit.setText(copyright.value)
        if permission:
            self.permissions_edit.setText(permission.value)
        if full_license:
            self.full_license_edit.setPlainText(full_license.value)
        # Set placeholder texts for the fields.
        self.version_name_edit.setPlaceholderText(
            UiStrings().RequiredShowInFooter)
        self.copyright_edit.setPlaceholderText(
            UiStrings().RequiredShowInFooter)
        self.permissions_edit.setPlaceholderText(
            UiStrings().OptionalShowInFooter)
        self.full_license_edit.setPlaceholderText(
            UiStrings().OptionalHideInFooter)
        if book_name_language and book_name_language.value != 'None':
            self.language_selection_combo_box.setCurrentIndex(
                int(book_name_language.value) + 1)
        self.books = {}
        self.web_bible = self.manager.get_meta_data(self.bible,
                                                    'download_source')
        if self.web_bible:
            self.book_name_notice.setText(
                translate(
                    'BiblesPlugin.EditBibleForm',
                    'This is a Web Download Bible.\nIt is not possible to customize the Book Names.'
                ))
            self.scroll_area.hide()
        else:
            self.book_name_notice.setText(
                translate(
                    'BiblesPlugin.EditBibleForm',
                    'To use the customized book names, "Bible language" must be selected on the Meta Data tab '
                    'or, if "Global settings" is selected, on the Bible page in Configure OpenLP.'
                ))
            for book in BiblesResourcesDB.get_books():
                self.books[book['abbreviation']] = self.manager.get_book_by_id(
                    self.bible, book['id'])
                if self.books[book['abbreviation']] and not self.web_bible:
                    self.book_name_edit[book['abbreviation']].setText(
                        self.books[book['abbreviation']].name)
                else:
                    # It is necessary to remove the Widget otherwise there still
                    # exists the vertical spacing in QFormLayout
                    self.book_name_widget_layout.removeWidget(
                        self.book_name_label[book['abbreviation']])
                    self.book_name_label[book['abbreviation']].hide()
                    self.book_name_widget_layout.removeWidget(
                        self.book_name_edit[book['abbreviation']])
                    self.book_name_edit[book['abbreviation']].hide()
예제 #48
0
 def performWizard(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 %s of %s: "%s"\nUpgrading ...') % (number + 1, max_bibles, 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 %s - download name: "%s" failed' % (
                     meta_data['download_source'], 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.'))
                 self.increment_progress_bar(translate(
                     'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\nFailed') %
                     (number + 1, max_bibles, name), 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.warn('Upgrading from "%s" failed' % filename[0])
                 self.new_bibles[number].session.close()
                 del self.new_bibles[number]
                 self.increment_progress_bar(translate('BiblesPlugin.UpgradeWizardForm',
                     'Upgrading Bible %s of %s: "%s"\nFailed') % (number + 1, max_bibles, 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 %s of %s: "%s"\nUpgrading %s ...') % (number + 1, max_bibles, name, 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.warn('Upgrading books from %s - download name: "%s" aborted by user' % (
                         meta_data['download_source'], 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.warn('No verses found to import for book "%s"', 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.warn('Upgrading books from "%s" failed' % name)
                 self.new_bibles[number].session.close()
                 del self.new_bibles[number]
                 self.increment_progress_bar(translate('BiblesPlugin.UpgradeWizardForm',
                     'Upgrading Bible %s of %s: "%s"\nFailed') % (number + 1, max_bibles, 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 %s of %s: "%s"\nUpgrading %s ...') %
                     (number + 1, max_bibles, name, 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.warn('Upgrading books from %s " failed - aborted by user' % 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.warn('No verses found to import for book "%s"', 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 %s of %s: "%s"\nFailed') % (number + 1, max_bibles, 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 %s of %s: "%s"\nComplete') % (number + 1, max_bibles, 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()