forked from openlp/openlp
This commit is contained in:
parent
8d36b9a416
commit
b5982dec40
@ -58,3 +58,5 @@ from editverseform import EditVerseForm
|
|||||||
from editsongform import EditSongForm
|
from editsongform import EditSongForm
|
||||||
from songmaintenanceform import SongMaintenanceForm
|
from songmaintenanceform import SongMaintenanceForm
|
||||||
from songimportform import SongImportForm
|
from songimportform import SongImportForm
|
||||||
|
from songexportform import SongExportForm
|
||||||
|
|
||||||
|
229
openlp/plugins/songs/forms/songexportform.py
Normal file
229
openlp/plugins/songs/forms/songexportform.py
Normal file
@ -0,0 +1,229 @@
|
|||||||
|
# -*- 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, Jonathan Corwin, Michael #
|
||||||
|
# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian #
|
||||||
|
# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, #
|
||||||
|
# Carsten Tinggaard, 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 song export function for OpenLP.
|
||||||
|
"""
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
|
||||||
|
from PyQt4 import QtCore, QtGui
|
||||||
|
|
||||||
|
from openlp.core.lib import Receiver, SettingsManager, translate
|
||||||
|
from openlp.core.ui import criticalErrorMessageBox
|
||||||
|
from openlp.core.ui.wizard import OpenLPWizard
|
||||||
|
from openlp.plugins.songs.lib.db import Song
|
||||||
|
from openlp.plugins.songs.lib.openlyricsexport import OpenLyricsExport
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
class SongExportForm(OpenLPWizard):
|
||||||
|
"""
|
||||||
|
This is the Song Export Wizard, which allows easy exporting of Songs to
|
||||||
|
OpenLyrics.
|
||||||
|
"""
|
||||||
|
log.info(u'SongExportForm loaded')
|
||||||
|
|
||||||
|
def __init__(self, parent, plugin):
|
||||||
|
"""
|
||||||
|
Instantiate the wizard, and run any extra setup we need to.
|
||||||
|
|
||||||
|
``parent``
|
||||||
|
The QWidget-derived parent of the wizard.
|
||||||
|
|
||||||
|
``plugin``
|
||||||
|
The songs plugin.
|
||||||
|
"""
|
||||||
|
self.plugin = plugin
|
||||||
|
OpenLPWizard.__init__(self, parent, plugin, u'songExportWizard',
|
||||||
|
u':/wizards/wizard_importsong.bmp')
|
||||||
|
|
||||||
|
def setupUi(self, image):
|
||||||
|
"""
|
||||||
|
Set up the song wizard UI.
|
||||||
|
"""
|
||||||
|
OpenLPWizard.setupUi(self, image)
|
||||||
|
|
||||||
|
def customInit(self):
|
||||||
|
"""
|
||||||
|
Song wizard specific initialisation.
|
||||||
|
"""
|
||||||
|
songs = self.plugin.manager.get_all_objects(Song)
|
||||||
|
for song in songs:
|
||||||
|
self.availableListWidget.addItem(unicode(song.id))
|
||||||
|
|
||||||
|
def customSignals(self):
|
||||||
|
"""
|
||||||
|
Song wizard specific signals.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def addCustomPages(self):
|
||||||
|
"""
|
||||||
|
Add song wizard specific pages.
|
||||||
|
"""
|
||||||
|
# Source Page
|
||||||
|
self.sourcePage = QtGui.QWizardPage()
|
||||||
|
self.sourcePage.setObjectName(u'SourcePage')
|
||||||
|
self.sourceLayout = QtGui.QVBoxLayout(self.sourcePage)
|
||||||
|
self.sourceLayout.setObjectName(u'SourceLayout')
|
||||||
|
|
||||||
|
self.songListsWidget = QtGui.QWidget(self.sourcePage)
|
||||||
|
self.songListsWidget.setGeometry(QtCore.QRect(8, 10, 541, 291))
|
||||||
|
self.songListsWidget.setObjectName("songListsWidget")
|
||||||
|
self.SongListsLayout = QtGui.QHBoxLayout(self.songListsWidget)
|
||||||
|
self.SongListsLayout.setSpacing(0)
|
||||||
|
self.SongListsLayout.setMargin(0)
|
||||||
|
self.SongListsLayout.setObjectName("SongListsLayout")
|
||||||
|
self.availableGroupBox = QtGui.QGroupBox(self.songListsWidget)
|
||||||
|
self.availableGroupBox.setObjectName("availableGroupBox")
|
||||||
|
self.verticalLayout_5 = QtGui.QVBoxLayout(self.availableGroupBox)
|
||||||
|
self.verticalLayout_5.setObjectName("verticalLayout_5")
|
||||||
|
self.availableListWidget = QtGui.QListWidget(self.availableGroupBox)
|
||||||
|
self.availableListWidget.setObjectName("availableListWidget")
|
||||||
|
self.verticalLayout_5.addWidget(self.availableListWidget)
|
||||||
|
self.SongListsLayout.addWidget(self.availableGroupBox)
|
||||||
|
self.selectionWidget = QtGui.QWidget(self.songListsWidget)
|
||||||
|
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
|
||||||
|
sizePolicy.setHorizontalStretch(0)
|
||||||
|
sizePolicy.setVerticalStretch(0)
|
||||||
|
sizePolicy.setHeightForWidth(self.selectionWidget.sizePolicy().hasHeightForWidth())
|
||||||
|
self.selectionWidget.setSizePolicy(sizePolicy)
|
||||||
|
self.selectionWidget.setMaximumSize(QtCore.QSize(30, 16777215))
|
||||||
|
self.selectionWidget.setObjectName("selectionWidget")
|
||||||
|
self.SelectionLayout = QtGui.QVBoxLayout(self.selectionWidget)
|
||||||
|
self.SelectionLayout.setSpacing(0)
|
||||||
|
self.SelectionLayout.setSizeConstraint(QtGui.QLayout.SetMinimumSize)
|
||||||
|
self.SelectionLayout.setMargin(0)
|
||||||
|
self.SelectionLayout.setObjectName("SelectionLayout")
|
||||||
|
self.addSelected = QtGui.QToolButton(self.selectionWidget)
|
||||||
|
icon = QtGui.QIcon()
|
||||||
|
icon.addPixmap(QtGui.QPixmap(":/exports/export_move_to_list.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
||||||
|
self.addSelected.setIcon(icon)
|
||||||
|
self.addSelected.setIconSize(QtCore.QSize(20, 20))
|
||||||
|
self.addSelected.setObjectName("addSelected")
|
||||||
|
self.SelectionLayout.addWidget(self.addSelected)
|
||||||
|
self.removeSelected = QtGui.QToolButton(self.selectionWidget)
|
||||||
|
icon1 = QtGui.QIcon()
|
||||||
|
icon1.addPixmap(QtGui.QPixmap(":/imports/import_remove.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
||||||
|
self.removeSelected.setIcon(icon1)
|
||||||
|
self.removeSelected.setIconSize(QtCore.QSize(20, 20))
|
||||||
|
self.removeSelected.setObjectName("removeSelected")
|
||||||
|
self.SelectionLayout.addWidget(self.removeSelected)
|
||||||
|
self.SongListsLayout.addWidget(self.selectionWidget)
|
||||||
|
self.selectedGroupBox = QtGui.QGroupBox(self.songListsWidget)
|
||||||
|
self.selectedGroupBox.setObjectName("selectedGroupBox")
|
||||||
|
self.verticalLayout_6 = QtGui.QVBoxLayout(self.selectedGroupBox)
|
||||||
|
self.verticalLayout_6.setObjectName("verticalLayout_6")
|
||||||
|
self.selectedListWidget = QtGui.QListWidget(self.selectedGroupBox)
|
||||||
|
self.selectedListWidget.setObjectName("selectedListWidget")
|
||||||
|
self.verticalLayout_6.addWidget(self.selectedListWidget)
|
||||||
|
self.SongListsLayout.addWidget(self.selectedGroupBox)
|
||||||
|
|
||||||
|
|
||||||
|
self.formatStack = QtGui.QStackedLayout()
|
||||||
|
self.formatStack.setObjectName(u'FormatStack')
|
||||||
|
self.sourceLayout.addLayout(self.formatStack)
|
||||||
|
self.addPage(self.sourcePage)
|
||||||
|
|
||||||
|
def retranslateUi(self):
|
||||||
|
"""
|
||||||
|
Song wizard localisation.
|
||||||
|
"""
|
||||||
|
self.setWindowTitle(
|
||||||
|
translate('SongsPlugin.ImportWizardForm', 'Song Import Wizard'))
|
||||||
|
self.titleLabel.setText(
|
||||||
|
u'<span style="font-size:14pt; font-weight:600;">%s</span>' % \
|
||||||
|
translate('SongsPlugin.ImportWizardForm',
|
||||||
|
'Welcome to the Song Import Wizard'))
|
||||||
|
self.informationLabel.setText(
|
||||||
|
translate('SongsPlugin.ImportWizardForm',
|
||||||
|
'This wizard will help you to export songs from a variety of '
|
||||||
|
'formats. Click the next button below to start the process by '
|
||||||
|
'selecting a format to export from.'))
|
||||||
|
self.sourcePage.setTitle(
|
||||||
|
translate('SongsPlugin.ImportWizardForm', 'Select Import Source'))
|
||||||
|
self.sourcePage.setSubTitle(
|
||||||
|
translate('SongsPlugin.ImportWizardForm',
|
||||||
|
'Select the export format, and where to export from.'))
|
||||||
|
|
||||||
|
self.progressPage.setTitle(
|
||||||
|
translate('SongsPlugin.ImportWizardForm', 'Importing'))
|
||||||
|
self.progressPage.setSubTitle(
|
||||||
|
translate('SongsPlugin.ImportWizardForm',
|
||||||
|
'Please wait while your songs are exported.'))
|
||||||
|
self.progressLabel.setText(
|
||||||
|
translate('SongsPlugin.ImportWizardForm', 'Ready.'))
|
||||||
|
self.progressBar.setFormat(
|
||||||
|
translate('SongsPlugin.ImportWizardForm', '%p%'))
|
||||||
|
|
||||||
|
def validateCurrentPage(self):
|
||||||
|
"""
|
||||||
|
Validate the current page before moving on to the next page.
|
||||||
|
"""
|
||||||
|
if self.currentPage() == self.welcomePage:
|
||||||
|
return True
|
||||||
|
elif self.currentPage() == self.sourcePage:
|
||||||
|
return True
|
||||||
|
elif self.currentPage() == self.progressPage:
|
||||||
|
return True
|
||||||
|
|
||||||
|
def registerFields(self):
|
||||||
|
"""
|
||||||
|
Register song export wizard fields.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def setDefaults(self):
|
||||||
|
"""
|
||||||
|
Set default form values for the song export wizard.
|
||||||
|
"""
|
||||||
|
self.restart()
|
||||||
|
self.finishButton.setVisible(False)
|
||||||
|
self.cancelButton.setVisible(True)
|
||||||
|
|
||||||
|
def preWizard(self):
|
||||||
|
"""
|
||||||
|
Perform pre export tasks
|
||||||
|
"""
|
||||||
|
OpenLPWizard.preWizard(self)
|
||||||
|
self.progressLabel.setText(
|
||||||
|
translate('SongsPlugin.ImportWizardForm', 'Starting export...'))
|
||||||
|
Receiver.send_message(u'openlp_process_events')
|
||||||
|
|
||||||
|
def performWizard(self):
|
||||||
|
"""
|
||||||
|
Perform the actual export. This method pulls in the correct exporter
|
||||||
|
class, and then runs the ``do_export`` method of the exporter to do
|
||||||
|
the actual exporting.
|
||||||
|
"""
|
||||||
|
exporter = OpenLyricsExport()
|
||||||
|
if exporter.do_export():
|
||||||
|
self.progressLabel.setText(
|
||||||
|
translate('SongsPlugin.SongImportForm', 'Finished export.'))
|
||||||
|
else:
|
||||||
|
self.progressLabel.setText(
|
||||||
|
translate('SongsPlugin.SongImportForm',
|
||||||
|
'Your song export failed.'))
|
@ -34,7 +34,7 @@ from sqlalchemy.sql import or_
|
|||||||
from openlp.core.lib import MediaManagerItem, BaseListWithDnD, Receiver, \
|
from openlp.core.lib import MediaManagerItem, BaseListWithDnD, Receiver, \
|
||||||
ItemCapabilities, translate, check_item_selected
|
ItemCapabilities, translate, check_item_selected
|
||||||
from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm, \
|
from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm, \
|
||||||
SongImportForm
|
SongImportForm, SongExportForm
|
||||||
from openlp.plugins.songs.lib import OpenLyrics, SongXML
|
from openlp.plugins.songs.lib import OpenLyrics, SongXML
|
||||||
from openlp.plugins.songs.lib.db import Author, Song
|
from openlp.plugins.songs.lib.db import Author, Song
|
||||||
from openlp.core.lib.searchedit import SearchEdit
|
from openlp.core.lib.searchedit import SearchEdit
|
||||||
@ -271,6 +271,12 @@ class SongMediaItem(MediaManagerItem):
|
|||||||
if self.import_wizard.exec_() == QtGui.QDialog.Accepted:
|
if self.import_wizard.exec_() == QtGui.QDialog.Accepted:
|
||||||
Receiver.send_message(u'songs_load_list')
|
Receiver.send_message(u'songs_load_list')
|
||||||
|
|
||||||
|
def onExportClick(self):
|
||||||
|
if not hasattr(self, u'export_wizard'):
|
||||||
|
self.export_wizard = SongExportForm(self, self.parent)
|
||||||
|
if self.export_wizard.exec_() == QtGui.QDialog.Accepted:
|
||||||
|
Receiver.send_message(u'songs_load_list')
|
||||||
|
|
||||||
def onNewClick(self):
|
def onNewClick(self):
|
||||||
log.debug(u'onNewClick')
|
log.debug(u'onNewClick')
|
||||||
self.edit_song_form.newSong()
|
self.edit_song_form.newSong()
|
||||||
|
77
openlp/plugins/songs/lib/openlyricsexport.py
Executable file
77
openlp/plugins/songs/lib/openlyricsexport.py
Executable file
@ -0,0 +1,77 @@
|
|||||||
|
# -*- 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-2010 Tim Bentley, Jonathan Corwin, Michael #
|
||||||
|
# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian #
|
||||||
|
# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, #
|
||||||
|
# Carsten Tinggaard, 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:`openlyricsexport` module provides the functionality for exporting
|
||||||
|
songs from the database.
|
||||||
|
"""
|
||||||
|
import datetime
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
|
||||||
|
from lxml import etree
|
||||||
|
|
||||||
|
from openlp.core.lib import translate
|
||||||
|
from openlp.plugins.songs.lib import OpenLyrics
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
class OpenLyricsExport(object):
|
||||||
|
"""
|
||||||
|
This provides the Openlyrics export.
|
||||||
|
"""
|
||||||
|
def __init__(self, master_manager, song_ids, save_path):
|
||||||
|
"""
|
||||||
|
Initialise the export.
|
||||||
|
"""
|
||||||
|
log.debug(u'initialise OpenLyricsExport')
|
||||||
|
self.master_manager = master_manager
|
||||||
|
self.song_ids = song_ids
|
||||||
|
self.save_path = save_path
|
||||||
|
|
||||||
|
def do_export(self):
|
||||||
|
"""
|
||||||
|
Export the songs.
|
||||||
|
"""
|
||||||
|
openLyrics = OpenLyrics(self.master_manager)
|
||||||
|
self.export_wizard.exportProgressBar.setMaximum(len(songs))
|
||||||
|
for song in self.songs:
|
||||||
|
if self.stop_export_flag:
|
||||||
|
return False
|
||||||
|
self.export_wizard.incrementProgressBar(unicode(translate(
|
||||||
|
'SongsPlugin.OpenLyricsExport', 'Exporting %s...')) %
|
||||||
|
song.title)
|
||||||
|
path = os.path.join(self.save_path, song.title + u'.xml')
|
||||||
|
xml = openLyrics.song_to_xml(song)
|
||||||
|
# Add "IMPLEMENTED_VERSION = u'0.7" to xml.py/OpenLyrics class!
|
||||||
|
xml.set(u'version', OpenLyrics.IMPLEMENTED_VERSION)
|
||||||
|
xml.set(u'createdIn', u'OpenLP 1.9.4') # Use variable
|
||||||
|
xml.set(u'modifiedIn', u'OpenLP 1.9.4') # Use variable
|
||||||
|
xml.set(u'modifiedDate',
|
||||||
|
datetime.datetime.now().strftime(u'%Y-%m-%dT%H:%M:%S'))
|
||||||
|
tree = etree.ElementTree(etree.fromstring(xml))
|
||||||
|
tree.write(path, encoding=u'utf-8', xml_declaration=True,
|
||||||
|
pretty_print=True)
|
||||||
|
return True
|
@ -106,8 +106,17 @@ class SongsPlugin(Plugin):
|
|||||||
The actual **Export** menu item, so that your actions can
|
The actual **Export** menu item, so that your actions can
|
||||||
use it as their parent.
|
use it as their parent.
|
||||||
"""
|
"""
|
||||||
# No menu items for now.
|
# Main song import menu item - will eventually be the only one
|
||||||
pass
|
self.SongExportItem = QtGui.QAction(export_menu)
|
||||||
|
self.SongExportItem.setObjectName(u'SongExportItem')
|
||||||
|
self.SongExportItem.setText(translate(
|
||||||
|
'SongsPlugin', '&Song'))
|
||||||
|
self.SongExportItem.setToolTip(translate('SongsPlugin',
|
||||||
|
'Exports songs using the export wizard.'))
|
||||||
|
export_menu.addAction(self.SongExportItem)
|
||||||
|
# Signals and slots
|
||||||
|
QtCore.QObject.connect(self.SongExportItem,
|
||||||
|
QtCore.SIGNAL(u'triggered()'), self.onSongExportItemClicked)
|
||||||
|
|
||||||
def addToolsMenuItem(self, tools_menu):
|
def addToolsMenuItem(self, tools_menu):
|
||||||
"""
|
"""
|
||||||
@ -172,6 +181,10 @@ class SongsPlugin(Plugin):
|
|||||||
if self.mediaItem:
|
if self.mediaItem:
|
||||||
self.mediaItem.onImportClick()
|
self.mediaItem.onImportClick()
|
||||||
|
|
||||||
|
def onSongExportItemClicked(self):
|
||||||
|
if self.mediaItem:
|
||||||
|
self.mediaItem.onExportClick()
|
||||||
|
|
||||||
def about(self):
|
def about(self):
|
||||||
about_text = translate('SongsPlugin', '<strong>Songs Plugin</strong>'
|
about_text = translate('SongsPlugin', '<strong>Songs Plugin</strong>'
|
||||||
'<br />The songs plugin provides the ability to display and '
|
'<br />The songs plugin provides the ability to display and '
|
||||||
|
Loading…
Reference in New Issue
Block a user