From dad04bfd901582c6334e22c8130c04e444726c58 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sat, 3 Apr 2010 00:24:51 +0100 Subject: [PATCH 1/3] SOF fixes+delete all selected songs --- openlp/plugins/songs/lib/mediaitem.py | 23 +++++++++++------ openlp/plugins/songs/lib/sofimport.py | 23 +++++++++++------ openlp/plugins/songs/lib/songimport.py | 35 ++++++++++++++++---------- openlp/plugins/songs/songsplugin.py | 12 +++++++-- 4 files changed, 64 insertions(+), 29 deletions(-) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 9ac8ec977..145646a02 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -271,12 +271,21 @@ class SongMediaItem(MediaManagerItem): self.edit_song_form.exec_() def onDeleteClick(self): - item = self.ListView.currentItem() - if item: - item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] - self.parent.songmanager.delete_song(item_id) - row = self.ListView.row(item) - self.ListView.takeItem(row) + items = self.ListView.selectedIndexes() + if items: + if len(items) > 1: + ans = QtGui.QMessageBox.question(None, + self.trUtf8('Delete Confirmation'), + self.trUtf8('Delete %d songs?' % len(items)), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok| + QtGui.QMessageBox.Cancel), + QtGui.QMessageBox.Ok) + if ans == QtGui.QMessageBox.Cancel: + return + for item in items[:]: + item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] + self.parent.songmanager.delete_song(item_id) + self.ListView.takeItem(item.row()) def generateSlideData(self, service_item): raw_footer = [] @@ -345,4 +354,4 @@ class SongMediaItem(MediaManagerItem): service_item.audit = [ song.title, author_audit, song.copyright, song.ccli_number ] - return True \ No newline at end of file + return True diff --git a/openlp/plugins/songs/lib/sofimport.py b/openlp/plugins/songs/lib/sofimport.py index 63870f35c..df0ffd5bc 100644 --- a/openlp/plugins/songs/lib/sofimport.py +++ b/openlp/plugins/songs/lib/sofimport.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +property# -*- coding: utf-8 -*- # vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 ############################################################################### @@ -32,7 +32,7 @@ import re import os import time -from PyQt4 import QtCore +from PyQt4 import QtCore, QtGui from songimport import SongImport if os.name == u'nt': @@ -44,7 +44,6 @@ if os.name == u'nt': PAGE_BOTH = 6 else: import uno - from com.sun.star.beans import PropertyValue from com.sun.star.awt.FontWeight import BOLD from com.sun.star.awt.FontSlant import ITALIC from com.sun.star.style.BreakType import PAGE_BEFORE, PAGE_AFTER, PAGE_BOTH @@ -273,7 +272,8 @@ class SofImport(object): Add a song number, store as alternate title. Also use the song number to work out which songbook we're in """ - self.song.set_song_number(song_no) + self.song.set_song_number(song_no) + self.song.set_alternate_title(song_no + u'.') if int(song_no) <= 640: self.song.set_song_book(u'Songs of Fellowship 1', u'Kingsway Publications') @@ -313,7 +313,9 @@ class SofImport(object): author2 = authors[i].strip() if author2.find(u' ') == -1 and i < len(authors) - 1: author2 = author2 + u' ' \ - + authors[i + 1].strip().split(u' ')[-1] + + authors[i + 1].strip().split(u' ')[-1] + if author2.endswith(u'.'): + author2 = author2[:-1] self.song.add_author(author2) def add_verse_line(self, text): @@ -337,8 +339,15 @@ class SofImport(object): """ if self.currentverse.strip() == u'': return - if self.is_chorus: - versetag = 'C' + if self.is_chorus: + if not self.song.contains_verse('C'): + versetag = 'C' + elif not self.song.contains_verse('B'): + versetag = 'B' + elif not self.song.contains_verse('E'): + versetag = 'E' + else: + versetag = 'O' splitat = None else: versetag = 'V' diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py index aa9a73fd8..15e8e00eb 100644 --- a/openlp/plugins/songs/lib/songimport.py +++ b/openlp/plugins/songs/lib/songimport.py @@ -46,6 +46,7 @@ class SongImport(object): self.manager = song_manager self.title = u'' self.song_number = u'' + self.alternate_title = u'' self.copyright = u'' self.comment = u'' self.theme_name = u'' @@ -73,7 +74,7 @@ class SongImport(object): def get_song_number(self): """ - Return the song number (also known as alternate title) + Return the song number """ return self.song_number @@ -82,10 +83,16 @@ class SongImport(object): Set the title """ self.title = title - + + def set_alternate_title(self, title): + """ + Set the alternate title + """ + self.alternate_title = title + def set_song_number(self, song_number): """ - Set the song number/alternate title + Set the song number """ self.song_number = song_number @@ -113,8 +120,8 @@ class SongImport(object): def add_verse(self, verse, versetag): """ Add a verse. This is the whole verse, lines split by \n - Verse tag can be V1/C1/B1 etc, or 'V' and 'C' (will count the verses/ - choruses itself) or None, where it will assume verse + Verse tag can be V1/C/B etc, or 'V' (will count the verses/ + itself) or None, where it will assume verse It will also attempt to detect duplicates. In this case it will just add to the verse order """ @@ -122,23 +129,23 @@ class SongImport(object): if oldverse.strip() == verse.strip(): self.verse_order_list.append(oldversetag) return - if versetag == u'C': - self.choruscount += 1 - versetag += unicode(self.choruscount) if versetag == u'V' or not versetag: self.versecount += 1 versetag = u'V' + unicode(self.versecount) - self.verses.append([versetag, verse]) + self.verses.append([versetag, verse.rstrip()]) self.verse_order_list.append(versetag) - if self.choruscount > 0 and not versetag.startswith(u'C'): - self.verse_order_list.append(u'C1') + if versetag.startswith(u'V') and self.contains_verse(u'C'): + self.verse_order_list.append(u'C') def repeat_verse(self): """ Repeat the previous verse in the verse order """ self.verse_order_list.append(self.verse_order_list[-1]) - + + def contains_verse(self, versetag): + return versetag in self.verse_order_list + def check_complete(self): """ Check the mandatory fields are entered (i.e. title and a verse) @@ -173,7 +180,8 @@ class SongImport(object): """ song = Song() song.title = self.title - song.search_title = self.remove_punctuation(self.title) + song.search_title = self.remove_punctuation(self.title) \ + + '@' + self.alternate_title song.song_number = self.song_number song.search_lyrics = u'' sxml = SongXMLBuilder() @@ -235,6 +243,7 @@ class SongImport(object): print u'========================================' \ + u'========================================' print u'TITLE: ' + self.title + print u'ALT TITLE: ' + self.alternate_title for (versetag, versetext) in self.verses: print u'VERSE ' + versetag + u': ' + versetext print u'ORDER: ' + u' '.join(self.verse_order_list) diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index 6d39daa48..3e245690a 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -187,8 +187,16 @@ class SongsPlugin(Plugin): filename = QtGui.QFileDialog.getOpenFileName( None, self.trUtf8('Open Songs of Fellowship file'), u'', u'Songs of Fellowship file (*.rtf *.RTF)') - sofimport = SofImport(self.songmanager) - sofimport.import_sof(unicode(filename)) + try: + sofimport = SofImport(self.songmanager) + sofimport.import_sof(unicode(filename)) + except: + log.exception('Could not import SoF file') + QtGui.QMessageBox.critical(None, + self.ImportSongMenu.trUtf8('Import Error'), + self.ImportSongMenu.trUtf8('Error importing Songs of Fellowship file'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok), + QtGui.QMessageBox.Ok) def onExportOpenlp1ItemClicked(self): self.openlp_export_form.show() From 3ceb0267e986059c5a27a2445c2301d88a6aebec Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sat, 3 Apr 2010 20:17:37 +0100 Subject: [PATCH 2/3] cleanups+multi-song delete --- openlp/plugins/songs/lib/manager.py | 4 ++++ openlp/plugins/songs/lib/mediaitem.py | 24 +++++++++++++----------- openlp/plugins/songs/lib/sofimport.py | 18 ++++++------------ openlp/plugins/songs/lib/songimport.py | 14 +++++++++----- openlp/plugins/songs/songsplugin.py | 5 ++++- 5 files changed, 36 insertions(+), 29 deletions(-) diff --git a/openlp/plugins/songs/lib/manager.py b/openlp/plugins/songs/lib/manager.py index dcb49bfcd..0dfed09b6 100644 --- a/openlp/plugins/songs/lib/manager.py +++ b/openlp/plugins/songs/lib/manager.py @@ -111,12 +111,16 @@ class SongManager(): return False def delete_song(self, songid): + print songid song = self.get_song(songid) + print song.title try: self.session.delete(song) self.session.commit() + print "ok" return True except: + print "error" self.session.rollback() log.exception(u'Could not delete song from song database') return False diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 145646a02..1ce69f407 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -273,19 +273,21 @@ class SongMediaItem(MediaManagerItem): def onDeleteClick(self): items = self.ListView.selectedIndexes() if items: - if len(items) > 1: - ans = QtGui.QMessageBox.question(None, - self.trUtf8('Delete Confirmation'), - self.trUtf8('Delete %d songs?' % len(items)), - QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok| - QtGui.QMessageBox.Cancel), - QtGui.QMessageBox.Ok) - if ans == QtGui.QMessageBox.Cancel: - return - for item in items[:]: + if len(items) == 1: + del_message = self.trUtf8('Delete song?') + else: + del_message = self.trUtf8('Delete %d song?' % len(items)) + ans = QtGui.QMessageBox.question(None, + self.trUtf8('Delete Confirmation'), del_message, + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok| + QtGui.QMessageBox.Cancel), + QtGui.QMessageBox.Ok) + if ans == QtGui.QMessageBox.Cancel: + return + for item in items: item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] self.parent.songmanager.delete_song(item_id) - self.ListView.takeItem(item.row()) + self.onSearchTextButtonClick() def generateSlideData(self, service_item): raw_footer = [] diff --git a/openlp/plugins/songs/lib/sofimport.py b/openlp/plugins/songs/lib/sofimport.py index df0ffd5bc..6fb3cfb6e 100644 --- a/openlp/plugins/songs/lib/sofimport.py +++ b/openlp/plugins/songs/lib/sofimport.py @@ -32,7 +32,7 @@ property# -*- coding: utf-8 -*- import re import os import time -from PyQt4 import QtCore, QtGui +from PyQt4 import QtCore from songimport import SongImport if os.name == u'nt': @@ -315,8 +315,9 @@ class SofImport(object): author2 = author2 + u' ' \ + authors[i + 1].strip().split(u' ')[-1] if author2.endswith(u'.'): - author2 = author2[:-1] - self.song.add_author(author2) + author2 = author2[:-1] + if author2: + self.song.add_author(author2) def add_verse_line(self, text): """ @@ -340,17 +341,10 @@ class SofImport(object): if self.currentverse.strip() == u'': return if self.is_chorus: - if not self.song.contains_verse('C'): - versetag = 'C' - elif not self.song.contains_verse('B'): - versetag = 'B' - elif not self.song.contains_verse('E'): - versetag = 'E' - else: - versetag = 'O' + versetag = u'C' splitat = None else: - versetag = 'V' + versetag = u'V' splitat = self.verse_splits(self.song.get_song_number()) if splitat: ln = 0 diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py index 15e8e00eb..6adfcad7f 100644 --- a/openlp/plugins/songs/lib/songimport.py +++ b/openlp/plugins/songs/lib/songimport.py @@ -120,22 +120,26 @@ class SongImport(object): def add_verse(self, verse, versetag): """ Add a verse. This is the whole verse, lines split by \n - Verse tag can be V1/C/B etc, or 'V' (will count the verses/ - itself) or None, where it will assume verse + Verse tag can be V1/C1/B etc, or 'V' and 'C' (will count the verses/ + choruses itself) or None, where it will assume verse It will also attempt to detect duplicates. In this case it will just add to the verse order """ for (oldversetag, oldverse) in self.verses: if oldverse.strip() == verse.strip(): self.verse_order_list.append(oldversetag) - return + return + if versetag.startswith(u'C'): + self.choruscount += 1 + if versetag == u'C': + versetag += unicode(self.choruscount) if versetag == u'V' or not versetag: self.versecount += 1 versetag = u'V' + unicode(self.versecount) self.verses.append([versetag, verse.rstrip()]) self.verse_order_list.append(versetag) - if versetag.startswith(u'V') and self.contains_verse(u'C'): - self.verse_order_list.append(u'C') + if versetag.startswith(u'V') and self.contains_verse(u'C1'): + self.verse_order_list.append(u'C1') def repeat_verse(self): """ diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index 3e245690a..d7c0aa7ca 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -194,7 +194,10 @@ class SongsPlugin(Plugin): log.exception('Could not import SoF file') QtGui.QMessageBox.critical(None, self.ImportSongMenu.trUtf8('Import Error'), - self.ImportSongMenu.trUtf8('Error importing Songs of Fellowship file'), + self.ImportSongMenu.trUtf8('Error importing Songs of ' + + 'Fellowship file.\nOpenOffice.org must be installed' + + ' and you must be using an unedited copy of the RTF' + + ' included with the Songs of Fellowship Music Editions'), QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok), QtGui.QMessageBox.Ok) From 728c524ff5f893bf13f1e7cafc496098b1a07bb6 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sun, 4 Apr 2010 09:26:53 +0100 Subject: [PATCH 3/3] fixes --- openlp/plugins/songs/lib/mediaitem.py | 4 ++-- openlp/plugins/songs/lib/sofimport.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 4ca4eb697..e2b1dbf80 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -276,8 +276,8 @@ class SongMediaItem(MediaManagerItem): if len(items) == 1: del_message = self.trUtf8('Delete song?') else: - del_message = self.trUtf8('Delete %d song?' % len(items)) - ans = QtGui.QMessageBox.question(None, + del_message = unicode(self.trUtf8('Delete %d song?')) % len(items) + ans = QtGui.QMessageBox.question(self, self.trUtf8('Delete Confirmation'), del_message, QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok| QtGui.QMessageBox.Cancel), diff --git a/openlp/plugins/songs/lib/sofimport.py b/openlp/plugins/songs/lib/sofimport.py index c30f535e0..ed5bb095d 100644 --- a/openlp/plugins/songs/lib/sofimport.py +++ b/openlp/plugins/songs/lib/sofimport.py @@ -1,4 +1,4 @@ -property# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- # vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 ###############################################################################