added error logger methods

This commit is contained in:
Andreas Preikschat 2011-04-18 18:46:22 +02:00
parent 0398b93f78
commit a530851124
14 changed files with 97 additions and 69 deletions

View File

@ -741,15 +741,19 @@ class SongImportForm(OpenLPWizard):
filenames=self.getListOfFiles(self.foilPresenterFileListWidget) filenames=self.getListOfFiles(self.foilPresenterFileListWidget)
) )
test = importer.do_import() test = importer.do_import()
importer.write_error_report()
if isinstance(test, bool): if isinstance(test, bool):
raise received_boolean raise received_boolean
if importer.stop_import_flag: if importer.stop_import_flag:
print importer.import_error_log self.progressLabel.setText(translate('SongsPlugin.SongImportForm',
print u'cancelled' 'Song import has been cancelled.'))
elif importer.import_error_log: elif importer.import_error_log:
self.progressLabel.setText(self.progressLabel.setText( error_path = importer.write_error_report()
translate('SongsPlugin.SongImportForm', self.progressLabel.setTextInteractionFlags(
'Your song import failed.'))) QtCore.Qt.TextSelectableByMouse)
self.progressLabel.setText(unicode(translate(
'SongsPlugin.SongImportForm', 'Your song import failed. See '
'the error report for more details:\n%s')) % error_path)
else: else:
self.progressLabel.setText(WizardStrings.FinishedImport) self.progressLabel.setText(WizardStrings.FinishedImport)

View File

