From e1743650516a292cb07edbd0995fa2a159512c12 Mon Sep 17 00:00:00 2001 From: Samuel Mehrbrodt Date: Mon, 23 Jun 2014 13:38:17 +0200 Subject: [PATCH 1/5] Fix theme export Fixes: https://launchpad.net/bugs/1332990 --- openlp/core/ui/thememanager.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index fdd2ea592..714964846 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -391,9 +391,7 @@ class ThemeManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ThemeManager, R source = os.path.join(self.path, theme) for files in os.walk(source): for name in files[2]: - theme_zip.write( - os.path.join(source, name).encode('utf-8'), os.path.join(theme, name).encode('utf-8') - ) + theme_zip.write(os.path.join(source, name), os.path.join(theme, name)) QtGui.QMessageBox.information(self, translate('OpenLP.ThemeManager', 'Theme Exported'), translate('OpenLP.ThemeManager', From aa0e1ca1070a3347b07762d140b3d6f6e8c6b5b2 Mon Sep 17 00:00:00 2001 From: Samuel Mehrbrodt Date: Mon, 23 Jun 2014 15:51:56 +0200 Subject: [PATCH 2/5] Add test --- openlp/core/ui/thememanager.py | 27 ++++---- .../openlp_core_ui/test_thememanager.py | 62 +++++++++++++++++++ tests/resources/themes/Default/Default.xml | 34 ++++++++++ 3 files changed, 112 insertions(+), 11 deletions(-) create mode 100644 tests/functional/openlp_core_ui/test_thememanager.py create mode 100644 tests/resources/themes/Default/Default.xml diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 714964846..fb0788b99 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -383,15 +383,9 @@ class ThemeManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ThemeManager, R '/last directory export')) self.application.set_busy_cursor() if path: - Settings().setValue(self.settings_section + '/last directory export', path) - theme_path = os.path.join(path, theme + '.otz') - theme_zip = None try: - theme_zip = zipfile.ZipFile(theme_path, 'w') - source = os.path.join(self.path, theme) - for files in os.walk(source): - for name in files[2]: - theme_zip.write(os.path.join(source, name), os.path.join(theme, name)) + Settings().setValue(self.settings_section + '/last directory export', path) + self._export_theme(path, theme) QtGui.QMessageBox.information(self, translate('OpenLP.ThemeManager', 'Theme Exported'), translate('OpenLP.ThemeManager', @@ -401,11 +395,22 @@ class ThemeManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ThemeManager, R critical_error_message_box(translate('OpenLP.ThemeManager', 'Theme Export Failed'), translate('OpenLP.ThemeManager', 'Your theme could not be exported due to an error.')) - finally: - if theme_zip: - theme_zip.close() self.application.set_normal_cursor() + def _export_theme(self, path, theme): + """ + Create the zipfile with the theme contents. + :param path: Location where the zip file will be placed + :param theme: The name of the theme to be exported + """ + theme_path = os.path.join(path, theme + '.otz') + theme_zip = zipfile.ZipFile(theme_path, 'w') + source = os.path.join(self.path, theme) + for files in os.walk(source): + for name in files[2]: + theme_zip.write(os.path.join(source, name), os.path.join(theme, name)) + theme_zip.close() + def on_import_theme(self, field=None): """ Opens a file dialog to select the theme file(s) to import before attempting to extract OpenLP themes from diff --git a/tests/functional/openlp_core_ui/test_thememanager.py b/tests/functional/openlp_core_ui/test_thememanager.py new file mode 100644 index 000000000..3555b8843 --- /dev/null +++ b/tests/functional/openlp_core_ui/test_thememanager.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2014 Raoul Snyman # +# Portions copyright (c) 2008-2014 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. # +# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, # +# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # +# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, # +# Frode Woldsund, Martin Zibricky, Patrick Zimmermann # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### +""" +Package to test the openlp.core.ui.thememanager package. +""" +import zipfile +import os + +from unittest import TestCase +from tests.interfaces import MagicMock + +from openlp.core.ui import ThemeManager + +RESOURCES_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'resources', 'themes')) + + +class TestThemeManager(TestCase): + + def export_theme_test(self): + """ + Test exporting a theme . + """ + # GIVEN: A new ThemeManager instance. + theme_manager = ThemeManager() + theme_manager.path = RESOURCES_PATH + zipfile.ZipFile.__init__ = MagicMock() + zipfile.ZipFile.__init__.return_value = None + zipfile.ZipFile.write = MagicMock() + + # WHEN: The theme is exported + theme_manager._export_theme('/some/path', 'Default') + + # THEN: The zipfile should be created at the given path + zipfile.ZipFile.__init__.assert_called_with('/some/path/Default.otz', 'w') + zipfile.ZipFile.write.assert_called_with(os.path.join(RESOURCES_PATH, 'Default', 'Default.xml'), + 'Default/Default.xml') diff --git a/tests/resources/themes/Default/Default.xml b/tests/resources/themes/Default/Default.xml new file mode 100644 index 000000000..d77731005 --- /dev/null +++ b/tests/resources/themes/Default/Default.xml @@ -0,0 +1,34 @@ + + + Default + + #000000 + + + Arial + #FFFFFF + 40 + False + False + 0 + + True + False + + + Arial + #FFFFFF + 12 + False + False + 0 + + True + False + + + 0 + 0 + False + + From 39fbbf779d930d00bc3edb34229b6951e72d548c Mon Sep 17 00:00:00 2001 From: Samuel Mehrbrodt Date: Mon, 23 Jun 2014 15:54:13 +0200 Subject: [PATCH 3/5] Move this line out of try/catch block --- openlp/core/ui/thememanager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index fb0788b99..c42b9b664 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -383,8 +383,8 @@ class ThemeManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ThemeManager, R '/last directory export')) self.application.set_busy_cursor() if path: + Settings().setValue(self.settings_section + '/last directory export', path) try: - Settings().setValue(self.settings_section + '/last directory export', path) self._export_theme(path, theme) QtGui.QMessageBox.information(self, translate('OpenLP.ThemeManager', 'Theme Exported'), From 9702870afa6e8cd11fb6cf64b816f230c70f6213 Mon Sep 17 00:00:00 2001 From: Samuel Mehrbrodt Date: Mon, 30 Jun 2014 09:30:19 +0200 Subject: [PATCH 4/5] Close and delete zip in case of exception --- openlp/core/ui/thememanager.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index c42b9b664..95df35831 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -404,12 +404,17 @@ class ThemeManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ThemeManager, R :param theme: The name of the theme to be exported """ theme_path = os.path.join(path, theme + '.otz') - theme_zip = zipfile.ZipFile(theme_path, 'w') - source = os.path.join(self.path, theme) - for files in os.walk(source): - for name in files[2]: - theme_zip.write(os.path.join(source, name), os.path.join(theme, name)) - theme_zip.close() + try: + theme_zip = zipfile.ZipFile(theme_path, 'w') + source = os.path.join(self.path, theme) + for files in os.walk(source): + for name in files[2]: + theme_zip.write(os.path.join(source, name), os.path.join(theme, name)) + except (IOError, OSError): + if theme_zip: + theme_zip.close() + shutil.rmtree(theme_path, True) + raise def on_import_theme(self, field=None): """ From af6537116c785735c1dd80292cfa0c238f0ea413 Mon Sep 17 00:00:00 2001 From: Samuel Mehrbrodt Date: Mon, 30 Jun 2014 14:36:35 +0200 Subject: [PATCH 5/5] Close file also on success --- openlp/core/ui/thememanager.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 95df35831..c68d1694b 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -415,6 +415,8 @@ class ThemeManager(OpenLPMixin, RegistryMixin, QtGui.QWidget, Ui_ThemeManager, R theme_zip.close() shutil.rmtree(theme_path, True) raise + else: + theme_zip.close() def on_import_theme(self, field=None): """