openlp-core team mailing list archive
-
openlp-core team
-
Mailing list archive
-
Message #24043
[Merge] lp:~sam92/openlp/presentationmanager-import into lp:openlp
Samuel Mehrbrodt has proposed merging lp:~sam92/openlp/presentationmanager-import into lp:openlp.
Requested reviews:
Tim Bentley (trb143)
Tomas Groth (tomasgroth)
Related bugs:
Bug #957017 in OpenLP: "Support Presentation Manager song import"
https://bugs.launchpad.net/openlp/+bug/957017
For more details, see:
https://code.launchpad.net/~sam92/openlp/presentationmanager-import/+merge/226707
Add importer for PresentationManager
lp:~sam92/openlp/presentationmanager-import (revision 2398)
[SUCCESS] http://ci.openlp.org/job/Branch-01-Pull/514/
[SUCCESS] http://ci.openlp.org/job/Branch-02-Functional-Tests/472/
[SUCCESS] http://ci.openlp.org/job/Branch-03-Interface-Tests/417/
[FAILURE] http://ci.openlp.org/job/Branch-04-Windows_Tests/376/
[SUCCESS] http://ci.openlp.org/job/Branch-05a-Code_Analysis/245/
[SUCCESS] http://ci.openlp.org/job/Branch-05b-Test_Coverage/119/
--
https://code.launchpad.net/~sam92/openlp/presentationmanager-import/+merge/226707
Your team OpenLP Core is subscribed to branch lp:openlp.
=== modified file 'openlp/plugins/songs/lib/__init__.py'
--- openlp/plugins/songs/lib/__init__.py 2014-06-09 08:59:52 +0000
+++ openlp/plugins/songs/lib/__init__.py 2014-07-14 16:54:11 +0000
@@ -374,7 +374,7 @@
:param manager: The song database manager object.
:param song: The song object.
"""
- from .xml import SongXML
+ from .openlyricsxml import SongXML
if song.title:
song.title = clean_title(song.title)
=== modified file 'openlp/plugins/songs/lib/importer.py'
--- openlp/plugins/songs/lib/importer.py 2014-07-07 16:21:45 +0000
+++ openlp/plugins/songs/lib/importer.py 2014-07-14 16:54:11 +0000
@@ -52,12 +52,11 @@
from .importers.propresenter import ProPresenterImport
from .importers.worshipassistant import WorshipAssistantImport
from .importers.powerpraise import PowerPraiseImport
+from .importers.presentationmanager import PresentationManagerImport
+
+log = logging.getLogger(__name__)
+
# Imports that might fail
-
-
-log = logging.getLogger(__name__)
-
-
try:
from .importers.songsoffellowship import SongsOfFellowshipImport
HAS_SOF = True
@@ -163,16 +162,17 @@
OpenSong = 10
PowerPraise = 11
PowerSong = 12
- ProPresenter = 13
- SongBeamer = 14
- SongPro = 15
- SongShowPlus = 16
- SongsOfFellowship = 17
- SundayPlus = 18
- WordsOfWorship = 19
- WorshipAssistant = 20
- WorshipCenterPro = 21
- ZionWorx = 22
+ PresentationManager = 13
+ ProPresenter = 14
+ SongBeamer = 15
+ SongPro = 16
+ SongShowPlus = 17
+ SongsOfFellowship = 18
+ SundayPlus = 19
+ WordsOfWorship = 20
+ WorshipAssistant = 21
+ WorshipCenterPro = 22
+ ZionWorx = 23
# Set optional attribute defaults
__defaults__ = {
@@ -282,6 +282,12 @@
'invalidSourceMsg': translate('SongsPlugin.ImportWizardForm', 'You need to specify a valid PowerSong 1.0 '
'database folder.')
},
+ PresentationManager: {
+ 'class': PresentationManagerImport,
+ 'name': 'PresentationManager',
+ 'prefix': 'presentationManager',
+ 'filter': '%s (*.sng)' % translate('SongsPlugin.ImportWizardForm', 'PresentationManager Song Files')
+ },
ProPresenter: {
'class': ProPresenterImport,
'name': 'ProPresenter',
@@ -384,6 +390,7 @@
SongFormat.OpenSong,
SongFormat.PowerPraise,
SongFormat.PowerSong,
+ SongFormat.PresentationManager,
SongFormat.ProPresenter,
SongFormat.SongBeamer,
SongFormat.SongPro,
=== added file 'openlp/plugins/songs/lib/importers/presentationmanager.py'
--- openlp/plugins/songs/lib/importers/presentationmanager.py 1970-01-01 00:00:00 +0000
+++ openlp/plugins/songs/lib/importers/presentationmanager.py 2014-07-14 16:54:11 +0000
@@ -0,0 +1,93 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2013 Raoul Snyman #
+# Portions copyright (c) 2008-2013 Tim Bentley, Gerald Britton, Jonathan #
+# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, #
+# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. #
+# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, #
+# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
+# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, #
+# Frode Woldsund, Martin Zibricky, Patrick Zimmermann #
+# --------------------------------------------------------------------------- #
+# 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:`presentationmanager` module provides the functionality for importing
+Presentationmanager song files into the current database.
+"""
+
+import os
+from lxml import objectify
+
+from openlp.core.ui.wizard import WizardStrings
+from .songimport import SongImport
+
+
+class PresentationManagerImport(SongImport):
+ """
+ The :class:`PresentationManagerImport` class provides OpenLP with the
+ ability to import Presentationmanager song files.
+ """
+ def do_import(self):
+ self.import_wizard.progress_bar.setMaximum(len(self.import_source))
+ for file_path in self.import_source:
+ if self.stop_import_flag:
+ return
+ self.import_wizard.increment_progress_bar(WizardStrings.ImportingType % os.path.basename(file_path))
+ root = objectify.parse(open(file_path, 'rb')).getroot()
+ self.process_song(root)
+
+ def process_song(self, root):
+ self.set_defaults()
+ self.title = str(root.attributes.title)
+ self.add_author(str(root.attributes.author))
+ self.copyright = str(root.attributes.copyright)
+ self.ccli_number = str(root.attributes.ccli_number)
+ self.comments = str(root.attributes.comments)
+ verse_order_list = []
+ verse_count = {}
+ duplicates = []
+ for verse in root.verses.verse:
+ original_verse_def = verse.get('id')
+ # Presentation Manager stores duplicate verses instead of a verse order.
+ # We need to create the verse order from that.
+ is_duplicate = False
+ if original_verse_def in duplicates:
+ is_duplicate = True
+ else:
+ duplicates.append(original_verse_def)
+ if original_verse_def.startswith("Verse"):
+ verse_def = 'v'
+ elif original_verse_def.startswith("Chorus") or original_verse_def.startswith("Refrain"):
+ verse_def = 'c'
+ elif original_verse_def.startswith("Bridge"):
+ verse_def = 'b'
+ elif original_verse_def.startswith("End"):
+ verse_def = 'e'
+ else:
+ verse_def = 'o'
+ if not is_duplicate: # Only increment verse number if no duplicate
+ verse_count[verse_def] = verse_count.get(verse_def, 0) + 1
+ verse_def = '%s%d' % (verse_def, verse_count[verse_def])
+ if not is_duplicate: # Only add verse if no duplicate
+ self.add_verse(str(verse).strip(), verse_def)
+ verse_order_list.append(verse_def)
+
+ self.verse_order_list = verse_order_list
+ if not self.finish():
+ self.log_error(self.import_source)
=== added file 'tests/functional/openlp_plugins/songs/test_presentationmanagerimport.py'
--- tests/functional/openlp_plugins/songs/test_presentationmanagerimport.py 1970-01-01 00:00:00 +0000
+++ tests/functional/openlp_plugins/songs/test_presentationmanagerimport.py 2014-07-14 16:54:11 +0000
@@ -0,0 +1,53 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2014 Raoul Snyman #
+# Portions copyright (c) 2008-2014 Tim Bentley, Gerald Britton, Jonathan #
+# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, #
+# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. #
+# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, #
+# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
+# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, #
+# Frode Woldsund, Martin Zibricky, Patrick Zimmermann #
+# --------------------------------------------------------------------------- #
+# 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 #
+###############################################################################
+"""
+This module contains tests for the PresentationManager song importer.
+"""
+
+import os
+
+from tests.helpers.songfileimport import SongImportTestHelper
+
+TEST_PATH = os.path.abspath(
+ os.path.join(os.path.dirname(__file__), '..', '..', '..', 'resources', 'presentationmanagersongs'))
+
+
+class TestSongShowPlusFileImport(SongImportTestHelper):
+
+ def __init__(self, *args, **kwargs):
+ self.importer_class_name = 'PresentationManagerImport'
+ self.importer_module_name = 'presentationmanager'
+ super(TestSongShowPlusFileImport, self).__init__(*args, **kwargs)
+
+ def test_song_import(self):
+ """
+ Test that loading a PresentationManager file works correctly
+ """
+ self.file_import([os.path.join(TEST_PATH, 'Great Is Thy Faithfulness.sng')],
+ self.load_external_result_data(os.path.join(TEST_PATH, 'Great Is Thy Faithfulness.json')))
=== added directory 'tests/resources/presentationmanagersongs'
=== added file 'tests/resources/presentationmanagersongs/Great Is Thy Faithfulness.json'
--- tests/resources/presentationmanagersongs/Great Is Thy Faithfulness.json 1970-01-01 00:00:00 +0000
+++ tests/resources/presentationmanagersongs/Great Is Thy Faithfulness.json 2014-07-14 16:54:11 +0000
@@ -0,0 +1,25 @@
+{
+ "title": "Great Is Thy Faithfulness",
+ "authors": [
+ "Thomas O. Chisholm (1866-1960)"
+ ],
+ "verse_order_list": ["v1", "c1", "v2", "c1", "v3", "c1"],
+ "verses": [
+ [
+ "\"Great is Thy faithfulness\", O God my Father.\nThere is no shadow of turning with Thee;\nThou changest not, Thy compassions they fail not,\nAs Thou hast been Thou forever shall be.",
+ "v1"
+ ],
+ [
+ "Great is Thy faithfulness!\nGreat is Thy faithfulness!\nMorning by morning new mercies I see!\nAll I have needed Thy hand hath provided -\n\"Great is Thy faithfulness\", Lord, unto me!",
+ "c1"
+ ],
+ [
+ "Summer and winter, and springtime and harvest,\nSun, moon, and stars in their courses above,\nJoin with all nature in manifold witness,\nTo Thy great faithfulness, mercy and love.",
+ "v2"
+ ],
+ [
+ "Pardon for sin and a peace that endureth,\nThine own dear presence to cheer and to guide,\nStrength for today and bright hope for tomorrow,\nBlessings all mine, with ten thousand beside!",
+ "v3"
+ ]
+ ]
+}
=== added file 'tests/resources/presentationmanagersongs/Great Is Thy Faithfulness.sng'
--- tests/resources/presentationmanagersongs/Great Is Thy Faithfulness.sng 1970-01-01 00:00:00 +0000
+++ tests/resources/presentationmanagersongs/Great Is Thy Faithfulness.sng 2014-07-14 16:54:11 +0000
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<song xmlns="creativelifestyles/song">
+<attributes>
+<title>Great Is Thy Faithfulness</title>
+<author>Thomas O. Chisholm (1866-1960)</author>
+<copyright></copyright>
+<ccli_number></ccli_number>
+<comments></comments>
+</attributes>
+<verses>
+<verse id="Verse 1">
+"Great is Thy faithfulness", O God my Father.
+There is no shadow of turning with Thee;
+Thou changest not, Thy compassions they fail not,
+As Thou hast been Thou forever shall be.
+</verse>
+<verse id="Chorus">
+Great is Thy faithfulness!
+Great is Thy faithfulness!
+Morning by morning new mercies I see!
+All I have needed Thy hand hath provided -
+"Great is Thy faithfulness", Lord, unto me!
+</verse>
+<verse id="Verse 2">
+Summer and winter, and springtime and harvest,
+Sun, moon, and stars in their courses above,
+Join with all nature in manifold witness,
+To Thy great faithfulness, mercy and love.
+</verse>
+<verse id="Chorus">
+Great is Thy faithfulness!
+Great is Thy faithfulness!
+Morning by morning new mercies I see!
+All I have needed Thy hand hath provided -
+"Great is Thy faithfulness", Lord, unto me!
+</verse>
+<verse id="Verse 3">
+Pardon for sin and a peace that endureth,
+Thine own dear presence to cheer and to guide,
+Strength for today and bright hope for tomorrow,
+Blessings all mine, with ten thousand beside!
+</verse>
+<verse id="Chorus">
+Great is Thy faithfulness!
+Great is Thy faithfulness!
+Morning by morning new mercies I see!
+All I have needed Thy hand hath provided -
+"Great is Thy faithfulness", Lord, unto me!
+</verse>
+</verses>
+</song>
Follow ups