@ -79,10 +79,12 @@ class CCLIFileImport(SongImport):
ext = os.path.splitext(filename)[1] ext = os.path.splitext(filename)[1]
if ext.lower() == u'.usr': if ext.lower() == u'.usr':
log.info(u'SongSelect .usr format file found: %s', filename) log.info(u'SongSelect .usr format file found: %s', filename)
self.do_import_usr_file(lines) if not self.do_import_usr_file(lines):
self.log_error(filename)
elif ext.lower() == u'.txt': elif ext.lower() == u'.txt':
log.info(u'SongSelect .txt format file found: %s', filename) log.info(u'SongSelect .txt format file found: %s', filename)
self.do_import_txt_file(lines) if not self.do_import_txt_file(lines):
self.log_error(filename)
else: else:
self.log_error(filename, self.log_error(filename,
translate('SongsPlugin.CCLIFileImport', translate('SongsPlugin.CCLIFileImport',
@ -214,7 +216,7 @@ class CCLIFileImport(SongImport):
else: else:
self.add_author(author) self.add_author(author)
self.topics = [topic.strip() for topic in song_topics.split(u'/t')] self.topics = [topic.strip() for topic in song_topics.split(u'/t')]
self.finish() return self.finish()
def do_import_txt_file(self, textList): def do_import_txt_file(self, textList):
""" """
@ -331,4 +333,4 @@ class CCLIFileImport(SongImport):
author_list = song_author.split(u'|') author_list = song_author.split(u'|')
# Clean spaces before and after author names. # Clean spaces before and after author names.
[self.add_author(author_name.strip()) for author_name in author_list] [self.add_author(author_name.strip()) for author_name in author_list]
self.finish() return self.finish()

View File

@ -70,7 +70,6 @@ class EasiSlidesImport(SongImport):
self._parse_song(song) self._parse_song(song)
def _parse_song(self, song): def _parse_song(self, song):
self.set_defaults()
self._success = True self._success = True
self._add_unicode_attribute(u'title', song.Title1, True) self._add_unicode_attribute(u'title', song.Title1, True)
self._add_unicode_attribute(u'alternate_title', song.Title2) self._add_unicode_attribute(u'alternate_title', song.Title2)
@ -84,7 +83,10 @@ class EasiSlidesImport(SongImport):
self._add_unicode_attribute(u'song_book_name', song.BookReference) self._add_unicode_attribute(u'song_book_name', song.BookReference)
self._parse_and_add_lyrics(song) self._parse_and_add_lyrics(song)
if self._success: if self._success:
self.finish() if not self.finish():
self.log_error(song.Title1 if song.Title1 else u'')
else:
self.set_defaults()
def _add_unicode_attribute(self, self_attribute, import_attribute, def _add_unicode_attribute(self, self_attribute, import_attribute,
mandatory=False): mandatory=False):
@ -116,10 +118,8 @@ class EasiSlidesImport(SongImport):
def _add_authors(self, song): def _add_authors(self, song):
try: try:
authors = unicode(song.Writer).split(u',') authors = unicode(song.Writer).split(u',')
for author in authors: self.authors = \
author = author.strip() [author.strip() for author in authors if author.strip()]
if len(author):
self.authors.append(author)
except UnicodeDecodeError: except UnicodeDecodeError:
log.exception(u'Unicode decode error while decoding Writer') log.exception(u'Unicode decode error while decoding Writer')
self._success = False self._success = False

View File

@ -263,7 +263,8 @@ class EasyWorshipSongImport(SongImport):
verse.strip(), VerseType.Tags[VerseType.Verse]) verse.strip(), VerseType.Tags[VerseType.Verse])
if self.stop_import_flag: if self.stop_import_flag:
break break
self.finish() if not self.finish():
self.log_error(self.import_source)
db_file.close() db_file.close()
self.memo_file.close() self.memo_file.close()

View File

@ -97,6 +97,7 @@ from openlp.core.ui.wizard import WizardStrings
from openlp.plugins.songs.lib import clean_song, VerseType from openlp.plugins.songs.lib import clean_song, VerseType
from openlp.plugins.songs.lib.songimport import SongImport from openlp.plugins.songs.lib.songimport import SongImport
from openlp.plugins.songs.lib.db import Author, Book, Song, Topic from openlp.plugins.songs.lib.db import Author, Book, Song, Topic
from openlp.plugins.songs.lib.ui import SongStrings
from openlp.plugins.songs.lib.xml import SongXML from openlp.plugins.songs.lib.xml import SongXML
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -128,8 +129,10 @@ class FoilPresenterImport(SongImport):
parsed_file = etree.parse(file_path, parser) parsed_file = etree.parse(file_path, parser)
xml = unicode(etree.tostring(parsed_file)) xml = unicode(etree.tostring(parsed_file))
if self.FoilPresenter.xml_to_song(xml) is None: if self.FoilPresenter.xml_to_song(xml) is None:
self.log_error(file_path, SongStrings.NoXML)
log.debug(u'File could not be imported: %s' % file_path) log.debug(u'File could not be imported: %s' % file_path)
except etree.XMLSyntaxError: except etree.XMLSyntaxError:
self.log_error(file_path, SongStrings.XMLSyntaxError)
log.exception(u'XML syntax error in file %s' % file_path) log.exception(u'XML syntax error in file %s' % file_path)

View File

@ -143,7 +143,8 @@ class OpenLP1SongImport(SongImport):
break break
if self.stop_import_flag: if self.stop_import_flag:
break break
self.finish() if not self.finish():
self.log_error(self.import_source)
def get_encoding(self): def get_encoding(self):
""" """

View File

@ -155,15 +155,9 @@ class OpenLPSongImport(SongImport):
mapper(OldTopic, source_topics_table) mapper(OldTopic, source_topics_table)
source_songs = self.source_session.query(OldSong).all() source_songs = self.source_session.query(OldSong).all()
song_total = len(source_songs)
if self.import_wizard: if self.import_wizard:
self.import_wizard.progressBar.setMaximum(song_total) self.import_wizard.progressBar.setMaximum(len(source_songs))
song_count = 1
for song in source_songs: for song in source_songs:
if self.import_wizard:
self.import_wizard.incrementProgressBar(
unicode(translate('SongsPlugin.OpenLPSongImport',
'Importing song %d of %d.')) % (song_count, song_total))
new_song = Song() new_song = Song()
new_song.title = song.title new_song.title = song.title
if has_media_files and hasattr(song, 'alternate_title'): if has_media_files and hasattr(song, 'alternate_title'):
@ -218,7 +212,9 @@ class OpenLPSongImport(SongImport):
# file_name=media_file.file_name)) # file_name=media_file.file_name))
clean_song(self.manager, new_song) clean_song(self.manager, new_song)
self.manager.save_object(new_song) self.manager.save_object(new_song)
song_count += 1 if self.import_wizard:
self.import_wizard.incrementProgressBar(
WizardStrings.ImportingType % new_song.title)
if self.stop_import_flag: if self.stop_import_flag:
break break
engine.dispose() engine.dispose()

View File

@ -35,6 +35,7 @@ from lxml import etree
from openlp.core.ui.wizard import WizardStrings from openlp.core.ui.wizard import WizardStrings
from openlp.plugins.songs.lib.songimport import SongImport from openlp.plugins.songs.lib.songimport import SongImport
from openlp.plugins.songs.lib.ui import SongStrings
from openlp.plugins.songs.lib import OpenLyrics from openlp.plugins.songs.lib import OpenLyrics
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -69,5 +70,7 @@ class OpenLyricsImport(SongImport):
xml = unicode(etree.tostring(parsed_file)) xml = unicode(etree.tostring(parsed_file))
if self.openLyrics.xml_to_song(xml) is None: if self.openLyrics.xml_to_song(xml) is None:
log.debug(u'File could not be imported: %s' % file_path) log.debug(u'File could not be imported: %s' % file_path)
self.log_error(file_path, SongStrings.NoXML)
except etree.XMLSyntaxError: except etree.XMLSyntaxError:
log.exception(u'XML syntax error in file %s' % file_path) log.exception(u'XML syntax error in file %s' % file_path)
self.log_error(file_path, SongStrings.XMLSyntaxError)

View File

@ -35,6 +35,7 @@ from lxml.etree import Error, LxmlError
from openlp.core.ui.wizard import WizardStrings from openlp.core.ui.wizard import WizardStrings
from openlp.plugins.songs.lib import VerseType from openlp.plugins.songs.lib import VerseType
from openlp.plugins.songs.lib.songimport import SongImport from openlp.plugins.songs.lib.songimport import SongImport
from openlp.plugins.songs.lib.ui import SongStrings
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -181,9 +182,6 @@ class OpenSongImport(SongImport):
setattr(self, fn_or_string, ustring) setattr(self, fn_or_string, ustring)
else: else:
fn_or_string(ustring) fn_or_string(ustring)
if not len(self.title):
# to prevent creation of empty songs from wrong files
return
if u'theme' in fields and unicode(root.theme) not in self.topics: if u'theme' in fields and unicode(root.theme) not in self.topics:
self.topics.append(unicode(root.theme)) self.topics.append(unicode(root.theme))
if u'alttheme' in fields and unicode(root.alttheme) not in self.topics: if u'alttheme' in fields and unicode(root.alttheme) not in self.topics:
@ -274,10 +272,11 @@ class OpenSongImport(SongImport):
verse_tag = verse_def verse_tag = verse_def
verse_num = u'1' verse_num = u'1'
verse_def = u'%s%s' % (verse_tag, verse_num) verse_def = u'%s%s' % (verse_tag, verse_num)
if verses.has_key(verse_tag) \ if verses.has_key(verse_tag) and \
and verses[verse_tag].has_key(verse_num): verses[verse_tag].has_key(verse_num):
self.verse_order_list.append(verse_def) self.verse_order_list.append(verse_def)
else: else:
log.info(u'Got order %s but not in verse tags, dropping' log.info(u'Got order %s but not in verse tags, dropping'
u'this item from presentation order', verse_def) u'this item from presentation order', verse_def)
self.finish() if not self.finish():
self.log_error(file.name)

View File

@ -35,6 +35,7 @@ import re
from openlp.plugins.songs.lib import VerseType from openlp.plugins.songs.lib import VerseType
from openlp.plugins.songs.lib.songimport import SongImport from openlp.plugins.songs.lib.songimport import SongImport
from openlp.plugins.songs.lib.ui import SongStrings
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -72,6 +73,11 @@ class SongBeamerImport(SongImport):
Initialise the Song Beamer importer. Initialise the Song Beamer importer.
""" """
SongImport.__init__(self, manager, **kwargs) SongImport.__init__(self, manager, **kwargs)
self.log_error(u'/home/andreas/1.sng', u'aaaa')
self.log_error(u'/home/andreas/4.sng', u'asdfsdfsadfds')
self.log_error(u'/home/andreas/3.sng', u'asdf3q4')
self.log_error(u'/home/andreas/2.sng', u'sadfasdf')
self.log_error(u'/home/andreas/ä.sng', u'kqwjw32w3')
def do_import(self): def do_import(self):
""" """
@ -124,7 +130,8 @@ class SongBeamerImport(SongImport):
if self.current_verse: if self.current_verse:
self.replace_html_tags() self.replace_html_tags()
self.add_verse(self.current_verse, self.current_verse_type) self.add_verse(self.current_verse, self.current_verse_type)
self.finish() if not self.finish():
self.log_error(file)
def replace_html_tags(self): def replace_html_tags(self):
""" """
@ -184,7 +191,7 @@ class SongBeamerImport(SongImport):
elif tag_val[0] == u'#Bible': elif tag_val[0] == u'#Bible':
pass pass
elif tag_val[0] == u'#Categories': elif tag_val[0] == u'#Categories':
self.topics = line.split(',') self.topics = tag_val[1].split(',')
elif tag_val[0] == u'#CCLI': elif tag_val[0] == u'#CCLI':
self.ccli_number = tag_val[1] self.ccli_number = tag_val[1]
elif tag_val[0] == u'#Chords': elif tag_val[0] == u'#Chords':

View File

@ -23,13 +23,17 @@
# with this program; if not, write to the Free Software Foundation, Inc., 59 # # with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Temple Place, Suite 330, Boston, MA 02111-1307 USA #
############################################################################### ###############################################################################
import codecs
import datetime
import logging import logging
import os
import re import re
from PyQt4 import QtCore from PyQt4 import QtCore
from openlp.core.lib import Receiver, translate from openlp.core.lib import Receiver, translate
from openlp.core.ui.wizard import WizardStrings from openlp.core.ui.wizard import WizardStrings
from openlp.core.utils import AppLocation
from openlp.plugins.songs.lib import clean_song, VerseType from openlp.plugins.songs.lib import clean_song, VerseType
from openlp.plugins.songs.lib.db import Song, Author, Topic, Book, MediaFile from openlp.plugins.songs.lib.db import Song, Author, Topic, Book, MediaFile
from openlp.plugins.songs.lib.ui import SongStrings from openlp.plugins.songs.lib.ui import SongStrings
@ -67,7 +71,7 @@ class SongImport(QtCore.QObject):
self.song = None self.song = None
self.stop_import_flag = False self.stop_import_flag = False
self.set_defaults() self.set_defaults()
self.import_error_log = [] self.error_log = []
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'openlp_stop_wizard'), self.stop_import) QtCore.SIGNAL(u'openlp_stop_wizard'), self.stop_import)
@ -96,7 +100,7 @@ class SongImport(QtCore.QObject):
self.copyright_string = unicode(translate( self.copyright_string = unicode(translate(
'SongsPlugin.SongImport', 'copyright')) 'SongsPlugin.SongImport', 'copyright'))
def log_error(self, filepath, reason=None): def log_error(self, filepath, reason=SongStrings.SongIncomplete):
""" """
This should be called, when a song could not be imported. This should be called, when a song could not be imported.
@ -109,7 +113,22 @@ class SongImport(QtCore.QObject):
The reason, why the import failed. The string should be as The reason, why the import failed. The string should be as
informative as possible. informative as possible.
""" """
self.import_error_log.append((filepath, unicode(reason))) self.error_log.append((filepath, unicode(reason)))
def write_error_report(self):
"""
Creates a error import containing all error messages.
"""
report_path = os.path.join(AppLocation.get_data_path(), unicode(translate(
'SongsPlugin.SongImport','song_import_report (%s).txt')) %
datetime.datetime.now().strftime(u'%Y-%m-%dT%H:%M:%S'))
report_file = codecs.open(report_path, u'w', u'utf-8')
report_file.write(translate('SongsPlugin.SongImport',
'The following songs could not be imported:\n'))
for filepath, reason in self.error_log:
report_file.write(u'- %s (%s)\n' % (filepath, reason))
report_file.close()
return report_path
def stop_import(self): def stop_import(self):
""" """
@ -257,7 +276,7 @@ class SongImport(QtCore.QObject):
Author not checked here, if no author then "Author unknown" is Author not checked here, if no author then "Author unknown" is
automatically added automatically added
""" """
if self.title == u'' or len(self.verses) == 0: if not self.title or not len(self.verses):
return False return False
else: else:
return True return True
@ -268,13 +287,12 @@ class SongImport(QtCore.QObject):
""" """
if not self.check_complete(): if not self.check_complete():
self.set_defaults() self.set_defaults()
return return False
log.info(u'committing song %s to database', self.title) log.info(u'committing song %s to database', self.title)
song = Song() song = Song()
song.title = self.title song.title = self.title
self.import_wizard.incrementProgressBar( self.import_wizard.incrementProgressBar(
WizardStrings.ImportingType % song.title) WizardStrings.ImportingType % song.title)
print WizardStrings.ImportingType
song.alternate_title = self.alternate_title song.alternate_title = self.alternate_title
# Values will be set when cleaning the song. # Values will be set when cleaning the song.
song.search_title = u'' song.search_title = u''
@ -331,7 +349,7 @@ class SongImport(QtCore.QObject):
publisher=self.song_book_pub) publisher=self.song_book_pub)
song.book = song_book song.book = song_book
for topictext in self.topics: for topictext in self.topics:
if len(topictext) == 0: if not topictext:
continue continue
topic = self.manager.get_object_filtered(Topic, topic = self.manager.get_object_filtered(Topic,
Topic.name == topictext) Topic.name == topictext)
@ -341,6 +359,7 @@ class SongImport(QtCore.QObject):
clean_song(self.manager, song) clean_song(self.manager, song)
self.manager.save_object(song) self.manager.save_object(song)
self.set_defaults() self.set_defaults()
return True
def print_song(self): def print_song(self):
""" """

