openlp-core team mailing list archive
-
openlp-core team
-
Mailing list archive
-
Message #02240
[Merge] lp:~meths/openlp/trivialfixes into lp:openlp
Jon Tibble has proposed merging lp:~meths/openlp/trivialfixes into lp:openlp.
Requested reviews:
OpenLP Core (openlp-core)
Database refactoring:
* Prefer python object filter clauses in queries
* Move another plugin to generic methods and remove its manager.py
--
https://code.launchpad.net/~meths/openlp/trivialfixes/+merge/28942
Your team OpenLP Core is requested to review the proposed merge of lp:~meths/openlp/trivialfixes into lp:openlp.
=== modified file 'openlp/core/lib/db.py'
--- openlp/core/lib/db.py 2010-06-28 13:38:29 +0000
+++ openlp/core/lib/db.py 2010-06-30 22:10:46 +0000
@@ -166,17 +166,17 @@
else:
return self.session.query(object_class).get(key)
- def get_object_filtered(self, object_class, filter_string):
+ def get_object_filtered(self, object_class, filter_clause):
"""
Returns an object matching specified criteria
``object_class``
The type of object to return
- ``filter_string``
+ ``filter_clause``
The criteria to select the object by
"""
- return self.session.query(object_class).filter(filter_string).first()
+ return self.session.query(object_class).filter(filter_clause).first()
def get_all_objects(self, object_class, order_by_ref=None):
"""
@@ -192,17 +192,24 @@
return self.session.query(object_class).order_by(order_by_ref).all()
return self.session.query(object_class).all()
- def get_all_objects_filtered(self, object_class, filter_string):
+ def get_all_objects_filtered(self, object_class, filter_clause,
+ order_by_ref=None):
"""
Returns a selection of objects from the database
``object_class``
The type of objects to return
- ``filter_string``
+ ``filter_clause``
The filter governing selection of objects to return
+
+ ``order_by_ref``
+ Any parameters to order the returned objects by. Defaults to None.
"""
- return self.session.query(object_class).filter(filter_string).all()
+ if order_by_ref:
+ return self.session.query(object_class).filter(filter_clause) \
+ .order_by(order_by_ref).all()
+ return self.session.query(object_class).filter(filter_clause).all()
def delete_object(self, object_class, key):
"""
=== modified file 'openlp/plugins/bibles/lib/db.py'
--- openlp/plugins/bibles/lib/db.py 2010-06-28 13:38:29 +0000
+++ openlp/plugins/bibles/lib/db.py 2010-06-30 22:10:46 +0000
@@ -299,11 +299,10 @@
The name of the book to return
"""
log.debug(u'BibleDb.get_book("%s")', book)
- db_book = self.session.query(Book).filter(
- Book.name.like(book + u'%')).first()
+ db_book = self.get_object_filtered(Book, Book.name.like(book + u'%'))
if db_book is None:
- db_book = self.session.query(Book).filter(
- Book.abbreviation.like(book + u'%')).first()
+ db_book = self.get_object_filtered(Book,
+ Book.abbreviation.like(book + u'%'))
return db_book
def get_verses(self, reference_list):
=== modified file 'openlp/plugins/custom/customplugin.py'
--- openlp/plugins/custom/customplugin.py 2010-06-30 18:16:07 +0000
+++ openlp/plugins/custom/customplugin.py 2010-06-30 22:10:46 +0000
@@ -78,8 +78,7 @@
return about_text
def can_delete_theme(self, theme):
- filter_string = u'theme_name=\'%s\'' % theme
if not self.custommanager.get_all_objects_filtered(CustomSlide,
- filter_string):
+ CustomSlide.theme_name == theme):
return True
return False
=== modified file 'openlp/plugins/songs/forms/songimportform.py'
--- openlp/plugins/songs/forms/songimportform.py 2010-06-21 16:43:59 +0000
+++ openlp/plugins/songs/forms/songimportform.py 2010-06-30 22:10:46 +0000
@@ -30,7 +30,7 @@
from songimportwizard import Ui_SongImportWizard
from openlp.core.lib import Receiver, SettingsManager, translate
#from openlp.core.utils import AppLocation
-from openlp.plugins.songs.lib.manager import SongFormat
+from openlp.plugins.songs.lib import SongFormat
log = logging.getLogger(__name__)
=== modified file 'openlp/plugins/songs/lib/__init__.py'
--- openlp/plugins/songs/lib/__init__.py 2010-06-24 20:48:38 +0000
+++ openlp/plugins/songs/lib/__init__.py 2010-06-30 22:10:46 +0000
@@ -25,6 +25,52 @@
from openlp.core.lib import translate
+#from openlp.plugins.songs.lib import OpenLyricsSong, OpenSongSong, CCLISong, \
+# CSVSong
+
+class SongFormat(object):
+ """
+ This is a special enumeration class that holds the various types of songs,
+ plus a few helper functions to facilitate generic handling of song types
+ for importing.
+ """
+ Unknown = -1
+ OpenLyrics = 0
+ OpenSong = 1
+ CCLI = 2
+ CSV = 3
+
+ @staticmethod
+ def get_class(id):
+ """
+ Return the appropriate imeplementation class.
+
+ ``id``
+ The song format.
+ """
+# if id == SongFormat.OpenLyrics:
+# return OpenLyricsSong
+# elif id == SongFormat.OpenSong:
+# return OpenSongSong
+# elif id == SongFormat.CCLI:
+# return CCLISong
+# elif id == SongFormat.CSV:
+# return CSVSong
+# else:
+ return None
+
+ @staticmethod
+ def list():
+ """
+ Return a list of the supported song formats.
+ """
+ return [
+ SongFormat.OpenLyrics,
+ SongFormat.OpenSong,
+ SongFormat.CCLI,
+ SongFormat.CSV
+ ]
+
class VerseType(object):
"""
VerseType provides an enumeration for the tags that may be associated
@@ -91,7 +137,6 @@
unicode(VerseType.to_string(VerseType.Other)).lower():
return VerseType.Other
-from manager import SongManager
from songstab import SongsTab
from mediaitem import SongMediaItem
from songimport import SongImport
=== removed file 'openlp/plugins/songs/lib/manager.py'
--- openlp/plugins/songs/lib/manager.py 2010-06-15 18:08:02 +0000
+++ openlp/plugins/songs/lib/manager.py 1970-01-01 00:00:00 +0000
@@ -1,116 +0,0 @@
-# -*- coding: utf-8 -*-
-# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
-
-###############################################################################
-# OpenLP - Open Source Lyrics Projection #
-# --------------------------------------------------------------------------- #
-# Copyright (c) 2008-2010 Raoul Snyman #
-# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael #
-# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin #
-# Thompson, Jon Tibble, Carsten Tinggaard #
-# --------------------------------------------------------------------------- #
-# This program is free software; you can redistribute it and/or modify it #
-# under the terms of the GNU General Public License as published by the Free #
-# Software Foundation; version 2 of the License. #
-# #
-# This program is distributed in the hope that it will be useful, but WITHOUT #
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
-# more details. #
-# #
-# You should have received a copy of the GNU General Public License along #
-# with this program; if not, write to the Free Software Foundation, Inc., 59 #
-# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
-###############################################################################
-
-import logging
-
-from openlp.core.lib.db import Manager
-from openlp.plugins.songs.lib.db import init_schema, Song, Author
-#from openlp.plugins.songs.lib import OpenLyricsSong, OpenSongSong, CCLISong, \
-# CSVSong
-
-log = logging.getLogger(__name__)
-
-class SongFormat(object):
- """
- This is a special enumeration class that holds the various types of songs,
- plus a few helper functions to facilitate generic handling of song types
- for importing.
- """
- Unknown = -1
- OpenLyrics = 0
- OpenSong = 1
- CCLI = 2
- CSV = 3
-
- @staticmethod
- def get_class(id):
- """
- Return the appropriate imeplementation class.
-
- ``id``
- The song format.
- """
-# if id == SongFormat.OpenLyrics:
-# return OpenLyricsSong
-# elif id == SongFormat.OpenSong:
-# return OpenSongSong
-# elif id == SongFormat.CCLI:
-# return CCLISong
-# elif id == SongFormat.CSV:
-# return CSVSong
-# else:
- return None
-
- @staticmethod
- def list():
- """
- Return a list of the supported song formats.
- """
- return [
- SongFormat.OpenLyrics,
- SongFormat.OpenSong,
- SongFormat.CCLI,
- SongFormat.CSV
- ]
-
-
-class SongManager(Manager):
- """
- The Song Manager provides a central location for all database code. This
- class takes care of connecting to the database and running all the queries.
- """
- log.info(u'Song manager loaded')
-
- def __init__(self):
- """
- Creates the connection to the database, and creates the tables if they
- don't exist.
- """
- log.debug(u'Song Initialising')
- Manager.__init__(self, u'songs', init_schema)
- log.debug(u'Song Initialised')
-
- def search_song_title(self, keywords):
- """
- Searches the song title for keywords.
- """
- return self.session.query(Song).filter(
- Song.search_title.like(u'%' + keywords + u'%')).order_by(
- Song.search_title.asc()).all()
-
- def search_song_lyrics(self, keywords):
- """
- Searches the song lyrics for keywords.
- """
- return self.session.query(Song).filter(
- Song.search_lyrics.like(u'%' + keywords + u'%')).order_by(
- Song.search_lyrics.asc()).all()
-
- def get_song_from_author(self, keywords):
- """
- Searches the song authors for keywords.
- """
- return self.session.query(Author).filter(Author.display_name.like(
- u'%' + keywords + u'%')).order_by(Author.display_name.asc()).all()
=== modified file 'openlp/plugins/songs/lib/mediaitem.py'
--- openlp/plugins/songs/lib/mediaitem.py 2010-06-25 00:30:26 +0000
+++ openlp/plugins/songs/lib/mediaitem.py 2010-06-30 22:10:46 +0000
@@ -165,18 +165,21 @@
search_type = self.SearchTypeComboBox.currentIndex()
if search_type == 0:
log.debug(u'Titles Search')
- search_results = self.parent.manager.search_song_title(
- search_keywords)
+ search_results = self.parent.manager.get_all_objects_filtered(Song,
+ Song.search_title.like(u'%' + keywords + u'%'),
+ Song.search_title.asc())
self.displayResultsSong(search_results)
elif search_type == 1:
log.debug(u'Lyrics Search')
- search_results = self.parent.manager.search_song_lyrics(
- search_keywords)
+ search_results = self.parent.manager.get_all_objects_filtered(Song,
+ Song.search_lyrics.like(u'%' + keywords + u'%'),
+ Song.search_lyrics.asc())
self.displayResultsSong(search_results)
elif search_type == 2:
log.debug(u'Authors Search')
- search_results = self.parent.manager.get_song_from_author(
- search_keywords)
+ search_results = self.parent.manager.get_all_objects_filtered(
+ Author, Author.display_name.like(u'%' + search_keywords + u'%'),
+ Author.display_name.asc())
self.displayResultsAuthor(search_results)
#Called to redisplay the song list screen edith from a search
#or from the exit of the Song edit dialog. If remote editing is active
=== modified file 'openlp/plugins/songs/lib/songimport.py'
--- openlp/plugins/songs/lib/songimport.py 2010-06-28 13:38:29 +0000
+++ openlp/plugins/songs/lib/songimport.py 2010-06-30 22:10:46 +0000
@@ -302,8 +302,8 @@
song.theme_name = self.theme_name
song.ccli_number = self.ccli_number
for authortext in self.authors:
- filter_string = u'display_name=%s' % authortext
- author = self.manager.get_object_filtered(Author, filter_string)
+ author = self.manager.get_object_filtered(Author,
+ Author.display_name == authortext)
if author is None:
author = Author()
author.display_name = authortext
@@ -312,8 +312,8 @@
self.manager.save_object(author)
song.authors.append(author)
if self.song_book_name:
- filter_string = u'name=%s' % self.song_book_name
- song_book = self.manager.get_object_filtered(Book, filter_string)
+ song_book = self.manager.get_object_filtered(Book,
+ Book.name == self.song_book_name)
if song_book is None:
song_book = Book()
song_book.name = self.song_book_name
@@ -321,8 +321,8 @@
self.manager.save_object(song_book)
song.song_book_id = song_book.id
for topictext in self.topics:
- filter_string = u'name=%s' % topictext
- topic = self.manager.get_object_filtered(Topic, filter_string)
+ topic = self.manager.get_object_filtered(Topic,
+ Topic.name == topictext)
if topic is None:
topic = Topic()
topic.name = topictext
=== modified file 'openlp/plugins/songs/songsplugin.py'
--- openlp/plugins/songs/songsplugin.py 2010-06-30 18:16:07 +0000
+++ openlp/plugins/songs/songsplugin.py 2010-06-30 22:10:46 +0000
@@ -29,7 +29,8 @@
from openlp.core.lib import Plugin, build_icon, PluginStatus, Receiver, \
translate
-from openlp.plugins.songs.lib import SongManager, SongMediaItem, SongsTab
+from openlp.core.lib.db import Manager
+from openlp.plugins.songs.lib import SongMediaItem, SongsTab
from openlp.plugins.songs.lib.db import Song
try:
@@ -56,7 +57,7 @@
"""
Plugin.__init__(self, u'Songs', u'1.9.2', plugin_helpers)
self.weight = -10
- self.manager = SongManager()
+ self.manager = Manager(u'songs', init_schema)
self.icon = build_icon(u':/plugins/plugin_songs.png')
self.status = PluginStatus.Active
@@ -65,8 +66,6 @@
def initialise(self):
log.info(u'Songs Initialising')
- #if self.songmanager is None:
- # self.songmanager = SongManager()
Plugin.initialise(self)
self.insert_toolbox_item()
self.media_item.displayResultsSong(
@@ -199,7 +198,7 @@
return about_text
def can_delete_theme(self, theme):
- filter_string = u'theme_name=\'%s\'' % theme
- if not self.manager.get_all_objects_filtered(Song, filter_string):
+ if not self.manager.get_all_objects_filtered(Song,
+ Song.theme_name == theme):
return True
return False
Follow ups