forked from openlp/openlp
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:
commit
6738d936cd
@ -180,11 +180,13 @@ class ExceptionForm(QtWidgets.QDialog, Ui_ExceptionDialog, RegistryProperties):
|
||||
if ':' in line:
|
||||
exception = line.split('\n')[-1].split(':')[0]
|
||||
subject = 'Bug report: %s in %s' % (exception, source)
|
||||
mail_to_url = QtCore.QUrlQuery('mailto:bugs@openlp.org')
|
||||
mail_to_url.addQueryItem('subject', subject)
|
||||
mail_to_url.addQueryItem('body', self.report_text % content)
|
||||
mail_urlquery = QtCore.QUrlQuery()
|
||||
mail_urlquery.addQueryItem('subject', subject)
|
||||
mail_urlquery.addQueryItem('body', self.report_text % content)
|
||||
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)
|
||||
|
||||
def on_description_updated(self):
|
||||
|
@ -198,6 +198,7 @@ class EditCustomForm(QtWidgets.QDialog, Ui_CustomEditDialog):
|
||||
# Insert all slides to make the old_slides list complete.
|
||||
for slide in slides:
|
||||
old_slides.insert(old_row, slide)
|
||||
old_row += 1
|
||||
self.slide_list_view.addItems(old_slides)
|
||||
self.slide_list_view.repaint()
|
||||
|
||||
|
@ -289,40 +289,45 @@ class EasyWorshipSongImport(SongImport):
|
||||
for i in range(rec_count):
|
||||
if self.stop_import_flag:
|
||||
break
|
||||
raw_record = db_file.read(record_size)
|
||||
self.fields = self.record_structure.unpack(raw_record)
|
||||
self.set_defaults()
|
||||
self.title = self.get_field(fi_title).decode(self.encoding)
|
||||
# Get remaining fields.
|
||||
copy = self.get_field(fi_copy)
|
||||
admin = self.get_field(fi_admin)
|
||||
ccli = self.get_field(fi_ccli)
|
||||
authors = self.get_field(fi_author)
|
||||
words = self.get_field(fi_words)
|
||||
if copy:
|
||||
self.copyright = copy.decode(self.encoding)
|
||||
if admin:
|
||||
try:
|
||||
raw_record = db_file.read(record_size)
|
||||
self.fields = self.record_structure.unpack(raw_record)
|
||||
self.set_defaults()
|
||||
self.title = self.get_field(fi_title).decode(self.encoding)
|
||||
# Get remaining fields.
|
||||
copy = self.get_field(fi_copy)
|
||||
admin = self.get_field(fi_admin)
|
||||
ccli = self.get_field(fi_ccli)
|
||||
authors = self.get_field(fi_author)
|
||||
words = self.get_field(fi_words)
|
||||
if copy:
|
||||
self.copyright += ', '
|
||||
self.copyright += translate('SongsPlugin.EasyWorshipSongImport',
|
||||
'Administered by %s') % admin.decode(self.encoding)
|
||||
if ccli:
|
||||
self.ccli_number = ccli.decode(self.encoding)
|
||||
if authors:
|
||||
authors = authors.decode(self.encoding)
|
||||
else:
|
||||
authors = ''
|
||||
# Set the SongImport object members.
|
||||
self.set_song_import_object(authors, words)
|
||||
if self.stop_import_flag:
|
||||
break
|
||||
if self.entry_error_log:
|
||||
self.copyright = copy.decode(self.encoding)
|
||||
if admin:
|
||||
if copy:
|
||||
self.copyright += ', '
|
||||
self.copyright += translate('SongsPlugin.EasyWorshipSongImport',
|
||||
'Administered by %s') % admin.decode(self.encoding)
|
||||
if ccli:
|
||||
self.ccli_number = ccli.decode(self.encoding)
|
||||
if authors:
|
||||
authors = authors.decode(self.encoding)
|
||||
else:
|
||||
authors = ''
|
||||
# Set the SongImport object members.
|
||||
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,
|
||||
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)
|
||||
% (self.title, e))
|
||||
db_file.close()
|
||||
self.memo_file.close()
|
||||
|
||||
@ -368,7 +373,7 @@ class EasyWorshipSongImport(SongImport):
|
||||
first_line_is_tag = False
|
||||
# EW tags: verse, chorus, pre-chorus, bridge, tag,
|
||||
# intro, ending, slide
|
||||
for tag in VerseType.tags + ['tag', 'slide']:
|
||||
for tag in VerseType.names + ['tag', 'slide', 'end']:
|
||||
tag = tag.lower()
|
||||
ew_tag = verse_split[0].strip().lower()
|
||||
if ew_tag.startswith(tag):
|
||||
@ -390,6 +395,9 @@ class EasyWorshipSongImport(SongImport):
|
||||
if not number_found:
|
||||
verse_type += '1'
|
||||
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)
|
||||
if len(self.comments) > 5:
|
||||
self.comments += str(translate('SongsPlugin.EasyWorshipSongImport',
|
||||
|
@ -295,7 +295,7 @@ class SongMediaItem(MediaManagerItem):
|
||||
:param search_keywords: A list of search keywords - book first, then number
|
||||
:return: None
|
||||
"""
|
||||
|
||||
|
||||
log.debug('display results Book')
|
||||
self.list_view.clear()
|
||||
|
||||
@ -700,7 +700,7 @@ class SongMediaItem(MediaManagerItem):
|
||||
:param s: A string value from the list we want to sort.
|
||||
"""
|
||||
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):
|
||||
"""
|
||||
|
@ -422,10 +422,10 @@ class TestMediaItem(TestCase, TestMixin):
|
||||
"""
|
||||
# GIVEN: A string to be converted into a sort key
|
||||
string_sort_key = 'A1B12C'
|
||||
|
||||
|
||||
# WHEN: We attempt to create a sort key
|
||||
sort_key_result = self.media_item._natural_sort_key(string_sort_key)
|
||||
|
||||
|
||||
# THEN: We should get back a tuple split on integers
|
||||
self.assertEqual(sort_key_result, ['a', 1, 'b', 12, 'c'])
|
||||
|
||||
|
@ -32,7 +32,7 @@ from PyQt5 import QtWidgets
|
||||
|
||||
from openlp.core.common import Registry, Settings
|
||||
from openlp.core.lib.pluginmanager import PluginManager
|
||||
from tests.interfaces import MagicMock
|
||||
from tests.interfaces import MagicMock, patch
|
||||
from tests.helpers.testmixin import TestMixin
|
||||
|
||||
|
||||
@ -45,13 +45,12 @@ class TestPluginManager(TestCase, TestMixin):
|
||||
"""
|
||||
Some pre-test setup required.
|
||||
"""
|
||||
Settings.setDefaultFormat(Settings.IniFormat)
|
||||
self.setup_application()
|
||||
self.build_settings()
|
||||
self.temp_dir = mkdtemp('openlp')
|
||||
Settings().setValue('advanced/data path', self.temp_dir)
|
||||
Registry.create()
|
||||
Registry().register('service_list', MagicMock())
|
||||
self.setup_application()
|
||||
self.main_window = QtWidgets.QMainWindow()
|
||||
Registry().register('main_window', self.main_window)
|
||||
|
||||
@ -64,7 +63,13 @@ class TestPluginManager(TestCase, TestMixin):
|
||||
gc.collect()
|
||||
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
|
||||
"""
|
||||
|
@ -128,3 +128,19 @@ class TestEditCustomForm(TestCase, TestMixin):
|
||||
# THEN: The validate method should have returned 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.')
|
||||
|
||||
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'])
|
||||
|
Loading…
Reference in New Issue
Block a user