View File

@ -169,12 +169,11 @@ class SongShowPlusImport(SongImport):
self.add_verse(unicode(data, u'cp1252'), verseTag) self.add_verse(unicode(data, u'cp1252'), verseTag)
else: else:
log.debug("Unrecognised blockKey: %s, data: %s" log.debug("Unrecognised blockKey: %s, data: %s"
%(blockKey, data)) % (blockKey, data))
self.verse_order_list = self.sspVerseOrderList self.verse_order_list = self.sspVerseOrderList
songData.close() songData.close()
self.finish() if not self.finish():
self.import_wizard.incrementProgressBar( self.log_error(file)
WizardStrings.ImportingType % file_name)
def toOpenLPVerseTag(self, verseName, ignoreUnique=False): def toOpenLPVerseTag(self, verseName, ignoreUnique=False):
if verseName.find(" ") != -1: if verseName.find(" ") != -1:
@ -186,22 +185,19 @@ class SongShowPlusImport(SongImport):
verseNumber = "1" verseNumber = "1"
verseType = verseType.lower() verseType = verseType.lower()
if verseType == "verse": if verseType == "verse":
verseTag = "V" verseTag = VerseType.Tags[VerseType.Verse]
elif verseType == "chorus": elif verseType == "chorus":
verseTag = "C" verseTag = VerseType.Tags[VerseType.Chorus]
elif verseType == "bridge": elif verseType == "bridge":
verseTag = "B" verseTag = VerseType.Tags[VerseType.Bridge]
elif verseType == "pre-chorus": elif verseType == "pre-chorus":
verseTag = "P" verseTag = VerseType.Tags[VerseType.PreChorus]
elif verseType == "bridge":
verseTag = "B"
else: else:
if not self.otherList.has_key(verseName): if not self.otherList.has_key(verseName):
if ignoreUnique: if ignoreUnique:
return None return None
self.otherCount = self.otherCount + 1 self.otherCount = self.otherCount + 1
self.otherList[verseName] = str(self.otherCount) self.otherList[verseName] = str(self.otherCount)
verseTag = "O" verseTag = VerseType.Tags[VerseType.Other]
verseNumber = self.otherList[verseName] verseNumber = self.otherList[verseName]
verseTag = verseTag + verseNumber return verseTag + verseNumber
return verseTag

