Merge lp:~tomasgroth/openlp/bugfixes14 into lp:openlp

Proposed by Tomas Groth
Status: Merged
Approved by: Raoul Snyman
Approved revision: 2502
Merged at revision: 2502
Proposed branch: lp:~tomasgroth/openlp/bugfixes14
Merge into: lp:openlp
Diff against target: 338 lines (+166/-38)
8 files modified
openlp/core/common/settings.py (+4/-2)
openlp/core/common/uistrings.py (+1/-0)
openlp/core/ui/slidecontroller.py (+17/-14)
openlp/plugins/bibles/lib/csvbible.py (+11/-20)
openlp/plugins/bibles/lib/versereferencelist.py (+4/-2)
tests/functional/openlp_plugins/bibles/test_csvimport.py (+97/-0)
tests/resources/bibles/dk1933-books.csv (+22/-0)
tests/resources/bibles/dk1933-verses.csv (+10/-0)
To merge this branch: bzr merge lp:~tomasgroth/openlp/bugfixes14
Reviewer Review Type Date Requested Status
Raoul Snyman Approve
Tim Bentley Approve
Review via email: mp+249897@code.launchpad.net

Description of the change

Use the doubleclick-go-live setting in the preview controller. Fixes bug 1422197.
If no copyright info is given for bible, don't print it. Fixes bug 1420785.
Make csv-bible import work with python3. Fixes bug 1421136.
Add default shortcut bindings for preview next/prev, and make the appear in the shortcut edit dialog. Fixes bug 1412570.

