forked from openlp/openlp
Updating the SongsManager to use SQLAlchemy
bzr-revno: 284
This commit is contained in:
parent
7022a05316
commit
11bede8fd8
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE UserProject SYSTEM "UserProject-4.0.dtd">
|
<!DOCTYPE UserProject SYSTEM "UserProject-4.0.dtd">
|
||||||
<!-- eric4 user project file for project openlp.org 2.0 -->
|
<!-- eric4 user project file for project openlp.org 2.0 -->
|
||||||
<!-- Saved: 2009-01-03, 01:14:22 -->
|
<!-- Saved: 2009-01-17, 13:06:08 -->
|
||||||
<!-- Copyright (C) 2009 Raoul Snyman, raoulsnyman@openlp.org -->
|
<!-- Copyright (C) 2009 Raoul Snyman, raoulsnyman@openlp.org -->
|
||||||
<UserProject version="4.0">
|
<UserProject version="4.0">
|
||||||
</UserProject>
|
</UserProject>
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE Tasks SYSTEM "Tasks-4.2.dtd">
|
<!DOCTYPE Tasks SYSTEM "Tasks-4.2.dtd">
|
||||||
<!-- eric4 tasks file for project openlp.org 2.0 -->
|
<!-- eric4 tasks file for project openlp.org 2.0 -->
|
||||||
<!-- Saved: 2009-01-03, 01:14:23 -->
|
<!-- Saved: 2009-01-17, 13:06:08 -->
|
||||||
<Tasks version="4.2">
|
<Tasks version="4.2">
|
||||||
<Task priority="1" completed="False" bugfix="False">
|
<Task priority="1" completed="False" bugfix="False">
|
||||||
<Summary>TODO: what is the tags for bridge, pre-chorus?</Summary>
|
<Summary>TODO: what is the tags for bridge, pre-chorus?</Summary>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE Project SYSTEM "Project-4.4.dtd">
|
<!DOCTYPE Project SYSTEM "Project-4.4.dtd">
|
||||||
<!-- eric4 project file for project openlp.org 2.0 -->
|
<!-- eric4 project file for project openlp.org 2.0 -->
|
||||||
<!-- Saved: 2009-01-03, 01:14:22 -->
|
<!-- Saved: 2009-01-17, 13:05:58 -->
|
||||||
<!-- Copyright (C) 2009 Raoul Snyman, raoulsnyman@openlp.org -->
|
<!-- Copyright (C) 2009 Raoul Snyman, raoulsnyman@openlp.org -->
|
||||||
<Project version="4.4">
|
<Project version="4.4">
|
||||||
<ProgLanguage mixed="0">Python</ProgLanguage>
|
<ProgLanguage mixed="0">Python</ProgLanguage>
|
||||||
@ -65,9 +65,7 @@
|
|||||||
<Source>openlp/core/test/testplugins/testplugin2/testplugin2.py</Source>
|
<Source>openlp/core/test/testplugins/testplugin2/testplugin2.py</Source>
|
||||||
<Source>openlp/plugins/bibles/bibleplugin.py</Source>
|
<Source>openlp/plugins/bibles/bibleplugin.py</Source>
|
||||||
<Source>openlp/plugins/bibles/forms/bibleimportdialog.py</Source>
|
<Source>openlp/plugins/bibles/forms/bibleimportdialog.py</Source>
|
||||||
<Source>openlp/plugins/bibles/forms/bibleimportprogressform.py</Source>
|
|
||||||
<Source>openlp/plugins/bibles/forms/bibleimportform.py</Source>
|
<Source>openlp/plugins/bibles/forms/bibleimportform.py</Source>
|
||||||
<Source>openlp/plugins/bibles/forms/bibleimportprogressdialog.py</Source>
|
|
||||||
<Source>openlp/plugins/bibles/lib/biblemanager.py</Source>
|
<Source>openlp/plugins/bibles/lib/biblemanager.py</Source>
|
||||||
<Source>openlp/plugins/bibles/lib/bibleDBimpl.py</Source>
|
<Source>openlp/plugins/bibles/lib/bibleDBimpl.py</Source>
|
||||||
<Source>openlp/plugins/bibles/lib/bibleOSISimpl.py</Source>
|
<Source>openlp/plugins/bibles/lib/bibleOSISimpl.py</Source>
|
||||||
@ -113,6 +111,8 @@
|
|||||||
<Source>openlp/migration/migratesongs.py</Source>
|
<Source>openlp/migration/migratesongs.py</Source>
|
||||||
<Source>openlp/migration/display.py</Source>
|
<Source>openlp/migration/display.py</Source>
|
||||||
<Source>openlp/migration/migratebibles.py</Source>
|
<Source>openlp/migration/migratebibles.py</Source>
|
||||||
|
<Source>openlp/plugins/songs/lib/songclasses.py</Source>
|
||||||
|
<Source>openlp/plugins/songs/lib/songtables.py</Source>
|
||||||
</Sources>
|
</Sources>
|
||||||
<Forms>
|
<Forms>
|
||||||
<Form>resources/forms/openlpexportform.ui</Form>
|
<Form>resources/forms/openlpexportform.ui</Form>
|
||||||
|
@ -27,7 +27,7 @@ from songbookform import SongBookForm
|
|||||||
|
|
||||||
from editsongdialog import Ui_EditSongDialog
|
from editsongdialog import Ui_EditSongDialog
|
||||||
|
|
||||||
from openlp.plugins.songs.lib.songtable import *
|
from openlp.plugins.songs.lib.models import Session, Song, Author, Topic
|
||||||
|
|
||||||
class EditSongForm(QWidget, Ui_EditSongDialog):
|
class EditSongForm(QWidget, Ui_EditSongDialog):
|
||||||
"""
|
"""
|
||||||
|
@ -23,10 +23,10 @@ from sqlalchemy.orm import scoped_session, sessionmaker, mapper, relation
|
|||||||
from openlp.plugins.songs.lib.tables import *
|
from openlp.plugins.songs.lib.tables import *
|
||||||
from openlp.plugins.songs.lib.classes import *
|
from openlp.plugins.songs.lib.classes import *
|
||||||
|
|
||||||
Session = None
|
session = None
|
||||||
|
|
||||||
def init_models(url):
|
def init_models(url):
|
||||||
Session = scoped_session(sessionmaker(autoflush=True, autocommit=False,
|
session = scoped_session(sessionmaker(autoflush=True, autocommit=False,
|
||||||
bind=create_engine(url)))
|
bind=create_engine(url)))
|
||||||
|
|
||||||
|
|
||||||
|
@ -21,215 +21,121 @@ Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
import os, os.path
|
import os, os.path
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from songDBimpl import SongDBImpl
|
from sqlalchemy.orm import asc, desc, like
|
||||||
|
from openlp.plugins.songs.lib.models import init_models, metadata, session, \
|
||||||
|
songs_table, Song, Author, Topic
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
class SongManager():
|
class SongManager():
|
||||||
|
"""
|
||||||
|
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.
|
||||||
|
"""
|
||||||
|
|
||||||
global log
|
global log
|
||||||
log=logging.getLogger("SongManager")
|
log=logging.getLogger("SongManager")
|
||||||
log.info("Song manager loaded")
|
log.info("Song manager loaded")
|
||||||
|
|
||||||
def __init__(self, config):
|
def __init__(self, config):
|
||||||
"""
|
"""
|
||||||
Finds all the bibles defined for the system
|
Creates the connection to the database, and creates the tables if they
|
||||||
Creates an Interface Object for each bible containing connection information
|
don't exist.
|
||||||
Throws Exception if no Bibles are found.
|
|
||||||
|
|
||||||
Init confirms the bible exists and stores the database path.
|
|
||||||
"""
|
"""
|
||||||
self.config = config
|
self.config = config
|
||||||
log.debug( "Song Initialising")
|
log.debug( "Song Initialising")
|
||||||
self.songDBCache = None
|
self.db_url = u''
|
||||||
self.authorcache = None
|
db_type = self.config.get_db_type()
|
||||||
self.songPath = self.config.get_data_path()
|
if db_type == u'sqlite':
|
||||||
self.songSuffix = "sqlite"
|
self.db_url = u'sqlite://' + self.config.get_data_path() + \
|
||||||
log.debug("Song Path %s and suffix %s", self.songPath, self.songSuffix )
|
u'songs.sqlite'
|
||||||
self.dialogobject = None
|
else:
|
||||||
|
self.db_url = self.config.get_db_type + 'u://' + \
|
||||||
files = self.config.get_files(self.songSuffix)
|
self.config.get_db_username + u':' + \
|
||||||
if len(files) > 0:
|
self.config.get_db_password + u'@' + \
|
||||||
log.debug("Song File %s", files )
|
self.config.get_db_hostname + u'/' + \
|
||||||
self.songDBCache = SongDBImpl(self.songPath,files[0], self.songSuffix)
|
self.config.get_db_database
|
||||||
|
ini_models(self.db_url)
|
||||||
|
if not songs_table.exists():
|
||||||
|
metadata.create_all()
|
||||||
log.debug( "Song Initialised")
|
log.debug( "Song Initialised")
|
||||||
|
|
||||||
def have_song_database(self):
|
|
||||||
if self.songDBCache == None:
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
def process_dialog(self, dialogobject):
|
def process_dialog(self, dialogobject):
|
||||||
self.dialogobject = dialogobject
|
self.dialogobject = dialogobject
|
||||||
|
|
||||||
def get_song(self, songid):
|
def get_songs(self):
|
||||||
"""
|
"""
|
||||||
Returns the details of a song
|
Returns the details of a song
|
||||||
"""
|
"""
|
||||||
return self.songDBCache.get_song(songid)
|
return session.query(Song).order_by(title).all()
|
||||||
|
|
||||||
def get_authors(self, reload=False):
|
def search_song_title(self, keywords):
|
||||||
|
"""
|
||||||
|
Searches the song title for keywords.
|
||||||
|
"""
|
||||||
|
return session.query(Song).filter(search_title.like(u'%' + keywords + u'%'))
|
||||||
|
|
||||||
|
def search_song_lyrics(self, keywords):
|
||||||
|
"""
|
||||||
|
Searches the song lyrics for keywords.
|
||||||
|
"""
|
||||||
|
return session.query(Song).filter(search_lyrics.like(u'%' + keywords + u'%'))
|
||||||
|
|
||||||
|
def get_song(self, id):
|
||||||
|
"""
|
||||||
|
Returns the details of a song
|
||||||
|
"""
|
||||||
|
return session.query(Song).get(id)
|
||||||
|
|
||||||
|
def save_song(self, song):
|
||||||
|
"""
|
||||||
|
Saves a song to the database
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
session.add(song)
|
||||||
|
session.commit()
|
||||||
|
return True
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def delete_song(self, song):
|
||||||
|
try:
|
||||||
|
session.delete(song)
|
||||||
|
session.commit()
|
||||||
|
return True
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_authors(self):
|
||||||
"""
|
"""
|
||||||
Returns a list of all the authors
|
Returns a list of all the authors
|
||||||
"""
|
"""
|
||||||
if self.authorcache == None or reload == True:
|
return session.query(Author).order_by(display_name).all()
|
||||||
self.authorcache = self.songDBCache.get_authors()
|
|
||||||
return self.authorcache
|
|
||||||
|
|
||||||
def get_author(self, authorid):
|
def get_author(self, id):
|
||||||
"""
|
"""
|
||||||
Details of the Author
|
Details of the Author
|
||||||
"""
|
"""
|
||||||
return self.songDBCache.get_author(authorid)
|
return session.query(Author).get(id)
|
||||||
|
|
||||||
def save_author(self, author):
|
def save_author(self, author):
|
||||||
"""
|
"""
|
||||||
Save the Author and refresh the cache
|
Save the Author and refresh the cache
|
||||||
"""
|
"""
|
||||||
self.songDBCache.save_author(author)
|
try:
|
||||||
self.get_authors(True) # Updates occured refresh the cache
|
session.add(author)
|
||||||
|
session.commit()
|
||||||
return True
|
return True
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
|
||||||
def delete_author(self, authorid):
|
def delete_author(self, authorid):
|
||||||
"""
|
"""
|
||||||
Delete the author and refresh the author cache
|
Delete the author and refresh the author cache
|
||||||
"""
|
"""
|
||||||
self.songDBCache.delete_author(authorid)
|
try:
|
||||||
self.get_authors(True) # Updates occured refresh the cache
|
session.delete(author)
|
||||||
|
session.commit()
|
||||||
return True
|
return True
|
||||||
|
except:
|
||||||
def get_song_authors_for_author(self, authorid):
|
|
||||||
"""
|
|
||||||
Returns the details of a song
|
|
||||||
"""
|
|
||||||
return self.songDBCache.get_song_authors_for_author(authorid)
|
|
||||||
|
|
||||||
def get_song_authors_for_song(self, songid):
|
|
||||||
"""
|
|
||||||
Returns the details of a song
|
|
||||||
"""
|
|
||||||
return self.songDBCache.get_song_authors_for_song(songid)
|
|
||||||
|
|
||||||
def get_bible_books(self,bible):
|
|
||||||
"""
|
|
||||||
Returns a list of the books of the bible from the database
|
|
||||||
"""
|
|
||||||
log.debug("get_bible_books %s", bible)
|
|
||||||
return self.bibleDBCache[bible].get_bible_books()
|
|
||||||
|
|
||||||
def get_book_chapter_count(self, bible, book):
|
|
||||||
"""
|
|
||||||
Returns the number of Chapters for a given book
|
|
||||||
"""
|
|
||||||
log.debug( "get_book_chapter_count %s,%s", bible, book)
|
|
||||||
return self.bibleDBCache[bible].get_max_bible_book_chapter(book)
|
|
||||||
|
|
||||||
def get_book_verse_count(self, bible, book, chapter):
|
|
||||||
"""
|
|
||||||
Returns all the number of verses for a given
|
|
||||||
book and chapterMaxBibleBookVerses
|
|
||||||
"""
|
|
||||||
log.debug( "get_book_verse_count %s,%s,%s", bible, book, chapter)
|
|
||||||
return self.bibleDBCache[bible].get_max_bible_book_verses(book, chapter)
|
|
||||||
|
|
||||||
def get_verse_from_text(self, bible, versetext):
|
|
||||||
"""
|
|
||||||
Returns all the number of verses for a given
|
|
||||||
book and chapterMaxBibleBookVerses
|
|
||||||
"""
|
|
||||||
log.debug( "get_verses_from_text %s,%s", bible, versetext)
|
|
||||||
return self.bibleDBCache[bible].get_verses_from_text(versetext)
|
|
||||||
|
|
||||||
def save_meta_data(self, bible, version, copyright, permissions):
|
|
||||||
"""
|
|
||||||
Saves the bibles meta data
|
|
||||||
"""
|
|
||||||
log.debug( "save_meta %s,%s, %s,%s", bible, version, copyright, permissions)
|
|
||||||
self.bibleDBCache[bible].save_meta("Version", version)
|
|
||||||
self.bibleDBCache[bible].save_meta("Copyright", copyright)
|
|
||||||
self.bibleDBCache[bible].save_meta("Permissins", permissions)
|
|
||||||
|
|
||||||
def get_meta_data(self, bible, key):
|
|
||||||
"""
|
|
||||||
Returns the meta data for a given key
|
|
||||||
"""
|
|
||||||
log.debug( "get_meta %s,%s", bible, key)
|
|
||||||
self.bibleDBCache[bible].get_meta(key)
|
|
||||||
|
|
||||||
def get_verse_text(self, bible, bookname, schapter, echapter, sverse, everse = 0 ):
|
|
||||||
"""
|
|
||||||
Returns a list of verses for a given Book, Chapter and ranges of verses.
|
|
||||||
If the end verse(everse) is less then the start verse(sverse)
|
|
||||||
then only one verse is returned
|
|
||||||
bible - Which bible to use.
|
|
||||||
Rest can be guessed at !
|
|
||||||
"""
|
|
||||||
text = []
|
|
||||||
#log.debug( self.bibleDBCache)
|
|
||||||
#log.debug( self.bibleHTTPCache)
|
|
||||||
log.debug( "get_verse_text %s,%s,%s,%s,%s,%s", bible,bookname, schapter,echapter, sverse, everse)
|
|
||||||
# bookid = self.booksOfBible[bookname] # convert to id ie Genesis --> 1 Revelation --> 73
|
|
||||||
# # SORT OUT BOOKNAME BOOK ID.
|
|
||||||
# # NAME COMES IN TO ID AND BACK TO NAME ?
|
|
||||||
# c = self.bibleDBCache[bible].getBibleChapter(bookname, chapter) # check to see if book/chapter exists
|
|
||||||
# bookabbrev = ""
|
|
||||||
# log.debug( "Bible Chapter %s", c )
|
|
||||||
# if not c:
|
|
||||||
# self._loadBook(bible,bookid, bookname, bookabbrev)
|
|
||||||
# self._loadChapter(bible, bookid,bookname, chapter)
|
|
||||||
if schapter == echapter:
|
|
||||||
text = self.bibleDBCache[bible].get_bible_text(bookname, schapter, sverse, everse)
|
|
||||||
else:
|
|
||||||
for i in range (schapter, echapter + 1):
|
|
||||||
if i == schapter:
|
|
||||||
start = sverse
|
|
||||||
end = self.get_book_verse_count(bible, bookname,i )[0]
|
|
||||||
elif i == echapter:
|
|
||||||
start = 1
|
|
||||||
end = everse
|
|
||||||
else:
|
|
||||||
start = 1
|
|
||||||
end = self.get_book_verse_count(bible, bookname,i )[0]
|
|
||||||
|
|
||||||
txt = self.bibleDBCache[bible].get_bible_text(bookname, i, start, end)
|
|
||||||
text.extend(txt)
|
|
||||||
return text
|
|
||||||
|
|
||||||
def _load_book(self, bible, bookid, bookname, bookabbrev):
|
|
||||||
log.debug( "load_book %s,%s,%s,%s", bible, bookid, bookname, bookabbrev)
|
|
||||||
cl = self.bibleDBCache[bible].get_bible_book(bookname)
|
|
||||||
log.debug( "get bible book %s" , cl)
|
|
||||||
if not cl :
|
|
||||||
self.bibleDBCache[bible].create_book(bookid, bookname, bookabbrev)
|
|
||||||
|
|
||||||
def _loadChapter(self, bible, bookid, bookname, chapter):
|
|
||||||
log.debug( "load_chapter %s,%s,%s,%s", bible, bookid,bookname, chapter)
|
|
||||||
try :
|
|
||||||
chaptlist = self.bibleHTTPCache[bible].get_bible_chapter(bible, bookid,bookname, chapter)
|
|
||||||
self.bibleDBCache[bible].create_chapter(bookname, chapter, chaptlist)
|
|
||||||
except :
|
|
||||||
log.error("Errow thrown %s", sys.exc_info()[1])
|
|
||||||
|
|
||||||
def _is_new_bible(self, name):
|
|
||||||
"""
|
|
||||||
Check cache to see if new bible
|
|
||||||
"""
|
|
||||||
for b , o in self.bibleDBCache.iteritems():
|
|
||||||
log.debug( b )
|
|
||||||
if b == name :
|
|
||||||
return False
|
return False
|
||||||
return True
|
|
||||||
|
|
||||||
def get_song_from_title(self,searchtext):
|
|
||||||
log.debug("get song from title %s", searchtext)
|
|
||||||
return self.songDBCache.get_song_from_title(searchtext)
|
|
||||||
|
|
||||||
def get_song_from_lyrics(self,searchtext):
|
|
||||||
log.debug("get song from lyrics %s", searchtext)
|
|
||||||
return self.songDBCache.get_song_from_lyrics(searchtext)
|
|
||||||
|
|
||||||
def get_song_from_author(self,searchtext):
|
|
||||||
log.debug("get song from author %s", searchtext)
|
|
||||||
return self.songDBCache.get_song_from_author(searchtext)
|
|
||||||
|
|
||||||
def dump_songs(self):
|
|
||||||
self.songDBCache.dump_songs()
|
|
||||||
|
Loading…
Reference in New Issue
Block a user