openlp-core team mailing list archive
-
openlp-core team
-
Mailing list archive
-
Message #24992
[Merge] lp:~tomasgroth/openlp/bugfixes5 into lp:openlp
Tomas Groth has proposed merging lp:~tomasgroth/openlp/bugfixes5 into lp:openlp.
Requested reviews:
OpenLP Core (openlp-core)
Related bugs:
Bug #1387278 in OpenLP: "Crash when exporting settings"
https://bugs.launchpad.net/openlp/+bug/1387278
Bug #1390917 in OpenLP: "Traceback when copying or creating a theme with background image on Windows"
https://bugs.launchpad.net/openlp/+bug/1390917
Bug #1390986 in OpenLP: "Worship Assistent import gives traceback"
https://bugs.launchpad.net/openlp/+bug/1390986
Bug #1390987 in OpenLP: "Traceback when previewing item from service list"
https://bugs.launchpad.net/openlp/+bug/1390987
For more details, see:
https://code.launchpad.net/~tomasgroth/openlp/bugfixes5/+merge/241396
Fix for bug #1387278: Crash when exporting settings
Fix for bug #1390917: Traceback when copying or creating a theme with background image on Windows
Fix for bug #1390986: Worship Assistent import gives traceback, also improved WA verseorder import
Fix for bug #1390987: Traceback when previewing item from service list
Fix traceback when saving service while in debug mode
--
https://code.launchpad.net/~tomasgroth/openlp/bugfixes5/+merge/241396
Your team OpenLP Core is requested to review the proposed merge of lp:~tomasgroth/openlp/bugfixes5 into lp:openlp.
=== modified file 'openlp/core/common/settings.py'
--- openlp/core/common/settings.py 2014-10-22 01:27:01 +0000
+++ openlp/core/common/settings.py 2014-11-11 11:38:27 +0000
@@ -431,10 +431,14 @@
:param key: The key to return the value from.
"""
# if group() is not empty the group has not been specified together with the key.
- if self.group():
- default_value = Settings.__default_settings__[self.group() + '/' + key]
- else:
- default_value = Settings.__default_settings__[key]
+ try:
+ if self.group():
+ default_value = Settings.__default_settings__[self.group() + '/' + key]
+ else:
+ default_value = Settings.__default_settings__[key]
+ except KeyError:
+ log.warning('Key "%s" was not found in settings, returning None!' % key)
+ return None
setting = super(Settings, self).value(key, default_value)
return self._convert_value(setting, default_value)
=== modified file 'openlp/core/ui/servicemanager.py'
--- openlp/core/ui/servicemanager.py 2014-10-29 21:04:17 +0000
+++ openlp/core/ui/servicemanager.py 2014-11-11 11:38:27 +0000
@@ -494,7 +494,7 @@
service.append({'openlp_core': core})
return service
- def save_file(self):
+ def save_file(self, field=None):
"""
Save the current service file.
@@ -1427,9 +1427,10 @@
self.drop_position = -1
self.set_modified()
- def make_preview(self):
+ def make_preview(self, field=None):
"""
Send the current item to the Preview slide controller
+ :param field:
"""
self.application.set_busy_cursor()
item, child = self.find_service_item()
=== modified file 'openlp/core/ui/thememanager.py'
--- openlp/core/ui/thememanager.py 2014-10-31 12:01:07 +0000
+++ openlp/core/ui/thememanager.py 2014-11-11 11:38:27 +0000
@@ -37,7 +37,7 @@
from PyQt4 import QtCore, QtGui
from openlp.core.common import Registry, RegistryProperties, AppLocation, Settings, OpenLPMixin, RegistryMixin, \
- check_directory_exists, UiStrings, translate
+ check_directory_exists, UiStrings, translate, is_win
from openlp.core.lib import FileDialog, ImageSource, OpenLPToolbar, get_text_file_string, build_icon, \
check_item_selected, create_thumb, validate_thumb
from openlp.core.lib.theme import ThemeXML, BackgroundType
@@ -662,8 +662,12 @@
out_file.close()
if image_from and os.path.abspath(image_from) != os.path.abspath(image_to):
try:
- encoding = get_filesystem_encoding()
- shutil.copyfile(str(image_from).encode(encoding), str(image_to).encode(encoding))
+ # Windows is always unicode, so no need to encode filenames
+ if is_win():
+ shutil.copyfile(image_from, image_to)
+ else:
+ encoding = get_filesystem_encoding()
+ shutil.copyfile(image_from.encode(encoding), image_to.encode(encoding))
except IOError as xxx_todo_changeme:
shutil.Error = xxx_todo_changeme
self.log_exception('Failed to save theme image')
=== modified file 'openlp/plugins/songs/lib/importers/worshipassistant.py'
--- openlp/plugins/songs/lib/importers/worshipassistant.py 2014-07-04 09:31:06 +0000
+++ openlp/plugins/songs/lib/importers/worshipassistant.py 2014-11-11 11:38:27 +0000
@@ -93,7 +93,7 @@
details = chardet.detect(detect_content)
detect_file.close()
songs_file = open(self.import_source, 'r', encoding=details['encoding'])
- songs_reader = csv.DictReader(songs_file)
+ songs_reader = csv.DictReader(songs_file, escapechar='\\')
try:
records = list(songs_reader)
except csv.Error as e:
@@ -104,6 +104,8 @@
num_records = len(records)
log.info('%s records found in CSV file' % num_records)
self.import_wizard.progress_bar.setMaximum(num_records)
+ # Create regex to strip html tags
+ re_html_strip = re.compile(r'<[^>]+>')
for index, record in enumerate(records, 1):
if self.stop_import_flag:
return
@@ -119,13 +121,12 @@
self.title = record['TITLE']
if record['AUTHOR'] != EMPTY_STR:
self.parse_author(record['AUTHOR'])
- print(record['AUTHOR'])
if record['COPYRIGHT'] != EMPTY_STR:
self.add_copyright(record['COPYRIGHT'])
if record['CCLINR'] != EMPTY_STR:
self.ccli_number = record['CCLINR']
if record['ROADMAP'] != EMPTY_STR:
- verse_order_list = record['ROADMAP'].split(',')
+ verse_order_list = [x.strip() for x in record['ROADMAP'].split(',')]
lyrics = record['LYRICS2']
except UnicodeDecodeError as e:
self.log_error(translate('SongsPlugin.WorshipAssistantImport', 'Record %d' % index),
@@ -136,8 +137,15 @@
'File not valid WorshipAssistant CSV format.'), 'TypeError: %s' % e)
return
verse = ''
+ used_verses = []
for line in lyrics.splitlines():
if line.startswith('['): # verse marker
+ # Add previous verse
+ if verse:
+ # remove trailing linebreak, part of the WA syntax
+ self.add_verse(verse[:-1], verse_id)
+ used_verses.append(verse_id)
+ verse = ''
# drop the square brackets
right_bracket = line.find(']')
content = line[1:right_bracket].lower()
@@ -152,19 +160,31 @@
verse_index = VerseType.from_loose_input(verse_tag) if verse_tag else 0
verse_tag = VerseType.tags[verse_index]
# Update verse order when the verse name has changed
- if content != verse_tag + verse_num:
+ verse_id = verse_tag + verse_num
+ # Make sure we've not choosen an id already used
+ while verse_id in verse_order_list and content in verse_order_list:
+ verse_num = str(int(verse_num) + 1)
+ verse_id = verse_tag + verse_num
+ if content != verse_id:
for i in range(len(verse_order_list)):
if verse_order_list[i].lower() == content.lower():
- verse_order_list[i] = verse_tag + verse_num
- elif line and not line.isspace():
- verse += line + '\n'
- elif verse:
- self.add_verse(verse, verse_tag+verse_num)
- verse = ''
+ verse_order_list[i] = verse_id
+ else:
+ # add line text to verse. Strip out html
+ verse += re_html_strip.sub('', line) + '\n'
if verse:
- self.add_verse(verse, verse_tag+verse_num)
+ # remove trailing linebreak, part of the WA syntax
+ if verse.endswith('\n\n'):
+ verse = verse[:-1]
+ self.add_verse(verse, verse_id)
+ used_verses.append(verse_id)
if verse_order_list:
- self.verse_order_list = verse_order_list
+ # Use the verse order in the import, but remove entries that doesn't have a text
+ cleaned_verse_order_list = []
+ for verse in verse_order_list:
+ if verse in used_verses:
+ cleaned_verse_order_list.append(verse)
+ self.verse_order_list = cleaned_verse_order_list
if not self.finish():
self.log_error(translate('SongsPlugin.WorshipAssistantImport', 'Record %d') % index
+ (': "' + self.title + '"' if self.title else ''))
=== modified file 'tests/functional/openlp_core_common/test_settings.py'
--- tests/functional/openlp_core_common/test_settings.py 2014-10-22 20:43:05 +0000
+++ tests/functional/openlp_core_common/test_settings.py 2014-11-11 11:38:27 +0000
@@ -115,3 +115,15 @@
# THEN the new value is returned when re-read
self.assertEqual('very short', Settings().value('test/extend'), 'The saved value should be returned')
+
+ def settings_nonexisting_test(self):
+ """
+ Test the Settings on query for non-existing value
+ """
+ # GIVEN: A new Settings setup
+
+ # WHEN reading a setting that doesn't exists
+ does_not_exist_value = Settings().value('core/does not exists')
+
+ # THEN None should be returned
+ self.assertEqual(does_not_exist_value, None, 'The value should be None')
=== modified file 'tests/functional/openlp_plugins/songs/test_worshipassistantimport.py'
--- tests/functional/openlp_plugins/songs/test_worshipassistantimport.py 2014-07-04 09:31:06 +0000
+++ tests/functional/openlp_plugins/songs/test_worshipassistantimport.py 2014-11-11 11:38:27 +0000
@@ -54,3 +54,5 @@
self.load_external_result_data(os.path.join(TEST_PATH, 'du_herr.json')))
self.file_import(os.path.join(TEST_PATH, 'would_you_be_free.csv'),
self.load_external_result_data(os.path.join(TEST_PATH, 'would_you_be_free.json')))
+ self.file_import(os.path.join(TEST_PATH, 'would_you_be_free2.csv'),
+ self.load_external_result_data(os.path.join(TEST_PATH, 'would_you_be_free.json')))
=== modified file 'tests/resources/worshipassistantsongs/would_you_be_free.json'
--- tests/resources/worshipassistantsongs/would_you_be_free.json 2014-06-26 07:59:16 +0000
+++ tests/resources/worshipassistantsongs/would_you_be_free.json 2014-11-11 11:38:27 +0000
@@ -8,7 +8,7 @@
"copyright": "Public Domain",
"verses": [
[
- "Would you be free from your burden of sin? \nThere's power in the blood, power in the blood \nWould you o'er evil a victory win? \nThere's wonderful power in the blood \n",
+ "Would you be free from your burden of sin? \nThere's power in the blood, power in the blood \nWould you o'er evil a victory win? \nThere's wonderful power in the blood \n ",
"v1"
],
[
=== added file 'tests/resources/worshipassistantsongs/would_you_be_free2.csv'
--- tests/resources/worshipassistantsongs/would_you_be_free2.csv 1970-01-01 00:00:00 +0000
+++ tests/resources/worshipassistantsongs/would_you_be_free2.csv 2014-11-11 11:38:27 +0000
@@ -0,0 +1,31 @@
+SONGNR,TITLE,AUTHOR,COPYRIGHT,FIRSTLINE,PRIKEY,ALTKEY,TEMPO,FOCUS,THEME,SCRIPTURE,ACTIVE,SONGBOOK,TIMESIG,INTRODUCED,LASTUSED,TIMESUSED,CCLINR,USER1,USER2,USER3,USER4,USER5,ROADMAP,FILELINK1,OVERMAP,FILELINK2,LYRICS,INFO,LYRICS2,Background
+"7","Would You Be Free","Jones, Lewis E.","Public Domain","Would you be free from your burden of sin?","G","","Moderate","Only To Others","","","N","Y","","1899-12-30","1899-12-30","","","","","","","","1, C, 1","","","",".G C G
+ Would you be free from your burden of sin?
+. D D7 G
+ There's power in the blood, power in the blood
+. C G
+ Would you o'er evil a victory win?
+. D D7 G
+ There's wonderful power in the blood
+
+.G C G
+ There is power, power, wonder working power
+.D G
+ In the blood of the Lamb
+. C G
+ There is power, power, wonder working power
+. D G
+ In the precious blood of the Lamb
+","","[1]
+Would you be free from your burden of sin?
+There's power in the blood, power in the blood
+Would you o'er evil a victory win?
+There's wonderful power in the blood
+
+[C]
+There is power, power, wonder working power
+In the blood of the Lamb
+There is power, power, wonder working power
+In the precious blood of the Lamb
+
+[x]",""
References