← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~tomasgroth/openlp/25bugfixes1 into lp:openlp

 

Tomas Groth has proposed merging lp:~tomasgroth/openlp/25bugfixes1 into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)
Related bugs:
  Bug #1547234 in OpenLP: "Missing Verses in EasyWorship 2009 Import"
  https://bugs.launchpad.net/openlp/+bug/1547234
  Bug #1553922 in OpenLP: "EasyWorship import throws exception on unknown character"
  https://bugs.launchpad.net/openlp/+bug/1553922
  Bug #1554428 in OpenLP: "The bug-report window produces traceback when pressing "Send email""
  https://bugs.launchpad.net/openlp/+bug/1554428
  Bug #1554748 in OpenLP: "Slide Order Changes in Custom Slides"
  https://bugs.launchpad.net/openlp/+bug/1554748

For more details, see:
https://code.launchpad.net/~tomasgroth/openlp/25bugfixes1/+merge/288872

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
-- 
Your team OpenLP Core is requested to review the proposed merge of lp:~tomasgroth/openlp/25bugfixes1 into lp:openlp.
=== modified file 'openlp/core/ui/exceptionform.py'
--- openlp/core/ui/exceptionform.py	2016-01-09 16:26:14 +0000
+++ openlp/core/ui/exceptionform.py	2016-03-13 22:06:46 +0000
@@ -180,11 +180,13 @@
             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@xxxxxxxxxx')
-        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@xxxxxxxxxx')
+        mail_to_url.setQuery(mail_urlquery)
         QtGui.QDesktopServices.openUrl(mail_to_url)
 
     def on_description_updated(self):

=== modified file 'openlp/plugins/custom/forms/editcustomform.py'
--- openlp/plugins/custom/forms/editcustomform.py	2016-01-09 16:26:14 +0000
+++ openlp/plugins/custom/forms/editcustomform.py	2016-03-13 22:06:46 +0000
@@ -198,6 +198,7 @@
             # 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()
 

=== modified file 'openlp/plugins/songs/lib/importers/easyworship.py'
--- openlp/plugins/songs/lib/importers/easyworship.py	2016-01-31 19:36:54 +0000
+++ openlp/plugins/songs/lib/importers/easyworship.py	2016-03-13 22:06:46 +0000
@@ -289,40 +289,45 @@
             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 @@
                 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 @@
                         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',

=== modified file 'openlp/plugins/songs/lib/mediaitem.py'
--- openlp/plugins/songs/lib/mediaitem.py	2016-02-13 16:57:09 +0000
+++ openlp/plugins/songs/lib/mediaitem.py	2016-03-13 22:06:46 +0000
@@ -295,7 +295,7 @@
         :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 @@
         :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):
         """

=== modified file 'tests/functional/openlp_plugins/songs/test_mediaitem.py'
--- tests/functional/openlp_plugins/songs/test_mediaitem.py	2016-02-13 16:57:09 +0000
+++ tests/functional/openlp_plugins/songs/test_mediaitem.py	2016-03-13 22:06:46 +0000
@@ -422,10 +422,10 @@
         """
         # 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'])
 

=== modified file 'tests/interfaces/openlp_core_lib/test_pluginmanager.py'
--- tests/interfaces/openlp_core_lib/test_pluginmanager.py	2015-12-31 22:46:06 +0000
+++ tests/interfaces/openlp_core_lib/test_pluginmanager.py	2016-03-13 22:06:46 +0000
@@ -32,7 +32,7 @@
 
 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 @@
         """
         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 @@
         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
         """

=== modified file 'tests/interfaces/openlp_plugins/custom/forms/test_customform.py'
--- tests/interfaces/openlp_plugins/custom/forms/test_customform.py	2015-12-31 22:46:06 +0000
+++ tests/interfaces/openlp_plugins/custom/forms/test_customform.py	2016-03-13 22:06:46 +0000
@@ -128,3 +128,19 @@
             # 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'])


References