Couple of changes to the Songs plugin classes - trying to get SQLAlchemy to work.

bzr-revno: 292
This commit is contained in:
Raoul Snyman 2009-02-01 21:12:18 +00:00
parent bd510467d5
commit 6ea70e92a1
10 changed files with 96 additions and 109 deletions

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE UserProject SYSTEM "UserProject-4.0.dtd">
<!-- eric4 user project file for project openlp.org 2.0 -->
<!-- Saved: 2009-01-17, 13:06:08 -->
<!-- Saved: 2009-01-27, 23:44:25 -->
<!-- Copyright (C) 2009 Raoul Snyman, raoulsnyman@openlp.org -->
<UserProject version="4.0">
</UserProject>
</UserProject>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Tasks SYSTEM "Tasks-4.2.dtd">
<!-- eric4 tasks file for project openlp.org 2.0 -->
<!-- Saved: 2009-01-17, 13:06:08 -->
<!-- Saved: 2009-01-27, 23:44:25 -->
<Tasks version="4.2">
<Task priority="1" completed="False" bugfix="False">
<Summary>TODO: what is the tags for bridge, pre-chorus?</Summary>
@ -111,4 +111,4 @@
<Linenumber>534</Linenumber>
</Resource>
</Task>
</Tasks>
</Tasks>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Project SYSTEM "Project-4.4.dtd">
<!-- eric4 project file for project openlp.org 2.0 -->
<!-- Saved: 2009-01-17, 13:05:58 -->
<!-- Saved: 2009-01-27, 23:44:25 -->
<!-- Copyright (C) 2009 Raoul Snyman, raoulsnyman@openlp.org -->
<Project version="4.4">
<ProgLanguage mixed="0">Python</ProgLanguage>
@ -66,7 +66,6 @@
<Source>openlp/plugins/bibles/bibleplugin.py</Source>
<Source>openlp/plugins/bibles/forms/bibleimportdialog.py</Source>
<Source>openlp/plugins/bibles/forms/bibleimportform.py</Source>
<Source>openlp/plugins/bibles/lib/biblemanager.py</Source>
<Source>openlp/plugins/bibles/lib/bibleDBimpl.py</Source>
<Source>openlp/plugins/bibles/lib/bibleOSISimpl.py</Source>
<Source>openlp/plugins/bibles/lib/bibleHTTPimpl.py</Source>
@ -74,7 +73,6 @@
<Source>openlp/plugins/bibles/__init__.py</Source>
<Source>openlp/plugins/bibles/lib/__init__.py</Source>
<Source>openlp/plugins/bibles/forms/__init__.py</Source>
<Source>openlp/plugins/bibles/lib/biblecommon.py</Source>
<Source>openlp/plugins/songs/lib/__init__.py</Source>
<Source>openlp/plugins/songs/lib/songxml.py</Source>
<Source>openlp/plugins/songs/lib/models.py</Source>
@ -93,12 +91,8 @@
<Source>openlp/plugins/videos/videoplugin.py</Source>
<Source>openlp/plugins/images/__init__.py</Source>
<Source>openlp/plugins/images/imageplugin.py</Source>
<Source>openlp/plugins/songs/lib/songinterface.py</Source>
<Source>openlp/plugins/songs/lib/songfile.py</Source>
<Source>openlp/plugins/songs/forms/editsongdialog.py</Source>
<Source>openlp/core/lib/pluginutils.py</Source>
<Source>openlp/plugins/songs/lib/songmanager.py</Source>
<Source>openlp/plugins/songs/lib/songDBimpl.py</Source>
<Source>openlpcnv.pyw</Source>
<Source>openlp/plugins/songs/forms/songbookdialog.py</Source>
<Source>openlp/plugins/songs/forms/topicsdialog.py</Source>
@ -111,8 +105,17 @@
<Source>openlp/migration/migratesongs.py</Source>
<Source>openlp/migration/display.py</Source>
<Source>openlp/migration/migratebibles.py</Source>
<Source>openlp/plugins/songs/lib/songclasses.py</Source>
<Source>openlp/plugins/songs/lib/songtables.py</Source>
<Source>openlp/plugins/songs/lib/tables.py</Source>
<Source>openlp/plugins/songs/lib/classes.py</Source>
<Source>openlp/plugins/songs/lib/manager.py</Source>
<Source>openlp/plugins/bibles/lib/classes.py</Source>
<Source>openlp/plugins/bibles/lib/tables.py</Source>
<Source>openlp/plugins/bibles/lib/manager.py</Source>
<Source>openlp/plugins/bibles/lib/common.py</Source>
<Source>openlp/plugins/songs/lib/meta.py</Source>
<Source>openlp/core/test/testplugins/deeper/__init__.py</Source>
<Source>openlp/core/test/testplugins/deeper/toodeep/__init__.py</Source>
<Source>openlp/core/test/testplugins/deeper/toodeep/plugin3toodeep.py</Source>
</Sources>
<Forms>
<Form>resources/forms/openlpexportform.ui</Form>
@ -148,7 +151,7 @@
</Others>
<MainScript>openlp.pyw</MainScript>
<Vcs>
<VcsType>PySvn</VcsType>
<VcsType>Subversion</VcsType>
<VcsOptions>
<dict>
<key>
@ -220,7 +223,7 @@
</key>
<value>
<list>
<string></string>
<string></string>
</list>
</value>
<key>

