Fix slide order change when splitting custom slides. Fixes bug 1554748.

Fix EasyWorship import issues with missing verses and traceback on unknown chars.
Fix traceback in the bug-report dialog. Fixes bug 1554428.
Fix weird test bug in test_pluginmanager.py.
Pep8 fixes

bzr-revno: 2628
Fixes: https://launchpad.net/bugs/1547234, https://launchpad.net/bugs/1553922, https://launchpad.net/bugs/1554428, https://launchpad.net/bugs/1554748
This commit is contained in:
second@tgc.dk 2016-03-15 22:32:10 +01:00 committed by Tomas Groth
commit 6738d936cd
7 changed files with 76 additions and 44 deletions

View File

@ -180,11 +180,13 @@ class ExceptionForm(QtWidgets.QDialog, Ui_ExceptionDialog, RegistryProperties):
if ':' in line: if ':' in line:
exception = line.split('\n')[-1].split(':')[0] exception = line.split('\n')[-1].split(':')[0]
subject = 'Bug report: %s in %s' % (exception, source) subject = 'Bug report: %s in %s' % (exception, source)
mail_to_url = QtCore.QUrlQuery('mailto:bugs@openlp.org') mail_urlquery = QtCore.QUrlQuery()
mail_to_url.addQueryItem('subject', subject) mail_urlquery.addQueryItem('subject', subject)
mail_to_url.addQueryItem('body', self.report_text % content) mail_urlquery.addQueryItem('body', self.report_text % content)
if self.file_attachment: if self.file_attachment:
mail_to_url.addQueryItem('attach', self.file_attachment) mail_urlquery.addQueryItem('attach', self.file_attachment)
mail_to_url = QtCore.QUrl('mailto:bugs@openlp.org')
mail_to_url.setQuery(mail_urlquery)
QtGui.QDesktopServices.openUrl(mail_to_url) QtGui.QDesktopServices.openUrl(mail_to_url)
def on_description_updated(self): def on_description_updated(self):

View File

@ -198,6 +198,7 @@ class EditCustomForm(QtWidgets.QDialog, Ui_CustomEditDialog):
# Insert all slides to make the old_slides list complete. # Insert all slides to make the old_slides list complete.
for slide in slides: for slide in slides:
old_slides.insert(old_row, slide) old_slides.insert(old_row, slide)
old_row += 1
self.slide_list_view.addItems(old_slides) self.slide_list_view.addItems(old_slides)
self.slide_list_view.repaint() self.slide_list_view.repaint()

View File