View File

@ -38,8 +38,11 @@ class SongStrings(object):
Authors = translate('OpenLP.Ui', 'Authors', 'Plural') Authors = translate('OpenLP.Ui', 'Authors', 'Plural')
AuthorUnknown = u'Author Unknown' # Used to populate the database. AuthorUnknown = u'Author Unknown' # Used to populate the database.
CopyrightSymbol = translate('OpenLP.Ui', '\xa9', 'Copyright symbol.') CopyrightSymbol = translate('OpenLP.Ui', '\xa9', 'Copyright symbol.')
NoXML = translate('OpenLP.Ui', 'Song does not contain any XML')
SongBook = translate('OpenLP.Ui', 'Song Book', 'Singular') SongBook = translate('OpenLP.Ui', 'Song Book', 'Singular')
SongBooks = translate('OpenLP.Ui', 'Song Books', 'Plural') SongBooks = translate('OpenLP.Ui', 'Song Books', 'Plural')
SongIncomplete = translate('OpenLP.Ui','Title and/or verses not found')
SongMaintenance = translate('OpenLP.Ui', 'Song Maintenance') SongMaintenance = translate('OpenLP.Ui', 'Song Maintenance')
Topic = translate('OpenLP.Ui', 'Topic', 'Singular') Topic = translate('OpenLP.Ui', 'Topic', 'Singular')
Topics = translate('OpenLP.Ui', 'Topics', 'Plural') Topics = translate('OpenLP.Ui', 'Topics', 'Plural')
XMLSyntaxError = translate('OpenLP.Ui', 'XML syntax error')

