← Back to team overview

openlp-core team mailing list archive

[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