Database refactoring

This commit is contained in:
Jon Tibble 2010-06-30 23:05:51 +01:00
parent eda9093064
commit 079d72f93f
9 changed files with 84 additions and 148 deletions

View File

@ -166,17 +166,17 @@ class Manager(object):
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 @@ class Manager(object):
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):
"""

View File

@ -299,11 +299,10 @@ class BibleDB(QtCore.QObject, Manager):
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):

View File

@ -78,8 +78,7 @@ class CustomPlugin(Plugin):
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

View File

@ -30,7 +30,7 @@ from PyQt4 import QtCore, QtGui
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__)

View File

@ -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 @@ class VerseType(object):
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

View File

@ -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()

View File

@ -165,18 +165,21 @@ class SongMediaItem(MediaManagerItem):
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

View File

@ -302,8 +302,8 @@ class SongImport(object):
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 @@ class SongImport(object):
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 @@ class SongImport(object):
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

View File

@ -29,7 +29,8 @@ from PyQt4 import QtCore, QtGui
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 @@ class SongsPlugin(Plugin):
"""
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 @@ class SongsPlugin(Plugin):
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 @@ class SongsPlugin(Plugin):
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