From 2592d6f698cbddffcfe84b7b73f358b8041123cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Sun, 26 Feb 2012 22:27:05 +0100 Subject: [PATCH 1/6] add possibility to search for songbook and songnumber --- openlp/plugins/songs/lib/mediaitem.py | 39 +++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index ab95d794f..62a48521c 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -43,7 +43,7 @@ from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm, \ SongImportForm, SongExportForm from openlp.plugins.songs.lib import OpenLyrics, SongXML, VerseType, \ clean_string -from openlp.plugins.songs.lib.db import Author, Song, MediaFile +from openlp.plugins.songs.lib.db import Author, Song, Book, MediaFile from openlp.plugins.songs.lib.ui import SongStrings log = logging.getLogger(__name__) @@ -56,7 +56,8 @@ class SongSearch(object): Titles = 2 Lyrics = 3 Authors = 4 - Themes = 5 + Books = 5 + Themes = 6 class SongMediaItem(MediaManagerItem): @@ -158,6 +159,8 @@ class SongMediaItem(MediaManagerItem): translate('SongsPlugin.MediaItem', 'Lyrics')), (SongSearch.Authors, u':/songs/song_search_author.png', SongStrings.Authors), + (SongSearch.Books, u':/songs/song_book_edit.png', + SongStrings.SongBooks), (SongSearch.Themes, u':/slides/slide_theme.png', UiStrings().Themes) ]) self.searchTextEdit.setCurrentSearchType(QtCore.QSettings().value( @@ -196,6 +199,19 @@ class SongMediaItem(MediaManagerItem): Author.display_name.like(u'%' + search_keywords + u'%'), Author.display_name.asc()) self.displayResultsAuthor(search_results) + elif search_type == SongSearch.Books: + log.debug(u'Books Search') + search_results = self.plugin.manager.get_all_objects(Book, + Book.name.like(u'%' + search_keywords + u'%'), + Book.name.asc()) + song_number = False + if not search_results: + search_keywords = search_keywords.rpartition(' ') + search_results = self.plugin.manager.get_all_objects(Book, + Book.name.like(u'%' + search_keywords[0] + u'%'), + Book.name.asc()) + song_number = re.sub(r'[^0-9]', u'', search_keywords[2]) + self.displayResultsBook(search_results, song_number) elif search_type == SongSearch.Themes: log.debug(u'Theme Search') search_results = self.plugin.manager.get_all_objects(Song, @@ -270,6 +286,25 @@ class SongMediaItem(MediaManagerItem): song_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(song.id)) self.listView.addItem(song_name) + def displayResultsBook(self, searchresults, song_number=False): + log.debug(u'display results Book') + self.listView.clear() + for book in searchresults: + songs = sorted(book.songs, key=lambda song: int( + re.sub(r'[^0-9]', u' ', song.song_number).partition(' ')[0]) + if len(re.sub(r'[^\w]', ' ', song.song_number)) else 0) + for song in songs: + # Do not display temporary songs + if song.temporary: + continue + if song_number and not song_number in song.song_number: + continue + song_detail = u'%s - %s (%s)' % (book.name, song.song_number, + song.title) + song_name = QtGui.QListWidgetItem(song_detail) + song_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(song.id)) + self.listView.addItem(song_name) + def onClearTextButtonClick(self): """ Clear the search text. From b56d8d2a061aa52511cab2763c64230b42fc65e6 Mon Sep 17 00:00:00 2001 From: Rastislav Pecik Date: Mon, 27 Feb 2012 01:42:35 +0100 Subject: [PATCH 2/6] Fixed connection to mysql to use UTF8 encoding. Fixes: https://launchpad.net/bugs/941692 --- openlp/core/lib/db.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index d7ca10f0f..30b41a6b5 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -193,6 +193,12 @@ class Manager(object): else: self.db_url = u'sqlite:///%s/%s.sqlite' % ( AppLocation.get_section_data_path(plugin_name), plugin_name) + elif db_type == u'mysql' : + self.db_url = u'%s://%s:%s@%s/%s?charset=utf8' % (db_type, + urlquote(unicode(settings.value(u'db username').toString())), + urlquote(unicode(settings.value(u'db password').toString())), + urlquote(unicode(settings.value(u'db hostname').toString())), + urlquote(unicode(settings.value(u'db database').toString()))) else: self.db_url = u'%s://%s:%s@%s/%s' % (db_type, urlquote(unicode(settings.value(u'db username').toString())), From c024e9e47d989855418f3e20aa564fa1a6b1b889 Mon Sep 17 00:00:00 2001 From: Rastislav Pecik Date: Mon, 27 Feb 2012 19:18:52 +0100 Subject: [PATCH 3/6] Exported mysql charset settings to configuration files and cleaned up the code --- openlp/core/lib/db.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index 30b41a6b5..36823b118 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -193,18 +193,18 @@ class Manager(object): else: self.db_url = u'sqlite:///%s/%s.sqlite' % ( AppLocation.get_section_data_path(plugin_name), plugin_name) - elif db_type == u'mysql' : - self.db_url = u'%s://%s:%s@%s/%s?charset=utf8' % (db_type, - urlquote(unicode(settings.value(u'db username').toString())), - urlquote(unicode(settings.value(u'db password').toString())), - urlquote(unicode(settings.value(u'db hostname').toString())), - urlquote(unicode(settings.value(u'db database').toString()))) else: self.db_url = u'%s://%s:%s@%s/%s' % (db_type, urlquote(unicode(settings.value(u'db username').toString())), urlquote(unicode(settings.value(u'db password').toString())), urlquote(unicode(settings.value(u'db hostname').toString())), urlquote(unicode(settings.value(u'db database').toString()))) + if db_type == u'mysql': + db_encoding = unicode( + settings.value(u'db encoding').toString()) + if db_encoding == "": + db_encoding = u'utf8' + self.db_url += u'?charset=%s' % (urlquote(db_encoding)) settings.endGroup() if upgrade_mod: db_ver, up_ver = upgrade_db(self.db_url, upgrade_mod) From 6ec167ed83b13f84f3307194509f7634d03a008f Mon Sep 17 00:00:00 2001 From: Rastislav Pecik Date: Tue, 28 Feb 2012 12:12:52 +0100 Subject: [PATCH 4/6] QSettings.value() now uses second argument for default value, which is utf8 --- openlp/core/lib/db.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index 36823b118..a4a047497 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -201,9 +201,7 @@ class Manager(object): urlquote(unicode(settings.value(u'db database').toString()))) if db_type == u'mysql': db_encoding = unicode( - settings.value(u'db encoding').toString()) - if db_encoding == "": - db_encoding = u'utf8' + settings.value(u'db encoding', u'utf8').toString()) self.db_url += u'?charset=%s' % (urlquote(db_encoding)) settings.endGroup() if upgrade_mod: From 271c4ef1a41a18b18707d6d4509ee5069eee93b9 Mon Sep 17 00:00:00 2001 From: Rastislav Pecik Date: Tue, 28 Feb 2012 12:30:30 +0100 Subject: [PATCH 5/6] using QtCore.QVariant object as a second argument in settings.value method --- openlp/core/lib/db.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index a4a047497..6eff984c3 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -201,7 +201,7 @@ class Manager(object): urlquote(unicode(settings.value(u'db database').toString()))) if db_type == u'mysql': db_encoding = unicode( - settings.value(u'db encoding', u'utf8').toString()) + settings.value(u'db encoding', QtCore.QVariant(u'utf8')).toString()) self.db_url += u'?charset=%s' % (urlquote(db_encoding)) settings.endGroup() if upgrade_mod: From 8818256b2a99d0b8a3805495ff47232a6ad054f0 Mon Sep 17 00:00:00 2001 From: Rastislav Pecik Date: Tue, 28 Feb 2012 15:06:14 +0100 Subject: [PATCH 6/6] Fixed code according to mrege proposal comments --- openlp/core/lib/db.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index 6eff984c3..436ea82de 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -201,8 +201,8 @@ class Manager(object): urlquote(unicode(settings.value(u'db database').toString()))) if db_type == u'mysql': db_encoding = unicode( - settings.value(u'db encoding', QtCore.QVariant(u'utf8')).toString()) - self.db_url += u'?charset=%s' % (urlquote(db_encoding)) + settings.value(u'db encoding', u'utf8').toString()) + self.db_url += u'?charset=%s' % urlquote(db_encoding) settings.endGroup() if upgrade_mod: db_ver, up_ver = upgrade_db(self.db_url, upgrade_mod)