forked from openlp/openlp
Fix bug 1414980: Make xml parsing of presentation manager files recover if errors are encountered.
Fix bug 1414978: Set the cursor back to normal after deleting a presentation. Fix bug 1410738: Added a cancel-button to FTW when no internet is available. Fix bug 1412517: Fix support for 'end' mark in bible-search. bzr-revno: 2495 Fixes: https://launchpad.net/bugs/1414978, https://launchpad.net/bugs/1414980, https://launchpad.net/bugs/1410738, https://launchpad.net/bugs/1412517
This commit is contained in:
commit
1e9430b435
@ -268,9 +268,11 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties):
|
||||
self.web = 'http://openlp.org/files/frw/'
|
||||
self.cancel_button.clicked.connect(self.on_cancel_button_clicked)
|
||||
self.no_internet_finish_button.clicked.connect(self.on_no_internet_finish_button_clicked)
|
||||
self.no_internet_cancel_button.clicked.connect(self.on_no_internet_cancel_button_clicked)
|
||||
self.currentIdChanged.connect(self.on_current_id_changed)
|
||||
Registry().register_function('config_screen_changed', self.update_screen_list_combo)
|
||||
self.no_internet_finish_button.setVisible(False)
|
||||
self.no_internet_cancel_button.setVisible(False)
|
||||
# Check if this is a re-run of the wizard.
|
||||
self.has_run_wizard = Settings().value('core/has run wizard')
|
||||
check_directory_exists(os.path.join(gettempdir(), 'openlp'))
|
||||
@ -327,6 +329,10 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties):
|
||||
self.next_button.setVisible(False)
|
||||
self.cancel_button.setVisible(False)
|
||||
self.no_internet_finish_button.setVisible(True)
|
||||
if self.has_run_wizard:
|
||||
self.no_internet_cancel_button.setVisible(False)
|
||||
else:
|
||||
self.no_internet_cancel_button.setVisible(True)
|
||||
elif page_id == FirstTimePage.Plugins:
|
||||
self.back_button.setVisible(False)
|
||||
elif page_id == FirstTimePage.Progress:
|
||||
@ -372,6 +378,13 @@ class FirstTimeForm(QtGui.QWizard, UiFirstTimeWizard, RegistryProperties):
|
||||
Settings().setValue('core/has run wizard', True)
|
||||
self.close()
|
||||
|
||||
def on_no_internet_cancel_button_clicked(self):
|
||||
"""
|
||||
Process the triggering of the "Cancel" button on the No Internet page.
|
||||
"""
|
||||
self.was_cancelled = True
|
||||
self.close()
|
||||
|
||||
def url_get_file(self, url, f_path):
|
||||
""""
|
||||
Download a file given a URL. The file is retrieved in chunks, giving the ability to cancel the download at any
|
||||
|
@ -59,7 +59,8 @@ class UiFirstTimeWizard(object):
|
||||
first_time_wizard.resize(550, 386)
|
||||
first_time_wizard.setModal(True)
|
||||
first_time_wizard.setOptions(QtGui.QWizard.IndependentPages | QtGui.QWizard.NoBackButtonOnStartPage |
|
||||
QtGui.QWizard.NoBackButtonOnLastPage | QtGui.QWizard.HaveCustomButton1)
|
||||
QtGui.QWizard.NoBackButtonOnLastPage | QtGui.QWizard.HaveCustomButton1 |
|
||||
QtGui.QWizard.HaveCustomButton2)
|
||||
if is_macosx():
|
||||
first_time_wizard.setPixmap(QtGui.QWizard.BackgroundPixmap,
|
||||
QtGui.QPixmap(':/wizards/openlp-osx-wizard.png'))
|
||||
@ -69,6 +70,7 @@ class UiFirstTimeWizard(object):
|
||||
self.finish_button = self.button(QtGui.QWizard.FinishButton)
|
||||
self.no_internet_finish_button = self.button(QtGui.QWizard.CustomButton1)
|
||||
self.cancel_button = self.button(QtGui.QWizard.CancelButton)
|
||||
self.no_internet_cancel_button = self.button(QtGui.QWizard.CustomButton2)
|
||||
self.next_button = self.button(QtGui.QWizard.NextButton)
|
||||
self.back_button = self.button(QtGui.QWizard.BackButton)
|
||||
add_welcome_page(first_time_wizard, ':/wizards/wizard_firsttime.bmp')
|
||||
@ -271,3 +273,4 @@ class UiFirstTimeWizard(object):
|
||||
'and OpenLP is configured.'))
|
||||
self.progress_label.setText(translate('OpenLP.FirstTimeWizard', 'Starting configuration process...'))
|
||||
first_time_wizard.setButtonText(QtGui.QWizard.CustomButton1, translate('OpenLP.FirstTimeWizard', 'Finish'))
|
||||
first_time_wizard.setButtonText(QtGui.QWizard.CustomButton2, translate('OpenLP.FirstTimeWizard', 'Cancel'))
|
||||
|
@ -371,7 +371,7 @@ def parse_reference(reference, bible, language_selection, book_ref_id=False):
|
||||
from_chapter = from_verse
|
||||
from_verse = None
|
||||
if to_chapter:
|
||||
if to_chapter < from_chapter:
|
||||
if from_chapter and to_chapter < from_chapter:
|
||||
continue
|
||||
else:
|
||||
chapter = to_chapter
|
||||
@ -387,7 +387,7 @@ def parse_reference(reference, bible, language_selection, book_ref_id=False):
|
||||
from_verse = 1
|
||||
if not to_verse:
|
||||
to_verse = -1
|
||||
if to_chapter > from_chapter:
|
||||
if to_chapter and to_chapter > from_chapter:
|
||||
ref_list.append((book_ref_id, from_chapter, from_verse, -1))
|
||||
for i in range(from_chapter + 1, to_chapter):
|
||||
ref_list.append((book_ref_id, i, 1, -1))
|
||||
|
@ -225,10 +225,10 @@ class PresentationMediaItem(MediaManagerItem):
|
||||
self.clean_up_thumbnails(filepath)
|
||||
self.main_window.increment_progress_bar()
|
||||
self.main_window.finished_progress_bar()
|
||||
self.application.set_busy_cursor()
|
||||
for row in row_list:
|
||||
self.list_view.takeItem(row)
|
||||
Settings().setValue(self.settings_section + '/presentations files', self.get_file_list())
|
||||
self.application.set_normal_cursor()
|
||||
|
||||
def clean_up_thumbnails(self, filepath):
|
||||
"""
|
||||
|
@ -25,7 +25,9 @@ Presentationmanager song files into the current database.
|
||||
"""
|
||||
|
||||
import os
|
||||
from lxml import objectify
|
||||
import re
|
||||
import chardet
|
||||
from lxml import objectify, etree
|
||||
|
||||
from openlp.core.ui.wizard import WizardStrings
|
||||
from .songimport import SongImport
|
||||
@ -42,7 +44,18 @@ class PresentationManagerImport(SongImport):
|
||||
if self.stop_import_flag:
|
||||
return
|
||||
self.import_wizard.increment_progress_bar(WizardStrings.ImportingType % os.path.basename(file_path))
|
||||
root = objectify.parse(open(file_path, 'rb')).getroot()
|
||||
try:
|
||||
tree = etree.parse(file_path, parser=etree.XMLParser(recover=True))
|
||||
except etree.XMLSyntaxError:
|
||||
# Try to detect encoding and use it
|
||||
file = open(file_path, mode='rb')
|
||||
encoding = chardet.detect(file.read())['encoding']
|
||||
file.close()
|
||||
# Open file with detected encoding and remove encoding declaration
|
||||
text = open(file_path, mode='r', encoding=encoding).read()
|
||||
text = re.sub('.+\?>\n', '', text)
|
||||
tree = etree.fromstring(text, parser=etree.XMLParser(recover=True))
|
||||
root = objectify.fromstring(etree.tostring(tree))
|
||||
self.process_song(root)
|
||||
|
||||
def process_song(self, root):
|
||||
|
@ -46,3 +46,5 @@ class TestPresentationManagerFileImport(SongImportTestHelper):
|
||||
self.load_external_result_data(os.path.join(TEST_PATH, 'Great Is Thy Faithfulness.json')))
|
||||
self.file_import([os.path.join(TEST_PATH, 'Agnus Dei.sng')],
|
||||
self.load_external_result_data(os.path.join(TEST_PATH, 'Agnus Dei.json')))
|
||||
self.file_import([os.path.join(TEST_PATH, 'Amazing Grace.sng')],
|
||||
self.load_external_result_data(os.path.join(TEST_PATH, 'Amazing Grace.json')))
|
||||
|
@ -109,3 +109,13 @@ class TestBibleManager(TestCase, TestMixin):
|
||||
results = parse_reference('Raoul 1', self.manager.db_cache['tests'], MagicMock())
|
||||
# THEN a verse array should be returned
|
||||
self.assertEqual(False, results, "The bible Search should return False")
|
||||
|
||||
def parse_reference_five_test(self):
|
||||
"""
|
||||
Test the parse_reference method with 1 Timothy 1:3-end
|
||||
"""
|
||||
# GIVEN given a bible in the bible manager
|
||||
# WHEN asking to parse the bible reference
|
||||
results = parse_reference('1 Timothy 1:3-end', self.manager.db_cache['tests'], MagicMock(), 54)
|
||||
# THEN a verse array should be returned
|
||||
self.assertEqual([(54, 1, 3, -1)], results, "The bible verses should matches the expected results")
|
||||
|
29
tests/resources/presentationmanagersongs/Amazing Grace.json
Normal file
29
tests/resources/presentationmanagersongs/Amazing Grace.json
Normal file
@ -0,0 +1,29 @@
|
||||
{
|
||||
"title": "Amazing Grace",
|
||||
"authors": [
|
||||
"John Newton"
|
||||
],
|
||||
"verse_order_list": ["v1", "v2", "v3", "v4", "v5"],
|
||||
"verses": [
|
||||
[
|
||||
"Amazing grace! How sweet the sound!\nThat saved a wretch like me!\nI once was lost, but now am found;\nWas blind, but now I see.",
|
||||
"v1"
|
||||
],
|
||||
[
|
||||
"'Twas grace that taught my heart to fear,\nAnd grace my fears relieved.\nHow precious did that grace appear,\nThe hour I first believed.",
|
||||
"v2"
|
||||
],
|
||||
[
|
||||
"The Lord has promised good to me,\nHis Word my hope secures.\nHe will my shield and portion be\nAs long as life endures.",
|
||||
"v3"
|
||||
],
|
||||
[
|
||||
"Thro' many dangers, toils and snares\nI have already come.\n'Tis grace that brought me safe thus far,\nAnd grace will lead me home.",
|
||||
"v4"
|
||||
],
|
||||
[
|
||||
"When we've been there ten thousand years,\nBright shining as the sun,\nWe've no less days to sing God's praise,\nThan when we first begun.",
|
||||
"v5"
|
||||
]
|
||||
]
|
||||
}
|
BIN
tests/resources/presentationmanagersongs/Amazing Grace.sng
Normal file
BIN
tests/resources/presentationmanagersongs/Amazing Grace.sng
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user