openlp-core team mailing list archive
-
openlp-core team
-
Mailing list archive
-
Message #01811
[Merge] lp:~meths/openlp/trivialfixes into lp:openlp
Jon Tibble has proposed merging lp:~meths/openlp/trivialfixes into lp:openlp.
Requested reviews:
Tim Bentley (trb143)
Raoul Snyman (raoul-snyman): needs fixing
Bible search fix:
* Add feedback when a book is not found
* Caters for partial file-based bibles e.g. Just one testament
* Prevent an uncaught exception (the previous behaviour)
Fix lack of feedback when editing and deleting media manager items when none are selected
Fix Bible Import Wizard setField errors
Fix addToServiceItem locations
Remove unused scripts/get-strings.py
--
https://code.launchpad.net/~meths/openlp/trivialfixes/+merge/27821
Your team OpenLP Core is subscribed to branch lp:openlp.
=== modified file 'openlp/core/lib/mediamanageritem.py'
--- openlp/core/lib/mediamanageritem.py 2010-06-15 15:22:26 +0000
+++ openlp/core/lib/mediamanageritem.py 2010-06-17 11:52:27 +0000
@@ -110,7 +110,6 @@
self.remoteTriggered = None
self.ServiceItemIconName = None
self.singleServiceItem = True
- self.addToServiceItem = False
self.PageLayout = QtGui.QVBoxLayout(self)
self.PageLayout.setSpacing(0)
self.PageLayout.setContentsMargins(4, 0, 4, 0)
@@ -133,6 +132,7 @@
self.hasEditIcon = True
self.hasFileIcon = False
self.hasDeleteIcon = True
+ self.addToServiceItem = False
def retranslateUi(self):
"""
@@ -325,6 +325,19 @@
"""
pass
+ def checkItemSelected(self, message):
+ """
+ Check if a list item is selected so an action may be performed on it
+
+ ``message``
+ The message to give the user if no item is selected
+ """
+ if not self.ListView.selectedIndexes():
+ QtGui.QMessageBox.information(self,
+ translate(u'MediaManagerItem', u'No Items Selected'), message)
+ return False
+ return True
+
def onFileClick(self):
files = QtGui.QFileDialog.getOpenFileNames(
self, self.OnNewPrompt,
@@ -392,7 +405,7 @@
if not self.ListView.selectedIndexes() and not self.remoteTriggered:
QtGui.QMessageBox.information(self,
self.trUtf8('No Items Selected'),
- self.trUtf8('You must select one or more items.'))
+ self.trUtf8('You must select one or more items to preview.'))
else:
log.debug(self.PluginNameShort + u' Preview requested')
service_item = self.buildServiceItem()
@@ -404,7 +417,7 @@
if not self.ListView.selectedIndexes():
QtGui.QMessageBox.information(self,
self.trUtf8('No Items Selected'),
- self.trUtf8('You must select one or more items.'))
+ self.trUtf8('You must select one or more items to send live.'))
else:
log.debug(self.PluginNameShort + u' Live requested')
service_item = self.buildServiceItem()
=== modified file 'openlp/core/lib/plugin.py'
--- openlp/core/lib/plugin.py 2010-05-01 13:05:17 +0000
+++ openlp/core/lib/plugin.py 2010-06-17 11:52:27 +0000
@@ -231,7 +231,8 @@
Show a dialog when the user clicks on the 'About' button in the plugin
manager.
"""
- pass
+ raise NotImplementedError(
+ u'Plugin.about needs to be defined by the plugin')
def initialise(self):
"""
=== modified file 'openlp/plugins/bibles/forms/importwizardform.py'
--- openlp/plugins/bibles/forms/importwizardform.py 2010-06-15 15:22:26 +0000
+++ openlp/plugins/bibles/forms/importwizardform.py 2010-06-17 11:52:27 +0000
@@ -303,17 +303,20 @@
self.setField(u'csv_versefile', QtCore.QVariant(''))
self.setField(u'opensong_file', QtCore.QVariant(''))
self.setField(u'web_location', QtCore.QVariant(WebDownload.Crosswalk))
- self.setField(u'web_biblename', QtCore.QVariant(self.BibleComboBox))
+ self.setField(u'web_biblename',
+ QtCore.QVariant(self.BibleComboBox.currentIndex()))
self.setField(u'proxy_server',
settings.value(u'proxy address', QtCore.QVariant(u'')))
self.setField(u'proxy_username',
settings.value(u'proxy username', QtCore.QVariant(u'')))
self.setField(u'proxy_password',
settings.value(u'proxy password', QtCore.QVariant(u'')))
- self.setField(u'license_version', QtCore.QVariant(self.VersionNameEdit))
- self.setField(u'license_copyright', QtCore.QVariant(self.CopyrightEdit))
+ self.setField(u'license_version',
+ QtCore.QVariant(self.VersionNameEdit.text()))
+ self.setField(u'license_copyright',
+ QtCore.QVariant(self.CopyrightEdit.text()))
self.setField(u'license_permission',
- QtCore.QVariant(self.PermissionEdit))
+ QtCore.QVariant(self.PermissionEdit.text()))
self.onLocationComboBoxChanged(WebDownload.Crosswalk)
settings.endGroup()
=== modified file 'openlp/plugins/bibles/lib/db.py'
--- openlp/plugins/bibles/lib/db.py 2010-06-14 02:42:47 +0000
+++ openlp/plugins/bibles/lib/db.py 2010-06-17 11:52:27 +0000
@@ -29,8 +29,9 @@
import re
from sqlalchemy import or_
-from PyQt4 import QtCore
+from PyQt4 import QtCore, QtGui
+from openlp.core.lib import translate
from openlp.plugins.bibles.lib.models import *
log = logging.getLogger(__name__)
@@ -304,14 +305,22 @@
if db_book:
book = db_book.name
log.debug(u'Book name corrected to "%s"', book)
- verses = self.session.query(Verse)\
- .filter_by(book_id=db_book.id)\
- .filter_by(chapter=chapter)\
- .filter(Verse.verse >= start_verse)\
- .filter(Verse.verse <= end_verse)\
- .order_by(Verse.verse)\
- .all()
- verse_list.extend(verses)
+ verses = self.session.query(Verse)\
+ .filter_by(book_id=db_book.id)\
+ .filter_by(chapter=chapter)\
+ .filter(Verse.verse >= start_verse)\
+ .filter(Verse.verse <= end_verse)\
+ .order_by(Verse.verse)\
+ .all()
+ verse_list.extend(verses)
+ else:
+ log.debug(u'OpenLP failed to find book %s', book)
+ QtGui.QMessageBox.information(self.bible_plugin.media_item,
+ translate(u'BibleDB', u'Book not found'),
+ translate(u'BibleDB', u'The book you requested could not '
+ u'be found in this bible. Please check your spelling '
+ u'and that this is a complete bible not just one '
+ u'testament.'))
return verse_list
def verse_search(self, text):
@@ -383,4 +392,3 @@
log.debug(u'...............................Verses ')
verses = self.session.query(Verse).all()
log.debug(verses)
-
=== modified file 'openlp/plugins/bibles/lib/mediaitem.py'
--- openlp/plugins/bibles/lib/mediaitem.py 2010-06-09 21:15:37 +0000
+++ openlp/plugins/bibles/lib/mediaitem.py 2010-06-17 11:52:27 +0000
@@ -57,7 +57,6 @@
self.IconPath = u'songs/song'
self.ListViewWithDnD_class = BibleListView
self.lastReference = []
- self.addToServiceItem = True
MediaManagerItem.__init__(self, parent, icon, title)
# place to store the search results
self.search_results = {}
=== modified file 'openlp/plugins/custom/lib/mediaitem.py'
--- openlp/plugins/custom/lib/mediaitem.py 2010-06-08 15:38:09 +0000
+++ openlp/plugins/custom/lib/mediaitem.py 2010-06-17 11:52:27 +0000
@@ -115,16 +115,24 @@
self.parent.edit_custom_form.exec_()
def onEditClick(self):
- item = self.ListView.currentItem()
- if item:
+ """
+ Edit a custom item
+ """
+ if self.checkItemSelected(translate(u'CustomPlugin.MediaItem',
+ u'You must select an item to edit.')):
+ item = self.ListView.currentItem()
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
self.parent.edit_custom_form.loadCustom(item_id, False)
self.parent.edit_custom_form.exec_()
self.initialise()
def onDeleteClick(self):
- item = self.ListView.currentItem()
- if item:
+ """
+ Remove a custom item from the list and database
+ """
+ if self.checkItemSelected(translate(u'CustomPlugin.MediaItem',
+ u'You must select an item to delete.')):
+ item = self.ListView.currentItem()
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
self.parent.custommanager.delete_custom(item_id)
row = self.ListView.row(item)
=== modified file 'openlp/plugins/images/lib/mediaitem.py'
--- openlp/plugins/images/lib/mediaitem.py 2010-06-15 15:22:26 +0000
+++ openlp/plugins/images/lib/mediaitem.py 2010-06-17 11:52:27 +0000
@@ -54,7 +54,6 @@
# be instanced by the base MediaManagerItem
self.ListViewWithDnD_class = ImageListView
MediaManagerItem.__init__(self, parent, icon, title)
- self.addToServiceItem = True
def initPluginNameVisible(self):
self.PluginNameVisible = translate(u'ImagePlugin.MediaItem', u'Image')
@@ -74,6 +73,7 @@
self.hasFileIcon = True
self.hasNewIcon = False
self.hasEditIcon = False
+ self.addToServiceItem = True
def initialise(self):
log.debug(u'initialise')
@@ -116,14 +116,18 @@
self.PageLayout.addWidget(self.ImageWidget)
def onDeleteClick(self):
- items = self.ListView.selectedIndexes()
- if items:
+ """
+ Remove an image item from the list
+ """
+ if self.checkItemSelected(translate(u'ImagePlugin.MediaItem',
+ u'You must select an item to delete.')):
+ items = self.ListView.selectedIndexes()
for item in items:
text = self.ListView.item(item.row())
if text:
try:
- os.remove(
- os.path.join(self.servicePath, unicode(text.text())))
+ os.remove(os.path.join(self.servicePath,
+ unicode(text.text())))
except OSError:
#if not present do not worry
pass
=== modified file 'openlp/plugins/media/lib/mediaitem.py'
--- openlp/plugins/media/lib/mediaitem.py 2010-06-15 15:22:26 +0000
+++ openlp/plugins/media/lib/mediaitem.py 2010-06-17 11:52:27 +0000
@@ -137,8 +137,12 @@
self.settingsSection))
def onDeleteClick(self):
- item = self.ListView.currentItem()
- if item:
+ """
+ Remove a media item from the list
+ """
+ if self.checkItemSelected(translate(u'MediaPlugin.MediaItem',
+ u'You must select an item to delete.')):
+ item = self.ListView.currentItem()
row = self.ListView.row(item)
self.ListView.takeItem(row)
SettingsManager.set_list(self.settingsSection,
@@ -152,4 +156,3 @@
item_name.setIcon(build_icon(img))
item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file))
self.ListView.addItem(item_name)
-
=== modified file 'openlp/plugins/presentations/lib/mediaitem.py'
--- openlp/plugins/presentations/lib/mediaitem.py 2010-06-09 21:15:37 +0000
+++ openlp/plugins/presentations/lib/mediaitem.py 2010-06-17 11:52:27 +0000
@@ -174,8 +174,12 @@
self.ListView.addItem(item_name)
def onDeleteClick(self):
- item = self.ListView.currentItem()
- if item:
+ """
+ Remove a presentation item from the list
+ """
+ if self.checkItemSelected(translate(u'PresentationPlugin.MediaItem',
+ u'You must select an item to delete.')):
+ item = self.ListView.currentItem()
row = self.ListView.row(item)
self.ListView.takeItem(row)
SettingsManager.set_list(self.settingsSection,
=== modified file 'openlp/plugins/songs/lib/mediaitem.py'
--- openlp/plugins/songs/lib/mediaitem.py 2010-06-15 15:22:26 +0000
+++ openlp/plugins/songs/lib/mediaitem.py 2010-06-17 11:52:27 +0000
@@ -275,15 +275,23 @@
self.edit_song_form.exec_()
def onEditClick(self):
- item = self.ListView.currentItem()
- if item:
+ """
+ Edit a song
+ """
+ if self.checkItemSelected(translate(u'SongsPlugin.MediaItem',
+ u'You must select an item to edit.')):
+ item = self.ListView.currentItem()
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
self.edit_song_form.loadSong(item_id, False)
self.edit_song_form.exec_()
def onDeleteClick(self):
- items = self.ListView.selectedIndexes()
- if items:
+ """
+ Remove a song from the list and database
+ """
+ if self.checkItemSelected(translate(u'SongsPlugin.MediaItem',
+ u'You must select an item to delete.')):
+ items = self.ListView.selectedIndexes()
if len(items) == 1:
del_message = translate(u'SongsPlugin.MediaItem',
u'Delete song?')
@@ -371,4 +379,3 @@
song.title, author_audit, song.copyright, song.ccli_number
]
return True
-
=== removed file 'scripts/get-strings.py'
--- scripts/get-strings.py 2010-03-21 23:58:01 +0000
+++ scripts/get-strings.py 1970-01-01 00:00:00 +0000
@@ -1,116 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
-
-###############################################################################
-# OpenLP - Open Source Lyrics Projection #
-# --------------------------------------------------------------------------- #
-# Copyright (c) 2008-2010 Raoul Snyman #
-# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael #
-# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin #
-# Thompson, Jon Tibble, Carsten Tinggaard #
-# --------------------------------------------------------------------------- #
-# 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 #
-###############################################################################
-
-import os
-from cgi import escape
-from ast import parse, NodeVisitor, Str
-
-ts_file = u"""<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="1.1">
-%s
-</TS>
-"""
-ts_context = u""" <context>
- <name>%s</name>
-%s </context>
-"""
-ts_message = u""" <message>
- <location filename="%s" line="%d"/>
- <source>%s</source>
- <translation type="unfinished"></translation>
- </message>
-"""
-
-class StringExtractor(NodeVisitor):
-
- def __init__(self, strings, filename, base_path):
- self.base_path = base_path
- self.filename = filename
- self.strings = strings
- self.classname = 'unknown'
-
- def visit_ClassDef(self, node):
- self.classname = node.name
- self.generic_visit(node)
-
- def visit_Call(self, node):
- if hasattr(node.func, 'attr') and node.func.attr == 'trUtf8' and isinstance(node.args[0], Str):
- string = node.args[0].s
- key = '%s-%s' % (self.classname, string)
- self.strings[key] = [self.classname, self.filename[len(self.base_path) + 1:], node.lineno, escape(string)]
- self.generic_visit(node)
-
-def parse_file(base_path, filename, strings):
- file = open(filename, u'r')
- try:
- ast = parse(file.read())
- except SyntaxError, e:
- print "Unable to parse %s: %s" % (filename, e)
- return
- file.close()
-
- StringExtractor(strings, filename, base_path).visit(ast)
-
-def write_file(filename, strings):
- translation_file = u''
- translation_contexts = []
- translation_messages = []
- class_name = strings[strings.keys()[0]][0]
- current_context = u''
- for key, translation in strings.iteritems():
- if class_name != translation[0]:
- current_context = ts_context % (class_name, u''.join(translation_messages))
- translation_contexts.append(current_context)
- translation_messages = []
- class_name = translation[0]
- translation_messages.append(ts_message % (translation[1], translation[2], translation[3]))
- current_context = ts_context % (class_name, u''.join(translation_messages))
- translation_contexts.append(current_context)
- translation_file = ts_file % (u''.join(translation_contexts))
- file = open(filename, u'w')
- file.write(translation_file.encode('utf8'))
- file.close()
-
-def main():
- strings = {}
- start_dir = os.path.abspath(u'..')
- for root, dirs, files in os.walk(start_dir):
- for file in files:
- if file.startswith(u'hook-') or file.startswith(u'test_'):
- continue
- if file.endswith(u'.py'):
- print u'Parsing "%s"' % file
- parse_file(start_dir, os.path.join(root, file), strings)
- print u'Generating TS file...',
- write_file(os.path.join(start_dir, u'resources', u'i18n', u'openlp_en.ts'), strings)
- print u'done.'
-
-if __name__ == u'__main__':
- if os.path.split(os.path.abspath(u'.'))[1] != u'scripts':
- print u'You need to run this script from the scripts directory.'
- else:
- main()
Follow ups