View File

@ -105,11 +105,7 @@ class WowImport(SongImport):
if isinstance(self.import_source, list): if isinstance(self.import_source, list):
self.import_wizard.progressBar.setMaximum(len(self.import_source)) self.import_wizard.progressBar.setMaximum(len(self.import_source))
for file in self.import_source: for file in self.import_source:
author = u''
copyright = u''
file_name = os.path.split(file)[1] file_name = os.path.split(file)[1]
self.import_wizard.incrementProgressBar(
WizardStrings.ImportingType % file_name, 0)
# Get the song title # Get the song title
self.title = file_name.rpartition(u'.')[0] self.title = file_name.rpartition(u'.')[0]
songData = open(file, 'rb') songData = open(file, 'rb')
@ -129,7 +125,7 @@ class WowImport(SongImport):
self.line_text = unicode( self.line_text = unicode(
songData.read(ord(songData.read(1))), u'cp1252') songData.read(ord(songData.read(1))), u'cp1252')
songData.seek(1, os.SEEK_CUR) songData.seek(1, os.SEEK_CUR)
if block_text != u'': if block_text:
block_text += u'\n' block_text += u'\n'
block_text += self.line_text block_text += self.line_text
self.lines_to_read -= 1 self.lines_to_read -= 1
@ -143,16 +139,14 @@ class WowImport(SongImport):
self.add_verse(block_text, block_type) self.add_verse(block_text, block_type)
# Now to extract the author # Now to extract the author
author_length = ord(songData.read(1)) author_length = ord(songData.read(1))
if author_length != 0: if author_length:
author = unicode(songData.read(author_length), u'cp1252') self.parse_author(
unicode(songData.read(author_length), u'cp1252'))
# Finally the copyright # Finally the copyright
copyright_length = ord(songData.read(1)) copyright_length = ord(songData.read(1))
if copyright_length != 0: if copyright_length:
copyright = unicode( self.add_copyright(unicode(
songData.read(copyright_length), u'cp1252') songData.read(copyright_length), u'cp1252'))
self.parse_author(author)
self.add_copyright(copyright)
songData.close() songData.close()
self.finish() if not self.finish():
self.import_wizard.incrementProgressBar( self.log_error(file)
WizardStrings.ImportingType % file_name)