View File

@ -27,8 +27,6 @@ from songbookform import SongBookForm
from editsongdialog import Ui_EditSongDialog
from openlp.plugins.songs.lib.models import Session, Song, Author, Topic
class EditSongForm(QWidget, Ui_EditSongDialog):
"""
Class documentation goes here.
@ -61,11 +59,7 @@ class EditSongForm(QWidget, Ui_EditSongDialog):
self.AuthorsSelectionComboItem.addItem( i.display_name)
def load_song(self, songid):
if songid == None: # We have a new Song
self.song = Song()
else:
self.songid = songid
self.song = self.songmanager.get_song(songid)
self.song = self.songmanager.get_song(songid)
self.TitleEditItem.setText(self.song.title)
self.LyricsTextEdit.setText(self.song.lyrics)
self.CopyrightEditItem.setText(self.song.copyright)

View File

@ -18,8 +18,8 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
"""
from songmanager import SongManager
from songtable import Author
from manager import SongManager
#from xml import SongOpenXml
__all__ = ['SongManager', 'Author']
__all__ = ['SongManager']

View File

@ -16,8 +16,6 @@ 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
"""
from sqlalchemy.orm import mapper, relation
from openlp.plugins.songs.lib.tables import *
class BaseModel(object):
"""
@ -58,14 +56,3 @@ class Topic(BaseModel):
Topic model
"""
pass
mapper(Author, authors_table)
mapper(Book, song_books_table)
mapper(Song, songs_table,
properties={'authors': relation(Author, backref='songs',
secondary=authors_songs_table),
'book': relation(Book, backref='songs'),
'topics': relation(Topic, backref='songs',
secondary=songs_topics_table)})
mapper(Topic, topics_table)

View File

@ -23,7 +23,7 @@ import sys
from sqlalchemy import asc, desc
from openlp.plugins.songs.lib.models import init_models, metadata, session, \
songs_table, Song, Author, Topic
engine, songs_table, Song, Author, Topic
import logging
@ -47,15 +47,17 @@ class SongManager():
self.db_url = u''
db_type = self.config.get_config(u'db type')
if db_type == u'sqlite':
self.db_url = u'sqlite://' + self.config.get_data_path() + \
self.db_url = u'sqlite:///' + self.config.get_data_path() + \
u'/songs.sqlite'
print self.db_url
else:
self.db_url = db_type + 'u://' + \
self.config.get_config(u'db username') + u':' + \
self.config.get_config(u'db password') + u'@' + \
self.config.get_config(u'db hostname') + u'/' + \
self.config.get_config(u'db database')
init_models(self.db_url)
#print self.db_url
self.session = init_models(self.db_url)
if not songs_table.exists():
metadata.create_all()
log.debug( "Song Initialised")
@ -67,19 +69,19 @@ class SongManager():
"""
Returns the details of a song
"""
return session.query(Song).order_by(title).all()
return self.session.query(Song).order_by(title).all()
def search_song_title(self, keywords):
"""
Searches the song title for keywords.
"""
return session.query(Song).filter(search_title.like(u'%' + keywords + u'%'))
return self.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'%'))
return self.session.query(Song).filter(search_lyrics.like(u'%' + keywords + u'%'))
def get_song(self, id=None):
"""
@ -88,23 +90,23 @@ class SongManager():
if id is None:
return Song()
else:
return session.query(Song).get(id)
return self.session.query(Song).get(id)
def save_song(self, song):
"""
Saves a song to the database
"""
try:
session.add(song)
session.commit()
self.session.add(song)
self.session.commit()
return True
except:
return False
def delete_song(self, song):
try:
session.delete(song)
session.commit()
self.session.delete(song)
self.session.commit()
return True
except:
return False
@ -113,21 +115,21 @@ class SongManager():
"""
Returns a list of all the authors
"""
return session.query(Author).order_by(display_name).all()
return self.session.query(Author).order_by(Author.display_name).all()
def get_author(self, id):
"""
Details of the Author
"""
return session.query(Author).get(id)
return self.session.query(Author).get(id)
def save_author(self, author):
"""
Save the Author and refresh the cache
"""
try:
session.add(author)
session.commit()
self.session.add(author)
self.session.commit()
return True
except:
return False
@ -137,8 +139,8 @@ class SongManager():
Delete the author and refresh the author cache
"""
try:
session.delete(author)
session.commit()
self.session.delete(author)
self.session.commit()
return True
except:
return False

View File

@ -30,4 +30,4 @@ session = None
# Global metadata. If you have multiple databases with overlapping table
# names, you'll need a metadata for each database
metadata = MetaData()
metadata = MetaData()

View File

@ -26,16 +26,16 @@ from openlp.plugins.songs.lib.classes import *
def init_models(url):
engine = create_engine(url)
metadata.bind = engine
session = scoped_session(sessionmaker(autoflush=True, autocommit=False,
bind=engine))
metadata.bind = engine
mapper(Author, authors_table)
mapper(Book, song_books_table)
mapper(Song, songs_table,
mapper(Author, authors_table)
mapper(Book, song_books_table)
mapper(Song, songs_table,
properties={'authors': relation(Author, backref='songs',
secondary=authors_songs_table),
'book': relation(Book, backref='songs'),
'topics': relation(Topic, backref='songs',
secondary=songs_topics_table)})
mapper(Topic, topics_table)
mapper(Topic, topics_table)
return session

View File

@ -22,16 +22,15 @@ import logging
from PyQt4 import QtCore, QtGui
from openlp.core.resources import *
from openlp.core.lib import Plugin,PluginUtils, MediaManagerItem
from openlp.core.lib import Plugin, PluginUtils, MediaManagerItem
from forms import EditSongForm, OpenLPImportForm, OpenSongImportForm, \
OpenLPExportForm, OpenSongExportForm
from openlp.plugins.songs.lib import SongManager
from openlp.plugins.songs.lib.songclasses import *
class SongsPlugin(Plugin, PluginUtils):
global log
log=logging.getLogger("SongsPlugin")
log.info("Song Plugin loaded")
log.info("Song Plugin loaded")
def __init__(self):
# Call the parent constructor
Plugin.__init__(self, 'Songs', '1.9.0')
@ -103,7 +102,7 @@ class SongsPlugin(Plugin, PluginUtils):
self.ClearTextButton = QtGui.QPushButton(self.SongWidget)
self.ClearTextButton.setObjectName('ClearTextButton')
self.ClearTextButton.setText('Clear')
self.SearchLayout.addWidget(self.ClearTextButton, 3, 1, 1, 1)
self.SearchLayout.addWidget(self.ClearTextButton, 3, 1, 1, 1)
self.SearchTextButton = QtGui.QPushButton(self.SongWidget)
self.SearchTextButton.setObjectName('SearchTextButton')
self.SearchTextButton.setText('Search')
@ -114,31 +113,31 @@ class SongsPlugin(Plugin, PluginUtils):
self.SongListView.setColumnCount(3)
self.SongListView.setColumnHidden(0, True)
self.SongListView.setColumnWidth(1, 200)
self.SongListView.setColumnWidth(2, 80)
self.SongListView.setColumnWidth(2, 80)
self.SongListView.setShowGrid(False)
self.SongListView.setSortingEnabled(False)
self.SongListView.setSortingEnabled(False)
self.SongListView.setAlternatingRowColors(True)
self.SongListView.setHorizontalHeaderLabels(QtCore.QStringList(["","Song Name","Author"]))
self.SongListView.setHorizontalHeaderLabels(QtCore.QStringList(["","Song Name","Author"]))
self.SongListView.setGeometry(QtCore.QRect(10, 100, 256, 591))
self.SongListView.setObjectName("listView")
self.MediaManagerItem.PageLayout.addWidget(self.SongListView)
QtCore.QObject.connect(self.SearchTextButton, QtCore.SIGNAL("pressed()"), self.onSearchTextButton)
QtCore.QObject.connect(self.ClearTextButton, QtCore.SIGNAL("pressed()"), self.onClearTextButton)
QtCore.QObject.connect(self.SearchTextEdit, QtCore.SIGNAL("textChanged(const QString&)"), self.onSearchTextEdit)
QtCore.QObject.connect(self.SongListView, QtCore.SIGNAL("itemPressed(QTableWidgetItem * item)"), self.onSongSelected)
QtCore.QObject.connect(self.SearchTextButton, QtCore.SIGNAL("pressed()"), self.onSearchTextButtonClick)
QtCore.QObject.connect(self.ClearTextButton, QtCore.SIGNAL("pressed()"), self.onClearTextButtonClick)
QtCore.QObject.connect(self.SearchTextEdit, QtCore.SIGNAL("textChanged(const QString&)"), self.onSearchTextEditChanged)
QtCore.QObject.connect(self.SongListView, QtCore.SIGNAL("itemPressed(QTableWidgetItem * item)"), self.onSongSelected)
#define and add the context menu
self.SongListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
self.SongListView.addAction(self.add_to_context_menu(self.SongListView, ':/songs/song_new.png', "&Edit Song", self.onSongEditClick))
self.SongListView.addAction(self.add_to_context_menu(self.SongListView, ':/songs/song_new.png', "&Edit Song", self.onSongEditClick))
self.SongListView.addAction(self.add_to_context_separator(self.SongListView))
self.SongListView.addAction(self.add_to_context_menu(self.SongListView, ':/system/system_preview.png', "&Preview Song", self.onSongPreviewClick))
self.SongListView.addAction(self.add_to_context_menu(self.SongListView, ':/system/system_live.png', "&Show Live", self.onSongLiveClick))
self.SongListView.addAction(self.add_to_context_menu(self.SongListView, ':/system/system_preview.png', "&Preview Song", self.onSongPreviewClick))
self.SongListView.addAction(self.add_to_context_menu(self.SongListView, ':/system/system_live.png', "&Show Live", self.onSongLiveClick))
self.SongListView.addAction(self.add_to_context_menu(self.SongListView, ':/system/system_add.png', "&Add to Service", self.onSongEditClick))
return self.MediaManagerItem
def add_import_menu_item(self, import_menu):
@ -194,35 +193,37 @@ class SongsPlugin(Plugin, PluginUtils):
QtCore.QObject.connect(self.ExportOpenSongItem, QtCore.SIGNAL("triggered()"), self.onExportOpenSongItemClicked)
def initialise(self):
self.SearchTypeComboBox.addItem("Titles")
self.SearchTypeComboBox.addItem("Lyrics")
self.SearchTypeComboBox.addItem("Authors")
self.SearchTypeComboBox.addItem(u'Titles')
self.SearchTypeComboBox.addItem(u'Lyrics')
self.SearchTypeComboBox.addItem(u'Authors')
def onClearTextButton(self):
def onClearTextButtonClick(self):
"""
Clear the search text.
"""
self.SearchTextEdit.clear()
def onSearchTextEdit(self):
sl = 3
if self.SearchTypeComboBox.currentText()=="Lyrics":
sl = 7
if len(self.SearchTextEdit.displayText()) > sl: # only search if > 3 characters
self.onSearchTextButton()
def onSearchTextEditChanged(self, text):
#sl = 3
#if self.SearchTypeComboBox.currentText() == u'Lyrics':
# sl = 7
#if len(text) > sl: # only search if > 3 characters
self.onSearchTextButtonClick()
def onSearchTextButton(self):
searchtext = str(self.SearchTextEdit.displayText() )
searchresults = []
ct = self.SearchTypeComboBox.currentText()
if self.SearchTypeComboBox.currentText()=="Titles":
def onSearchTextButtonClick(self):
search_keywords = str(self.SearchTextEdit.displayText())
search_results = []
search_type = self.SearchTypeComboBox.currentText()
if search_type == u'Titles':
log.debug("Titles Search")
searchresults = self.songmanager.get_song_from_title(searchtext)
elif self.SearchTypeComboBox.currentText()=="Lyrics":
log.debug("Lyrics Search")
searchresults = self.songmanager.get_song_from_lyrics(searchtext)
elif self.SearchTypeComboBox.currentText()=="Authors":
log.debug("Authors Search")
searchresults = self.songmanager.get_song_from_author(searchtext)
self._display_results(searchresults)
search_results = self.songmanager.search_song_title(search_keywords)
elif search_type == u'Lyrics':
log.debug("Lyrics Search")
searchresults = self.songmanager.search_song_lyrics(search_keywords)
elif search_type == u'Authors':
log.debug("Authors Search")
#searchresults = self.songmanager.get_song_from_author(searchtext)
self._display_results(search_results)
def onSongSelected(self, item):
print item
@ -259,12 +260,12 @@ class SongsPlugin(Plugin, PluginUtils):
def onExportOpenSongItemClicked(self):
self.opensong_export_form.show()
def _display_results(self, searchresults):
log.debug("_search results")
self.SongListView.clear() # clear the results
self.SongListView.setHorizontalHeaderLabels(QtCore.QStringList(["","Song Name","Author"]))
self.SongListView.setVerticalHeaderLabels(QtCore.QStringList([""]))
self.SongListView.setVerticalHeaderLabels(QtCore.QStringList([""]))
self.SongListView.setRowCount(0)
log.debug("Records returned from search %s", len(searchresults))
for song in searchresults:
@ -272,10 +273,10 @@ class SongsPlugin(Plugin, PluginUtils):
c = self.SongListView.rowCount()
self.SongListView.setRowCount(c+1)
twi = QtGui.QTableWidgetItem(str(song.id))
self.SongListView.setItem(c , 0, twi)
self.SongListView.setItem(c , 0, twi)
twi = QtGui.QTableWidgetItem(str(song.title))
self.SongListView.setItem(c , 1, twi)
self.SongListView.setItem(c , 1, twi)
twi = QtGui.QTableWidgetItem(str(author.display_name))
self.SongListView.setItem(c , 2, twi)
self.SongListView.setRowHeight(c, 20)