@ -289,40 +289,45 @@ class EasyWorshipSongImport(SongImport):
for i in range(rec_count): for i in range(rec_count):
if self.stop_import_flag: if self.stop_import_flag:
break break
raw_record = db_file.read(record_size) try:
self.fields = self.record_structure.unpack(raw_record) raw_record = db_file.read(record_size)
self.set_defaults() self.fields = self.record_structure.unpack(raw_record)
self.title = self.get_field(fi_title).decode(self.encoding) self.set_defaults()
# Get remaining fields. self.title = self.get_field(fi_title).decode(self.encoding)
copy = self.get_field(fi_copy) # Get remaining fields.
admin = self.get_field(fi_admin) copy = self.get_field(fi_copy)
ccli = self.get_field(fi_ccli) admin = self.get_field(fi_admin)
authors = self.get_field(fi_author) ccli = self.get_field(fi_ccli)
words = self.get_field(fi_words) authors = self.get_field(fi_author)
if copy: words = self.get_field(fi_words)
self.copyright = copy.decode(self.encoding)
if admin:
if copy: if copy:
self.copyright += ', ' self.copyright = copy.decode(self.encoding)
self.copyright += translate('SongsPlugin.EasyWorshipSongImport', if admin:
'Administered by %s') % admin.decode(self.encoding) if copy:
if ccli: self.copyright += ', '
self.ccli_number = ccli.decode(self.encoding) self.copyright += translate('SongsPlugin.EasyWorshipSongImport',
if authors: 'Administered by %s') % admin.decode(self.encoding)
authors = authors.decode(self.encoding) if ccli:
else: self.ccli_number = ccli.decode(self.encoding)
authors = '' if authors:
# Set the SongImport object members. authors = authors.decode(self.encoding)
self.set_song_import_object(authors, words) else:
if self.stop_import_flag: authors = ''
break # Set the SongImport object members.
if self.entry_error_log: self.set_song_import_object(authors, words)
if self.stop_import_flag:
break
if self.entry_error_log:
self.log_error(self.import_source,
translate('SongsPlugin.EasyWorshipSongImport', '"%s" could not be imported. %s')
% (self.title, self.entry_error_log))
self.entry_error_log = ''
elif not self.finish():
self.log_error(self.import_source)
except Exception as e:
self.log_error(self.import_source, self.log_error(self.import_source,
translate('SongsPlugin.EasyWorshipSongImport', '"%s" could not be imported. %s') translate('SongsPlugin.EasyWorshipSongImport', '"%s" could not be imported. %s')
% (self.title, self.entry_error_log)) % (self.title, e))
self.entry_error_log = ''
elif not self.finish():
self.log_error(self.import_source)
db_file.close() db_file.close()
self.memo_file.close() self.memo_file.close()
@ -368,7 +373,7 @@ class EasyWorshipSongImport(SongImport):
first_line_is_tag = False first_line_is_tag = False
# EW tags: verse, chorus, pre-chorus, bridge, tag, # EW tags: verse, chorus, pre-chorus, bridge, tag,
# intro, ending, slide # intro, ending, slide
for tag in VerseType.tags + ['tag', 'slide']: for tag in VerseType.names + ['tag', 'slide', 'end']:
tag = tag.lower() tag = tag.lower()
ew_tag = verse_split[0].strip().lower() ew_tag = verse_split[0].strip().lower()
if ew_tag.startswith(tag): if ew_tag.startswith(tag):
@ -390,6 +395,9 @@ class EasyWorshipSongImport(SongImport):
if not number_found: if not number_found:
verse_type += '1' verse_type += '1'
break break
# If the verse only consist of the tag-line, add an empty line to create an empty slide
if first_line_is_tag and len(verse_split) == 1:
verse_split.append("")
self.add_verse(verse_split[-1].strip() if first_line_is_tag else verse, verse_type) self.add_verse(verse_split[-1].strip() if first_line_is_tag else verse, verse_type)
if len(self.comments) > 5: if len(self.comments) > 5:
self.comments += str(translate('SongsPlugin.EasyWorshipSongImport', self.comments += str(translate('SongsPlugin.EasyWorshipSongImport',

View File

@ -295,7 +295,7 @@ class SongMediaItem(MediaManagerItem):
:param search_keywords: A list of search keywords - book first, then number :param search_keywords: A list of search keywords - book first, then number
:return: None :return: None
""" """
log.debug('display results Book') log.debug('display results Book')
self.list_view.clear() self.list_view.clear()
@ -700,7 +700,7 @@ class SongMediaItem(MediaManagerItem):
:param s: A string value from the list we want to sort. :param s: A string value from the list we want to sort.
""" """
return [int(text) if text.isdecimal() else text.lower() return [int(text) if text.isdecimal() else text.lower()
for text in re.split('(\d+)', s)] for text in re.split('(\d+)', s)]
def search(self, string, show_error): def search(self, string, show_error):
""" """

View File

@ -422,10 +422,10 @@ class TestMediaItem(TestCase, TestMixin):
""" """
# GIVEN: A string to be converted into a sort key # GIVEN: A string to be converted into a sort key
string_sort_key = 'A1B12C' string_sort_key = 'A1B12C'
# WHEN: We attempt to create a sort key # WHEN: We attempt to create a sort key
sort_key_result = self.media_item._natural_sort_key(string_sort_key) sort_key_result = self.media_item._natural_sort_key(string_sort_key)
# THEN: We should get back a tuple split on integers # THEN: We should get back a tuple split on integers
self.assertEqual(sort_key_result, ['a', 1, 'b', 12, 'c']) self.assertEqual(sort_key_result, ['a', 1, 'b', 12, 'c'])

View File

@ -32,7 +32,7 @@ from PyQt5 import QtWidgets
from openlp.core.common import Registry, Settings from openlp.core.common import Registry, Settings
from openlp.core.lib.pluginmanager import PluginManager from openlp.core.lib.pluginmanager import PluginManager
from tests.interfaces import MagicMock from tests.interfaces import MagicMock, patch
from tests.helpers.testmixin import TestMixin from tests.helpers.testmixin import TestMixin
@ -45,13 +45,12 @@ class TestPluginManager(TestCase, TestMixin):
""" """
Some pre-test setup required. Some pre-test setup required.
""" """
Settings.setDefaultFormat(Settings.IniFormat) self.setup_application()
self.build_settings() self.build_settings()
self.temp_dir = mkdtemp('openlp') self.temp_dir = mkdtemp('openlp')
Settings().setValue('advanced/data path', self.temp_dir) Settings().setValue('advanced/data path', self.temp_dir)
Registry.create() Registry.create()
Registry().register('service_list', MagicMock()) Registry().register('service_list', MagicMock())
self.setup_application()
self.main_window = QtWidgets.QMainWindow() self.main_window = QtWidgets.QMainWindow()
Registry().register('main_window', self.main_window) Registry().register('main_window', self.main_window)
@ -64,7 +63,13 @@ class TestPluginManager(TestCase, TestMixin):
gc.collect() gc.collect()
shutil.rmtree(self.temp_dir) shutil.rmtree(self.temp_dir)
def find_plugins_test(self): @patch('openlp.plugins.songusage.lib.db.init_schema')
@patch('openlp.plugins.songs.lib.db.init_schema')
@patch('openlp.plugins.images.lib.db.init_schema')
@patch('openlp.plugins.custom.lib.db.init_schema')
@patch('openlp.plugins.alerts.lib.db.init_schema')
@patch('openlp.plugins.bibles.lib.db.init_schema')
def find_plugins_test(self, mocked_is1, mocked_is2, mocked_is3, mocked_is4, mocked_is5, mocked_is6):
""" """
Test the find_plugins() method to ensure it imports the correct plugins Test the find_plugins() method to ensure it imports the correct plugins
""" """

View File

@ -128,3 +128,19 @@ class TestEditCustomForm(TestCase, TestMixin):
# THEN: The validate method should have returned False. # THEN: The validate method should have returned False.
assert not result, 'The _validate() method should have retured False' assert not result, 'The _validate() method should have retured False'
mocked_critical_error_message_box.assert_called_with(message='You need to add at least one slide.') mocked_critical_error_message_box.assert_called_with(message='You need to add at least one slide.')
def update_slide_list_test(self):
"""
Test the update_slide_list() method
"""
# GIVEN: Mocked slide_list_view with a slide with 3 lines
self.form.slide_list_view = MagicMock()
self.form.slide_list_view.count.return_value = 1
self.form.slide_list_view.currentRow.return_value = 0
self.form.slide_list_view.item.return_value = MagicMock(return_value='1st Slide\n2nd Slide\n3rd Slide')
# WHEN: updating the slide by splitting the lines into slides
self.form.update_slide_list(['1st Slide', '2nd Slide', '3rd Slide'])
# THEN: The slides should be created in correct order
self.form.slide_list_view.addItems.assert_called_with(['1st Slide', '2nd Slide', '3rd Slide'])