From 1adac78588f63aea8cf110c54ce6fed8415c92a5 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 26 Aug 2011 13:02:06 +0100 Subject: [PATCH 01/10] Add date fields to songs --- openlp/plugins/songs/lib/db.py | 5 ++++- openlp/plugins/songs/lib/upgrade.py | 19 +++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/openlp/plugins/songs/lib/db.py b/openlp/plugins/songs/lib/db.py index bee64b3ba..13ce24266 100644 --- a/openlp/plugins/songs/lib/db.py +++ b/openlp/plugins/songs/lib/db.py @@ -31,6 +31,7 @@ the Songs plugin from sqlalchemy import Column, ForeignKey, Table, types from sqlalchemy.orm import mapper, relation +from sqlalchemy.sql.expression import func from openlp.core.lib.db import BaseModel, init_db @@ -195,7 +196,9 @@ def init_schema(url): Column(u'song_number', types.Unicode(64)), Column(u'theme_name', types.Unicode(128)), Column(u'search_title', types.Unicode(255), index=True, nullable=False), - Column(u'search_lyrics', types.UnicodeText, nullable=False) + Column(u'search_lyrics', types.UnicodeText, nullable=False), + Column(u'create_date', types.DateTime(), default=func.now()), + Column(u'last_modified', types.DateTime(), onupdate=func.now()) ) # Definition of the "topics" table diff --git a/openlp/plugins/songs/lib/upgrade.py b/openlp/plugins/songs/lib/upgrade.py index e0f2668d9..fae3400c2 100644 --- a/openlp/plugins/songs/lib/upgrade.py +++ b/openlp/plugins/songs/lib/upgrade.py @@ -25,15 +25,16 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### """ -The :mod:`upgrade` module provides a way for the database and schema that is the backend for -the Songs plugin +The :mod:`upgrade` module provides a way for the database and schema that is the +backend for the Songs plugin """ from sqlalchemy import Column, ForeignKey, Table, types +from sqlalchemy.sql.expression import func from migrate import changeset from migrate.changeset.constraint import ForeignKeyConstraint -__version__ = 1 +__version__ = 2 def upgrade_setup(metadata): """ @@ -57,7 +58,7 @@ def upgrade_1(session, metadata, tables): """ Version 1 upgrade. - This upgrade removes the many-to-many relationship between songs and + This upgrade removes the many-to-many relationship between songs and media_files and replaces it with a one-to-many, which is far more representative of the real relationship between the two entities. @@ -75,3 +76,13 @@ def upgrade_1(session, metadata, tables): ForeignKeyConstraint([u'song_id'], [u'songs.id'], table=tables[u'media_files']).create() +def upgrade_2(session, metadata, tables): + """ + Version 2 upgrade. + + This upgrade adds a create_date and last_modified date to the songs table + """ + Column(u'create_date', types.DateTime(), default=func.now())\ + .create(table=tables[u'songs'], populate_default=True) + Column(u'last_modified', types.DateTime(), default=func.now())\ + .create(table=tables[u'songs'], populate_default=True) From 4f0c7716bc2c53067de6722716a05f17bbc0981d Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 26 Aug 2011 14:13:32 +0100 Subject: [PATCH 02/10] Fix default value --- openlp/plugins/songs/lib/db.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/songs/lib/db.py b/openlp/plugins/songs/lib/db.py index 13ce24266..5bfa0c830 100644 --- a/openlp/plugins/songs/lib/db.py +++ b/openlp/plugins/songs/lib/db.py @@ -198,7 +198,8 @@ def init_schema(url): Column(u'search_title', types.Unicode(255), index=True, nullable=False), Column(u'search_lyrics', types.UnicodeText, nullable=False), Column(u'create_date', types.DateTime(), default=func.now()), - Column(u'last_modified', types.DateTime(), onupdate=func.now()) + Column(u'last_modified', types.DateTime(), default=func.now(), + onupdate=func.now()) ) # Definition of the "topics" table From fbb32a027880259eec86bf5219bfdd86ef7e3ebd Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 26 Aug 2011 17:30:51 +0200 Subject: [PATCH 03/10] added hints that exported files are OpenLyrics files --- openlp/plugins/songs/forms/songexportform.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/songs/forms/songexportform.py b/openlp/plugins/songs/forms/songexportform.py index 90c3b0275..3d3c4d559 100644 --- a/openlp/plugins/songs/forms/songexportform.py +++ b/openlp/plugins/songs/forms/songexportform.py @@ -170,8 +170,8 @@ class SongExportForm(OpenLPWizard): translate('OpenLP.Ui', 'Welcome to the Song Export Wizard')) self.informationLabel.setText( translate('SongsPlugin.ExportWizardForm', 'This wizard will help to' - ' export your songs to the open and free OpenLyrics worship song ' - 'format.')) + ' export your songs to the open and free OpenLyrics' + ' worship song format.')) self.availableSongsPage.setTitle( translate('SongsPlugin.ExportWizardForm', 'Select Songs')) self.availableSongsPage.setSubTitle( @@ -285,7 +285,9 @@ class SongExportForm(OpenLPWizard): self, songs, unicode(self.directoryLineEdit.text())) if exporter.do_export(): self.progressLabel.setText( - translate('SongsPlugin.SongExportForm', 'Finished export.')) + translate('SongsPlugin.SongExportForm', 'Finished export. To ' + 'import these files again use the OpenLyrics ' + 'importer.')) else: self.progressLabel.setText( translate('SongsPlugin.SongExportForm', From d88a268c5cfcc9b4bc589ed5a21f7ac81e50aa80 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 26 Aug 2011 17:48:58 +0200 Subject: [PATCH 04/10] removed 'again' --- openlp/plugins/songs/forms/songexportform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/songs/forms/songexportform.py b/openlp/plugins/songs/forms/songexportform.py index 3d3c4d559..22020a401 100644 --- a/openlp/plugins/songs/forms/songexportform.py +++ b/openlp/plugins/songs/forms/songexportform.py @@ -286,7 +286,7 @@ class SongExportForm(OpenLPWizard): if exporter.do_export(): self.progressLabel.setText( translate('SongsPlugin.SongExportForm', 'Finished export. To ' - 'import these files again use the OpenLyrics ' + 'import these files use the OpenLyrics ' 'importer.')) else: self.progressLabel.setText( From f266485001f809f5ee46457dcb90a61f93cce7b8 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 26 Aug 2011 18:56:36 +0100 Subject: [PATCH 05/10] Add fields to database --- openlp/core/lib/db.py | 1 + openlp/plugins/songs/lib/upgrade.py | 6 +- openlp/plugins/songusage/lib/db.py | 4 +- openlp/plugins/songusage/lib/upgrade.py | 61 +++++++++++++++++++++ openlp/plugins/songusage/songusageplugin.py | 5 +- 5 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 openlp/plugins/songusage/lib/upgrade.py diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index fb8a38b1f..2c504c3ae 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -72,6 +72,7 @@ def upgrade_db(url, upgrade): ``upgrade`` The python module that contains the upgrade instructions. """ + print url, upgrade session, metadata = init_db(url) tables = upgrade.upgrade_setup(metadata) metadata_table = Table(u'metadata', metadata, diff --git a/openlp/plugins/songs/lib/upgrade.py b/openlp/plugins/songs/lib/upgrade.py index e0f2668d9..a7aa1bd6c 100644 --- a/openlp/plugins/songs/lib/upgrade.py +++ b/openlp/plugins/songs/lib/upgrade.py @@ -25,8 +25,8 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### """ -The :mod:`upgrade` module provides a way for the database and schema that is the backend for -the Songs plugin +The :mod:`upgrade` module provides a way for the database and schema that is the +backend for the Songs plugin """ from sqlalchemy import Column, ForeignKey, Table, types @@ -57,7 +57,7 @@ def upgrade_1(session, metadata, tables): """ Version 1 upgrade. - This upgrade removes the many-to-many relationship between songs and + This upgrade removes the many-to-many relationship between songs and media_files and replaces it with a one-to-many, which is far more representative of the real relationship between the two entities. diff --git a/openlp/plugins/songusage/lib/db.py b/openlp/plugins/songusage/lib/db.py index 9a11ef16b..bbd645634 100644 --- a/openlp/plugins/songusage/lib/db.py +++ b/openlp/plugins/songusage/lib/db.py @@ -56,7 +56,9 @@ def init_schema(url): Column(u'title', types.Unicode(255), nullable=False), Column(u'authors', types.Unicode(255), nullable=False), Column(u'copyright', types.Unicode(255)), - Column(u'ccl_number', types.Unicode(65)) + Column(u'ccl_number', types.Unicode(65)), + Column(u'plugin_name', types.Unicode(20)), + Column(u'source', types.Unicode(10)) ) mapper(SongUsageItem, songusage_table) diff --git a/openlp/plugins/songusage/lib/upgrade.py b/openlp/plugins/songusage/lib/upgrade.py new file mode 100644 index 000000000..cdae3b694 --- /dev/null +++ b/openlp/plugins/songusage/lib/upgrade.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2011 Raoul Snyman # +# Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # +# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # +# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# --------------------------------------------------------------------------- # +# 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 # +############################################################################### +""" +The :mod:`upgrade` module provides a way for the database and schema that is the +backend for the SongsUsage plugin +""" + +from sqlalchemy import Column, ForeignKey, Table, types +from migrate import changeset +from migrate.changeset.constraint import ForeignKeyConstraint + +__version__ = 1 + +def upgrade_setup(metadata): + """ + Set up the latest revision all tables, with reflection, needed for the + upgrade process. If you want to drop a table, you need to remove it from + here, and add it to your upgrade function. + """ + tables = { + u'songusage_data': Table(u'songusage_data', metadata, autoload=True) + } + print tables + return tables + + +def upgrade_1(session, metadata, tables): + """ + Version 1 upgrade. + + This upgrade adds two new fields to the songusage database + """ + print "hi" + Column(u'plugin_name', types.Unicode(20), default=u'') \ + .create(table=tables[u'songusage_data'], populate_default=True) + Column(u'source', types.Unicode(10), default=u'') \ + .create(table=tables[u'songusage_data'], populate_default=True) diff --git a/openlp/plugins/songusage/songusageplugin.py b/openlp/plugins/songusage/songusageplugin.py index b39fe1a33..1a0335d67 100644 --- a/openlp/plugins/songusage/songusageplugin.py +++ b/openlp/plugins/songusage/songusageplugin.py @@ -37,6 +37,7 @@ from openlp.core.lib.ui import base_action, shortcut_action from openlp.core.utils.actions import ActionList from openlp.plugins.songusage.forms import SongUsageDetailForm, \ SongUsageDeleteForm +from openlp.plugins.songusage.lib import upgrade from openlp.plugins.songusage.lib.db import init_schema, SongUsageItem log = logging.getLogger(__name__) @@ -46,11 +47,11 @@ class SongUsagePlugin(Plugin): def __init__(self, plugin_helpers): Plugin.__init__(self, u'songusage', plugin_helpers) + self.manager = Manager(u'songusage', init_schema, upgrade_mod=upgrade) self.weight = -4 self.icon = build_icon(u':/plugins/plugin_songusage.png') self.activeIcon = build_icon(u':/songusage/song_usage_active.png') self.inactiveIcon = build_icon(u':/songusage/song_usage_inactive.png') - self.manager = None self.songUsageActive = False def addToolsMenuItem(self, tools_menu): @@ -137,8 +138,6 @@ class SongUsagePlugin(Plugin): translate('SongUsagePlugin', 'Song Usage')) action_list.add_action(self.songUsageReport, translate('SongUsagePlugin', 'Song Usage')) - if self.manager is None: - self.manager = Manager(u'songusage', init_schema) self.songUsageDeleteForm = SongUsageDeleteForm(self.manager, self.formparent) self.songUsageDetailForm = SongUsageDetailForm(self, self.formparent) From 2dd0aa234e1b3e364105b9bd1098f158a262fcf5 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 26 Aug 2011 19:07:44 +0100 Subject: [PATCH 06/10] remove prints --- openlp/core/lib/db.py | 1 - openlp/plugins/songusage/lib/upgrade.py | 2 -- 2 files changed, 3 deletions(-) diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index 2c504c3ae..fb8a38b1f 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -72,7 +72,6 @@ def upgrade_db(url, upgrade): ``upgrade`` The python module that contains the upgrade instructions. """ - print url, upgrade session, metadata = init_db(url) tables = upgrade.upgrade_setup(metadata) metadata_table = Table(u'metadata', metadata, diff --git a/openlp/plugins/songusage/lib/upgrade.py b/openlp/plugins/songusage/lib/upgrade.py index cdae3b694..31b552fc6 100644 --- a/openlp/plugins/songusage/lib/upgrade.py +++ b/openlp/plugins/songusage/lib/upgrade.py @@ -44,7 +44,6 @@ def upgrade_setup(metadata): tables = { u'songusage_data': Table(u'songusage_data', metadata, autoload=True) } - print tables return tables @@ -54,7 +53,6 @@ def upgrade_1(session, metadata, tables): This upgrade adds two new fields to the songusage database """ - print "hi" Column(u'plugin_name', types.Unicode(20), default=u'') \ .create(table=tables[u'songusage_data'], populate_default=True) Column(u'source', types.Unicode(10), default=u'') \ From 1e4b922bface5007549f69faeb26892299f3f6e7 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 26 Aug 2011 20:09:25 +0100 Subject: [PATCH 07/10] DB Fixed --- openlp/core/lib/db.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index fb8a38b1f..7ad743235 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -73,6 +73,13 @@ def upgrade_db(url, upgrade): The python module that contains the upgrade instructions. """ session, metadata = init_db(url) + + class Metadata(BaseModel): + """ + Provides a class for the metadata table. + """ + pass + tables = upgrade.upgrade_setup(metadata) metadata_table = Table(u'metadata', metadata, Column(u'key', types.Unicode(64), primary_key=True), @@ -103,6 +110,7 @@ def upgrade_db(url, upgrade): session.commit() return int(version_meta.value), upgrade.__version__ + def delete_database(plugin_name, db_file_name=None): """ Remove a database file from the system. @@ -138,14 +146,6 @@ class BaseModel(object): instance.__setattr__(key, value) return instance - -class Metadata(BaseModel): - """ - Provides a class for the metadata table. - """ - pass - - class Manager(object): """ Provide generic object persistence management From 01128d4dc784a464a3404fa2012665b3fc7bec53 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 26 Aug 2011 20:31:02 +0100 Subject: [PATCH 08/10] Fix report and triggers --- .../songusage/forms/songusagedetailform.py | 8 ++++--- openlp/plugins/songusage/songusageplugin.py | 21 +++++++++++++++---- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/openlp/plugins/songusage/forms/songusagedetailform.py b/openlp/plugins/songusage/forms/songusagedetailform.py index 303789d20..f7b04a656 100644 --- a/openlp/plugins/songusage/forms/songusagedetailform.py +++ b/openlp/plugins/songusage/forms/songusagedetailform.py @@ -117,9 +117,11 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog): try: fileHandle = open(outname, u'w') for instance in usage: - record = u'\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\"\n' % ( - instance.usagedate, instance.usagetime, instance.title, - instance.copyright, instance.ccl_number, instance.authors) + record = u'\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",' \ + u'\"%s\",\"%s\"\n' % ( instance.usagedate, + instance.usagetime, instance.title, instance.copyright, + instance.ccl_number, instance.authors, + instance.plugin_name, instance.source) fileHandle.write(record.encode(u'utf-8')) Receiver.send_message(u'openlp_information_message', { u'title': translate('SongUsagePlugin.SongUsageDetailForm', diff --git a/openlp/plugins/songusage/songusageplugin.py b/openlp/plugins/songusage/songusageplugin.py index 1a0335d67..495d3103d 100644 --- a/openlp/plugins/songusage/songusageplugin.py +++ b/openlp/plugins/songusage/songusageplugin.py @@ -122,10 +122,10 @@ class SongUsagePlugin(Plugin): Plugin.initialise(self) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'slidecontroller_live_started'), - self.onReceiveSongUsage) + self.displaySongUsage) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'print_service_started'), - self.onReceiveSongUsage) + self.printSongUsage) self.songUsageActive = QtCore.QSettings().value( self.settingsSection + u'/active', QtCore.QVariant(False)).toBool() @@ -196,10 +196,21 @@ class SongUsagePlugin(Plugin): self.songUsageStatus.blockSignals(False) - def onReceiveSongUsage(self, item): + def displaySongUsage(self, item): """ - Song Usage for live song from SlideController + Song Usage for which has been displayed """ + self._add_song_usage(unicode(translate('SongUsagePlugin', + 'display')), item) + + def printSongUsage(self, item): + """ + Song Usage for which has been printed + """ + self._add_song_usage(unicode(translate('SongUsagePlugin', + 'printed')), item) + + def _add_song_usage(self, source, item): audit = item[0].audit if self.songUsageActive and audit: song_usage_item = SongUsageItem() @@ -209,6 +220,8 @@ class SongUsagePlugin(Plugin): song_usage_item.copyright = audit[2] song_usage_item.ccl_number = audit[3] song_usage_item.authors = u' '.join(audit[1]) + song_usage_item.plugin_name = item[0].name + song_usage_item.source = source self.manager.save_object(song_usage_item) def onSongUsageDelete(self): From 9de4c0c1189cb3c8de2eab5942f7f37f20de5ce0 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 27 Aug 2011 07:07:30 +0100 Subject: [PATCH 09/10] Remove extra imports --- openlp/plugins/songusage/lib/upgrade.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/songusage/lib/upgrade.py b/openlp/plugins/songusage/lib/upgrade.py index 31b552fc6..1824fd594 100644 --- a/openlp/plugins/songusage/lib/upgrade.py +++ b/openlp/plugins/songusage/lib/upgrade.py @@ -29,7 +29,7 @@ The :mod:`upgrade` module provides a way for the database and schema that is the backend for the SongsUsage plugin """ -from sqlalchemy import Column, ForeignKey, Table, types +from sqlalchemy import Column, Table, types from migrate import changeset from migrate.changeset.constraint import ForeignKeyConstraint From 611577577fd27409b8a061ff9b2375047208792a Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 27 Aug 2011 07:12:03 +0100 Subject: [PATCH 10/10] Remove extra imports 2 --- openlp/plugins/songusage/lib/upgrade.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openlp/plugins/songusage/lib/upgrade.py b/openlp/plugins/songusage/lib/upgrade.py index 1824fd594..50ca32fcd 100644 --- a/openlp/plugins/songusage/lib/upgrade.py +++ b/openlp/plugins/songusage/lib/upgrade.py @@ -31,7 +31,6 @@ backend for the SongsUsage plugin from sqlalchemy import Column, Table, types from migrate import changeset -from migrate.changeset.constraint import ForeignKeyConstraint __version__ = 1