← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~phill-ridout/openlp/thumbnail_fixes into lp:openlp

 

Phill has proposed merging lp:~phill-ridout/openlp/thumbnail_fixes into lp:openlp.

Requested reviews:
  Raoul Snyman (raoul-snyman)
Related bugs:
  Bug #1414360 in OpenLP: "2.1.2 Traceback on Presentations for MAC"
  https://bugs.launchpad.net/openlp/+bug/1414360
  Bug #1414585 in OpenLP: "Thumbnail of images isn't shown in stage view and remote control"
  https://bugs.launchpad.net/openlp/+bug/1414585

For more details, see:
https://code.launchpad.net/~phill-ridout/openlp/thumbnail_fixes/+merge/248171

Fixes #1414585 Thumbnail of images isn't shown in stage view and remote control
and #1414585 2.1.2 Traceback on Presentations for MAC


--------------------------------
lp:~phill-ridout/openlp/thumbnail_fixes (revision 2494)
[SUCCESS] http://ci.openlp.org/job/Branch-01-Pull/926/
[SUCCESS] http://ci.openlp.org/job/Branch-02-Functional-Tests/852/
[SUCCESS] http://ci.openlp.org/job/Branch-03-Interface-Tests/797/
[SUCCESS] http://ci.openlp.org/job/Branch-04a-Windows_Functional_Tests/708/
[SUCCESS] http://ci.openlp.org/job/Branch-04b-Windows_Interface_Tests/307/
[SUCCESS] http://ci.openlp.org/job/Branch-05a-Code_Analysis/445/
[SUCCESS] http://ci.openlp.org/job/Branch-05b-Test_Coverage/316/
-- 
Your team OpenLP Core is subscribed to branch lp:openlp.
=== modified file 'openlp/plugins/bibles/lib/__init__.py'
--- openlp/plugins/bibles/lib/__init__.py	2015-01-22 13:19:10 +0000
+++ openlp/plugins/bibles/lib/__init__.py	2015-01-30 21:25:00 +0000
@@ -178,7 +178,7 @@
     default_separators = [
         '|'.join([
             translate('BiblesPlugin', ':', 'Verse identifier e.g. Genesis 1 : 1 = Genesis Chapter 1 Verse 1'),
-            translate('BiblesPlugin', 'v','Verse identifier e.g. Genesis 1 v 1 = Genesis Chapter 1 Verse 1'),
+            translate('BiblesPlugin', 'v', 'Verse identifier e.g. Genesis 1 v 1 = Genesis Chapter 1 Verse 1'),
             translate('BiblesPlugin', 'V', 'Verse identifier e.g. Genesis 1 V 1 = Genesis Chapter 1 Verse 1'),
             translate('BiblesPlugin', 'verse', 'Verse identifier e.g. Genesis 1 verse 1 = Genesis Chapter 1 Verse 1'),
             translate('BiblesPlugin', 'verses',

=== modified file 'openlp/plugins/images/lib/mediaitem.py'
--- openlp/plugins/images/lib/mediaitem.py	2015-01-24 18:24:51 +0000
+++ openlp/plugins/images/lib/mediaitem.py	2015-01-30 21:25:00 +0000
@@ -314,6 +314,16 @@
                 return True
         return return_value
 
+    def generate_thumbnail_path(self, image):
+        """
+        Generate a path to the thumbnail
+
+        :param image: An instance of ImageFileNames
+        :return: A path to the thumbnail of type str
+        """
+        ext = os.path.splitext(image.filename)[1].lower()
+        return os.path.join(self.service_path, '{}{}'.format(str(image.id), ext))
+
     def load_full_list(self, images, initial_load=False, open_group=None):
         """
         Replace the list of images and groups in the interface.
@@ -335,27 +345,26 @@
         # Sort the images by its filename considering language specific.
         # characters.
         images.sort(key=lambda image_object: get_locale_key(os.path.split(str(image_object.filename))[1]))
-        for imageFile in images:
-            log.debug('Loading image: %s', imageFile.filename)
-            filename = os.path.split(imageFile.filename)[1]
-            ext = os.path.splitext(imageFile.filename)[1].lower()
-            thumb = os.path.join(self.service_path, "%s%s" % (str(imageFile.id), ext))
-            if not os.path.exists(imageFile.filename):
+        for image_file in images:
+            log.debug('Loading image: %s', image_file.filename)
+            filename = os.path.split(image_file.filename)[1]
+            thumb = self.generate_thumbnail_path(image_file)
+            if not os.path.exists(image_file.filename):
                 icon = build_icon(':/general/general_delete.png')
             else:
-                if validate_thumb(imageFile.filename, thumb):
+                if validate_thumb(image_file.filename, thumb):
                     icon = build_icon(thumb)
                 else:
-                    icon = create_thumb(imageFile.filename, thumb)
+                    icon = create_thumb(image_file.filename, thumb)
             item_name = QtGui.QTreeWidgetItem([filename])
             item_name.setText(0, filename)
             item_name.setIcon(0, icon)
-            item_name.setToolTip(0, imageFile.filename)
-            item_name.setData(0, QtCore.Qt.UserRole, imageFile)
-            if imageFile.group_id == 0:
+            item_name.setToolTip(0, image_file.filename)
+            item_name.setData(0, QtCore.Qt.UserRole, image_file)
+            if image_file.group_id == 0:
                 self.list_view.addTopLevelItem(item_name)
             else:
-                group_items[imageFile.group_id].addChild(item_name)
+                group_items[image_file.group_id].addChild(item_name)
             if not initial_load:
                 self.main_window.increment_progress_bar()
         if not initial_load:
@@ -549,24 +558,24 @@
         # force a nonexistent theme
         service_item.theme = -1
         missing_items_file_names = []
-        images_file_names = []
+        images = []
         # Expand groups to images
         for bitem in items:
             if isinstance(bitem.data(0, QtCore.Qt.UserRole), ImageGroups) or bitem.data(0, QtCore.Qt.UserRole) is None:
                 for index in range(0, bitem.childCount()):
                     if isinstance(bitem.child(index).data(0, QtCore.Qt.UserRole), ImageFilenames):
-                        images_file_names.append(bitem.child(index).data(0, QtCore.Qt.UserRole).filename)
+                        images.append(bitem.child(index).data(0, QtCore.Qt.UserRole))
             elif isinstance(bitem.data(0, QtCore.Qt.UserRole), ImageFilenames):
-                images_file_names.append(bitem.data(0, QtCore.Qt.UserRole).filename)
+                images.append(bitem.data(0, QtCore.Qt.UserRole))
         # Don't try to display empty groups
-        if not images_file_names:
+        if not images:
             return False
         # Find missing files
-        for filename in images_file_names:
-            if not os.path.exists(filename):
-                missing_items_file_names.append(filename)
+        for image in images:
+            if not os.path.exists(image.filename):
+                missing_items_file_names.append(image.filename)
         # We cannot continue, as all images do not exist.
-        if not images_file_names:
+        if not images:
             if not remote:
                 critical_error_message_box(
                     translate('ImagePlugin.MediaItem', 'Missing Image(s)'),
@@ -582,9 +591,10 @@
                 QtGui.QMessageBox.No:
             return False
         # Continue with the existing images.
-        for filename in images_file_names:
-            name = os.path.split(filename)[1]
-            service_item.add_from_image(filename, name, background, os.path.join(self.service_path, name))
+        for image in images:
+            name = os.path.split(image.filename)[1]
+            thumbnail = self.generate_thumbnail_path(image)
+            service_item.add_from_image(image.filename, name, background, thumbnail)
         return True
 
     def check_group_exists(self, new_group):

=== modified file 'openlp/plugins/presentations/presentationplugin.py'
--- openlp/plugins/presentations/presentationplugin.py	2015-01-22 17:31:00 +0000
+++ openlp/plugins/presentations/presentationplugin.py	2015-01-30 21:25:00 +0000
@@ -143,7 +143,10 @@
         super().app_startup()
         files_from_config = Settings().value('presentations/presentations files')
         for file in files_from_config:
-            self.media_item.clean_up_thumbnails(file)
+            try:
+                self.media_item.clean_up_thumbnails(file)
+            except AttributeError:
+                pass
         self.media_item.list_view.clear()
         Settings().setValue('presentations/thumbnail_scheme', 'md5')
         self.media_item.validate_and_load(files_from_config)

=== modified file 'tests/functional/openlp_core_utils/test_utils.py'
--- tests/functional/openlp_core_utils/test_utils.py	2015-01-19 08:34:29 +0000
+++ tests/functional/openlp_core_utils/test_utils.py	2015-01-30 21:25:00 +0000
@@ -25,7 +25,7 @@
 import os
 from unittest import TestCase
 
-from openlp.core.utils import clean_filename, get_filesystem_encoding, get_locale_key, \
+from openlp.core.utils import clean_filename, delete_file, get_filesystem_encoding, get_locale_key, \
     get_natural_key, split_filename, _get_user_agent, get_web_page, get_uno_instance, add_actions
 from tests.functional import MagicMock, patch
 
@@ -184,6 +184,59 @@
         # THEN: The file name should be cleaned.
         self.assertEqual(wanted_name, result, 'The file name should not contain any special characters.')
 
+    def delete_file_no_path_test(self):
+        """"
+        Test the delete_file function when called with out a valid path
+        """
+        # GIVEN: A blank path
+        # WEHN: Calling delete_file
+        result = delete_file('')
+
+        # THEN: delete_file should return False
+        self.assertFalse(result, "delete_file should return False when called with ''")
+
+    def delete_file_path_success_test(self):
+        """"
+        Test the delete_file function when it successfully deletes a file
+        """
+        # GIVEN: A mocked os which returns True when os.path.exists is called
+        with patch('openlp.core.utils.os', **{'path.exists.return_value': False}):
+
+            # WHEN: Calling delete_file with a file path
+            result = delete_file('path/file.ext')
+
+            # THEN: delete_file should return True
+            self.assertTrue(result, 'delete_file should return True when it successfully deletes a file')
+
+    def delete_file_path_no_file_exists_test(self):
+        """"
+        Test the delete_file function when the file to remove does not exist
+        """
+        # GIVEN: A mocked os which returns False when os.path.exists is called
+        with patch('openlp.core.utils.os', **{'path.exists.return_value': False}):
+
+            # WHEN: Calling delete_file with a file path
+            result = delete_file('path/file.ext')
+
+            # THEN: delete_file should return True
+            self.assertTrue(result, 'delete_file should return True when the file doesnt exist')
+
+    def delete_file_path_exception_test(self):
+        """"
+        Test the delete_file function when os.remove raises an exception
+        """
+        # GIVEN: A mocked os which returns True when os.path.exists is called and raises an OSError when os.remove is
+        #       called.
+        with patch('openlp.core.utils.os', **{'path.exists.return_value': True, 'path.exists.side_effect': OSError}), \
+                patch('openlp.core.utils.log') as mocked_log:
+
+            # WHEN: Calling delete_file with a file path
+            result = delete_file('path/file.ext')
+
+            # THEN: delete_file should log and exception and return False
+            self.assertEqual(mocked_log.exception.call_count, 1)
+            self.assertFalse(result, 'delete_file should return False when os.remove raises an OSError')
+
     def get_locale_key_test(self):
         """
         Test the get_locale_key(string) function


Follow ups