diff --git a/openlp/core/lib/spelltextedit.py b/openlp/core/lib/spelltextedit.py index 30811e08b..82391a0b3 100644 --- a/openlp/core/lib/spelltextedit.py +++ b/openlp/core/lib/spelltextedit.py @@ -28,9 +28,9 @@ import re try: import enchant from enchant import DictNotFoundError - enchant_available = True + ENCHANT_AVAILABLE = True except ImportError: - enchant_available = False + ENCHANT_AVAILABLE = False # based on code from # http://john.nachtimwald.com/2009/08/22/qplaintextedit-with-in-line-spell-check @@ -45,7 +45,7 @@ class SpellTextEdit(QtGui.QPlainTextEdit): def __init__(self, *args): QtGui.QPlainTextEdit.__init__(self, *args) # Default dictionary based on the current locale. - if enchant_available: + if ENCHANT_AVAILABLE: try: self.dict = enchant.Dict() except DictNotFoundError: @@ -72,7 +72,7 @@ class SpellTextEdit(QtGui.QPlainTextEdit): self.setTextCursor(cursor) # Check if the selected word is misspelled and offer spelling # suggestions if it is. - if enchant_available and self.textCursor().hasSelection(): + if ENCHANT_AVAILABLE and self.textCursor().hasSelection(): text = unicode(self.textCursor().selectedText()) if not self.dict.check(text): spell_menu = QtGui.QMenu(translate('OpenLP.SpellTextEdit', diff --git a/openlp/core/ui/advancedtab.py b/openlp/core/ui/advancedtab.py index 52151e5b8..58b637bc2 100644 --- a/openlp/core/ui/advancedtab.py +++ b/openlp/core/ui/advancedtab.py @@ -163,8 +163,7 @@ class AdvancedTab(SettingsTab): settings.value(u'enable exit confirmation', QtCore.QVariant(True)).toBool()) self.hideMouseCheckBox.setChecked( - settings.value(u'hide mouse', - QtCore.QVariant(False)).toBool()) + settings.value(u'hide mouse', QtCore.QVariant(False)).toBool()) settings.endGroup() def save(self): diff --git a/openlp/core/utils/__init__.py b/openlp/core/utils/__init__.py index b7d95a46d..9117a8e19 100644 --- a/openlp/core/utils/__init__.py +++ b/openlp/core/utils/__init__.py @@ -26,7 +26,6 @@ """ The :mod:`utils` module provides the utility libraries for OpenLP """ - import logging import os import re @@ -36,12 +35,18 @@ import urllib2 from datetime import datetime from PyQt4 import QtGui, QtCore +if sys.platform != u'win32' and sys.platform != u'darwin': + try: + from xdg import BaseDirectory + XDG_BASE_AVAILABLE = True + except ImportError: + XDG_BASE_AVAILABLE = False import openlp from openlp.core.lib import Receiver, translate log = logging.getLogger(__name__) -images_filter = None +IMAGES_FILTER = None class VersionThread(QtCore.QThread): """ @@ -113,77 +118,46 @@ class AppLocation(object): The directory type you want, for instance the data directory. """ if dir_type == AppLocation.AppDir: - if hasattr(sys, u'frozen') and sys.frozen == 1: - app_path = os.path.abspath(os.path.split(sys.argv[0])[0]) - else: - app_path = os.path.split(openlp.__file__)[0] - return app_path + return _get_frozen_path( + os.path.abspath(os.path.split(sys.argv[0])[0]), + os.path.split(openlp.__file__)[0]) elif dir_type == AppLocation.ConfigDir: - if sys.platform == u'win32': - path = os.path.join(os.getenv(u'APPDATA'), u'openlp') - elif sys.platform == u'darwin': - path = os.path.join(os.getenv(u'HOME'), u'Library', - u'Application Support', u'openlp') - else: - try: - from xdg import BaseDirectory - path = os.path.join( - BaseDirectory.xdg_config_home, u'openlp') - except ImportError: - path = os.path.join(os.getenv(u'HOME'), u'.openlp') - return path + return _get_os_dir_path(u'openlp', + os.path.join(os.getenv(u'HOME'), u'Library', + u'Application Support', u'openlp'), + os.path.join(BaseDirectory.xdg_config_home, u'openlp'), + os.path.join(os.getenv(u'HOME'), u'.openlp')) elif dir_type == AppLocation.DataDir: - if sys.platform == u'win32': - path = os.path.join(os.getenv(u'APPDATA'), u'openlp', u'data') - elif sys.platform == u'darwin': - path = os.path.join(os.getenv(u'HOME'), u'Library', - u'Application Support', u'openlp', u'Data') - else: - try: - from xdg import BaseDirectory - path = os.path.join(BaseDirectory.xdg_data_home, u'openlp') - except ImportError: - path = os.path.join(os.getenv(u'HOME'), u'.openlp', u'data') - return path + return _get_os_dir_path(os.path.join(u'openlp', u'data'), + os.path.join(os.getenv(u'HOME'), u'Library', + u'Application Support', u'openlp', u'Data'), + os.path.join(BaseDirectory.xdg_data_home, u'openlp'), + os.path.join(os.getenv(u'HOME'), u'.openlp', u'data')) elif dir_type == AppLocation.PluginsDir: - plugin_path = None app_path = os.path.abspath(os.path.split(sys.argv[0])[0]) - if hasattr(sys, u'frozen') and sys.frozen == 1: - plugin_path = os.path.join(app_path, u'plugins') - else: - plugin_path = os.path.join( - os.path.split(openlp.__file__)[0], u'plugins') - return plugin_path + return _get_frozen_path(os.path.join(app_path, u'plugins'), + os.path.join(os.path.split(openlp.__file__)[0], u'plugins')) elif dir_type == AppLocation.VersionDir: - if hasattr(sys, u'frozen') and sys.frozen == 1: - version_path = os.path.abspath(os.path.split(sys.argv[0])[0]) - else: - version_path = os.path.split(openlp.__file__)[0] - return version_path + return _get_frozen_path( + os.path.abspath(os.path.split(sys.argv[0])[0]), + os.path.split(openlp.__file__)[0]) elif dir_type == AppLocation.CacheDir: - if sys.platform == u'win32': - path = os.path.join(os.getenv(u'APPDATA'), u'openlp') - elif sys.platform == u'darwin': - path = os.path.join(os.getenv(u'HOME'), u'Library', - u'Application Support', u'openlp') - else: - try: - from xdg import BaseDirectory - path = os.path.join( - BaseDirectory.xdg_cache_home, u'openlp') - except ImportError: - path = os.path.join(os.getenv(u'HOME'), u'.openlp') - return path + return _get_os_dir_path(u'openlp', + os.path.join(os.getenv(u'HOME'), u'Library', + u'Application Support', u'openlp'), + os.path.join(BaseDirectory.xdg_cache_home, u'openlp'), + os.path.join(os.getenv(u'HOME'), u'.openlp')) if dir_type == AppLocation.LanguageDir: - if hasattr(sys, u'frozen') and sys.frozen == 1: - app_path = os.path.abspath(os.path.split(sys.argv[0])[0]) - else: - app_path = os.path.split(openlp.__file__)[0] + app_path = _get_frozen_path( + os.path.abspath(os.path.split(sys.argv[0])[0]), + os.path.split(openlp.__file__)[0]) return os.path.join(app_path, u'i18n') - @staticmethod def get_data_path(): + """ + Return the path OpenLP stores all its data under. + """ path = AppLocation.get_directory(AppLocation.DataDir) if not os.path.exists(path): os.makedirs(path) @@ -191,12 +165,38 @@ class AppLocation(object): @staticmethod def get_section_data_path(section): + """ + Return the path a particular module stores its data under. + """ data_path = AppLocation.get_data_path() path = os.path.join(data_path, section) if not os.path.exists(path): os.makedirs(path) return path +def _get_os_dir_path(win_option, darwin_option, base_dir_option, + non_base_dir_option): + """ + Return a path based on which OS and environment we are running in. + """ + if sys.platform == u'win32': + return os.path.join(os.getenv(u'APPDATA'), win_option) + elif sys.platform == u'darwin': + return darwin_option + else: + if XDG_BASE_AVAILABLE: + return base_dir_option + else: + return non_base_dir_option + +def _get_frozen_path(frozen_option, non_frozen_option): + """ + Return a path based on the system status. + """ + if hasattr(sys, u'frozen') and sys.frozen == 1: + return frozen_option + else: + return non_frozen_option def check_latest_version(current_version): """ @@ -225,9 +225,8 @@ def check_latest_version(current_version): remote_version = None try: remote_version = unicode(urllib2.urlopen(req, None).read()).strip() - except IOError, e: - if hasattr(e, u'reason'): - log.exception(u'Reason for failure: %s', e.reason) + except IOError: + log.exception(u'Failed to download the latest OpenLP version file') if remote_version: version_string = remote_version return version_string @@ -264,18 +263,21 @@ def get_images_filter(): Returns a filter string for a file dialog containing all the supported image formats. """ - global images_filter - if not images_filter: + global IMAGES_FILTER + if not IMAGES_FILTER: log.debug(u'Generating images filter.') formats = [unicode(fmt) for fmt in QtGui.QImageReader.supportedImageFormats()] visible_formats = u'(*.%s)' % u'; *.'.join(formats) actual_formats = u'(*.%s)' % u' *.'.join(formats) - images_filter = u'%s %s %s' % (translate('OpenLP', 'Image Files'), + IMAGES_FILTER = u'%s %s %s' % (translate('OpenLP', 'Image Files'), visible_formats, actual_formats) - return images_filter + return IMAGES_FILTER def split_filename(path): + """ + Return a list of the parts in a given path. + """ path = os.path.abspath(path) if not os.path.isfile(path): return path, u'' diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py index 462dac89a..af8b71795 100644 --- a/openlp/plugins/songs/lib/__init__.py +++ b/openlp/plugins/songs/lib/__init__.py @@ -48,49 +48,27 @@ class VerseType(object): ``verse_type`` The type to return a string for """ - if verse_type == VerseType.Verse: - return translate('SongsPlugin.VerseType', 'Verse') - elif verse_type == VerseType.Chorus: - return translate('SongsPlugin.VerseType', 'Chorus') - elif verse_type == VerseType.Bridge: - return translate('SongsPlugin.VerseType', 'Bridge') - elif verse_type == VerseType.PreChorus: - return translate('SongsPlugin.VerseType', 'Pre-Chorus') - elif verse_type == VerseType.Intro: - return translate('SongsPlugin.VerseType', 'Intro') - elif verse_type == VerseType.Ending: - return translate('SongsPlugin.VerseType', 'Ending') - elif verse_type == VerseType.Other: - return translate('SongsPlugin.VerseType', 'Other') - - @staticmethod - def expand_string(verse_type): - """ - Return the VerseType for a given string - - ``verse_type`` - The string to return a VerseType for - """ - verse_type = verse_type.lower() - if verse_type == \ + if not isinstance(verse_type, int): + verse_type = verse_type.lower() + if verse_type == VerseType.Verse or verse_type == \ unicode(VerseType.to_string(VerseType.Verse)).lower()[0]: return translate('SongsPlugin.VerseType', 'Verse') - elif verse_type == \ + elif verse_type == VerseType.Chorus or verse_type == \ unicode(VerseType.to_string(VerseType.Chorus)).lower()[0]: return translate('SongsPlugin.VerseType', 'Chorus') - elif verse_type == \ + elif verse_type == VerseType.Bridge or verse_type == \ unicode(VerseType.to_string(VerseType.Bridge)).lower()[0]: return translate('SongsPlugin.VerseType', 'Bridge') - elif verse_type == \ + elif verse_type == VerseType.PreChorus or verse_type == \ unicode(VerseType.to_string(VerseType.PreChorus)).lower()[0]: - return translate('SongsPlugin.VerseType', 'PreChorus') - elif verse_type == \ + return translate('SongsPlugin.VerseType', 'Pre-Chorus') + elif verse_type == VerseType.Intro or verse_type == \ unicode(VerseType.to_string(VerseType.Intro)).lower()[0]: return translate('SongsPlugin.VerseType', 'Intro') - elif verse_type == \ + elif verse_type == VerseType.Ending or verse_type == \ unicode(VerseType.to_string(VerseType.Ending)).lower()[0]: return translate('SongsPlugin.VerseType', 'Ending') - elif verse_type == \ + elif verse_type == VerseType.Other or verse_type == \ unicode(VerseType.to_string(VerseType.Other)).lower()[0]: return translate('SongsPlugin.VerseType', 'Other') @@ -163,7 +141,7 @@ def retrieve_windows_encoding(recommendation=None): translate('SongsPlugin', 'Character Encoding'), translate('SongsPlugin', 'The codepage setting is responsible\n' 'for the correct character representation.\n' - 'Usually you are fine with the preselected choise.'), + 'Usually you are fine with the preselected choice.'), [pair[1] for pair in encodings], recommended_index, False) else: choice = QtGui.QInputDialog.getItem(None, diff --git a/openlp/plugins/songs/lib/importer.py b/openlp/plugins/songs/lib/importer.py index 128d80138..120f47738 100644 --- a/openlp/plugins/songs/lib/importer.py +++ b/openlp/plugins/songs/lib/importer.py @@ -23,7 +23,9 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### - +""" +The :mod:`importer` modules provides the general song import functionality. +""" from opensongimport import OpenSongImport from olpimport import OpenLPSongImport from openlyricsimport import OpenLyricsImport @@ -34,19 +36,19 @@ from songbeamerimport import SongBeamerImport # Imports that might fail try: from olp1import import OpenLP1SongImport - has_openlp1 = True + HAS_OPENLP1 = True except ImportError: - has_openlp1 = False + HAS_OPENLP1 = False try: from sofimport import SofImport - has_sof = True + HAS_SOF = True except ImportError: - has_sof = False + HAS_SOF = False try: from oooimport import OooImport - has_ooo = True + HAS_OOO = True except ImportError: - has_ooo = False + HAS_OOO = False class SongFormat(object): """ @@ -118,14 +120,20 @@ class SongFormat(object): @staticmethod def set_availability(format, available): + """ + Set the availability for a given song format. + """ SongFormat._format_availability[format] = available @staticmethod def get_availability(format): + """ + Return the availability of a given song format. + """ return SongFormat._format_availability.get(format, True) -SongFormat.set_availability(SongFormat.OpenLP1, has_openlp1) -SongFormat.set_availability(SongFormat.SongsOfFellowship, has_sof) -SongFormat.set_availability(SongFormat.Generic, has_ooo) +SongFormat.set_availability(SongFormat.OpenLP1, HAS_OPENLP1) +SongFormat.set_availability(SongFormat.SongsOfFellowship, HAS_SOF) +SongFormat.set_availability(SongFormat.Generic, HAS_OOO) -__all__ = [u'SongFormat'] \ No newline at end of file +__all__ = [u'SongFormat'] diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 93e40f58a..67021616b 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -194,8 +194,7 @@ class SongMediaItem(MediaManagerItem): elif search_type == 5: log.debug(u'Theme Search') search_results = self.parent.manager.get_all_objects(Song, - Song.theme_name == search_keywords, - Song.search_lyrics.asc()) + Song.theme_name == search_keywords, Song.search_lyrics.asc()) self.displayResultsSong(search_results) def onSongListLoad(self): diff --git a/openlp/plugins/songs/lib/songbeamerimport.py b/openlp/plugins/songs/lib/songbeamerimport.py index c783793db..47290bfbd 100644 --- a/openlp/plugins/songs/lib/songbeamerimport.py +++ b/openlp/plugins/songs/lib/songbeamerimport.py @@ -83,7 +83,7 @@ class SongBeamerImport(SongImport): def do_import(self): """ - Recieve a single file, or a list of files to import. + Receive a single file or a list of files to import. """ if isinstance(self.import_source, list): self.import_wizard.progressBar.setMaximum( @@ -94,21 +94,21 @@ class SongBeamerImport(SongImport): self.current_verse = u'' self.current_verse_type = u'V' read_verses = False - self.file_name = os.path.split(file)[1] + file_name = os.path.split(file)[1] self.import_wizard.incrementProgressBar( - u'Importing %s' % (self.file_name), 0) + u'Importing %s' % (file_name), 0) if os.path.isfile(file): detect_file = open(file, u'r') details = chardet.detect(detect_file.read(2048)) detect_file.close() infile = codecs.open(file, u'r', details['encoding']) - self.songData = infile.readlines() + songData = infile.readlines() infile.close() else: return False - self.title = self.file_name.split('.sng')[0] + self.title = file_name.split('.sng')[0] read_verses = False - for line in self.songData: + for line in songData: # Just make sure that the line is of the type 'Unicode'. line = unicode(line).strip() if line.startswith(u'#') and not read_verses: @@ -136,7 +136,7 @@ class SongBeamerImport(SongImport): self.finish() self.import_wizard.incrementProgressBar(unicode(translate( 'SongsPlugin.SongBeamerImport', 'Importing %s...')) % - self.file_name) + file_name) return True def replace_html_tags(self): diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py index c1105a578..b4f64f9b4 100644 --- a/openlp/plugins/songs/lib/songimport.py +++ b/openlp/plugins/songs/lib/songimport.py @@ -62,7 +62,6 @@ class SongImport(QtCore.QObject): Create defaults for properties - call this before each song if importing many songs at once to ensure a clean beginning """ - self.authors = [] self.title = u'' self.song_number = u'' self.alternate_title = u'' @@ -251,17 +250,11 @@ class SongImport(QtCore.QObject): def finish(self): """ - All fields have been set to this song. Write it away + All fields have been set to this song. Write the song to disk. """ if not self.authors: self.authors.append(unicode(translate('SongsPlugin.SongImport', 'Author unknown'))) - self.commit_song() - - def commit_song(self): - """ - Write the song and its fields to disk - """ log.info(u'commiting song %s to database', self.title) song = Song() song.title = self.title diff --git a/openlp/plugins/songs/lib/wowimport.py b/openlp/plugins/songs/lib/wowimport.py index d0c308413..b90a47de6 100644 --- a/openlp/plugins/songs/lib/wowimport.py +++ b/openlp/plugins/songs/lib/wowimport.py @@ -107,63 +107,60 @@ class WowImport(SongImport): def do_import(self): """ - Recieve a single file, or a list of files to import. + Receive a single file or a list of files to import. """ - if isinstance(self.import_source, list): self.import_wizard.progressBar.setMaximum(len(self.import_source)) for file in self.import_source: - self.author = u'' - self.copyright = u'' - self.file_name = os.path.split(file)[1] + author = u'' + copyright = u'' + file_name = os.path.split(file)[1] self.import_wizard.incrementProgressBar( - u'Importing %s' % (self.file_name), 0) + u'Importing %s' % (file_name), 0) # Get the song title - self.title = self.file_name.rpartition(u'.')[0] - self.songData = open(file, 'rb') - if self.songData.read(19) != u'WoW File\nSong Words': + self.title = file_name.rpartition(u'.')[0] + songData = open(file, 'rb') + if songData.read(19) != u'WoW File\nSong Words': continue # Seek to byte which stores number of blocks in the song - self.songData.seek(56) - self.no_of_blocks = ord(self.songData.read(1)) + songData.seek(56) + no_of_blocks = ord(songData.read(1)) # Seek to the beging of the first block - self.songData.seek(82) - for block in range(self.no_of_blocks): - self.lines_to_read = ord(self.songData.read(1)) + songData.seek(82) + for block in range(no_of_blocks): + self.lines_to_read = ord(songData.read(1)) # Skip 3 nulls to the beginnig of the 1st line - self.songData.seek(3, os.SEEK_CUR) - self.block_text = u'' + songData.seek(3, os.SEEK_CUR) + block_text = u'' while self.lines_to_read: - self.length_of_line = ord(self.songData.read(1)) self.line_text = unicode( - self.songData.read(self.length_of_line), u'cp1252') - self.songData.seek(1, os.SEEK_CUR) - if self.block_text != u'': - self.block_text += u'\n' - self.block_text += self.line_text + songData.read(ord(songData.read(1))), u'cp1252') + songData.seek(1, os.SEEK_CUR) + if block_text != u'': + block_text += u'\n' + block_text += self.line_text self.lines_to_read -= 1 - self.block_type = BLOCK_TYPES[ord(self.songData.read(1))] + block_type = BLOCK_TYPES[ord(songData.read(1))] # Skip 3 nulls at the end of the block - self.songData.seek(3, os.SEEK_CUR) + songData.seek(3, os.SEEK_CUR) # Blocks are seperated by 2 bytes, skip them, but not if # this is the last block! - if (block + 1) < self.no_of_blocks: - self.songData.seek(2, os.SEEK_CUR) - self.add_verse(self.block_text, self.block_type) - # Now to extact the author - self.author_length = ord(self.songData.read(1)) - if self.author_length != 0: - self.author = unicode( - self.songData.read(self.author_length), u'cp1252') + if (block + 1) < no_of_blocks: + songData.seek(2, os.SEEK_CUR) + self.add_verse(block_text, block_type) + # Now to extract the author + author_length = ord(songData.read(1)) + if author_length != 0: + author = unicode(songData.read(author_length), u'cp1252') # Finally the copyright - self.copyright_length = ord(self.songData.read(1)) - if self.copyright_length != 0: - self.copyright = unicode( - self.songData.read(self.copyright_length), u'cp1252') - self.parse_author(self.author) - self.add_copyright(self.copyright) - self.songData.close() + copyright_length = ord(songData.read(1)) + if copyright_length != 0: + copyright = unicode( + songData.read(copyright_length), u'cp1252') + self.parse_author(author) + self.add_copyright(copyright) + songData.close() self.finish() self.import_wizard.incrementProgressBar( - u'Importing %s' % (self.file_name)) + u'Importing %s' % (file_name)) return True diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index cbe313212..88459b797 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -435,7 +435,7 @@ class OpenLyrics(object): text += u'\n' text += u'\n'.join([unicode(line) for line in lines.line]) verse_name = self._get(verse, u'name') - verse_type = unicode(VerseType.expand_string(verse_name[0]))[0] + verse_type = unicode(VerseType.to_string(verse_name[0]))[0] verse_number = re.compile(u'[a-zA-Z]*').sub(u'', verse_name) verse_part = re.compile(u'[0-9]*').sub(u'', verse_name[1:]) # OpenLyrics allows e. g. "c", but we need "c1".