To post a comment you must log in.
Revision history for this message
Tomas Groth (tomasgroth) wrote :
Revision history for this message
Tim Bentley (trb143) :
review: Approve
Revision history for this message
Raoul Snyman (raoul-snyman) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'openlp/core/common/settings.py'
2--- openlp/core/common/settings.py 2015-01-18 13:39:21 +0000
3+++ openlp/core/common/settings.py 2015-02-16 22:11:10 +0000
4@@ -216,7 +216,8 @@
5 'shortcuts/moveDown': [QtGui.QKeySequence(QtCore.Qt.Key_PageDown)],
6 'shortcuts/nextTrackItem': [],
7 'shortcuts/nextItem_live': [QtGui.QKeySequence(QtCore.Qt.Key_Down), QtGui.QKeySequence(QtCore.Qt.Key_PageDown)],
8- 'shortcuts/nextItem_preview': [],
9+ 'shortcuts/nextItem_preview': [QtGui.QKeySequence(QtCore.Qt.Key_Down),
10+ QtGui.QKeySequence(QtCore.Qt.Key_PageDown)],
11 'shortcuts/nextService': [QtGui.QKeySequence(QtCore.Qt.Key_Right)],
12 'shortcuts/newService': [],
13 'shortcuts/offlineHelpItem': [],
14@@ -230,7 +231,8 @@
15 'shortcuts/playSlidesLoop': [],
16 'shortcuts/playSlidesOnce': [],
17 'shortcuts/previousService': [QtGui.QKeySequence(QtCore.Qt.Key_Left)],
18- 'shortcuts/previousItem_preview': [],
19+ 'shortcuts/previousItem_preview': [QtGui.QKeySequence(QtCore.Qt.Key_Up),
20+ QtGui.QKeySequence(QtCore.Qt.Key_PageUp)],
21 'shortcuts/printServiceItem': [QtGui.QKeySequence('Ctrl+P')],
22 'shortcuts/songExportItem': [],
23 'shortcuts/songUsageStatus': [QtGui.QKeySequence(QtCore.Qt.Key_F4)],
24
25=== modified file 'openlp/core/common/uistrings.py'
26--- openlp/core/common/uistrings.py 2015-01-18 13:39:21 +0000
27+++ openlp/core/common/uistrings.py 2015-02-16 22:11:10 +0000
28@@ -115,6 +115,7 @@
29 self.PlaySlidesInLoop = translate('OpenLP.Ui', 'Play Slides in Loop')
30 self.PlaySlidesToEnd = translate('OpenLP.Ui', 'Play Slides to End')
31 self.Preview = translate('OpenLP.Ui', 'Preview')
32+ self.PreviewToolbar = translate('OpenLP.Ui', 'Preview Toolbar')
33 self.PrintService = translate('OpenLP.Ui', 'Print Service')
34 self.Projector = translate('OpenLP.Ui', 'Projector', 'Singular')
35 self.Projectors = translate('OpenLP.Ui', 'Projectors', 'Plural')
36
37=== modified file 'openlp/core/ui/slidecontroller.py'
38--- openlp/core/ui/slidecontroller.py 2015-01-29 21:21:03 +0000
39+++ openlp/core/ui/slidecontroller.py 2015-02-16 22:11:10 +0000
40@@ -408,7 +408,7 @@
41 self.set_live_hot_keys(self)
42 self.__add_actions_to_widget(self.controller)
43 else:
44- self.preview_widget.doubleClicked.connect(self.on_preview_add_to_service)
45+ self.preview_widget.doubleClicked.connect(self.on_preview_double_click)
46 self.toolbar.set_widget_visible(['editSong'], False)
47 self.controller.addActions([self.next_item, self.previous_item])
48 Registry().register_function('slidecontroller_%s_stop_loop' % self.type_prefix, self.on_stop_loop)
49@@ -1309,18 +1309,21 @@
50 if self.service_item:
51 self.service_manager.add_service_item(self.service_item)
52
53- def on_go_live_click(self, field=None):
54- """
55- triggered by clicking the Preview slide items
56- """
57- if Settings().value('advanced/double click live'):
58- # Live and Preview have issues if we have video or presentations
59- # playing in both at the same time.
60- if self.service_item.is_command():
61- Registry().execute('%s_stop' % self.service_item.name.lower(), [self.service_item, self.is_live])
62- if self.service_item.is_media():
63- self.on_media_close()
64- self.on_go_live()
65+ def on_preview_double_click(self, field=None):
66+ """
67+ Triggered when a preview slide item is doubleclicked
68+ """
69+ if self.service_item:
70+ if Settings().value('advanced/double click live'):
71+ # Live and Preview have issues if we have video or presentations
72+ # playing in both at the same time.
73+ if self.service_item.is_command():
74+ Registry().execute('%s_stop' % self.service_item.name.lower(), [self.service_item, self.is_live])
75+ if self.service_item.is_media():
76+ self.on_media_close()
77+ self.on_go_live()
78+ else:
79+ self.on_preview_add_to_service()
80
81 def on_go_live(self, field=None):
82 """
83@@ -1418,7 +1421,7 @@
84 super(PreviewController, self).__init__(parent)
85 self.split = 0
86 self.type_prefix = 'preview'
87- self.category = None
88+ self.category = 'Preview Toolbar'
89
90 def bootstrap_post_set_up(self):
91 """
92
93=== modified file 'openlp/plugins/bibles/lib/csvbible.py'
94--- openlp/plugins/bibles/lib/csvbible.py 2015-01-18 13:39:21 +0000
95+++ openlp/plugins/bibles/lib/csvbible.py 2015-02-16 22:11:10 +0000
96@@ -73,7 +73,7 @@
97 """
98 log.info(self.__class__.__name__)
99 BibleDB.__init__(self, parent, **kwargs)
100- self.books_file = kwargs['books_file']
101+ self.books_file = kwargs['booksfile']
102 self.verses_file = kwargs['versefile']
103
104 def do_import(self, bible_name=None):
105@@ -93,23 +93,20 @@
106 # Populate the Tables
107 try:
108 details = get_file_encoding(self.books_file)
109- books_file = open(self.books_file, 'r')
110- if not books_file.read(3) == '\xEF\xBB\xBF':
111- # no BOM was found
112- books_file.seek(0)
113+ books_file = open(self.books_file, 'r', encoding=details['encoding'])
114 books_reader = csv.reader(books_file, delimiter=',', quotechar='"')
115 for line in books_reader:
116 if self.stop_import_flag:
117 break
118- self.wizard.increment_progress_bar(translate('BiblesPlugin.CSVBible', 'Importing books... %s') %
119- str(line[2], details['encoding']))
120- book_ref_id = self.get_book_ref_id_by_name(str(line[2], details['encoding']), 67, language_id)
121+ self.wizard.increment_progress_bar(translate('BiblesPlugin.CSVBible', 'Importing books... %s')
122+ % line[2])
123+ book_ref_id = self.get_book_ref_id_by_name(line[2], 67, language_id)
124 if not book_ref_id:
125 log.error('Importing books from "%s" failed' % self.books_file)
126 return False
127 book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
128- self.create_book(str(line[2], details['encoding']), book_ref_id, book_details['testament_id'])
129- book_list[int(line[0])] = str(line[2], details['encoding'])
130+ self.create_book(line[2], book_ref_id, book_details['testament_id'])
131+ book_list.update({int(line[0]): line[2]})
132 self.application.process_events()
133 except (IOError, IndexError):
134 log.exception('Loading books from file failed')
135@@ -125,10 +122,7 @@
136 try:
137 book_ptr = None
138 details = get_file_encoding(self.verses_file)
139- verse_file = open(self.verses_file, 'rb')
140- if not verse_file.read(3) == '\xEF\xBB\xBF':
141- # no BOM was found
142- verse_file.seek(0)
143+ verse_file = open(self.verses_file, 'r', encoding=details['encoding'])
144 verse_reader = csv.reader(verse_file, delimiter=',', quotechar='"')
145 for line in verse_reader:
146 if self.stop_import_flag:
147@@ -136,7 +130,7 @@
148 try:
149 line_book = book_list[int(line[0])]
150 except ValueError:
151- line_book = str(line[0], details['encoding'])
152+ line_book = line[0]
153 if book_ptr != line_book:
154 book = self.get_book(line_book)
155 book_ptr = book.name
156@@ -144,10 +138,7 @@
157 translate('BiblesPlugin.CSVBible',
158 'Importing verses from %s...' % book.name, 'Importing verses from <book name>...'))
159 self.session.commit()
160- try:
161- verse_text = str(line[3], details['encoding'])
162- except UnicodeError:
163- verse_text = str(line[3], 'cp1252')
164+ verse_text = line[3]
165 self.create_verse(book.id, line[1], line[2], verse_text)
166 self.wizard.increment_progress_bar(translate('BiblesPlugin.CSVBible', 'Importing verses... done.'))
167 self.application.process_events()
168@@ -170,7 +161,7 @@
169 """
170 detect_file = None
171 try:
172- detect_file = open(filename, 'r')
173+ detect_file = open(filename, 'rb')
174 details = chardet.detect(detect_file.read(1024))
175 except IOError:
176 log.exception('Error detecting file encoding')
177
178=== modified file 'openlp/plugins/bibles/lib/versereferencelist.py'
179--- openlp/plugins/bibles/lib/versereferencelist.py 2015-01-18 13:39:21 +0000
180+++ openlp/plugins/bibles/lib/versereferencelist.py 2015-02-16 22:11:10 +0000
181@@ -82,9 +82,11 @@
182 if result[-1] not in [';', ',', '.']:
183 result += ';'
184 result += ' '
185- result = '%s%s, %s' % (result, version['version'], version['copyright'])
186+ result += version['version']
187+ if version['copyright'].strip():
188+ result += ', ' + version['copyright']
189 if version['permission'].strip():
190- result = result + ', ' + version['permission']
191+ result += ', ' + version['permission']
192 result = result.rstrip()
193 if result.endswith(','):
194 return result[:len(result) - 1]
195
196=== added file 'tests/functional/openlp_plugins/bibles/test_csvimport.py'
197--- tests/functional/openlp_plugins/bibles/test_csvimport.py 1970-01-01 00:00:00 +0000
198+++ tests/functional/openlp_plugins/bibles/test_csvimport.py 2015-02-16 22:11:10 +0000
199@@ -0,0 +1,97 @@
200+# -*- coding: utf-8 -*-
201+# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
202+
203+###############################################################################
204+# OpenLP - Open Source Lyrics Projection #
205+# --------------------------------------------------------------------------- #
206+# Copyright (c) 2008-2015 OpenLP Developers #
207+# --------------------------------------------------------------------------- #
208+# This program is free software; you can redistribute it and/or modify it #
209+# under the terms of the GNU General Public License as published by the Free #
210+# Software Foundation; version 2 of the License. #
211+# #
212+# This program is distributed in the hope that it will be useful, but WITHOUT #
213+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
214+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
215+# more details. #
216+# #
217+# You should have received a copy of the GNU General Public License along #
218+# with this program; if not, write to the Free Software Foundation, Inc., 59 #
219+# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
220+###############################################################################
221+"""
222+This module contains tests for the CSV Bible importer.
223+"""
224+
225+import os
226+import json
227+from unittest import TestCase
228+
229+from tests.functional import MagicMock, patch
230+from openlp.plugins.bibles.lib.csvbible import CSVBible
231+from openlp.plugins.bibles.lib.db import BibleDB
232+
233+TEST_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__),
234+ '..', '..', '..', 'resources', 'bibles'))
235+
236+
237+class TestCSVImport(TestCase):
238+ """
239+ Test the functions in the :mod:`csvimport` module.
240+ """
241+
242+ def setUp(self):
243+ self.registry_patcher = patch('openlp.plugins.bibles.lib.db.Registry')
244+ self.registry_patcher.start()
245+ self.manager_patcher = patch('openlp.plugins.bibles.lib.db.Manager')
246+ self.manager_patcher.start()
247+
248+ def tearDown(self):
249+ self.registry_patcher.stop()
250+ self.manager_patcher.stop()
251+
252+ def create_importer_test(self):
253+ """
254+ Test creating an instance of the CSV file importer
255+ """
256+ # GIVEN: A mocked out "manager"
257+ mocked_manager = MagicMock()
258+
259+ # WHEN: An importer object is created
260+ importer = CSVBible(mocked_manager, path='.', name='.', booksfile='.', versefile='.')
261+
262+ # THEN: The importer should be an instance of BibleDB
263+ self.assertIsInstance(importer, BibleDB)
264+
265+ def file_import_test(self):
266+ """
267+ Test the actual import of CSV Bible file
268+ """
269+ # GIVEN: Test files with a mocked out "manager", "import_wizard", and mocked functions
270+ # get_book_ref_id_by_name, create_verse, create_book, session and get_language.
271+ result_file = open(os.path.join(TEST_PATH, 'dk1933.json'), 'rb')
272+ test_data = json.loads(result_file.read().decode())
273+ books_file = os.path.join(TEST_PATH, 'dk1933-books.csv')
274+ verses_file = os.path.join(TEST_PATH, 'dk1933-verses.csv')
275+ with patch('openlp.plugins.bibles.lib.csvbible.CSVBible.application'):
276+ mocked_manager = MagicMock()
277+ mocked_import_wizard = MagicMock()
278+ importer = CSVBible(mocked_manager, path='.', name='.', booksfile=books_file, versefile=verses_file)
279+ importer.wizard = mocked_import_wizard
280+ importer.get_book_ref_id_by_name = MagicMock()
281+ importer.create_verse = MagicMock()
282+ importer.create_book = MagicMock()
283+ importer.session = MagicMock()
284+ importer.get_language = MagicMock()
285+ importer.get_language.return_value = 'Danish'
286+ importer.get_book = MagicMock()
287+
288+ # WHEN: Importing bible file
289+ importer.do_import()
290+
291+ # THEN: The create_verse() method should have been called with each verse in the file.
292+ self.assertTrue(importer.create_verse.called)
293+ for verse_tag, verse_text in test_data['verses']:
294+ importer.create_verse.assert_any_call(importer.get_book().id, '1', verse_tag, verse_text)
295+ importer.create_book.assert_any_call('1. Mosebog', importer.get_book_ref_id_by_name(), 1)
296+ importer.create_book.assert_any_call('1. Krønikebog', importer.get_book_ref_id_by_name(), 1)
297
298=== added file 'tests/resources/bibles/dk1933-books.csv'
299--- tests/resources/bibles/dk1933-books.csv 1970-01-01 00:00:00 +0000
300+++ tests/resources/bibles/dk1933-books.csv 2015-02-16 22:11:10 +0000
301@@ -0,0 +1,22 @@
302+1,1,1. Mosebog,1Mos
303+2,1,2. Mosebog,2Mos
304+3,1,3. Mosebog,3Mos
305+4,1,4. Mosebog,4Mos
306+5,1,5. Mosebog,5Mos
307+6,1,Josvabogen,jos
308+7,1,Dommerbogen,dom
309+8,1,Ruths Bog,ruth
310+9,1,1. Samuelsbog,1Sam
311+10,1,2. Samuelsbog,2Sam
312+11,1,1. Kongebog,1kong
313+12,1,2. Kongebog,2kong
314+13,1,1. Krønikebog,1kron
315+14,1,2. Krønikebog,2kron
316+15,1,Ezras Bog,ezra
317+16,1,Nehemias' Bog,neh
318+17,1,Esters Bog,est
319+18,1,Jobs Bog,job
320+19,1,Salmernes Bog,sl
321+20,1,Ordsprogenes Bog,ordsp
322+21,1,Prædikerens Bog,prad
323+22,1,Højsangen,hojs
324
325=== added file 'tests/resources/bibles/dk1933-verses.csv'
326--- tests/resources/bibles/dk1933-verses.csv 1970-01-01 00:00:00 +0000
327+++ tests/resources/bibles/dk1933-verses.csv 2015-02-16 22:11:10 +0000
328@@ -0,0 +1,10 @@
329+1,1,1,"I Begyndelsen skabte Gud Himmelen og Jorden."
330+1,1,2,"Og Jorden var øde og tom, og der var Mørke over Verdensdybet. Men Guds Ånd svævede over Vandene."
331+1,1,3,"Og Gud sagde: ""Der blive Lys!"" Og der blev Lys."
332+1,1,4,"Og Gud så, at Lyset var godt, og Gud satte Skel mellem Lyset og Mørket,"
333+1,1,5,"og Gud kaldte Lyset Dag, og Mørket kaldte han Nat. Og det blev Aften, og det blev Morgen, første Dag."
334+1,1,6,"Derpå sagde Gud: ""Der blive en Hvælving midt i Vandene til at skille Vandene ad!"""
335+1,1,7,"Og således skete det: Gud gjorde Hvælvingen og skilte Vandet under Hvælvingen fra Vandet over Hvælvingen;"
336+1,1,8,"og Gud kaldte Hvælvingen Himmel. Og det blev Aften, og det blev Morgen, anden Dag."
337+1,1,9,"Derpå sagde Gud: ""Vandet under Himmelen samle sig på eet Sted, så det faste Land kommer til Syne!"" Og således skete det;"
338+1,1,10,"og Gud kaldte det faste Land Jord, og Stedet, hvor Vandet samlede sig, kaldte han Hav. Og Gud så, at det var godt."