← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~trb143/openlp/pep8 into lp:openlp

 

Tim Bentley has proposed merging lp:~trb143/openlp/pep8 into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)

For more details, see:
https://code.launchpad.net/~trb143/openlp/pep8/+merge/212253

Last lot of cleanups - promise.

Used pep8 command line to generate the errors with a config file of 

[pep8]
exclude=resources.py,vlc.py
max-line-length = 120

Deleted old tests as they are not valid and did nothing.
Fixed up some missed variables.
completed pep8 compliance on the openlp root.




-- 
https://code.launchpad.net/~trb143/openlp/pep8/+merge/212253
Your team OpenLP Core is requested to review the proposed merge of lp:~trb143/openlp/pep8 into lp:openlp.
=== modified file 'openlp/core/common/applocation.py'
--- openlp/core/common/applocation.py	2014-03-17 19:05:55 +0000
+++ openlp/core/common/applocation.py	2014-03-21 21:59:15 +0000
@@ -76,7 +76,7 @@
         elif dir_type == AppLocation.PluginsDir:
             app_path = os.path.abspath(os.path.split(sys.argv[0])[0])
             return get_frozen_path(os.path.join(app_path, 'plugins'),
-                os.path.join(os.path.split(openlp.__file__)[0], 'plugins'))
+                                   os.path.join(os.path.split(openlp.__file__)[0], 'plugins'))
         elif dir_type == AppLocation.VersionDir:
             return get_frozen_path(os.path.abspath(os.path.split(sys.argv[0])[0]), os.path.split(openlp.__file__)[0])
         elif dir_type == AppLocation.LanguageDir:

=== modified file 'openlp/core/common/openlpmixin.py'
--- openlp/core/common/openlpmixin.py	2014-01-11 17:52:01 +0000
+++ openlp/core/common/openlpmixin.py	2014-03-21 21:59:15 +0000
@@ -91,4 +91,4 @@
         Common log exception handler which prints the calling path
         """
         trace_error_handler(self.logger)
-        self.logger.exception(message)
\ No newline at end of file
+        self.logger.exception(message)

=== modified file 'openlp/core/common/registryproperties.py'
--- openlp/core/common/registryproperties.py	2014-03-16 21:25:23 +0000
+++ openlp/core/common/registryproperties.py	2014-03-21 21:59:15 +0000
@@ -149,4 +149,4 @@
         """
         if not hasattr(self, '_alerts_manager') or not self._alerts_manager:
             self._alerts_manager = Registry().get('alerts_manager')
-        return self._alerts_manager
\ No newline at end of file
+        return self._alerts_manager

=== modified file 'openlp/core/common/uistrings.py'
--- openlp/core/common/uistrings.py	2013-12-24 08:56:50 +0000
+++ openlp/core/common/uistrings.py	2014-03-21 21:59:15 +0000
@@ -73,8 +73,9 @@
         self.Default = translate('OpenLP.Ui', 'Default')
         self.DefaultColor = translate('OpenLP.Ui', 'Default Color:')
         self.DefaultServiceName = translate('OpenLP.Ui', 'Service %Y-%m-%d %H-%M',
-            'This may not contain any of the following characters: /\\?*|<>\[\]":+\n'
-            'See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information.')
+                                            'This may not contain any of the following characters: /\\?*|<>\[\]":+\n'
+                                            'See http://docs.python.org/library/datetime'
+                                            '.html#strftime-strptime-behavior for more information.')
         self.Delete = translate('OpenLP.Ui', '&Delete')
         self.DisplayStyle = translate('OpenLP.Ui', 'Display style:')
         self.Duplicate = translate('OpenLP.Ui', 'Duplicate Error')
@@ -132,7 +133,7 @@
         self.Service = translate('OpenLP.Ui', 'Service')
         self.Split = translate('OpenLP.Ui', 'Optional &Split')
         self.SplitToolTip = translate('OpenLP.Ui',
-            'Split a slide into two only if it does not fit on the screen as one slide.')
+                                      'Split a slide into two only if it does not fit on the screen as one slide.')
         self.StartTimeCode = translate('OpenLP.Ui', 'Start %s')
         self.StopPlaySlidesInLoop = translate('OpenLP.Ui', 'Stop Play Slides in Loop')
         self.StopPlaySlidesToEnd = translate('OpenLP.Ui', 'Stop Play Slides to End')

=== modified file 'openlp/core/lib/filedialog.py'
--- openlp/core/lib/filedialog.py	2013-12-24 08:56:50 +0000
+++ openlp/core/lib/filedialog.py	2014-03-21 21:59:15 +0000
@@ -63,4 +63,4 @@
                                                   UiStrings().FileNotFoundMessage % file)
                     continue
             file_list.append(file)
-        return file_list
\ No newline at end of file
+        return file_list

=== modified file 'openlp/core/lib/htmlbuilder.py'
--- openlp/core/lib/htmlbuilder.py	2014-03-17 19:05:55 +0000
+++ openlp/core/lib/htmlbuilder.py	2014-03-21 21:59:15 +0000
@@ -117,7 +117,9 @@
             display: table-cell;
             word-wrap: break-word;
             -webkit-transition: opacity 0.4s ease;
-            white-space:pre-wrap; word-wrap: break-word; text-align: left; vertical-align: top; font-family: Nimbus Sans L; font-size: 40pt; color: #FFFFFF; line-height: 100%; margin: 0;padding: 0; padding-bottom: 0; padding-left: 4px; width: 1580px; height: 810px;
+            white-space:pre-wrap; word-wrap: break-word; text-align: left; vertical-align: top; font-family: Nimbus
+            Sans L; font-size: 40pt; color: #FFFFFF; line-height: 100%; margin: 0;padding: 0; padding-bottom: 0;
+            padding-left: 4px; width: 1580px; height: 810px;
         }
         .lyricsmain {
              -webkit-text-stroke: 0.125em #000000; -webkit-text-fill-color: #FFFFFF;  text-shadow: #000000 5px 5px;
@@ -720,12 +722,12 @@
     else:
         padding_bottom = '0'
     lyrics = '%s word-wrap: break-word; ' \
-        'text-align: %s; vertical-align: %s; font-family: %s; ' \
-        'font-size: %spt; color: %s; line-height: %d%%; margin: 0;' \
-        'padding: 0; padding-bottom: %s; padding-left: %spx; width: %spx; height: %spx; ' % \
+             'text-align: %s; vertical-align: %s; font-family: %s; ' \
+             'font-size: %spt; color: %s; line-height: %d%%; margin: 0;' \
+             'padding: 0; padding-bottom: %s; padding-left: %spx; width: %spx; height: %spx; ' % \
         (justify, align, valign, theme_data.font_main_name, theme_data.font_main_size,
-        theme_data.font_main_color, 100 + int(theme_data.font_main_line_adjustment), padding_bottom,
-        left_margin, width, height)
+         theme_data.font_main_color, 100 + int(theme_data.font_main_line_adjustment), padding_bottom,
+         left_margin, width, height)
     if theme_data.font_main_italics:
         lyrics += 'font-style:italic; '
     if theme_data.font_main_bold:

=== modified file 'openlp/core/lib/imagemanager.py'
--- openlp/core/lib/imagemanager.py	2014-03-17 19:05:55 +0000
+++ openlp/core/lib/imagemanager.py	2014-03-21 21:59:15 +0000
@@ -113,8 +113,8 @@
         :param path: The image's file path. This should be an existing file path.
         :param source: The source describes the image's origin. Possible values are described in the
             :class:`~openlp.core.lib.ImageSource` class.
-        :param background: A ``QtGui.QColor`` object specifying the colour to be used to fill the gabs if the image's ratio does not
-            match with the display ratio.
+        :param background: A ``QtGui.QColor`` object specifying the colour to be used to fill the gabs if the image's
+            ratio does not match with the display ratio.
 
         """
         self.path = path

=== modified file 'openlp/core/lib/plugin.py'
--- openlp/core/lib/plugin.py	2014-03-18 20:36:02 +0000
+++ openlp/core/lib/plugin.py	2014-03-21 21:59:15 +0000
@@ -393,4 +393,4 @@
         """
         The plugin's needs to handle a new song creation
         """
-        pass
\ No newline at end of file
+        pass

=== modified file 'openlp/core/lib/searchedit.py'
--- openlp/core/lib/searchedit.py	2014-03-17 19:05:55 +0000
+++ openlp/core/lib/searchedit.py	2014-03-21 21:59:15 +0000
@@ -120,9 +120,8 @@
         A list of tuples to be used in the search type menu. The first item in the list will be preselected as the
         default.
 
-         :param items:     The list of tuples to use. The tuples should contain an integer identifier, an icon (QIcon instance or
-
-            string) and a title for the item in the menu. In short, they should look like this::
+         :param items:     The list of tuples to use. The tuples should contain an integer identifier, an icon (QIcon
+         instance or string) and a title for the item in the menu. In short, they should look like this::
 
                 (<identifier>, <icon>, <title>, <place holder text>)
 

=== modified file 'openlp/core/ui/aboutdialog.py'
--- openlp/core/ui/aboutdialog.py	2013-12-24 08:56:50 +0000
+++ openlp/core/ui/aboutdialog.py	2014-03-21 21:59:15 +0000
@@ -92,578 +92,574 @@
         Dynamically translate the UI.
         """
         about_dialog.setWindowTitle('%s OpenLP' % UiStrings().About)
-        self.about_text_edit.setPlainText(translate('OpenLP.AboutForm',
-            'OpenLP <version><revision> - Open Source Lyrics '
-            'Projection\n'
-            '\n'
-            'OpenLP is free church presentation software, or lyrics '
-            'projection software, used to display slides of songs, Bible '
-            'verses, videos, images, and even presentations (if '
-            'Impress, PowerPoint or PowerPoint Viewer is installed) '
-            'for church worship using a computer and a data projector.\n'
-            '\n'
-            'Find out more about OpenLP: http://openlp.org/\n'
-            '\n'
-            'OpenLP is written and maintained by volunteers. If you would '
-            'like to see more free Christian software being written, please '
-            'consider volunteering by using the button below.'
-        ))
+        self.about_text_edit.setPlainText(
+            translate('OpenLP.AboutForm',
+                      'OpenLP <version><revision> - Open Source Lyrics Projection\n'
+                      '\n'
+                      'OpenLP is free church presentation software, or lyrics '
+                      'projection software, used to display slides of songs, Bible '
+                      'verses, videos, images, and even presentations (if '
+                      'Impress, PowerPoint or PowerPoint Viewer is installed) '
+                      'for church worship using a computer and a data projector.\n'
+                      '\n'
+                      'Find out more about OpenLP: http://openlp.org/\n'
+                      '\n'
+                      'OpenLP is written and maintained by volunteers. If you would '
+                      'like to see more free Christian software being written, please '
+                      'consider volunteering by using the button below.'))
         self.about_notebook.setTabText(self.about_notebook.indexOf(self.about_tab), UiStrings().About)
         lead = 'Raoul "superfly" Snyman'
         developers = ['Tim "TRB143" Bentley', 'Jonathan "gushie" Corwin',
-            'Michael "cocooncrash" Gorven',
-            'Andreas "googol" Preikschat', 'Raoul "superfly" Snyman',
-            'Martin "mijiti" Thompson', 'Jon "Meths" Tibble']
+                      'Michael "cocooncrash" Gorven',
+                      'Andreas "googol" Preikschat', 'Raoul "superfly" Snyman',
+                      'Martin "mijiti" Thompson', 'Jon "Meths" Tibble']
         contributors = ['Gerald "jerryb" Britton',
-            'Samuel "MrGamgee" Findlay', 'Scott "sguerrieri" Guerrieri',
-            'Matthias "matthub" Hub', 'Meinert "m2j" Jordan',
-            'Armin "orangeshirt" K\xf6hler', 'Erik "luen" Lundin',
-            'Edwin "edwinlunando" Lunando', 'Brian "brianmeyer" Meyer',
-            'Joshua "milleja46" Miller', 'Stevan "ElderP" Pettit',
-            'Mattias "mahfiaz" P\xf5ldaru', 'Christian "crichter" Richter',
-            'Philip "Phill" Ridout', 'Simon "samscudder" Scudder',
-            'Jeffrey "whydoubt" Smith', 'Maikel Stuivenberg',
-            'Dave "Dave42W" Warnock', 'Frode "frodus" Woldsund',
-            'Martin "matysek" Zibricky', 'Patrick "mohij" Zimmermann']
+                        'Samuel "MrGamgee" Findlay', 'Scott "sguerrieri" Guerrieri',
+                        'Matthias "matthub" Hub', 'Meinert "m2j" Jordan',
+                        'Armin "orangeshirt" K\xf6hler', 'Erik "luen" Lundin',
+                        'Edwin "edwinlunando" Lunando', 'Brian "brianmeyer" Meyer',
+                        'Joshua "milleja46" Miller', 'Stevan "ElderP" Pettit',
+                        'Mattias "mahfiaz" P\xf5ldaru', 'Christian "crichter" Richter',
+                        'Philip "Phill" Ridout', 'Simon "samscudder" Scudder',
+                        'Jeffrey "whydoubt" Smith', 'Maikel Stuivenberg',
+                        'Dave "Dave42W" Warnock', 'Frode "frodus" Woldsund',
+                        'Martin "matysek" Zibricky', 'Patrick "mohij" Zimmermann']
         testers = ['Philip "Phill" Ridout', 'Wesley "wrst" Stout',
-            'John "jseagull1" Cegalis (lead)']
+                   'John "jseagull1" Cegalis (lead)']
         packagers = ['Thomas "tabthorpe" Abthorpe (FreeBSD)',
-            'Tim "TRB143" Bentley (Fedora and Android)',
-            'Matthias "matthub" Hub (Mac OS X)',
-            'Joseph "jdmulloy" Mulloy (openSUSE)',
-            'Stevan "ElderP" Pettit (Windows)',
-            'Raoul "superfly" Snyman (Debian, Ubuntu)',
-            'Garrett "floft" Wilson (Arch Linux)']
+                     'Tim "TRB143" Bentley (Fedora and Android)',
+                     'Matthias "matthub" Hub (Mac OS X)',
+                     'Joseph "jdmulloy" Mulloy (openSUSE)',
+                     'Stevan "ElderP" Pettit (Windows)',
+                     'Raoul "superfly" Snyman (Debian, Ubuntu)',
+                     'Garrett "floft" Wilson (Arch Linux)']
         translators = {
             'af': ['Johan "nuvolari" Mynhardt'],
             'cs': ['Martin "matysek" Zibricky'],
             'da': ['Henrik "Hsonesson" Sonesson'],
-            'de': ['Patrick "madmuffin" Br\xfcckner',
-                'Meinert "m2j" Jordan', 'Andreas "googol" Preikschat',
-                'Christian "crichter" Richter'],
+            'de': ['Patrick "madmuffin" Br\xfcckner', 'Meinert "m2j" Jordan', 'Andreas "googol" Preikschat',
+                   'Christian "crichter" Richter'],
             'en_GB': ['Tim "TRB143" Bentley', 'Jonathan "gushie" Corwin'],
-            'en_ZA': ['Raoul "superfly" Snyman',
-                       'Johan "nuvolari" Mynhardt'],
+            'en_ZA': ['Raoul "superfly" Snyman', 'Johan "nuvolari" Mynhardt'],
             'el': ['Alexander Siozos'],
             'es': ['Josu\xe9 Z\xfa\xf1iga', 'Christian Gonzalez'],
             'et': ['Mattias "mahfiaz" P\xf5ldaru'],
             'fi': ['Jori "joribu" Brander', 'Tobbe "tobbeb" Bildo'],
-            'fr': ['Stephan\xe9 "stbrunner" Brunner', 'Jeremie "jnau05"',
-                    'Carl "carl.fischer" Fischer'],
+            'fr': ['Stephan\xe9 "stbrunner" Brunner', 'Jeremie "jnau05"', 'Carl "carl.fischer" Fischer'],
             'hu': ['Gyuris Gell\xe9rt'],
             'id': ['Mico "bangmico" Siahaan', ' ign_christian'],
             'ja': ['Kunio "Kunio" Nakamaru', 'Chris Haris'],
             'nb': ['Atle "pendlaren" Weibell', 'Frode "frodus" Woldsund'],
             'nl': ['Arjen "typovar" van Voorst'],
-            'pt_BR': ['David Mederiros', 'Rafael "rafaellerm" Lerm',
-                       'Eduardo Levi Chaves',
-                       'Gustavo Bim', 'Rog\xeanio Bel\xe9m', 'Samuel'
-                'Simon "samscudder" Scudder', 'Van Der Fran'],
+            'pt_BR': ['David Mederiros', 'Rafael "rafaellerm" Lerm', 'Eduardo Levi Chaves',
+                      'Gustavo Bim', 'Rog\xeanio Bel\xe9m', 'Samuel Simon "samscudder" Scudder', 'Van Der Fran'],
             'ru': ['Sergey "ratz" Ratz'],
             'sv': ['Erik "luen" Lundin'],
             'ta_LK': ['"Prasad"'],
             'zh_CN': [' "executor" ']
         }
-        documentors = ['Wesley "wrst" Stout',
-            'John "jseagull1" Cegalis (lead)']
-        self.credits_text_edit.setPlainText(translate('OpenLP.AboutForm',
-            'Project Lead\n'
-            '    %s\n'
-            '\n'
-            'Developers\n'
-            '    %s\n'
-            '\n'
-            'Contributors\n'
-            '    %s\n'
-            '\n'
-            'Testers\n'
-            '    %s\n'
-            '\n'
-            'Packagers\n'
-            '    %s\n'
-            '\n'
-            'Translators\n'
-            '    Afrikaans (af)\n'
-            '        %s\n'
-            '    Czech (cs)\n'
-            '        %s\n'
-            '    Danish (da)\n'
-            '        %s\n'
-            '    German (de)\n'
-            '        %s\n'
-            '    Greek (el)\n'
-            '        %s\n'
-            '    English, United Kingdom (en_GB)\n'
-            '        %s\n'
-            '    English, South Africa (en_ZA)\n'
-            '        %s\n'
-            '    Spanish (es)\n'
-            '        %s\n'
-            '    Estonian (et)\n'
-            '        %s\n'
-            '    Finnish (fi)\n'
-            '        %s\n'
-            '    French (fr)\n'
-            '        %s\n'
-            '    Hungarian (hu)\n'
-            '        %s\n'
-            '    Indonesian (id)\n'
-            '        %s\n'
-            '    Japanese (ja)\n'
-            '        %s\n'
-            '    Norwegian Bokm\xe5l (nb)\n'
-            '        %s\n'
-            '    Dutch (nl)\n'
-            '        %s\n'
-            '    Portuguese, Brazil (pt_BR)\n'
-            '        %s\n'
-            '    Russian (ru)\n'
-            '        %s\n'
-            '    Swedish (sv)\n'
-            '        %s\n'
-            '    Tamil(Sri-Lanka) (ta_LK)\n'
-            '        %s\n'
-            '    Chinese(China) (zh_CN)\n'
-            '        %s\n'
-            '\n'
-            'Documentation\n'
-            '    %s\n'
-            '\n'
-            'Built With\n'
-            '    Python: http://www.python.org/\n'
-            '    Qt4: http://qt.digia.com/\n'
-            '    PyQt4: http://www.riverbankcomputing.co.uk/software/pyqt/'
-            'intro\n'
-            '    Oxygen Icons: http://oxygen-icons.org/\n'
-            '\n'
-            'Final Credit\n'
-            '    "For God so loved the world that He gave\n'
-            '    His one and only Son, so that whoever\n'
-            '    believes in Him will not perish but inherit\n'
-            '    eternal life."  -- John 3:16\n\n'
-            '    And last but not least, final credit goes to\n'
-            '    God our Father, for sending His Son to die\n'
-            '    on the cross, setting us free from sin. We\n'
-            '    bring this software to you for free because\n'
-            '    He has set us free.') % (lead, '\n    '.join(developers),
-            '\n    '.join(contributors), '\n    '.join(testers),
-            '\n    '.join(packagers), '\n        '.join(translators['af']),
-            '\n        '.join(translators['cs']),
-            '\n        '.join(translators['da']),
-            '\n        '.join(translators['de']),
-            '\n        '.join(translators['el']),
-            '\n        '.join(translators['en_GB']),
-            '\n        '.join(translators['en_ZA']),
-            '\n        '.join(translators['es']),
-            '\n        '.join(translators['et']),
-            '\n        '.join(translators['fi']),
-            '\n        '.join(translators['fr']),
-            '\n        '.join(translators['hu']),
-            '\n        '.join(translators['id']),
-            '\n        '.join(translators['ja']),
-            '\n        '.join(translators['nb']),
-            '\n        '.join(translators['nl']),
-            '\n        '.join(translators['pt_BR']),
-            '\n        '.join(translators['ru']),
-            '\n        '.join(translators['sv']),
-            '\n        '.join(translators['ta_LK']),
-            '\n        '.join(translators['zh_CN']),
-            '\n    '.join(documentors)))
+        documentors = ['Wesley "wrst" Stout', 'John "jseagull1" Cegalis (lead)']
+        self.credits_text_edit.setPlainText(
+            translate('OpenLP.AboutForm',
+                      'Project Lead\n'
+                      '    %s\n'
+                      '\n'
+                      'Developers\n'
+                      '    %s\n'
+                      '\n'
+                      'Contributors\n'
+                      '    %s\n'
+                      '\n'
+                      'Testers\n'
+                      '    %s\n'
+                      '\n'
+                      'Packagers\n'
+                      '    %s\n'
+                      '\n'
+                      'Translators\n'
+                      '    Afrikaans (af)\n'
+                      '        %s\n'
+                      '    Czech (cs)\n'
+                      '        %s\n'
+                      '    Danish (da)\n'
+                      '        %s\n'
+                      '    German (de)\n'
+                      '        %s\n'
+                      '    Greek (el)\n'
+                      '        %s\n'
+                      '    English, United Kingdom (en_GB)\n'
+                      '        %s\n'
+                      '    English, South Africa (en_ZA)\n'
+                      '        %s\n'
+                      '    Spanish (es)\n'
+                      '        %s\n'
+                      '    Estonian (et)\n'
+                      '        %s\n'
+                      '    Finnish (fi)\n'
+                      '        %s\n'
+                      '    French (fr)\n'
+                      '        %s\n'
+                      '    Hungarian (hu)\n'
+                      '        %s\n'
+                      '    Indonesian (id)\n'
+                      '        %s\n'
+                      '    Japanese (ja)\n'
+                      '        %s\n'
+                      '    Norwegian Bokm\xe5l (nb)\n'
+                      '        %s\n'
+                      '    Dutch (nl)\n'
+                      '        %s\n'
+                      '    Portuguese, Brazil (pt_BR)\n'
+                      '        %s\n'
+                      '    Russian (ru)\n'
+                      '        %s\n'
+                      '    Swedish (sv)\n'
+                      '        %s\n'
+                      '    Tamil(Sri-Lanka) (ta_LK)\n'
+                      '        %s\n'
+                      '    Chinese(China) (zh_CN)\n'
+                      '        %s\n'
+                      '\n'
+                      'Documentation\n'
+                      '    %s\n'
+                      '\n'
+                      'Built With\n'
+                      '    Python: http://www.python.org/\n'
+                      '    Qt4: http://qt.digia.com/\n'
+                      '    PyQt4: http://www.riverbankcomputing.co.uk/software/pyqt/'
+                      'intro\n'
+                      '    Oxygen Icons: http://oxygen-icons.org/\n'
+                      '\n'
+                      'Final Credit\n'
+                      '    "For God so loved the world that He gave\n'
+                      '    His one and only Son, so that whoever\n'
+                      '    believes in Him will not perish but inherit\n'
+                      '    eternal life."  -- John 3:16\n\n'
+                      '    And last but not least, final credit goes to\n'
+                      '    God our Father, for sending His Son to die\n'
+                      '    on the cross, setting us free from sin. We\n'
+                      '    bring this software to you for free because\n'
+                      '    He has set us free.') %
+            (lead, '\n    '.join(developers),
+                   '\n    '.join(contributors), '\n    '.join(testers),
+                   '\n    '.join(packagers), '\n        '.join(translators['af']),
+                   '\n        '.join(translators['cs']),
+                   '\n        '.join(translators['da']),
+                   '\n        '.join(translators['de']),
+                   '\n        '.join(translators['el']),
+                   '\n        '.join(translators['en_GB']),
+                   '\n        '.join(translators['en_ZA']),
+                   '\n        '.join(translators['es']),
+                   '\n        '.join(translators['et']),
+                   '\n        '.join(translators['fi']),
+                   '\n        '.join(translators['fr']),
+                   '\n        '.join(translators['hu']),
+                   '\n        '.join(translators['id']),
+                   '\n        '.join(translators['ja']),
+                   '\n        '.join(translators['nb']),
+                   '\n        '.join(translators['nl']),
+                   '\n        '.join(translators['pt_BR']),
+                   '\n        '.join(translators['ru']),
+                   '\n        '.join(translators['sv']),
+                   '\n        '.join(translators['ta_LK']),
+                   '\n        '.join(translators['zh_CN']),
+                   '\n    '.join(documentors)))
         self.about_notebook.setTabText(self.about_notebook.indexOf(self.credits_tab),
-            translate('OpenLP.AboutForm', 'Credits'))
+                                       translate('OpenLP.AboutForm', 'Credits'))
         copyright_note = translate('OpenLP.AboutForm',
-            'Copyright \xa9 2004-2014 %s\n'
-            'Portions copyright \xa9 2004-2014 %s') % ('Raoul Snyman',
-            'Tim Bentley, Gerald Britton, Jonathan Corwin, Samuel Findlay, '
-            'Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, '
-            'Armin K\xf6hler, Erik Lundin, Edwin Lunando, Joshua Miller, '
-            'Brian T. Meyer, Stevan Pettit, Andreas Preikschat, '
-            'Mattias P\xf5ldaru, Christian Richter, '
-            'Philip Ridout, Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, '
-            'Martin Thompson, Jon Tibble, Dave Warnock, Frode Woldsund, '
-            'Martin Zibricky, Patrick Zimmermann')
+                                   'Copyright \xa9 2004-2014 %s\n'
+                                   'Portions copyright \xa9 2004-2014 %s') % \
+            ('Raoul Snyman',
+             'Tim Bentley, Gerald Britton, Jonathan Corwin, Samuel Findlay, '
+             'Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, '
+             'Armin K\xf6hler, Erik Lundin, Edwin Lunando, Joshua Miller, '
+             'Brian T. Meyer, Stevan Pettit, Andreas Preikschat, '
+             'Mattias P\xf5ldaru, Christian Richter, '
+             'Philip Ridout, Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, '
+             'Martin Thompson, Jon Tibble, Dave Warnock, Frode Woldsund, '
+             'Martin Zibricky, Patrick Zimmermann')
         licence = translate('OpenLP.AboutForm',
-            '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 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.')
         disclaimer = translate('OpenLP.AboutForm',
-            '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 below '
-            'for more details.')
+                               '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 below '
+                               'for more details.')
         gpl_text = ('GNU GENERAL PUBLIC LICENSE\n'
-            'Version 2, June 1991\n'
-            '\n'
-            'Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 '
-            'Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. '
-            'Everyone is permitted to copy and distribute verbatim copies of '
-            'this license document, but changing it is not allowed.\n'
-            '\n'
-            'Preamble\n'
-            '\n'
-            'The licenses for most software are designed to take away your '
-            'freedom to share and change it. By contrast, the GNU General '
-            'Public License is intended to guarantee your freedom to share '
-            'and change free software--to make sure the software is free for '
-            'all its users. This General Public License applies to most of '
-            'the Free Software Foundation\'s software and to any other '
-            'program whose authors commit to using it. (Some other Free '
-            'Software Foundation software is covered by the GNU Lesser '
-            'General Public License instead.) You can apply it to your '
-            'programs, too.\n'
-            '\n'
-            'When we speak of free software, we are referring to freedom, not '
-            'price. Our General Public Licenses are designed to make sure '
-            'that you have the freedom to distribute copies of free software '
-            '(and charge for this service if you wish), that you receive '
-            'source code or can get it if you want it, that you can change '
-            'the software or use pieces of it in new free programs; and that '
-            'you know you can do these things.\n'
-            '\n'
-            'To protect your rights, we need to make restrictions that forbid '
-            'anyone to deny you these rights or to ask you to surrender the '
-            'rights. These restrictions translate to certain responsibilities '
-            'for you if you distribute copies of the software, or if you '
-            'modify it.\n'
-            '\n'
-            'For example, if you distribute copies of such a program, whether '
-            'gratis or for a fee, you must give the recipients all the rights '
-            'that you have. You must make sure that they, too, receive or '
-            'can get the source code. And you must show them these terms so '
-            'they know their rights.\n'
-            '\n'
-            'We protect your rights with two steps: (1) copyright the '
-            'software, and (2) offer you this license which gives you legal '
-            'permission to copy, distribute and/or modify the software.\n'
-            '\n'
-            'Also, for each author\'s protection and ours, we want to make '
-            'certain that everyone understands that there is no warranty for '
-            'this free software. If the software is modified by someone else '
-            'and passed on, we want its recipients to know that what they '
-            'have is not the original, so that any problems introduced by '
-            'others will not reflect on the original authors\' reputations.\n'
-            '\n'
-            'Finally, any free program is threatened constantly by software '
-            'patents. We wish to avoid the danger that redistributors of a '
-            'free program will individually obtain patent licenses, in effect '
-            'making the program proprietary. To prevent this, we have made '
-            'it clear that any patent must be licensed for everyone\'s free '
-            'use or not licensed at all.\n'
-            '\n'
-            'The precise terms and conditions for copying, distribution and '
-            'modification follow.\n'
-            '\n'
-            'GNU GENERAL PUBLIC LICENSE\n'
-            'TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n'
-            '\n'
-            '0. This License applies to any program or other work which '
-            'contains a notice placed by the copyright holder saying it may '
-            'be distributed under the terms of this General Public License. '
-            'The "Program", below, refers to any such program or work, and a '
-            '"work based on the Program" means either the Program or any '
-            'derivative work under copyright law: that is to say, a work '
-            'containing the Program or a portion of it, either verbatim or '
-            'with modifications and/or translated into another language. '
-            '(Hereinafter, translation is included without limitation in the '
-            'term "modification".) Each licensee is addressed as "you".\n'
-            '\n'
-            'Activities other than copying, distribution and modification are '
-            'not covered by this License; they are outside its scope. The '
-            'act of running the Program is not restricted, and the output '
-            'from the Program is covered only if its contents constitute a '
-            'work based on the Program (independent of having been made by '
-            'running the Program). Whether that is true depends on what the '
-            'Program does.\n'
-            '\n'
-            '1. You may copy and distribute verbatim copies of the Program\'s '
-            'source code as you receive it, in any medium, provided that you '
-            'conspicuously and appropriately publish on each copy an '
-            'appropriate copyright notice and disclaimer of warranty; keep '
-            'intact all the notices that refer to this License and to the '
-            'absence of any warranty; and give any other recipients of the '
-            'Program a copy of this License along with the Program.\n'
-            '\n'
-            'You may charge a fee for the physical act of transferring a '
-            'copy, and you may at your option offer warranty protection in '
-            'exchange for a fee.\n'
-            '\n'
-            '2. You may modify your copy or copies of the Program or any '
-            'portion of it, thus forming a work based on the Program, and '
-            'copy and distribute such modifications or work under the terms '
-            'of Section 1 above, provided that you also meet all of these '
-            'conditions:\n'
-            '\n'
-            'a) You must cause the modified files to carry prominent notices '
-            'stating that you changed the files and the date of any change.\n'
-            '\n'
-            'b) You must cause any work that you distribute or publish, that '
-            'in whole or in part contains or is derived from the Program or '
-            'any part thereof, to be licensed as a whole at no charge to all '
-            'third parties under the terms of this License.\n'
-            '\n'
-            'c) If the modified program normally reads commands interactively '
-            'when run, you must cause it, when started running for such '
-            'interactive use in the most ordinary way, to print or display an '
-            'announcement including an appropriate copyright notice and a '
-            'notice that there is no warranty (or else, saying that you '
-            'provide a warranty) and that users may redistribute the program '
-            'under these conditions, and telling the user how to view a copy '
-            'of this License. (Exception: if the Program itself is '
-            'interactive but does not normally print such an announcement, '
-            'your work based on the Program is not required to print an '
-            'announcement.)\n'
-            '\n'
-            'These requirements apply to the modified work as a whole. If '
-            'identifiable sections of that work are not derived from the '
-            'Program, and can be reasonably considered independent and '
-            'separate works in themselves, then this License, and its terms, '
-            'do not apply to those sections when you distribute them as '
-            'separate works. But when you distribute the same sections as '
-            'part of a whole which is a work based on the Program, the '
-            'distribution of the whole must be on the terms of this License, '
-            'whose permissions for other licensees extend to the entire '
-            'whole, and thus to each and every part regardless of who wrote '
-            'it.\n'
-            '\n'
-            'Thus, it is not the intent of this section to claim rights or '
-            'contest your rights to work written entirely by you; rather, the '
-            'intent is to exercise the right to control the distribution of '
-            'derivative or collective works based on the Program.\n'
-            '\n'
-            'In addition, mere aggregation of another work not based on the '
-            'Program with the Program (or with a work based on the Program) '
-            'on a volume of a storage or distribution medium does not bring '
-            'the other work under the scope of this License.\n'
-            '\n'
-            '3. You may copy and distribute the Program (or a work based on '
-            'it, under Section 2) in object code or executable form under the '
-            'terms of Sections 1 and 2 above provided that you also do one of '
-            'the following:\n'
-            '\n'
-            'a) Accompany it with the complete corresponding machine-readable '
-            'source code, which must be distributed under the terms of '
-            'Sections 1 and 2 above on a medium customarily used for software '
-            'interchange; or,\n'
-            '\n'
-            'b) Accompany it with a written offer, valid for at least three '
-            'years, to give any third party, for a charge no more than your '
-            'cost of physically performing source distribution, a complete '
-            'machine-readable copy of the corresponding source code, to be '
-            'distributed under the terms of Sections 1 and 2 above on a '
-            'medium customarily used for software interchange; or,\n'
-            '\n'
-            'c) Accompany it with the information you received as to the '
-            'offer to distribute corresponding source code. (This '
-            'alternative is allowed only for noncommercial distribution and '
-            'only if you received the program in object code or executable '
-            'form with such an offer, in accord with Subsection b above.)\n'
-            '\n'
-            'The source code for a work means the preferred form of the work '
-            'for making modifications to it. For an executable work, '
-            'complete source code means all the source code for all modules '
-            'it contains, plus any associated interface definition files, '
-            'plus the scripts used to control compilation and installation of '
-            'the executable. However, as a special exception, the source '
-            'code distributed need not include anything that is normally '
-            'distributed (in either source or binary form) with the major '
-            'components (compiler, kernel, and so on) of the operating system '
-            'on which the executable runs, unless that component itself '
-            'accompanies the executable.\n'
-            '\n'
-            'If distribution of executable or object code is made by offering '
-            'access to copy from a designated place, then offering equivalent '
-            'access to copy the source code from the same place counts as '
-            'distribution of the source code, even though third parties are '
-            'not compelled to copy the source along with the object code.\n'
-            '\n'
-            '4. You may not copy, modify, sublicense, or distribute the '
-            'Program except as expressly provided under this License. Any '
-            'attempt otherwise to copy, modify, sublicense or distribute the '
-            'Program is void, and will automatically terminate your rights '
-            'under this License. However, parties who have received copies, '
-            'or rights, from you under this License will not have their '
-            'licenses terminated so long as such parties remain in full '
-            'compliance.\n'
-            '\n'
-            '5. You are not required to accept this License, since you have '
-            'not signed it. However, nothing else grants you permission to '
-            'modify or distribute the Program or its derivative works. These '
-            'actions are prohibited by law if you do not accept this '
-            'License. Therefore, by modifying or distributing the Program '
-            '(or any work based on the Program), you indicate your acceptance '
-            'of this License to do so, and all its terms and conditions for '
-            'copying, distributing or modifying the Program or works based on '
-            'it.\n'
-            '\n'
-            '6. Each time you redistribute the Program (or any work based on '
-            'the Program), the recipient automatically receives a license '
-            'from the original licensor to copy, distribute or modify the '
-            'Program subject to these terms and conditions. You may not '
-            'impose any further restrictions on the recipients\' exercise of '
-            'the rights granted herein. You are not responsible for enforcing '
-            'compliance by third parties to this License.\n'
-            '\n'
-            '7. If, as a consequence of a court judgment or allegation of '
-            'patent infringement or for any other reason (not limited to '
-            'patent issues), conditions are imposed on you (whether by court '
-            'order, agreement or otherwise) that contradict the conditions of '
-            'this License, they do not excuse you from the conditions of this '
-            'License. If you cannot distribute so as to satisfy '
-            'simultaneously your obligations under this License and any other '
-            'pertinent obligations, then as a consequence you may not '
-            'distribute the Program at all. For example, if a patent license '
-            'would not permit royalty-free redistribution of the Program by '
-            'all those who receive copies directly or indirectly through you, '
-            'then the only way you could satisfy both it and this License '
-            'would be to refrain entirely from distribution of the Program.\n'
-            '\n'
-            'If any portion of this section is held invalid or unenforceable '
-            'under any particular circumstance, the balance of the section is '
-            'intended to apply and the section as a whole is intended to '
-            'apply in other circumstances.\n'
-            '\n'
-            'It is not the purpose of this section to induce you to infringe '
-            'any patents or other property right claims or to contest '
-            'validity of any such claims; this section has the sole purpose '
-            'of protecting the integrity of the free software distribution '
-            'system, which is implemented by public license practices. Many '
-            'people have made generous contributions to the wide range of '
-            'software distributed through that system in reliance on '
-            'consistent application of that system; it is up to the '
-            'author/donor to decide if he or she is willing to distribute '
-            'software through any other system and a licensee cannot impose '
-            'that choice.\n'
-            '\n'
-            'This section is intended to make thoroughly clear what is '
-            'believed to be a consequence of the rest of this License.\n'
-            '\n'
-            '8. If the distribution and/or use of the Program is restricted '
-            'in certain countries either by patents or by copyrighted '
-            'interfaces, the original copyright holder who places the Program '
-            'under this License may add an explicit geographical distribution '
-            'limitation excluding those countries, so that distribution is '
-            'permitted only in or among countries not thus excluded. In such '
-            'case, this License incorporates the limitation as if written in '
-            'the body of this License.\n'
-            '\n'
-            '9. The Free Software Foundation may publish revised and/or new '
-            'versions of the General Public License from time to time. Such '
-            'new versions will be similar in spirit to the present version, '
-            'but may differ in detail to address new problems or concerns.\n'
-            '\n'
-            'Each version is given a distinguishing version number. If the '
-            'Program specifies a version number of this License which applies '
-            'to it and "any later version", you have the option of '
-            'following the terms and conditions either of that version or of '
-            'any later version published by the Free Software Foundation. If '
-            'the Program does not specify a version number of this License, '
-            'you may choose any version ever published by the Free Software '
-            'Foundation.\n'
-            '\n'
-            '10. If you wish to incorporate parts of the Program into other '
-            'free programs whose distribution conditions are different, write '
-            'to the author to ask for permission. For software which is '
-            'copyrighted by the Free Software Foundation, write to the Free '
-            'Software Foundation; we sometimes make exceptions for this. Our '
-            'decision will be guided by the two goals of preserving the free '
-            'status of all derivatives of our free software and of promoting '
-            'the sharing and reuse of software generally.\n'
-            '\n'
-            'NO WARRANTY\n'
-            '\n'
-            '11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO '
-            'WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE '
-            'LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT '
-            'HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT '
-            'WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, '
-            'BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY '
-            'AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE '
-            'QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE '
-            'PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY '
-            'SERVICING, REPAIR OR CORRECTION.\n'
-            '\n'
-            '12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO '
-            'IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY '
-            'MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE '
-            'LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, '
-            'INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR '
-            'INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS '
-            'OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY '
-            'YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH '
-            'ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN '
-            'ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n'
-            '\n'
-            'END OF TERMS AND CONDITIONS\n'
-            '\n'
-            'How to Apply These Terms to Your New Programs\n'
-            '\n'
-            'If you develop a new program, and you want it to be of the '
-            'greatest possible use to the public, the best way to achieve '
-            'this is to make it free software which everyone can redistribute '
-            'and change under these terms.\n'
-            '\n'
-            'To do so, attach the following notices to the program. It is '
-            'safest to attach them to the start of each source file to most '
-            'effectively convey the exclusion of warranty; and each file '
-            'should have at least the "copyright" line and a pointer to where '
-            'the full notice is found.\n'
-            '\n'
-            '<one line to give the program\'s name and a brief idea of what '
-            'it does.>\n'
-            'Copyright (C) <year> <name of author>\n'
-            '\n'
-            '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; either version 2 of '
-            'the License, or (at your option) any later version.\n'
-            '\n'
-            '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.\n'
-            '\n'
-            '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., 51 Franklin Street, Fifth Floor, '
-            'Boston, MA 02110-1301 USA.\n'
-            '\n'
-            'Also add information on how to contact you by electronic and '
-            'paper mail.\n'
-            '\n'
-            'If the program is interactive, make it output a short notice '
-            'like this when it starts in an interactive mode:\n'
-            '\n'
-            'Gnomovision version 69, Copyright (C) year name of author\n'
-            'Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type '
-            '"show w".\n'
-            'This is free software, and you are welcome to redistribute it '
-            'under certain conditions; type "show c" for details.\n'
-            '\n'
-            'The hypothetical commands "show w" and "show c" should show '
-            'the appropriate parts of the General Public License. Of course, '
-            'the commands you use may be called something other than "show '
-            'w" and "show c"; they could even be mouse-clicks or menu items--'
-            'whatever suits your program.\n'
-            '\n'
-            'You should also get your employer (if you work as a programmer) '
-            'or your school, if any, to sign a "copyright disclaimer" for the '
-            'program, if necessary. Here is a sample; alter the names:\n'
-            '\n'
-            'Yoyodyne, Inc., hereby disclaims all copyright interest in the '
-            'program "Gnomovision" (which makes passes at compilers) written '
-            'by James Hacker.\n'
-            '\n'
-            '<signature of Ty Coon>, 1 April 1989\n'
-            'Ty Coon, President of Vice\n'
-            '\n'
-            'This General Public License does not permit incorporating your '
-            'program into proprietary programs. If your program is a '
-            'subroutine library, you may consider it more useful to permit '
-            'linking proprietary applications with the library. If this is '
-            'what you want to do, use the GNU Lesser General Public License '
-            'instead of this License.')
+                    'Version 2, June 1991\n'
+                    '\n'
+                    'Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 '
+                    'Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. '
+                    'Everyone is permitted to copy and distribute verbatim copies of '
+                    'this license document, but changing it is not allowed.\n'
+                    '\n'
+                    'Preamble\n'
+                    '\n'
+                    'The licenses for most software are designed to take away your '
+                    'freedom to share and change it. By contrast, the GNU General '
+                    'Public License is intended to guarantee your freedom to share '
+                    'and change free software--to make sure the software is free for '
+                    'all its users. This General Public License applies to most of '
+                    'the Free Software Foundation\'s software and to any other '
+                    'program whose authors commit to using it. (Some other Free '
+                    'Software Foundation software is covered by the GNU Lesser '
+                    'General Public License instead.) You can apply it to your '
+                    'programs, too.\n'
+                    '\n'
+                    'When we speak of free software, we are referring to freedom, not '
+                    'price. Our General Public Licenses are designed to make sure '
+                    'that you have the freedom to distribute copies of free software '
+                    '(and charge for this service if you wish), that you receive '
+                    'source code or can get it if you want it, that you can change '
+                    'the software or use pieces of it in new free programs; and that '
+                    'you know you can do these things.\n'
+                    '\n'
+                    'To protect your rights, we need to make restrictions that forbid '
+                    'anyone to deny you these rights or to ask you to surrender the '
+                    'rights. These restrictions translate to certain responsibilities '
+                    'for you if you distribute copies of the software, or if you '
+                    'modify it.\n'
+                    '\n'
+                    'For example, if you distribute copies of such a program, whether '
+                    'gratis or for a fee, you must give the recipients all the rights '
+                    'that you have. You must make sure that they, too, receive or '
+                    'can get the source code. And you must show them these terms so '
+                    'they know their rights.\n'
+                    '\n'
+                    'We protect your rights with two steps: (1) copyright the '
+                    'software, and (2) offer you this license which gives you legal '
+                    'permission to copy, distribute and/or modify the software.\n'
+                    '\n'
+                    'Also, for each author\'s protection and ours, we want to make '
+                    'certain that everyone understands that there is no warranty for '
+                    'this free software. If the software is modified by someone else '
+                    'and passed on, we want its recipients to know that what they '
+                    'have is not the original, so that any problems introduced by '
+                    'others will not reflect on the original authors\' reputations.\n'
+                    '\n'
+                    'Finally, any free program is threatened constantly by software '
+                    'patents. We wish to avoid the danger that redistributors of a '
+                    'free program will individually obtain patent licenses, in effect '
+                    'making the program proprietary. To prevent this, we have made '
+                    'it clear that any patent must be licensed for everyone\'s free '
+                    'use or not licensed at all.\n'
+                    '\n'
+                    'The precise terms and conditions for copying, distribution and '
+                    'modification follow.\n'
+                    '\n'
+                    'GNU GENERAL PUBLIC LICENSE\n'
+                    'TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n'
+                    '\n'
+                    '0. This License applies to any program or other work which '
+                    'contains a notice placed by the copyright holder saying it may '
+                    'be distributed under the terms of this General Public License. '
+                    'The "Program", below, refers to any such program or work, and a '
+                    '"work based on the Program" means either the Program or any '
+                    'derivative work under copyright law: that is to say, a work '
+                    'containing the Program or a portion of it, either verbatim or '
+                    'with modifications and/or translated into another language. '
+                    '(Hereinafter, translation is included without limitation in the '
+                    'term "modification".) Each licensee is addressed as "you".\n'
+                    '\n'
+                    'Activities other than copying, distribution and modification are '
+                    'not covered by this License; they are outside its scope. The '
+                    'act of running the Program is not restricted, and the output '
+                    'from the Program is covered only if its contents constitute a '
+                    'work based on the Program (independent of having been made by '
+                    'running the Program). Whether that is true depends on what the '
+                    'Program does.\n'
+                    '\n'
+                    '1. You may copy and distribute verbatim copies of the Program\'s '
+                    'source code as you receive it, in any medium, provided that you '
+                    'conspicuously and appropriately publish on each copy an '
+                    'appropriate copyright notice and disclaimer of warranty; keep '
+                    'intact all the notices that refer to this License and to the '
+                    'absence of any warranty; and give any other recipients of the '
+                    'Program a copy of this License along with the Program.\n'
+                    '\n'
+                    'You may charge a fee for the physical act of transferring a '
+                    'copy, and you may at your option offer warranty protection in '
+                    'exchange for a fee.\n'
+                    '\n'
+                    '2. You may modify your copy or copies of the Program or any '
+                    'portion of it, thus forming a work based on the Program, and '
+                    'copy and distribute such modifications or work under the terms '
+                    'of Section 1 above, provided that you also meet all of these '
+                    'conditions:\n'
+                    '\n'
+                    'a) You must cause the modified files to carry prominent notices '
+                    'stating that you changed the files and the date of any change.\n'
+                    '\n'
+                    'b) You must cause any work that you distribute or publish, that '
+                    'in whole or in part contains or is derived from the Program or '
+                    'any part thereof, to be licensed as a whole at no charge to all '
+                    'third parties under the terms of this License.\n'
+                    '\n'
+                    'c) If the modified program normally reads commands interactively '
+                    'when run, you must cause it, when started running for such '
+                    'interactive use in the most ordinary way, to print or display an '
+                    'announcement including an appropriate copyright notice and a '
+                    'notice that there is no warranty (or else, saying that you '
+                    'provide a warranty) and that users may redistribute the program '
+                    'under these conditions, and telling the user how to view a copy '
+                    'of this License. (Exception: if the Program itself is '
+                    'interactive but does not normally print such an announcement, '
+                    'your work based on the Program is not required to print an '
+                    'announcement.)\n'
+                    '\n'
+                    'These requirements apply to the modified work as a whole. If '
+                    'identifiable sections of that work are not derived from the '
+                    'Program, and can be reasonably considered independent and '
+                    'separate works in themselves, then this License, and its terms, '
+                    'do not apply to those sections when you distribute them as '
+                    'separate works. But when you distribute the same sections as '
+                    'part of a whole which is a work based on the Program, the '
+                    'distribution of the whole must be on the terms of this License, '
+                    'whose permissions for other licensees extend to the entire '
+                    'whole, and thus to each and every part regardless of who wrote '
+                    'it.\n'
+                    '\n'
+                    'Thus, it is not the intent of this section to claim rights or '
+                    'contest your rights to work written entirely by you; rather, the '
+                    'intent is to exercise the right to control the distribution of '
+                    'derivative or collective works based on the Program.\n'
+                    '\n'
+                    'In addition, mere aggregation of another work not based on the '
+                    'Program with the Program (or with a work based on the Program) '
+                    'on a volume of a storage or distribution medium does not bring '
+                    'the other work under the scope of this License.\n'
+                    '\n'
+                    '3. You may copy and distribute the Program (or a work based on '
+                    'it, under Section 2) in object code or executable form under the '
+                    'terms of Sections 1 and 2 above provided that you also do one of '
+                    'the following:\n'
+                    '\n'
+                    'a) Accompany it with the complete corresponding machine-readable '
+                    'source code, which must be distributed under the terms of '
+                    'Sections 1 and 2 above on a medium customarily used for software '
+                    'interchange; or,\n'
+                    '\n'
+                    'b) Accompany it with a written offer, valid for at least three '
+                    'years, to give any third party, for a charge no more than your '
+                    'cost of physically performing source distribution, a complete '
+                    'machine-readable copy of the corresponding source code, to be '
+                    'distributed under the terms of Sections 1 and 2 above on a '
+                    'medium customarily used for software interchange; or,\n'
+                    '\n'
+                    'c) Accompany it with the information you received as to the '
+                    'offer to distribute corresponding source code. (This '
+                    'alternative is allowed only for noncommercial distribution and '
+                    'only if you received the program in object code or executable '
+                    'form with such an offer, in accord with Subsection b above.)\n'
+                    '\n'
+                    'The source code for a work means the preferred form of the work '
+                    'for making modifications to it. For an executable work, '
+                    'complete source code means all the source code for all modules '
+                    'it contains, plus any associated interface definition files, '
+                    'plus the scripts used to control compilation and installation of '
+                    'the executable. However, as a special exception, the source '
+                    'code distributed need not include anything that is normally '
+                    'distributed (in either source or binary form) with the major '
+                    'components (compiler, kernel, and so on) of the operating system '
+                    'on which the executable runs, unless that component itself '
+                    'accompanies the executable.\n'
+                    '\n'
+                    'If distribution of executable or object code is made by offering '
+                    'access to copy from a designated place, then offering equivalent '
+                    'access to copy the source code from the same place counts as '
+                    'distribution of the source code, even though third parties are '
+                    'not compelled to copy the source along with the object code.\n'
+                    '\n'
+                    '4. You may not copy, modify, sublicense, or distribute the '
+                    'Program except as expressly provided under this License. Any '
+                    'attempt otherwise to copy, modify, sublicense or distribute the '
+                    'Program is void, and will automatically terminate your rights '
+                    'under this License. However, parties who have received copies, '
+                    'or rights, from you under this License will not have their '
+                    'licenses terminated so long as such parties remain in full '
+                    'compliance.\n'
+                    '\n'
+                    '5. You are not required to accept this License, since you have '
+                    'not signed it. However, nothing else grants you permission to '
+                    'modify or distribute the Program or its derivative works. These '
+                    'actions are prohibited by law if you do not accept this '
+                    'License. Therefore, by modifying or distributing the Program '
+                    '(or any work based on the Program), you indicate your acceptance '
+                    'of this License to do so, and all its terms and conditions for '
+                    'copying, distributing or modifying the Program or works based on '
+                    'it.\n'
+                    '\n'
+                    '6. Each time you redistribute the Program (or any work based on '
+                    'the Program), the recipient automatically receives a license '
+                    'from the original licensor to copy, distribute or modify the '
+                    'Program subject to these terms and conditions. You may not '
+                    'impose any further restrictions on the recipients\' exercise of '
+                    'the rights granted herein. You are not responsible for enforcing '
+                    'compliance by third parties to this License.\n'
+                    '\n'
+                    '7. If, as a consequence of a court judgment or allegation of '
+                    'patent infringement or for any other reason (not limited to '
+                    'patent issues), conditions are imposed on you (whether by court '
+                    'order, agreement or otherwise) that contradict the conditions of '
+                    'this License, they do not excuse you from the conditions of this '
+                    'License. If you cannot distribute so as to satisfy '
+                    'simultaneously your obligations under this License and any other '
+                    'pertinent obligations, then as a consequence you may not '
+                    'distribute the Program at all. For example, if a patent license '
+                    'would not permit royalty-free redistribution of the Program by '
+                    'all those who receive copies directly or indirectly through you, '
+                    'then the only way you could satisfy both it and this License '
+                    'would be to refrain entirely from distribution of the Program.\n'
+                    '\n'
+                    'If any portion of this section is held invalid or unenforceable '
+                    'under any particular circumstance, the balance of the section is '
+                    'intended to apply and the section as a whole is intended to '
+                    'apply in other circumstances.\n'
+                    '\n'
+                    'It is not the purpose of this section to induce you to infringe '
+                    'any patents or other property right claims or to contest '
+                    'validity of any such claims; this section has the sole purpose '
+                    'of protecting the integrity of the free software distribution '
+                    'system, which is implemented by public license practices. Many '
+                    'people have made generous contributions to the wide range of '
+                    'software distributed through that system in reliance on '
+                    'consistent application of that system; it is up to the '
+                    'author/donor to decide if he or she is willing to distribute '
+                    'software through any other system and a licensee cannot impose '
+                    'that choice.\n'
+                    '\n'
+                    'This section is intended to make thoroughly clear what is '
+                    'believed to be a consequence of the rest of this License.\n'
+                    '\n'
+                    '8. If the distribution and/or use of the Program is restricted '
+                    'in certain countries either by patents or by copyrighted '
+                    'interfaces, the original copyright holder who places the Program '
+                    'under this License may add an explicit geographical distribution '
+                    'limitation excluding those countries, so that distribution is '
+                    'permitted only in or among countries not thus excluded. In such '
+                    'case, this License incorporates the limitation as if written in '
+                    'the body of this License.\n'
+                    '\n'
+                    '9. The Free Software Foundation may publish revised and/or new '
+                    'versions of the General Public License from time to time. Such '
+                    'new versions will be similar in spirit to the present version, '
+                    'but may differ in detail to address new problems or concerns.\n'
+                    '\n'
+                    'Each version is given a distinguishing version number. If the '
+                    'Program specifies a version number of this License which applies '
+                    'to it and "any later version", you have the option of '
+                    'following the terms and conditions either of that version or of '
+                    'any later version published by the Free Software Foundation. If '
+                    'the Program does not specify a version number of this License, '
+                    'you may choose any version ever published by the Free Software '
+                    'Foundation.\n'
+                    '\n'
+                    '10. If you wish to incorporate parts of the Program into other '
+                    'free programs whose distribution conditions are different, write '
+                    'to the author to ask for permission. For software which is '
+                    'copyrighted by the Free Software Foundation, write to the Free '
+                    'Software Foundation; we sometimes make exceptions for this. Our '
+                    'decision will be guided by the two goals of preserving the free '
+                    'status of all derivatives of our free software and of promoting '
+                    'the sharing and reuse of software generally.\n'
+                    '\n'
+                    'NO WARRANTY\n'
+                    '\n'
+                    '11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO '
+                    'WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE '
+                    'LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT '
+                    'HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT '
+                    'WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, '
+                    'BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY '
+                    'AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE '
+                    'QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE '
+                    'PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY '
+                    'SERVICING, REPAIR OR CORRECTION.\n'
+                    '\n'
+                    '12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO '
+                    'IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY '
+                    'MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE '
+                    'LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, '
+                    'INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR '
+                    'INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS '
+                    'OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY '
+                    'YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH '
+                    'ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN '
+                    'ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n'
+                    '\n'
+                    'END OF TERMS AND CONDITIONS\n'
+                    '\n'
+                    'How to Apply These Terms to Your New Programs\n'
+                    '\n'
+                    'If you develop a new program, and you want it to be of the '
+                    'greatest possible use to the public, the best way to achieve '
+                    'this is to make it free software which everyone can redistribute '
+                    'and change under these terms.\n'
+                    '\n'
+                    'To do so, attach the following notices to the program. It is '
+                    'safest to attach them to the start of each source file to most '
+                    'effectively convey the exclusion of warranty; and each file '
+                    'should have at least the "copyright" line and a pointer to where '
+                    'the full notice is found.\n'
+                    '\n'
+                    '<one line to give the program\'s name and a brief idea of what '
+                    'it does.>\n'
+                    'Copyright (C) <year> <name of author>\n'
+                    '\n'
+                    '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; either version 2 of '
+                    'the License, or (at your option) any later version.\n'
+                    '\n'
+                    '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.\n'
+                    '\n'
+                    '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., 51 Franklin Street, Fifth Floor, '
+                    'Boston, MA 02110-1301 USA.\n'
+                    '\n'
+                    'Also add information on how to contact you by electronic and '
+                    'paper mail.\n'
+                    '\n'
+                    'If the program is interactive, make it output a short notice '
+                    'like this when it starts in an interactive mode:\n'
+                    '\n'
+                    'Gnomovision version 69, Copyright (C) year name of author\n'
+                    'Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type '
+                    '"show w".\n'
+                    'This is free software, and you are welcome to redistribute it '
+                    'under certain conditions; type "show c" for details.\n'
+                    '\n'
+                    'The hypothetical commands "show w" and "show c" should show '
+                    'the appropriate parts of the General Public License. Of course, '
+                    'the commands you use may be called something other than "show '
+                    'w" and "show c"; they could even be mouse-clicks or menu items--'
+                    'whatever suits your program.\n'
+                    '\n'
+                    'You should also get your employer (if you work as a programmer) '
+                    'or your school, if any, to sign a "copyright disclaimer" for the '
+                    'program, if necessary. Here is a sample; alter the names:\n'
+                    '\n'
+                    'Yoyodyne, Inc., hereby disclaims all copyright interest in the '
+                    'program "Gnomovision" (which makes passes at compilers) written '
+                    'by James Hacker.\n'
+                    '\n'
+                    '<signature of Ty Coon>, 1 April 1989\n'
+                    'Ty Coon, President of Vice\n'
+                    '\n'
+                    'This General Public License does not permit incorporating your '
+                    'program into proprietary programs. If your program is a '
+                    'subroutine library, you may consider it more useful to permit '
+                    'linking proprietary applications with the library. If this is '
+                    'what you want to do, use the GNU Lesser General Public License '
+                    'instead of this License.')
         self.license_text_edit.setPlainText('%s\n\n%s\n\n%s\n\n\n%s' % (copyright_note, licence, disclaimer, gpl_text))
         self.about_notebook.setTabText(self.about_notebook.indexOf(self.license_tab),
-            translate('OpenLP.AboutForm', 'License'))
+                                       translate('OpenLP.AboutForm', 'License'))
         self.volunteer_button.setText(translate('OpenLP.AboutForm', 'Volunteer'))

=== modified file 'openlp/core/ui/advancedtab.py'
--- openlp/core/ui/advancedtab.py	2014-03-17 19:05:55 +0000
+++ openlp/core/ui/advancedtab.py	2014-03-21 21:59:15 +0000
@@ -263,7 +263,7 @@
         """
         Setup the interface translation strings.
         """
-        self.tabTitleVisible = UiStrings().Advanced
+        self.tab_title_visible = UiStrings().Advanced
         self.ui_group_box.setTitle(translate('OpenLP.AdvancedTab', 'UI Settings'))
         self.data_directory_group_box.setTitle(translate('OpenLP.AdvancedTab', 'Data Location'))
         self.recent_label.setText(translate('OpenLP.AdvancedTab', 'Number of recent files to display:'))
@@ -319,7 +319,7 @@
             translate('OpenLP.AdvancedTab', '<strong>WARNING:</strong> New data directory location contains '
                       'OpenLP data files.  These files WILL be replaced during a copy.'))
         self.display_workaround_group_box.setTitle(translate('OpenLP.AdvancedTab', 'Display Workarounds'))
-        self.x11_bypass_check_box.setText(translate('OpenLP.AdvancedTab','Bypass X11 Window Manager'))
+        self.x11_bypass_check_box.setText(translate('OpenLP.AdvancedTab', 'Bypass X11 Window Manager'))
         self.alternate_rows_check_box.setText(translate('OpenLP.AdvancedTab', 'Use alternating row colours in lists'))
         # Slide Limits
         self.slide_group_box.setTitle(translate('OpenLP.GeneralTab', 'Service Item Slide Limits'))
@@ -375,7 +375,8 @@
         self.current_data_path = AppLocation.get_data_path()
         if not os.path.exists(self.current_data_path):
             log.error('Data path not found %s' % self.current_data_path)
-            answer = QtGui.QMessageBox.critical(self, translate('OpenLP.AdvancedTab', 'Data Directory Error'),
+            answer = QtGui.QMessageBox.critical(
+                self, translate('OpenLP.AdvancedTab', 'Data Directory Error'),
                 translate('OpenLP.AdvancedTab', 'OpenLP data directory was not found\n\n%s\n\n'
                           'This data directory was previously changed from the OpenLP '
                           'default location.  If the new location was on removable '
@@ -537,8 +538,9 @@
         # Make sure they want to change the data.
         answer = QtGui.QMessageBox.question(self, translate('OpenLP.AdvancedTab', 'Confirm Data Directory Change'),
                                             translate('OpenLP.AdvancedTab', 'Are you sure you want to change the '
-                                            'location of the OpenLP data directory to:\n\n%s\n\nThe data directory '
-                                            'will be changed when OpenLP is closed.').replace('%s', new_data_path),
+                                                      'location of the OpenLP data directory to:\n\n%s\n\nThe data '
+                                                      'directory will be changed when OpenLP is closed.').
+                                            replace('%s', new_data_path),
                                             QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes |
                                                                               QtGui.QMessageBox.No),
                                             QtGui.QMessageBox.No)
@@ -561,8 +563,9 @@
             # default.
             answer = QtGui.QMessageBox.question(self, translate('OpenLP.AdvancedTab', 'Reset Data Directory'),
                                                 translate('OpenLP.AdvancedTab', 'Are you sure you want to change the '
-                                                'location of the OpenLP data directory to the default location?\n\nThis'
-                                                ' location will be used after OpenLP is closed.'),
+                                                          'location of the OpenLP data directory to the default '
+                                                          'location?\n\nThis location will be used after OpenLP is  '
+                                                          'closed.'),
                                                 QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes |
                                                                                   QtGui.QMessageBox.No),
                                                 QtGui.QMessageBox.No)
@@ -588,7 +591,7 @@
             else:
                 self.new_data_directory_has_files_label.hide()
 
-    def check_data_overwrite(self, data_path ):
+    def check_data_overwrite(self, data_path):
         """
         Check if there's already data in the target directory.
         """
@@ -602,8 +605,8 @@
                                                translate('OpenLP.AdvancedTab',
                                                          'WARNING: \n\nThe location you have selected \n\n%s\n\n'
                                                          'appears to contain OpenLP data files. Do you wish to '
-                                                         'replace these files with the current data files?').replace
-                                                         ('%s', os.path.abspath(data_path,)),
+                                                         'replace these files with the current data files?').
+                                               replace('%s', os.path.abspath(data_path,)),
                                                QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes |
                                                                                  QtGui.QMessageBox.No),
                                                QtGui.QMessageBox.No)

=== modified file 'openlp/core/ui/exceptiondialog.py'
--- openlp/core/ui/exceptiondialog.py	2013-12-24 11:32:38 +0000
+++ openlp/core/ui/exceptiondialog.py	2014-03-21 21:59:15 +0000
@@ -83,9 +83,8 @@
         self.attach_tile_button = create_button(exception_dialog, 'attach_tile_button',
                                                 icon=':/general/general_open.png',
                                                 click=self.on_attach_file_button_clicked)
-        self.button_box = create_button_box(exception_dialog, 'button_box',
-                                            ['close'], [self.send_report_button,
-                                            self.save_report_button, self.attach_tile_button])
+        self.button_box = create_button_box(exception_dialog, 'button_box', ['close'],
+                                            [self.send_report_button, self.save_report_button, self.attach_tile_button])
         self.exception_layout.addWidget(self.button_box)
 
         self.retranslateUi(exception_dialog)

=== modified file 'openlp/core/ui/exceptionform.py'
--- openlp/core/ui/exceptionform.py	2014-03-16 21:25:23 +0000
+++ openlp/core/ui/exceptionform.py	2014-03-21 21:59:15 +0000
@@ -157,7 +157,8 @@
                                 '--- Exception Traceback ---\n%s\n'
                                 '--- System information ---\n%s\n'
                                 '--- Library Versions ---\n%s\n')
-        filename = QtGui.QFileDialog.getSaveFileName(self,
+        filename = QtGui.QFileDialog.getSaveFileName(
+            self,
             translate('OpenLP.ExceptionForm', 'Save Crash Report'),
             Settings().value(self.settings_section + '/last directory'),
             translate('OpenLP.ExceptionForm', 'Text files (*.txt *.log *.text)'))
@@ -185,14 +186,13 @@
         Opening systems default email client and inserting exception log and system information.
         """
         body = translate('OpenLP.ExceptionForm',
-            '*OpenLP Bug Report*\n'
-            'Version: %s\n\n'
-            '--- Details of the Exception. ---\n\n%s\n\n '
-            '--- Exception Traceback ---\n%s\n'
-            '--- System information ---\n%s\n'
-            '--- Library Versions ---\n%s\n',
-            'Please add the information that bug reports are favoured written '
-            'in English.')
+                         '*OpenLP Bug Report*\n'
+                         'Version: %s\n\n'
+                         '--- Details of the Exception. ---\n\n%s\n\n '
+                         '--- Exception Traceback ---\n%s\n'
+                         '--- System information ---\n%s\n'
+                         '--- Library Versions ---\n%s\n',
+                         'Please add the information that bug reports are favoured written in English.')
         content = self._create_report()
         source = ''
         exception = ''

=== modified file 'openlp/core/ui/filerenameform.py'
--- openlp/core/ui/filerenameform.py	2014-03-16 21:25:23 +0000
+++ openlp/core/ui/filerenameform.py	2014-03-21 21:59:15 +0000
@@ -57,4 +57,4 @@
         else:
             self.setWindowTitle(translate('OpenLP.FileRenameForm', 'File Rename'))
         self.file_name_edit.setFocus()
-        return QtGui.QDialog.exec_(self)
\ No newline at end of file
+        return QtGui.QDialog.exec_(self)

=== modified file 'openlp/core/ui/firsttimeform.py'
--- openlp/core/ui/firsttimeform.py	2014-03-18 20:36:02 +0000
+++ openlp/core/ui/firsttimeform.py	2014-03-21 21:59:15 +0000
@@ -468,4 +468,4 @@
         Set the status of a plugin.
         """
         status = PluginStatus.Active if field.checkState() == QtCore.Qt.Checked else PluginStatus.Inactive
-        Settings().setValue(tag, status)
\ No newline at end of file
+        Settings().setValue(tag, status)

=== modified file 'openlp/core/ui/formattingtagcontroller.py'
--- openlp/core/ui/formattingtagcontroller.py	2013-12-24 15:55:01 +0000
+++ openlp/core/ui/formattingtagcontroller.py	2014-03-21 21:59:15 +0000
@@ -174,4 +174,4 @@
         if end and end != end_html:
             return translate('OpenLP.FormattingTagForm',
                              'End tag %s does not match end tag for start tag %s' % (end, start_html)), None
-        return None, None
\ No newline at end of file
+        return None, None

=== modified file 'openlp/core/ui/formattingtagdialog.py'
--- openlp/core/ui/formattingtagdialog.py	2013-12-24 08:56:50 +0000
+++ openlp/core/ui/formattingtagdialog.py	2014-03-21 21:59:15 +0000
@@ -102,8 +102,7 @@
         self.edit_button_layout.addWidget(self.delete_button)
         self.edit_button_layout.addStretch()
         self.list_data_grid_layout.addLayout(self.edit_button_layout)
-        self.button_box = create_button_box(formatting_tag_dialog, 'button_box',
-            ['cancel', 'save', 'defaults'])
+        self.button_box = create_button_box(formatting_tag_dialog, 'button_box', ['cancel', 'save', 'defaults'])
         self.save_button = self.button_box.button(QtGui.QDialogButtonBox.Save)
         self.save_button.setObjectName('save_button')
         self.restore_button = self.button_box.button(QtGui.QDialogButtonBox.RestoreDefaults)

=== modified file 'openlp/core/ui/formattingtagform.py'
--- openlp/core/ui/formattingtagform.py	2013-12-24 15:55:01 +0000
+++ openlp/core/ui/formattingtagform.py	2014-03-21 21:59:15 +0000
@@ -204,4 +204,3 @@
                                           QtGui.QMessageBox.Ok)
             #self.tag_table_widget.selectRow(pre_row - 1)
             self.tag_table_widget.resizeRowsToContents()
-

=== modified file 'openlp/core/ui/generaltab.py'
--- openlp/core/ui/generaltab.py	2014-03-17 19:05:55 +0000
+++ openlp/core/ui/generaltab.py	2014-03-21 21:59:15 +0000
@@ -223,7 +223,8 @@
         self.save_check_service_check_box.setText(translate('OpenLP.GeneralTab',
                                                   'Prompt to save before starting a new service'))
         self.auto_unblank_check_box.setText(translate('OpenLP.GeneralTab', 'Unblank display when adding new live item'))
-        self.auto_preview_check_box.setText(translate('OpenLP.GeneralTab', 'Automatically preview next item in service'))
+        self.auto_preview_check_box.setText(translate('OpenLP.GeneralTab',
+                                                      'Automatically preview next item in service'))
         self.timeout_label.setText(translate('OpenLP.GeneralTab', 'Timed slide interval:'))
         self.timeout_spin_box.setSuffix(translate('OpenLP.GeneralTab', ' sec'))
         self.ccli_group_box.setTitle(translate('OpenLP.GeneralTab', 'CCLI Details'))

=== modified file 'openlp/core/ui/listpreviewwidget.py'
--- openlp/core/ui/listpreviewwidget.py	2014-03-16 21:25:23 +0000
+++ openlp/core/ui/listpreviewwidget.py	2014-03-21 21:59:15 +0000
@@ -160,4 +160,4 @@
         """
         Returns the number of slides this widget holds.
         """
-        return super(ListPreviewWidget, self).rowCount()
\ No newline at end of file
+        return super(ListPreviewWidget, self).rowCount()

=== modified file 'openlp/core/ui/maindisplay.py'
--- openlp/core/ui/maindisplay.py	2014-03-18 20:36:02 +0000
+++ openlp/core/ui/maindisplay.py	2014-03-21 21:59:15 +0000
@@ -601,4 +601,3 @@
         :param signal: The signal to be fired
         """
         QtCore.QObject.connect(self.media_object, signal, slot)
-

=== modified file 'openlp/core/ui/mainwindow.py'
--- openlp/core/ui/mainwindow.py	2014-03-18 20:36:02 +0000
+++ openlp/core/ui/mainwindow.py	2014-03-21 21:59:15 +0000
@@ -887,7 +887,7 @@
         # application terminates normally.   We need to exit without saving configuration.
         QtGui.QMessageBox.information(self, translate('OpenLP.MainWindow', 'Import settings'),
                                       translate('OpenLP.MainWindow', 'OpenLP will now close.  Imported settings will '
-                                      'be applied the next time you start OpenLP.'),
+                                                'be applied the next time you start OpenLP.'),
                                       QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
         self.settings_imported = True
         self.clean_up()
@@ -1042,8 +1042,8 @@
                 ret = QtGui.QMessageBox.question(self, translate('OpenLP.MainWindow', 'Close OpenLP'),
                                                  translate('OpenLP.MainWindow', 'Are you sure you want to close '
                                                                                 'OpenLP?'),
-                                                 QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui
-                                                 .QMessageBox.No),
+                                                 QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes |
+                                                                                   QtGui.QMessageBox.No),
                                                  QtGui.QMessageBox.Yes)
                 if ret == QtGui.QMessageBox.Yes:
                     self.clean_up()
@@ -1234,16 +1234,15 @@
         self.recent_files_menu.clear()
         for file_id, filename in enumerate(recent_files_to_display):
             log.debug('Recent file name: %s', filename)
-            action = create_action(self, '',
-                                   text='&%d %s' % (file_id + 1,
+            action = create_action(self, '', text='&%d %s' % (file_id + 1,
                                    os.path.splitext(os.path.basename(str(filename)))[0]), data=filename,
                                    triggers=self.service_manager_contents.on_recent_service_clicked)
             self.recent_files_menu.addAction(action)
         clear_recent_files_action = create_action(self, '',
                                                   text=translate('OpenLP.MainWindow', 'Clear List', 'Clear List of '
-                                                                                                   'recent files'),
+                                                                                                    'recent files'),
                                                   statustip=translate('OpenLP.MainWindow', 'Clear the list of recent '
-                                                                                          'files.'),
+                                                                                           'files.'),
                                                   enabled=bool(self.recent_files),
                                                   triggers=self.clear_recent_file_menu)
         add_actions(self.recent_files_menu, (None, clear_recent_files_action))
@@ -1352,8 +1351,8 @@
                 self.application.set_normal_cursor()
                 log.exception('Data copy failed %s' % str(why))
                 QtGui.QMessageBox.critical(self, translate('OpenLP.MainWindow', 'New Data Directory Error'),
-                                           translate('OpenLP.MainWindow',
-                                           'OpenLP Data directory copy failed\n\n%s').replace('%s', str(why)),
+                                           translate('OpenLP.MainWindow', 'OpenLP Data directory copy failed\n\n%s').
+                                           replace('%s', str(why)),
                                            QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
                 return False
         else:
@@ -1365,5 +1364,3 @@
         if self.new_data_path == AppLocation.get_directory(AppLocation.DataDir):
             settings.remove('advanced/data path')
         self.application.set_normal_cursor()
-
-

=== modified file 'openlp/core/ui/media/mediacontroller.py'
--- openlp/core/ui/media/mediacontroller.py	2014-03-18 20:36:02 +0000
+++ openlp/core/ui/media/mediacontroller.py	2014-03-21 21:59:15 +0000
@@ -383,7 +383,7 @@
         if not is_valid:
             # Media could not be loaded correctly
             critical_error_message_box(translate('MediaPlugin.MediaItem', 'Unsupported File'),
-                translate('MediaPlugin.MediaItem', 'Unsupported File'))
+                                       translate('MediaPlugin.MediaItem', 'Unsupported File'))
             return False
         # dont care about actual theme, set a black background
         if controller.is_live and not controller.media_info.is_background:
@@ -402,7 +402,7 @@
         if autoplay:
             if not self.media_play(controller):
                 critical_error_message_box(translate('MediaPlugin.MediaItem', 'Unsupported File'),
-                    translate('MediaPlugin.MediaItem', 'Unsupported File'))
+                                           translate('MediaPlugin.MediaItem', 'Unsupported File'))
                 return False
         self.set_controls_visible(controller, True)
         log.debug('use %s controller' % self.current_media_players[controller.controller_type])
@@ -644,9 +644,9 @@
             return
         display = self._define_display(self.live_controller)
         if self.live_controller.controller_type in self.current_media_players and \
-            self.current_media_players[self.live_controller.controller_type].state == MediaState.Playing:
-            self.current_media_players[self.live_controller.controller_type].pause(display)
-            self.current_media_players[self.live_controller.controller_type].set_visible(display, False)
+                self.current_media_players[self.live_controller.controller_type].state == MediaState.Playing:
+                self.current_media_players[self.live_controller.controller_type].pause(display)
+                self.current_media_players[self.live_controller.controller_type].set_visible(display, False)
 
     def media_blank(self, msg):
         """
@@ -701,4 +701,4 @@
         """
         if controller.is_live:
             return controller.display
-        return controller.preview_display
\ No newline at end of file
+        return controller.preview_display

=== modified file 'openlp/core/ui/media/mediaplayer.py'
--- openlp/core/ui/media/mediaplayer.py	2014-03-16 21:25:23 +0000
+++ openlp/core/ui/media/mediaplayer.py	2014-03-21 21:59:15 +0000
@@ -150,4 +150,4 @@
         """
         Returns Information about the player
         """
-        return ''
\ No newline at end of file
+        return ''

=== modified file 'openlp/core/ui/media/phononplayer.py'
--- openlp/core/ui/media/phononplayer.py	2014-03-17 19:05:55 +0000
+++ openlp/core/ui/media/phononplayer.py	2014-03-21 21:59:15 +0000
@@ -105,7 +105,7 @@
                 if ext not in mime_type_list:
                     mime_type_list.append(ext)
             log.info('MediaPlugin: %s additional extensions: %s' %
-                (mimetype, ' '.join(self.additional_extensions[mimetype])))
+                     (mimetype, ' '.join(self.additional_extensions[mimetype])))
 
     def setup(self, display):
         """

=== modified file 'openlp/core/ui/media/vlcplayer.py'
--- openlp/core/ui/media/vlcplayer.py	2013-12-31 20:29:03 +0000
+++ openlp/core/ui/media/vlcplayer.py	2014-03-21 21:59:15 +0000
@@ -291,4 +291,4 @@
                '<br/> <strong>' + translate('Media.player', 'Audio') +
                '</strong><br/>' + str(AUDIO_EXT) + '<br/><strong>' +
                translate('Media.player', 'Video') + '</strong><br/>' +
-               str(VIDEO_EXT) + '<br/>')
\ No newline at end of file
+               str(VIDEO_EXT) + '<br/>')

=== modified file 'openlp/core/ui/pluginform.py'
--- openlp/core/ui/pluginform.py	2014-03-16 21:25:23 +0000
+++ openlp/core/ui/pluginform.py	2014-03-21 21:59:15 +0000
@@ -154,4 +154,4 @@
         elif self.active_plugin.status == PluginStatus.Disabled:
             status_text = translate('OpenLP.PluginForm', '%s (Disabled)')
         self.plugin_list_widget.currentItem().setText(
-            status_text % self.active_plugin.name_strings['singular'])
\ No newline at end of file
+            status_text % self.active_plugin.name_strings['singular'])

=== modified file 'openlp/core/ui/printserviceform.py'
--- openlp/core/ui/printserviceform.py	2014-03-18 20:36:02 +0000
+++ openlp/core/ui/printserviceform.py	2014-03-21 21:59:15 +0000
@@ -394,4 +394,4 @@
             return
         for item in self.service_manager.service_items:
             # Trigger Audit requests
-            Registry().register_function('print_service_started', [item['service_item']])
\ No newline at end of file
+            Registry().register_function('print_service_started', [item['service_item']])

=== modified file 'openlp/core/ui/servicemanager.py'
--- openlp/core/ui/servicemanager.py	2014-03-16 21:25:23 +0000
+++ openlp/core/ui/servicemanager.py	2014-03-21 21:59:15 +0000
@@ -689,8 +689,8 @@
         if self._file_name.endswith('oszl') or self.service_has_all_original_files:
             file_name = QtGui.QFileDialog.getSaveFileName(self.main_window, UiStrings().SaveService, path,
                                                           translate('OpenLP.ServiceManager',
-                                                          'OpenLP Service Files (*.osz);; OpenLP Service Files - lite '
-                                                          '(*.oszl)'))
+                                                                    'OpenLP Service Files (*.osz);; OpenLP Service '
+                                                                    'Files - lite (*.oszl)'))
         else:
             file_name = QtGui.QFileDialog.getSaveFileName(self.main_window, UiStrings().SaveService, path,
                                                           translate('OpenLP.ServiceManager',
@@ -783,7 +783,8 @@
                 self.log_exception('Service file is cannot be extracted as zip: %s' % file_name)
                 QtGui.QMessageBox.information(self, translate('OpenLP.ServiceManager', 'Corrupt File'),
                                               translate('OpenLP.ServiceManager',
-                                              'This file is either corrupt or it is not an OpenLP 2 service file.'))
+                                                        'This file is either corrupt or it is not an OpenLP 2 service '
+                                                        'file.'))
             self.application.set_normal_cursor()
             return
         finally:
@@ -1253,8 +1254,7 @@
             tree_widget_item.setText(0, service_item_from_item.get_display_title())
             tips = []
             if service_item_from_item.temporary_edit:
-                tips.append('<strong>%s:</strong> <em>%s</em>' %
-                            (translate('OpenLP.ServiceManager', 'Edit'),
+                tips.append('<strong>%s:</strong> <em>%s</em>' % (translate('OpenLP.ServiceManager', 'Edit'),
                             (translate('OpenLP.ServiceManager', 'Service copy only'))))
             if service_item_from_item.theme and service_item_from_item.theme != -1:
                 tips.append('<strong>%s:</strong> <em>%s</em>' %
@@ -1492,9 +1492,9 @@
 
     def find_service_item(self):
         """
-        Finds the first selected ServiceItem in the list and returns the position of the service_item_from_item and its selected
-        child item. For example, if the third child item (in the Slidecontroller known as slide) in the second service
-        item is selected this will return::
+        Finds the first selected ServiceItem in the list and returns the position of the service_item_from_item and its
+        selected child item. For example, if the third child item (in the Slidecontroller known as slide) in the
+        second service item is selected this will return::
 
             (1, 2)
         """
@@ -1632,4 +1632,4 @@
         Print a Service Order Sheet.
         """
         setting_dialog = PrintServiceForm()
-        setting_dialog.exec_()
\ No newline at end of file
+        setting_dialog.exec_()

=== modified file 'openlp/core/ui/servicenoteform.py'
--- openlp/core/ui/servicenoteform.py	2014-03-16 21:25:23 +0000
+++ openlp/core/ui/servicenoteform.py	2014-03-21 21:59:15 +0000
@@ -74,4 +74,4 @@
         """
         Translate the UI on the fly
         """
-        self.setWindowTitle(translate('OpenLP.ServiceNoteForm', 'Service Item Notes'))
\ No newline at end of file
+        self.setWindowTitle(translate('OpenLP.ServiceNoteForm', 'Service Item Notes'))

=== modified file 'openlp/core/ui/settingsform.py'
--- openlp/core/ui/settingsform.py	2014-03-18 20:36:02 +0000
+++ openlp/core/ui/settingsform.py	2014-03-21 21:59:15 +0000
@@ -151,4 +151,4 @@
         :param function:  The function to be called
         """
         if not function in self.processes:
-            self.processes.append(function)
\ No newline at end of file
+            self.processes.append(function)

=== modified file 'openlp/core/ui/shortcutlistform.py'
--- openlp/core/ui/shortcutlistform.py	2014-03-18 20:36:02 +0000
+++ openlp/core/ui/shortcutlistform.py	2014-03-21 21:59:15 +0000
@@ -285,7 +285,7 @@
         if QtGui.QMessageBox.question(self, translate('OpenLP.ShortcutListDialog', 'Restore Default Shortcuts'),
                                       translate('OpenLP.ShortcutListDialog', 'Do you want to restore all '
                                                 'shortcuts to their defaults?'),
-                                      QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | 
+                                      QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes |
                                                                         QtGui.QMessageBox.No)) == QtGui.QMessageBox.No:
             return
         self._adjust_button(self.primary_push_button, False, text='')

=== modified file 'openlp/core/ui/slidecontroller.py'
--- openlp/core/ui/slidecontroller.py	2014-03-13 20:08:47 +0000
+++ openlp/core/ui/slidecontroller.py	2014-03-21 21:59:15 +0000
@@ -170,14 +170,14 @@
         size_toolbar_policy.setHeightForWidth(self.toolbar.sizePolicy().hasHeightForWidth())
         self.toolbar.setSizePolicy(size_toolbar_policy)
         self.previous_item = create_action(self, 'previousItem_' + self.type_prefix,
-                                           text=translate('OpenLP.SlideController', 'Previous Slide'), 
+                                           text=translate('OpenLP.SlideController', 'Previous Slide'),
                                            icon=':/slides/slide_previous.png',
                                            tooltip=translate('OpenLP.SlideController', 'Move to previous.'),
                                            can_shortcuts=True, context=QtCore.Qt.WidgetWithChildrenShortcut,
                                            category=self.category, triggers=self.on_slide_selected_previous)
         self.toolbar.addAction(self.previous_item)
         self.next_item = create_action(self, 'nextItem_' + self.type_prefix,
-                                       text=translate('OpenLP.SlideController', 'Next Slide'), 
+                                       text=translate('OpenLP.SlideController', 'Next Slide'),
                                        icon=':/slides/slide_next.png',
                                        tooltip=translate('OpenLP.SlideController', 'Move to next.'),
                                        can_shortcuts=True, context=QtCore.Qt.WidgetWithChildrenShortcut,
@@ -195,17 +195,17 @@
             self.hide_menu.setMenu(QtGui.QMenu(translate('OpenLP.SlideController', 'Hide'), self.toolbar))
             self.toolbar.add_toolbar_widget(self.hide_menu)
             self.blank_screen = create_action(self, 'blankScreen',
-                                              text=translate('OpenLP.SlideController', 'Blank Screen'), 
+                                              text=translate('OpenLP.SlideController', 'Blank Screen'),
                                               icon=':/slides/slide_blank.png',
-                                              checked=False, can_shortcuts=True, category=self.category, 
+                                              checked=False, can_shortcuts=True, category=self.category,
                                               triggers=self.on_blank_display)
             self.theme_screen = create_action(self, 'themeScreen',
-                                              text=translate('OpenLP.SlideController', 'Blank to Theme'), 
+                                              text=translate('OpenLP.SlideController', 'Blank to Theme'),
                                               icon=':/slides/slide_theme.png',
                                               checked=False, can_shortcuts=True, category=self.category,
                                               triggers=self.on_theme_display)
             self.desktop_screen = create_action(self, 'desktopScreen',
-                                                text=translate('OpenLP.SlideController', 'Show Desktop'), 
+                                                text=translate('OpenLP.SlideController', 'Show Desktop'),
                                                 icon=':/slides/slide_desktop.png',
                                                 checked=False, can_shortcuts=True, category=self.category,
                                                 triggers=self.on_hide_display)
@@ -255,15 +255,16 @@
             self.toolbar.add_toolbar_widget(self.delay_spin_box)
         else:
             self.toolbar.add_toolbar_action('goLive', icon=':/general/general_live.png',
-                                            tooltip=translate('OpenLP.SlideController', 'Move to live.'), 
+                                            tooltip=translate('OpenLP.SlideController', 'Move to live.'),
                                             triggers=self.on_go_live)
             self.toolbar.add_toolbar_action('addToService', icon=':/general/general_add.png',
-                                            tooltip=translate('OpenLP.SlideController', 'Add to Service.'), 
+                                            tooltip=translate('OpenLP.SlideController', 'Add to Service.'),
                                             triggers=self.on_preview_add_to_service)
             self.toolbar.addSeparator()
             self.toolbar.add_toolbar_action('editSong', icon=':/general/general_edit.png',
-                                            tooltip=translate('OpenLP.SlideController', 'Edit and reload song preview.')
-                                            , triggers=self.on_edit_song)
+                                            tooltip=translate('OpenLP.SlideController',
+                                                              'Edit and reload song preview.'),
+                                            triggers=self.on_edit_song)
         self.controller_layout.addWidget(self.toolbar)
         # Build the Media Toolbar
         self.media_controller.register_controller(self)
@@ -355,7 +356,7 @@
                 {'key': 'O', 'configurable': True, 'text': translate('OpenLP.SlideController', 'Go to "Other"')}
             ]
             shortcuts.extend([{'key': str(number)} for number in range(10)])
-            self.controller.addActions([create_action(self, 'shortcutAction_%s' % s['key'], 
+            self.controller.addActions([create_action(self, 'shortcutAction_%s' % s['key'],
                                                       text=s.get('text'),
                                                       can_shortcuts=True,
                                                       context=QtCore.Qt.WidgetWithChildrenShortcut,
@@ -394,9 +395,9 @@
         """
         Called, when a shortcut has been activated to jump to a chorus, verse, etc.
 
-        **Note**: This implementation is based on shortcuts. But it rather works like "key sequenes". You have to 
+        **Note**: This implementation is based on shortcuts. But it rather works like "key sequenes". You have to
         press one key after the other and **not** at the same time.
-        For example to jump to "V3" you have to press "V" and afterwards but within a time frame of 350ms 
+        For example to jump to "V3" you have to press "V" and afterwards but within a time frame of 350ms
         you have to press "3".
         """
         try:
@@ -456,17 +457,17 @@
         """
         self.previous_service = create_action(parent, 'previousService',
                                               text=translate('OpenLP.SlideController', 'Previous Service'),
-                                              can_shortcuts=True, context=QtCore.Qt.WidgetWithChildrenShortcut, 
+                                              can_shortcuts=True, context=QtCore.Qt.WidgetWithChildrenShortcut,
                                               category=self.category,
                                               triggers=self.service_previous)
         self.next_service = create_action(parent, 'nextService',
                                           text=translate('OpenLP.SlideController', 'Next Service'),
-                                          can_shortcuts=True, context=QtCore.Qt.WidgetWithChildrenShortcut, 
+                                          can_shortcuts=True, context=QtCore.Qt.WidgetWithChildrenShortcut,
                                           category=self.category,
                                           triggers=self.service_next)
         self.escape_item = create_action(parent, 'escapeItem',
                                          text=translate('OpenLP.SlideController', 'Escape Item'),
-                                         can_shortcuts=True, context=QtCore.Qt.WidgetWithChildrenShortcut, 
+                                         can_shortcuts=True, context=QtCore.Qt.WidgetWithChildrenShortcut,
                                          category=self.category,
                                          triggers=self.live_escape)
 
@@ -1325,7 +1326,7 @@
         """
         Update how much time is remaining
 
-        :param time: the time remainings
+        :param time: the time remaining
         """
         seconds = self.display.audio_player.media_object.remainingTime() // 1000
         minutes = seconds // 60

=== modified file 'openlp/core/ui/starttimeform.py'
--- openlp/core/ui/starttimeform.py	2014-03-16 21:25:23 +0000
+++ openlp/core/ui/starttimeform.py	2014-03-21 21:59:15 +0000
@@ -74,12 +74,12 @@
             self.minute_finish_spin_box.value() * 60 + self.second_finish_spin_box.value()
         if end > self.item['service_item'].media_length:
             critical_error_message_box(title=translate('OpenLP.StartTime_form', 'Time Validation Error'),
-                                       message=translate('OpenLP.StartTime_form', 
+                                       message=translate('OpenLP.StartTime_form',
                                                          'Finish time is set after the end of the media item'))
             return
         elif start > end:
             critical_error_message_box(title=translate('OpenLP.StartTime_form', 'Time Validation Error'),
-                                       message=translate('OpenLP.StartTime_form', 
+                                       message=translate('OpenLP.StartTime_form',
                                                          'Start time is after the finish time of the media item'))
             return
         self.item['service_item'].start_time = start
@@ -94,4 +94,4 @@
         seconds -= 3600 * hours
         minutes = seconds // 60
         seconds -= 60 * minutes
-        return hours, minutes, seconds
\ No newline at end of file
+        return hours, minutes, seconds

=== modified file 'openlp/core/ui/themeform.py'
--- openlp/core/ui/themeform.py	2014-03-18 20:36:02 +0000
+++ openlp/core/ui/themeform.py	2014-03-21 21:59:15 +0000
@@ -180,7 +180,7 @@
                 self.theme.background_type == background_image and is_not_image_file(self.theme.background_filename):
             QtGui.QMessageBox.critical(self, translate('OpenLP.ThemeWizard', 'Background Image Empty'),
                                        translate('OpenLP.ThemeWizard', '_you have not selected a '
-                                       'background image. Please select one before continuing.'))
+                                                 'background image. Please select one before continuing.'))
             return False
         else:
             return True
@@ -540,4 +540,4 @@
         new_color = QtGui.QColorDialog.getColor(QtGui.QColor(field), self)
         if new_color.isValid():
             field = new_color.name()
-        return field
\ No newline at end of file
+        return field

=== modified file 'openlp/core/ui/thememanager.py'
--- openlp/core/ui/thememanager.py	2014-03-16 21:25:23 +0000
+++ openlp/core/ui/thememanager.py	2014-03-21 21:59:15 +0000
@@ -517,7 +517,7 @@
         """
         ret = QtGui.QMessageBox.question(self, translate('OpenLP.ThemeManager', 'Theme Already Exists'),
                                          translate('OpenLP.ThemeManager',
-                                         'Theme %s already exists. Do you want to replace it?')
+                                                   'Theme %s already exists. Do you want to replace it?')
                                          .replace('%s', theme_name),
                                          QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes |
                                                                            QtGui.QMessageBox.No),
@@ -753,4 +753,4 @@
                                                    % (theme, plugin.name))
                         return False
             return True
-        return False
\ No newline at end of file
+        return False

=== modified file 'openlp/core/ui/themewizard.py'
--- openlp/core/ui/themewizard.py	2013-12-26 17:36:00 +0000
+++ openlp/core/ui/themewizard.py	2014-03-21 21:59:15 +0000
@@ -385,10 +385,10 @@
                                QtCore.SLOT('setDisabled(bool)'))
         QtCore.QObject.connect(self.footer_position_check_box, QtCore.SIGNAL('toggled(bool)'), self.footer_y_spin_box,
                                QtCore.SLOT('setDisabled(bool)'))
-        QtCore.QObject.connect(self.footer_position_check_box, QtCore.SIGNAL('toggled(bool)'), self.footer_width_spin_box,
-                               QtCore.SLOT('setDisabled(bool)'))
-        QtCore.QObject.connect(self.footer_position_check_box, QtCore.SIGNAL('toggled(bool)'), self.footer_height_spin_box,
-                               QtCore.SLOT('setDisabled(bool)'))
+        QtCore.QObject.connect(self.footer_position_check_box, QtCore.SIGNAL('toggled(bool)'),
+                               self.footer_width_spin_box, QtCore.SLOT('setDisabled(bool)'))
+        QtCore.QObject.connect(self.footer_position_check_box, QtCore.SIGNAL('toggled(bool)'),
+                               self.footer_height_spin_box, QtCore.SLOT('setDisabled(bool)'))
 
     def retranslateUi(self, themeWizard):
         """
@@ -409,15 +409,18 @@
         self.background_combo_box.setItemText(BackgroundType.Gradient,
                                               translate('OpenLP.ThemeWizard', 'Gradient'))
         self.background_combo_box.setItemText(BackgroundType.Image, UiStrings().Image)
-        self.background_combo_box.setItemText(BackgroundType.Transparent, translate('OpenLP.ThemeWizard', 'Transparent'))
+        self.background_combo_box.setItemText(BackgroundType.Transparent,
+                                              translate('OpenLP.ThemeWizard', 'Transparent'))
         self.color_label.setText(translate('OpenLP.ThemeWizard', 'color:'))
         self.gradient_start_label.setText(translate('OpenLP.ThemeWizard', 'Starting color:'))
         self.gradient_end_label.setText(translate('OpenLP.ThemeWizard', 'Ending color:'))
         self.gradient_type_label.setText(translate('OpenLP.ThemeWizard', 'Gradient:'))
         self.gradient_combo_box.setItemText(BackgroundGradientType.Horizontal,
                                             translate('OpenLP.ThemeWizard', 'Horizontal'))
-        self.gradient_combo_box.setItemText(BackgroundGradientType.Vertical, translate('OpenLP.ThemeWizard', 'Vertical'))
-        self.gradient_combo_box.setItemText(BackgroundGradientType.Circular, translate('OpenLP.ThemeWizard', 'Circular'))
+        self.gradient_combo_box.setItemText(BackgroundGradientType.Vertical,
+                                            translate('OpenLP.ThemeWizard', 'Vertical'))
+        self.gradient_combo_box.setItemText(BackgroundGradientType.Circular,
+                                            translate('OpenLP.ThemeWizard', 'Circular'))
         self.gradient_combo_box.setItemText(BackgroundGradientType.LeftTop,
                                             translate('OpenLP.ThemeWizard', 'Top Left - Bottom Right'))
         self.gradient_combo_box.setItemText(BackgroundGradientType.LeftBottom,
@@ -486,6 +489,6 @@
         self.preview_page.setSubTitle(translate('OpenLP.ThemeWizard', 'Preview the theme and save it.'))
         self.theme_name_label.setText(translate('OpenLP.ThemeWizard', 'Theme name:'))
         # Align all QFormLayouts towards each other.
-        label_width = max(self.background_label.minimumSizeHint().width(), 
+        label_width = max(self.background_label.minimumSizeHint().width(),
                           self.horizontal_label.minimumSizeHint().width())
         self.spacer.changeSize(label_width, 0, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)

=== modified file 'openlp/core/ui/wizard.py'
--- openlp/core/ui/wizard.py	2014-03-18 20:36:02 +0000
+++ openlp/core/ui/wizard.py	2014-03-21 21:59:15 +0000
@@ -303,4 +303,4 @@
             QtGui.QFileDialog.ShowDirsOnly)
         if folder:
             editbox.setText(folder)
-        Settings().setValue(self.plugin.settings_section + '/' + setting_name, folder)
\ No newline at end of file
+        Settings().setValue(self.plugin.settings_section + '/' + setting_name, folder)

=== modified file 'openlp/core/utils/__init__.py'
--- openlp/core/utils/__init__.py	2014-03-17 19:05:55 +0000
+++ openlp/core/utils/__init__.py	2014-03-21 21:59:15 +0000
@@ -72,13 +72,18 @@
         'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36'
     ],
     'darwin': [
-        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31',
-        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11',
-        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11',
+        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.31 (KHTML, like Gecko) '
+        'Chrome/26.0.1410.43 Safari/537.31',
+        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/536.11 (KHTML, like Gecko) '
+        'Chrome/20.0.1132.57 Safari/536.11',
+        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.11 (KHTML, like Gecko) '
+        'Chrome/20.0.1132.47 Safari/536.11',
     ],
     'linux2': [
-        'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Ubuntu Chromium/25.0.1364.160 Chrome/25.0.1364.160 Safari/537.22',
-        'Mozilla/5.0 (X11; CrOS armv7l 2913.260.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.99 Safari/537.11',
+        'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Ubuntu Chromium/25.0.1364.160 '
+        'Chrome/25.0.1364.160 Safari/537.22',
+        'Mozilla/5.0 (X11; CrOS armv7l 2913.260.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.99 '
+        'Safari/537.11',
         'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.27 (KHTML, like Gecko) Chrome/26.0.1389.0 Safari/537.27'
     ],
     'default': [
@@ -144,9 +149,9 @@
         # If they are equal, then this tree is tarball with the source for the release. We do not want the revision
         # number in the full version.
         if tree_revision == tag_revision:
-            full_version =  tag_version
+            full_version = tag_version
         else:
-            full_version =  '%s-bzr%s' % (tag_version, tree_revision)
+            full_version = '%s-bzr%s' % (tag_version, tree_revision)
     else:
         # We're not running the development version, let's use the file.
         filepath = AppLocation.get_directory(AppLocation.VersionDir)

=== modified file 'openlp/core/utils/actions.py'
--- openlp/core/utils/actions.py	2014-03-17 19:05:55 +0000
+++ openlp/core/utils/actions.py	2014-03-21 21:59:15 +0000
@@ -295,7 +295,7 @@
                 ActionList.shortcut_map[shortcuts[1]] = actions
             else:
                 log.warn('Shortcut "%s" is removed from "%s" because another action already uses this shortcut.' %
-                    (shortcuts[1], action.objectName()))
+                         (shortcuts[1], action.objectName()))
                 shortcuts.remove(shortcuts[1])
         # Check the primary shortcut.
         existing_actions = ActionList.shortcut_map.get(shortcuts[0], [])
@@ -306,7 +306,7 @@
             ActionList.shortcut_map[shortcuts[0]] = actions
         else:
             log.warn('Shortcut "%s" is removed from "%s" because another action already uses this shortcut.' %
-                (shortcuts[0], action.objectName()))
+                     (shortcuts[0], action.objectName()))
             shortcuts.remove(shortcuts[0])
         action.setShortcuts([QtGui.QKeySequence(shortcut) for shortcut in shortcuts])
 

=== modified file 'openlp/core/utils/languagemanager.py'
--- openlp/core/utils/languagemanager.py	2014-03-17 19:05:55 +0000
+++ openlp/core/utils/languagemanager.py	2014-03-21 21:59:15 +0000
@@ -126,8 +126,9 @@
         log.info('Language file: \'%s\' written to conf file' % language)
         if message:
             QtGui.QMessageBox.information(None,
-                translate('OpenLP.LanguageManager', 'Language'),
-                translate('OpenLP.LanguageManager', 'Please restart OpenLP to use your new language setting.'))
+                                          translate('OpenLP.LanguageManager', 'Language'),
+                                          translate('OpenLP.LanguageManager', 'Please restart OpenLP to use your new '
+                                                                              'language setting.'))
 
     @staticmethod
     def init_qm_list():

=== modified file 'openlp/plugins/alerts/alertsplugin.py'
--- openlp/plugins/alerts/alertsplugin.py	2014-03-16 21:25:23 +0000
+++ openlp/plugins/alerts/alertsplugin.py	2014-03-21 21:59:15 +0000
@@ -246,4 +246,4 @@
         align = VerticalType.Names[self.settings_tab.location]
         frame.evaluateJavaScript('update_css("%s", "%s", "%s", "%s", "%s")' %
                                  (align, self.settings_tab.font_face, self.settings_tab.font_size,
-                                 self.settings_tab.font_color, self.settings_tab.background_color))
+                                  self.settings_tab.font_color, self.settings_tab.background_color))

=== modified file 'openlp/plugins/alerts/forms/alertform.py'
--- openlp/plugins/alerts/forms/alertform.py	2014-01-11 21:46:20 +0000
+++ openlp/plugins/alerts/forms/alertform.py	2014-03-21 21:59:15 +0000
@@ -46,7 +46,7 @@
         self.manager = plugin.manager
         self.plugin = plugin
         self.item_id = None
-        super(AlertForm, self).__init__( Registry().get('main_window'))
+        super(AlertForm, self).__init__(Registry().get('main_window'))
         self.setupUi(self)
         self.display_button.clicked.connect(self.on_display_clicked)
         self.display_close_button.clicked.connect(self.on_display_close_clicked)

=== modified file 'openlp/plugins/alerts/lib/alertsmanager.py'
--- openlp/plugins/alerts/lib/alertsmanager.py	2014-03-16 21:25:23 +0000
+++ openlp/plugins/alerts/lib/alertsmanager.py	2014-03-21 21:59:15 +0000
@@ -97,4 +97,4 @@
             self.live_controller.display.alert('', alert_tab.location)
         self.killTimer(self.timer_id)
         self.timer_id = 0
-        self.generate_alert()
\ No newline at end of file
+        self.generate_alert()

=== modified file 'openlp/plugins/bibles/bibleplugin.py'
--- openlp/plugins/bibles/bibleplugin.py	2014-03-17 19:05:55 +0000
+++ openlp/plugins/bibles/bibleplugin.py	2014-03-21 21:59:15 +0000
@@ -113,8 +113,8 @@
         """
         super(BiblePlugin, self).app_startup()
         if self.manager.old_bible_databases:
-            if QtGui.QMessageBox.information(self.main_window,
-                translate('OpenLP', 'Information'),
+            if QtGui.QMessageBox.information(
+                    self.main_window, translate('OpenLP', 'Information'),
                 translate('OpenLP', 'Bible format has changed.\nYou have to upgrade your existing Bibles.\n'
                           'Should OpenLP upgrade now?'),
                 QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)) == \

=== modified file 'openlp/plugins/bibles/forms/bibleimportform.py'
--- openlp/plugins/bibles/forms/bibleimportform.py	2014-03-17 19:05:55 +0000
+++ openlp/plugins/bibles/forms/bibleimportform.py	2014-03-21 21:59:15 +0000
@@ -44,6 +44,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class WebDownload(object):
     """
     Provides an enumeration for the web bible types available to OpenLP.
@@ -81,258 +82,257 @@
         Set up the UI for the bible wizard.
         """
         super(BibleImportForm, self).setupUi(image)
-        self.formatComboBox.currentIndexChanged.connect(self.onCurrentIndexChanged)
+        self.format_combo_box.currentIndexChanged.connect(self.on_current_index_changed)
 
-    def onCurrentIndexChanged(self, index):
+    def on_current_index_changed(self, index):
         """
         Called when the format combo box's index changed. We have to check if
         the import is available and accordingly to disable or enable the next
         button.
         """
-        self.selectStack.setCurrentIndex(index)
+        self.select_stack.setCurrentIndex(index)
 
     def custom_init(self):
         """
         Perform any custom initialisation for bible importing.
         """
         self.manager.set_process_dialog(self)
-        self.loadWebBibles()
+        self.load_Web_Bibles()
         self.restart()
-        self.selectStack.setCurrentIndex(0)
+        self.select_stack.setCurrentIndex(0)
 
     def custom_signals(self):
         """
         Set up the signals used in the bible importer.
         """
-        self.webSourceComboBox.currentIndexChanged.connect(self.onWebSourceComboBoxIndexChanged)
-        self.osisBrowseButton.clicked.connect(self.onOsisBrowseButtonClicked)
-        self.csvBooksButton.clicked.connect(self.onCsvBooksBrowseButtonClicked)
-        self.csvVersesButton.clicked.connect(self.onCsvVersesBrowseButtonClicked)
-        self.openSongBrowseButton.clicked.connect(self.onOpenSongBrowseButtonClicked)
+        self.web_source_combo_box.currentIndexChanged.connect(self.on_web_source_combo_box_index_changed)
+        self.osis_browse_button.clicked.connect(self.on_osis_browse_button_clicked)
+        self.csv_books_button.clicked.connect(self.on_csv_books_browse_button_clicked)
+        self.csv_verses_button.clicked.connect(self.on_csv_verses_browse_button_clicked)
+        self.open_song_browse_button.clicked.connect(self.on_open_song_browse_button_clicked)
 
     def add_custom_pages(self):
         """
         Add the bible import specific wizard pages.
         """
         # Select Page
-        self.selectPage = QtGui.QWizardPage()
-        self.selectPage.setObjectName('SelectPage')
-        self.selectPageLayout = QtGui.QVBoxLayout(self.selectPage)
-        self.selectPageLayout.setObjectName('SelectPageLayout')
-        self.formatLayout = QtGui.QFormLayout()
-        self.formatLayout.setObjectName('FormatLayout')
-        self.formatLabel = QtGui.QLabel(self.selectPage)
-        self.formatLabel.setObjectName('FormatLabel')
-        self.formatComboBox = QtGui.QComboBox(self.selectPage)
-        self.formatComboBox.addItems(['', '', '', ''])
-        self.formatComboBox.setObjectName('FormatComboBox')
-        self.formatLayout.addRow(self.formatLabel, self.formatComboBox)
+        self.select_page = QtGui.QWizardPage()
+        self.select_page.setObjectName('SelectPage')
+        self.select_page_layout = QtGui.QVBoxLayout(self.select_page)
+        self.select_page_layout.setObjectName('SelectPageLayout')
+        self.format_layout = QtGui.QFormLayout()
+        self.format_layout.setObjectName('FormatLayout')
+        self.format_label = QtGui.QLabel(self.select_page)
+        self.format_label.setObjectName('FormatLabel')
+        self.format_combo_box = QtGui.QComboBox(self.select_page)
+        self.format_combo_box.addItems(['', '', '', ''])
+        self.format_combo_box.setObjectName('FormatComboBox')
+        self.format_layout.addRow(self.format_label, self.format_combo_box)
         self.spacer = QtGui.QSpacerItem(10, 0, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum)
-        self.formatLayout.setItem(1, QtGui.QFormLayout.LabelRole, self.spacer)
-        self.selectPageLayout.addLayout(self.formatLayout)
-        self.selectStack = QtGui.QStackedLayout()
-        self.selectStack.setObjectName('SelectStack')
-        self.osisWidget = QtGui.QWidget(self.selectPage)
-        self.osisWidget.setObjectName('OsisWidget')
-        self.osisLayout = QtGui.QFormLayout(self.osisWidget)
-        self.osisLayout.setMargin(0)
-        self.osisLayout.setObjectName('OsisLayout')
-        self.osisFileLabel = QtGui.QLabel(self.osisWidget)
-        self.osisFileLabel.setObjectName('OsisFileLabel')
-        self.osisFileLayout = QtGui.QHBoxLayout()
-        self.osisFileLayout.setObjectName('OsisFileLayout')
-        self.osisFileEdit = QtGui.QLineEdit(self.osisWidget)
-        self.osisFileEdit.setObjectName('OsisFileEdit')
-        self.osisFileLayout.addWidget(self.osisFileEdit)
-        self.osisBrowseButton = QtGui.QToolButton(self.osisWidget)
-        self.osisBrowseButton.setIcon(self.open_icon)
-        self.osisBrowseButton.setObjectName('OsisBrowseButton')
-        self.osisFileLayout.addWidget(self.osisBrowseButton)
-        self.osisLayout.addRow(self.osisFileLabel, self.osisFileLayout)
-        self.osisLayout.setItem(1, QtGui.QFormLayout.LabelRole, self.spacer)
-        self.selectStack.addWidget(self.osisWidget)
-        self.csvWidget = QtGui.QWidget(self.selectPage)
-        self.csvWidget.setObjectName('CsvWidget')
-        self.csvLayout = QtGui.QFormLayout(self.csvWidget)
-        self.csvLayout.setMargin(0)
-        self.csvLayout.setObjectName('CsvLayout')
-        self.csvBooksLabel = QtGui.QLabel(self.csvWidget)
-        self.csvBooksLabel.setObjectName('CsvBooksLabel')
-        self.csvBooksLayout = QtGui.QHBoxLayout()
-        self.csvBooksLayout.setObjectName('CsvBooksLayout')
-        self.csvBooksEdit = QtGui.QLineEdit(self.csvWidget)
-        self.csvBooksEdit.setObjectName('CsvBooksEdit')
-        self.csvBooksLayout.addWidget(self.csvBooksEdit)
-        self.csvBooksButton = QtGui.QToolButton(self.csvWidget)
-        self.csvBooksButton.setIcon(self.open_icon)
-        self.csvBooksButton.setObjectName('CsvBooksButton')
-        self.csvBooksLayout.addWidget(self.csvBooksButton)
-        self.csvLayout.addRow(self.csvBooksLabel, self.csvBooksLayout)
-        self.csvVersesLabel = QtGui.QLabel(self.csvWidget)
-        self.csvVersesLabel.setObjectName('CsvVersesLabel')
-        self.csvVersesLayout = QtGui.QHBoxLayout()
-        self.csvVersesLayout.setObjectName('CsvVersesLayout')
-        self.csvVersesEdit = QtGui.QLineEdit(self.csvWidget)
-        self.csvVersesEdit.setObjectName('CsvVersesEdit')
-        self.csvVersesLayout.addWidget(self.csvVersesEdit)
-        self.csvVersesButton = QtGui.QToolButton(self.csvWidget)
-        self.csvVersesButton.setIcon(self.open_icon)
-        self.csvVersesButton.setObjectName('CsvVersesButton')
-        self.csvVersesLayout.addWidget(self.csvVersesButton)
-        self.csvLayout.addRow(self.csvVersesLabel, self.csvVersesLayout)
-        self.csvLayout.setItem(3, QtGui.QFormLayout.LabelRole, self.spacer)
-        self.selectStack.addWidget(self.csvWidget)
-        self.openSongWidget = QtGui.QWidget(self.selectPage)
-        self.openSongWidget.setObjectName('OpenSongWidget')
-        self.openSongLayout = QtGui.QFormLayout(self.openSongWidget)
-        self.openSongLayout.setMargin(0)
-        self.openSongLayout.setObjectName('OpenSongLayout')
-        self.openSongFileLabel = QtGui.QLabel(self.openSongWidget)
-        self.openSongFileLabel.setObjectName('OpenSongFileLabel')
-        self.openSongFileLayout = QtGui.QHBoxLayout()
-        self.openSongFileLayout.setObjectName('OpenSongFileLayout')
-        self.openSongFileEdit = QtGui.QLineEdit(self.openSongWidget)
-        self.openSongFileEdit.setObjectName('OpenSongFileEdit')
-        self.openSongFileLayout.addWidget(self.openSongFileEdit)
-        self.openSongBrowseButton = QtGui.QToolButton(self.openSongWidget)
-        self.openSongBrowseButton.setIcon(self.open_icon)
-        self.openSongBrowseButton.setObjectName('OpenSongBrowseButton')
-        self.openSongFileLayout.addWidget(self.openSongBrowseButton)
-        self.openSongLayout.addRow(self.openSongFileLabel, self.openSongFileLayout)
-        self.openSongLayout.setItem(1, QtGui.QFormLayout.LabelRole, self.spacer)
-        self.selectStack.addWidget(self.openSongWidget)
-        self.webTabWidget = QtGui.QTabWidget(self.selectPage)
-        self.webTabWidget.setObjectName('WebTabWidget')
-        self.webBibleTab = QtGui.QWidget()
-        self.webBibleTab.setObjectName('WebBibleTab')
-        self.webBibleLayout = QtGui.QFormLayout(self.webBibleTab)
-        self.webBibleLayout.setObjectName('WebBibleLayout')
-        self.webSourceLabel = QtGui.QLabel(self.webBibleTab)
-        self.webSourceLabel.setObjectName('WebSourceLabel')
-        self.webBibleLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.webSourceLabel)
-        self.webSourceComboBox = QtGui.QComboBox(self.webBibleTab)
-        self.webSourceComboBox.setObjectName('WebSourceComboBox')
-        self.webSourceComboBox.addItems(['', '', ''])
-        self.webBibleLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.webSourceComboBox)
-        self.webTranslationLabel = QtGui.QLabel(self.webBibleTab)
-        self.webTranslationLabel.setObjectName('webTranslationLabel')
-        self.webBibleLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.webTranslationLabel)
-        self.webTranslationComboBox = QtGui.QComboBox(self.webBibleTab)
-        self.webTranslationComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
-        self.webTranslationComboBox.setObjectName('WebTranslationComboBox')
-        self.webBibleLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.webTranslationComboBox)
-        self.webTabWidget.addTab(self.webBibleTab, '')
-        self.webProxyTab = QtGui.QWidget()
-        self.webProxyTab.setObjectName('WebProxyTab')
-        self.webProxyLayout = QtGui.QFormLayout(self.webProxyTab)
-        self.webProxyLayout.setObjectName('WebProxyLayout')
-        self.webServerLabel = QtGui.QLabel(self.webProxyTab)
-        self.webServerLabel.setObjectName('WebServerLabel')
-        self.webProxyLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.webServerLabel)
-        self.webServerEdit = QtGui.QLineEdit(self.webProxyTab)
-        self.webServerEdit.setObjectName('WebServerEdit')
-        self.webProxyLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.webServerEdit)
-        self.webUserLabel = QtGui.QLabel(self.webProxyTab)
-        self.webUserLabel.setObjectName('WebUserLabel')
-        self.webProxyLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.webUserLabel)
-        self.webUserEdit = QtGui.QLineEdit(self.webProxyTab)
-        self.webUserEdit.setObjectName('WebUserEdit')
-        self.webProxyLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.webUserEdit)
-        self.webPasswordLabel = QtGui.QLabel(self.webProxyTab)
-        self.webPasswordLabel.setObjectName('WebPasswordLabel')
-        self.webProxyLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.webPasswordLabel)
-        self.webPasswordEdit = QtGui.QLineEdit(self.webProxyTab)
-        self.webPasswordEdit.setObjectName('WebPasswordEdit')
-        self.webProxyLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.webPasswordEdit)
-        self.webTabWidget.addTab(self.webProxyTab, '')
-        self.selectStack.addWidget(self.webTabWidget)
-        self.selectPageLayout.addLayout(self.selectStack)
-        self.addPage(self.selectPage)
+        self.format_layout.setItem(1, QtGui.QFormLayout.LabelRole, self.spacer)
+        self.select_page_layout.addLayout(self.format_layout)
+        self.select_stack = QtGui.QStackedLayout()
+        self.select_stack.setObjectName('SelectStack')
+        self.osis_widget = QtGui.QWidget(self.select_page)
+        self.osis_widget.setObjectName('OsisWidget')
+        self.osis_layout = QtGui.QFormLayout(self.osis_widget)
+        self.osis_layout.setMargin(0)
+        self.osis_layout.setObjectName('OsisLayout')
+        self.osis_file_label = QtGui.QLabel(self.osis_widget)
+        self.osis_file_label.setObjectName('OsisFileLabel')
+        self.osis_file_layout = QtGui.QHBoxLayout()
+        self.osis_file_layout.setObjectName('OsisFileLayout')
+        self.osis_file_edit = QtGui.QLineEdit(self.osis_widget)
+        self.osis_file_edit.setObjectName('OsisFileEdit')
+        self.osis_file_layout.addWidget(self.osis_file_edit)
+        self.osis_browse_button = QtGui.QToolButton(self.osis_widget)
+        self.osis_browse_button.setIcon(self.open_icon)
+        self.osis_browse_button.setObjectName('OsisBrowseButton')
+        self.osis_file_layout.addWidget(self.osis_browse_button)
+        self.osis_layout.addRow(self.osis_file_label, self.osis_file_layout)
+        self.osis_layout.setItem(1, QtGui.QFormLayout.LabelRole, self.spacer)
+        self.select_stack.addWidget(self.osis_widget)
+        self.csv_widget = QtGui.QWidget(self.select_page)
+        self.csv_widget.setObjectName('CsvWidget')
+        self.csv_layout = QtGui.QFormLayout(self.csv_widget)
+        self.csv_layout.setMargin(0)
+        self.csv_layout.setObjectName('CsvLayout')
+        self.csv_books_label = QtGui.QLabel(self.csv_widget)
+        self.csv_books_label.setObjectName('CsvBooksLabel')
+        self.csv_books_layout = QtGui.QHBoxLayout()
+        self.csv_books_layout.setObjectName('CsvBooksLayout')
+        self.csv_books_edit = QtGui.QLineEdit(self.csv_widget)
+        self.csv_books_edit.setObjectName('CsvBooksEdit')
+        self.csv_books_layout.addWidget(self.csv_books_edit)
+        self.csv_books_button = QtGui.QToolButton(self.csv_widget)
+        self.csv_books_button.setIcon(self.open_icon)
+        self.csv_books_button.setObjectName('CsvBooksButton')
+        self.csv_books_layout.addWidget(self.csv_books_button)
+        self.csv_layout.addRow(self.csv_books_label, self.csv_books_layout)
+        self.csv_verses_label = QtGui.QLabel(self.csv_widget)
+        self.csv_verses_label.setObjectName('CsvVersesLabel')
+        self.csv_verses_layout = QtGui.QHBoxLayout()
+        self.csv_verses_layout.setObjectName('CsvVersesLayout')
+        self.csv_verses_edit = QtGui.QLineEdit(self.csv_widget)
+        self.csv_verses_edit.setObjectName('CsvVersesEdit')
+        self.csv_verses_layout.addWidget(self.csv_verses_edit)
+        self.csv_verses_button = QtGui.QToolButton(self.csv_widget)
+        self.csv_verses_button.setIcon(self.open_icon)
+        self.csv_verses_button.setObjectName('CsvVersesButton')
+        self.csv_verses_layout.addWidget(self.csv_verses_button)
+        self.csv_layout.addRow(self.csv_verses_label, self.csv_verses_layout)
+        self.csv_layout.setItem(3, QtGui.QFormLayout.LabelRole, self.spacer)
+        self.select_stack.addWidget(self.csv_widget)
+        self.open_song_widget = QtGui.QWidget(self.select_page)
+        self.open_song_widget.setObjectName('OpenSongWidget')
+        self.open_song_layout = QtGui.QFormLayout(self.open_song_widget)
+        self.open_song_layout.setMargin(0)
+        self.open_song_layout.setObjectName('OpenSongLayout')
+        self.open_song_file_label = QtGui.QLabel(self.open_song_widget)
+        self.open_song_file_label.setObjectName('OpenSongFileLabel')
+        self.open_song_file_layout = QtGui.QHBoxLayout()
+        self.open_song_file_layout.setObjectName('OpenSongFileLayout')
+        self.open_song_file_edit = QtGui.QLineEdit(self.open_song_widget)
+        self.open_song_file_edit.setObjectName('OpenSongFileEdit')
+        self.open_song_file_layout.addWidget(self.open_song_file_edit)
+        self.open_song_browse_button = QtGui.QToolButton(self.open_song_widget)
+        self.open_song_browse_button.setIcon(self.open_icon)
+        self.open_song_browse_button.setObjectName('OpenSongBrowseButton')
+        self.open_song_file_layout.addWidget(self.open_song_browse_button)
+        self.open_song_layout.addRow(self.open_song_file_label, self.open_song_file_layout)
+        self.open_song_layout.setItem(1, QtGui.QFormLayout.LabelRole, self.spacer)
+        self.select_stack.addWidget(self.open_song_widget)
+        self.web_tab_widget = QtGui.QTabWidget(self.select_page)
+        self.web_tab_widget.setObjectName('WebTabWidget')
+        self.web_bible_tab = QtGui.QWidget()
+        self.web_bible_tab.setObjectName('WebBibleTab')
+        self.web_bible_layout = QtGui.QFormLayout(self.web_bible_tab)
+        self.web_bible_layout.setObjectName('WebBibleLayout')
+        self.web_source_label = QtGui.QLabel(self.web_bible_tab)
+        self.web_source_label.setObjectName('WebSourceLabel')
+        self.web_bible_layout.setWidget(0, QtGui.QFormLayout.LabelRole, self.web_source_label)
+        self.web_source_combo_box = QtGui.QComboBox(self.web_bible_tab)
+        self.web_source_combo_box.setObjectName('WebSourceComboBox')
+        self.web_source_combo_box.addItems(['', '', ''])
+        self.web_bible_layout.setWidget(0, QtGui.QFormLayout.FieldRole, self.web_source_combo_box)
+        self.web_translation_label = QtGui.QLabel(self.web_bible_tab)
+        self.web_translation_label.setObjectName('web_translation_label')
+        self.web_bible_layout.setWidget(1, QtGui.QFormLayout.LabelRole, self.web_translation_label)
+        self.web_translation_combo_box = QtGui.QComboBox(self.web_bible_tab)
+        self.web_translation_combo_box.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
+        self.web_translation_combo_box.setObjectName('WebTranslationComboBox')
+        self.web_bible_layout.setWidget(1, QtGui.QFormLayout.FieldRole, self.web_translation_combo_box)
+        self.web_tab_widget.addTab(self.web_bible_tab, '')
+        self.web_proxy_tab = QtGui.QWidget()
+        self.web_proxy_tab.setObjectName('WebProxyTab')
+        self.web_proxy_layout = QtGui.QFormLayout(self.web_proxy_tab)
+        self.web_proxy_layout.setObjectName('WebProxyLayout')
+        self.web_server_label = QtGui.QLabel(self.web_proxy_tab)
+        self.web_server_label.setObjectName('WebServerLabel')
+        self.web_proxy_layout.setWidget(0, QtGui.QFormLayout.LabelRole, self.web_server_label)
+        self.web_server_edit = QtGui.QLineEdit(self.web_proxy_tab)
+        self.web_server_edit.setObjectName('WebServerEdit')
+        self.web_proxy_layout.setWidget(0, QtGui.QFormLayout.FieldRole, self.web_server_edit)
+        self.web_user_label = QtGui.QLabel(self.web_proxy_tab)
+        self.web_user_label.setObjectName('WebUserLabel')
+        self.web_proxy_layout.setWidget(1, QtGui.QFormLayout.LabelRole, self.web_user_label)
+        self.web_user_edit = QtGui.QLineEdit(self.web_proxy_tab)
+        self.web_user_edit.setObjectName('WebUserEdit')
+        self.web_proxy_layout.setWidget(1, QtGui.QFormLayout.FieldRole, self.web_user_edit)
+        self.web_password_label = QtGui.QLabel(self.web_proxy_tab)
+        self.web_password_label.setObjectName('WebPasswordLabel')
+        self.web_proxy_layout.setWidget(2, QtGui.QFormLayout.LabelRole, self.web_password_label)
+        self.web_password_edit = QtGui.QLineEdit(self.web_proxy_tab)
+        self.web_password_edit.setObjectName('WebPasswordEdit')
+        self.web_proxy_layout.setWidget(2, QtGui.QFormLayout.FieldRole, self.web_password_edit)
+        self.web_tab_widget.addTab(self.web_proxy_tab, '')
+        self.select_stack.addWidget(self.web_tab_widget)
+        self.select_page_layout.addLayout(self.select_stack)
+        self.addPage(self.select_page)
         # License Page
-        self.licenseDetailsPage = QtGui.QWizardPage()
-        self.licenseDetailsPage.setObjectName('LicenseDetailsPage')
-        self.licenseDetailsLayout = QtGui.QFormLayout(self.licenseDetailsPage)
-        self.licenseDetailsLayout.setObjectName('LicenseDetailsLayout')
-        self.versionNameLabel = QtGui.QLabel(self.licenseDetailsPage)
-        self.versionNameLabel.setObjectName('VersionNameLabel')
-        self.licenseDetailsLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.versionNameLabel)
-        self.versionNameEdit = QtGui.QLineEdit(self.licenseDetailsPage)
-        self.versionNameEdit.setObjectName('VersionNameEdit')
-        self.licenseDetailsLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.versionNameEdit)
-        self.copyrightLabel = QtGui.QLabel(self.licenseDetailsPage)
-        self.copyrightLabel.setObjectName('CopyrightLabel')
-        self.licenseDetailsLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.copyrightLabel)
-        self.copyrightEdit = QtGui.QLineEdit(self.licenseDetailsPage)
-        self.copyrightEdit.setObjectName('CopyrightEdit')
-        self.licenseDetailsLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.copyrightEdit)
-        self.permissionsLabel = QtGui.QLabel(self.licenseDetailsPage)
-        self.permissionsLabel.setObjectName('PermissionsLabel')
-        self.licenseDetailsLayout.setWidget(2, QtGui.QFormLayout.LabelRole,
-            self.permissionsLabel)
-        self.permissionsEdit = QtGui.QLineEdit(self.licenseDetailsPage)
-        self.permissionsEdit.setObjectName('PermissionsEdit')
-        self.licenseDetailsLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.permissionsEdit)
-        self.addPage(self.licenseDetailsPage)
+        self.license_details_page = QtGui.QWizardPage()
+        self.license_details_page.setObjectName('LicenseDetailsPage')
+        self.license_details_layout = QtGui.QFormLayout(self.license_details_page)
+        self.license_details_layout.setObjectName('LicenseDetailsLayout')
+        self.version_name_label = QtGui.QLabel(self.license_details_page)
+        self.version_name_label.setObjectName('VersionNameLabel')
+        self.license_details_layout.setWidget(0, QtGui.QFormLayout.LabelRole, self.version_name_label)
+        self.version_name_edit = QtGui.QLineEdit(self.license_details_page)
+        self.version_name_edit.setObjectName('VersionNameEdit')
+        self.license_details_layout.setWidget(0, QtGui.QFormLayout.FieldRole, self.version_name_edit)
+        self.copyright_label = QtGui.QLabel(self.license_details_page)
+        self.copyright_label.setObjectName('CopyrightLabel')
+        self.license_details_layout.setWidget(1, QtGui.QFormLayout.LabelRole, self.copyright_label)
+        self.copyright_edit = QtGui.QLineEdit(self.license_details_page)
+        self.copyright_edit.setObjectName('CopyrightEdit')
+        self.license_details_layout.setWidget(1, QtGui.QFormLayout.FieldRole, self.copyright_edit)
+        self.permissions_label = QtGui.QLabel(self.license_details_page)
+        self.permissions_label.setObjectName('PermissionsLabel')
+        self.license_details_layout.setWidget(2, QtGui.QFormLayout.LabelRole, self.permissions_label)
+        self.permissions_edit = QtGui.QLineEdit(self.license_details_page)
+        self.permissions_edit.setObjectName('PermissionsEdit')
+        self.license_details_layout.setWidget(2, QtGui.QFormLayout.FieldRole, self.permissions_edit)
+        self.addPage(self.license_details_page)
 
     def retranslateUi(self):
         """
         Allow for localisation of the bible import wizard.
         """
         self.setWindowTitle(translate('BiblesPlugin.ImportWizardForm', 'Bible Import Wizard'))
-        self.title_label.setText(WizardStrings.HeaderStyle %
-            translate('OpenLP.Ui', 'Welcome to the Bible Import Wizard'))
+        self.title_label.setText(WizardStrings.HeaderStyle % translate('OpenLP.Ui',
+                                                                       'Welcome to the Bible Import Wizard'))
         self.information_label.setText(
             translate('BiblesPlugin.ImportWizardForm',
-            'This wizard will help you to import Bibles from a variety of '
-            'formats. Click the next button below to start the process by '
-            'selecting a format to import from.'))
-        self.selectPage.setTitle(WizardStrings.ImportSelect)
-        self.selectPage.setSubTitle(WizardStrings.ImportSelectLong)
-        self.formatLabel.setText(WizardStrings.FormatLabel)
-        self.formatComboBox.setItemText(BibleFormat.OSIS, WizardStrings.OSIS)
-        self.formatComboBox.setItemText(BibleFormat.CSV, WizardStrings.CSV)
-        self.formatComboBox.setItemText(BibleFormat.OpenSong, WizardStrings.OS)
-        self.formatComboBox.setItemText(BibleFormat.WebDownload,
-            translate('BiblesPlugin.ImportWizardForm', 'Web Download'))
-        self.osisFileLabel.setText(translate('BiblesPlugin.ImportWizardForm', 'Bible file:'))
-        self.csvBooksLabel.setText(translate('BiblesPlugin.ImportWizardForm', 'Books file:'))
-        self.csvVersesLabel.setText(translate('BiblesPlugin.ImportWizardForm', 'Verses file:'))
-        self.openSongFileLabel.setText(translate('BiblesPlugin.ImportWizardForm', 'Bible file:'))
-        self.webSourceLabel.setText(translate('BiblesPlugin.ImportWizardForm', 'Location:'))
-        self.webSourceComboBox.setItemText(WebDownload.Crosswalk,
-            translate('BiblesPlugin.ImportWizardForm', 'Crosswalk'))
-        self.webSourceComboBox.setItemText(WebDownload.BibleGateway,
-            translate('BiblesPlugin.ImportWizardForm', 'BibleGateway'))
-        self.webSourceComboBox.setItemText(WebDownload.Bibleserver,
-            translate('BiblesPlugin.ImportWizardForm', 'Bibleserver'))
-        self.webTranslationLabel.setText(translate('BiblesPlugin.ImportWizardForm', 'Bible:'))
-        self.webTabWidget.setTabText(self.webTabWidget.indexOf(self.webBibleTab),
-            translate('BiblesPlugin.ImportWizardForm', 'Download Options'))
-        self.webServerLabel.setText(translate('BiblesPlugin.ImportWizardForm', 'Server:'))
-        self.webUserLabel.setText(translate('BiblesPlugin.ImportWizardForm', 'Username:'))
-        self.webPasswordLabel.setText(translate('BiblesPlugin.ImportWizardForm', 'Password:'))
-        self.webTabWidget.setTabText(self.webTabWidget.indexOf(self.webProxyTab),
-            translate('BiblesPlugin.ImportWizardForm',
-            'Proxy Server (Optional)'))
-        self.licenseDetailsPage.setTitle(
+                      'This wizard will help you to import Bibles from a variety of '
+                      'formats. Click the next button below to start the process by '
+                      'selecting a format to import from.'))
+        self.select_page.setTitle(WizardStrings.ImportSelect)
+        self.select_page.setSubTitle(WizardStrings.ImportSelectLong)
+        self.format_label.setText(WizardStrings.FormatLabel)
+        self.format_combo_box.setItemText(BibleFormat.OSIS, WizardStrings.OSIS)
+        self.format_combo_box.setItemText(BibleFormat.CSV, WizardStrings.CSV)
+        self.format_combo_box.setItemText(BibleFormat.OpenSong, WizardStrings.OS)
+        self.format_combo_box.setItemText(BibleFormat.WebDownload, translate('BiblesPlugin.ImportWizardForm',
+                                                                             'Web Download'))
+        self.osis_file_label.setText(translate('BiblesPlugin.ImportWizardForm', 'Bible file:'))
+        self.csv_books_label.setText(translate('BiblesPlugin.ImportWizardForm', 'Books file:'))
+        self.csv_verses_label.setText(translate('BiblesPlugin.ImportWizardForm', 'Verses file:'))
+        self.open_song_file_label.setText(translate('BiblesPlugin.ImportWizardForm', 'Bible file:'))
+        self.web_source_label.setText(translate('BiblesPlugin.ImportWizardForm', 'Location:'))
+        self.web_source_combo_box.setItemText(WebDownload.Crosswalk, translate('BiblesPlugin.ImportWizardForm',
+                                                                               'Crosswalk'))
+        self.web_source_combo_box.setItemText(WebDownload.BibleGateway, translate('BiblesPlugin.ImportWizardForm',
+                                                                                  'BibleGateway'))
+        self.web_source_combo_box.setItemText(WebDownload.Bibleserver, translate('BiblesPlugin.ImportWizardForm',
+                                                                                 'Bibleserver'))
+        self.web_translation_label.setText(translate('BiblesPlugin.ImportWizardForm', 'Bible:'))
+        self.web_tab_widget.setTabText(self.web_tab_widget.indexOf(self.web_bible_tab),
+                                       translate('BiblesPlugin.ImportWizardForm', 'Download Options'))
+        self.web_server_label.setText(translate('BiblesPlugin.ImportWizardForm', 'Server:'))
+        self.web_user_label.setText(translate('BiblesPlugin.ImportWizardForm', 'Username:'))
+        self.web_password_label.setText(translate('BiblesPlugin.ImportWizardForm', 'Password:'))
+        self.web_tab_widget.setTabText(
+            self.web_tab_widget.indexOf(self.web_proxy_tab), translate('BiblesPlugin.ImportWizardForm',
+                                                                       'Proxy Server (Optional)'))
+        self.license_details_page.setTitle(
             translate('BiblesPlugin.ImportWizardForm', 'License Details'))
-        self.licenseDetailsPage.setSubTitle(translate('BiblesPlugin.ImportWizardForm',
-            'Set up the Bible\'s license details.'))
-        self.versionNameLabel.setText(translate('BiblesPlugin.ImportWizardForm', 'Version name:'))
-        self.copyrightLabel.setText(translate('BiblesPlugin.ImportWizardForm', 'Copyright:'))
-        self.permissionsLabel.setText(translate('BiblesPlugin.ImportWizardForm', 'Permissions:'))
+        self.license_details_page.setSubTitle(translate('BiblesPlugin.ImportWizardForm',
+                                                        'Set up the Bible\'s license details.'))
+        self.version_name_label.setText(translate('BiblesPlugin.ImportWizardForm', 'Version name:'))
+        self.copyright_label.setText(translate('BiblesPlugin.ImportWizardForm', 'Copyright:'))
+        self.permissions_label.setText(translate('BiblesPlugin.ImportWizardForm', 'Permissions:'))
         self.progress_page.setTitle(WizardStrings.Importing)
         self.progress_page.setSubTitle(translate('BiblesPlugin.ImportWizardForm',
-            'Please wait while your Bible is imported.'))
+                                                 'Please wait while your Bible is imported.'))
         self.progress_label.setText(WizardStrings.Ready)
         self.progress_bar.setFormat('%p%')
         # Align all QFormLayouts towards each other.
-        labelWidth = max(self.formatLabel.minimumSizeHint().width(),
-            self.osisFileLabel.minimumSizeHint().width(),
-            self.csvBooksLabel.minimumSizeHint().width(),
-            self.csvVersesLabel.minimumSizeHint().width(),
-            self.openSongFileLabel.minimumSizeHint().width())
-        self.spacer.changeSize(labelWidth, 0, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
+        label_width = max(self.format_label.minimumSizeHint().width(),
+                          self.osis_file_label.minimumSizeHint().width(),
+                          self.csv_books_label.minimumSizeHint().width(),
+                          self.csv_verses_label.minimumSizeHint().width(),
+                          self.open_song_file_label.minimumSizeHint().width())
+        self.spacer.changeSize(label_width, 0, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
 
     def validateCurrentPage(self):
         """
@@ -340,122 +340,130 @@
         """
         if self.currentPage() == self.welcome_page:
             return True
-        elif self.currentPage() == self.selectPage:
+        elif self.currentPage() == self.select_page:
             if self.field('source_format') == BibleFormat.OSIS:
                 if not self.field('osis_location'):
                     critical_error_message_box(UiStrings().NFSs, WizardStrings.YouSpecifyFile % WizardStrings.OSIS)
-                    self.osisFileEdit.setFocus()
+                    self.osis_file_edit.setFocus()
                     return False
             elif self.field('source_format') == BibleFormat.CSV:
                 if not self.field('csv_booksfile'):
-                    critical_error_message_box(UiStrings().NFSs, translate('BiblesPlugin.ImportWizardForm',
-                        'You need to specify a file with books of the Bible to use in the import.'))
-                    self.csvBooksEdit.setFocus()
+                    critical_error_message_box(
+                        UiStrings().NFSs, translate('BiblesPlugin.ImportWizardForm',
+                                                    'You need to specify a file with books of the Bible to use in the '
+                                                    'import.'))
+                    self.csv_books_edit.setFocus()
                     return False
                 elif not self.field('csv_versefile'):
-                    critical_error_message_box(UiStrings().NFSs,
-                        translate('BiblesPlugin.ImportWizardForm',
-                            'You need to specify a file of Bible verses to import.'))
-                    self.csvVersesEdit.setFocus()
+                    critical_error_message_box(
+                        UiStrings().NFSs,
+                        translate('BiblesPlugin.ImportWizardForm', 'You need to specify a file of Bible verses to '
+                                                                   'import.'))
+                    self.csv_verses_edit.setFocus()
                     return False
             elif self.field('source_format') == BibleFormat.OpenSong:
                 if not self.field('opensong_file'):
                     critical_error_message_box(UiStrings().NFSs, WizardStrings.YouSpecifyFile % WizardStrings.OS)
-                    self.openSongFileEdit.setFocus()
+                    self.open_song_file_edit.setFocus()
                     return False
             elif self.field('source_format') == BibleFormat.WebDownload:
-                self.versionNameEdit.setText(self.webTranslationComboBox.currentText())
+                self.version_name_edit.setText(self.web_translation_combo_box.currentText())
                 return True
             return True
-        elif self.currentPage() == self.licenseDetailsPage:
+        elif self.currentPage() == self.license_details_page:
             license_version = self.field('license_version')
             license_copyright = self.field('license_copyright')
             path = AppLocation.get_section_data_path('bibles')
             if not license_version:
-                critical_error_message_box(UiStrings().EmptyField,
+                critical_error_message_box(
+                    UiStrings().EmptyField,
                     translate('BiblesPlugin.ImportWizardForm', 'You need to specify a version name for your Bible.'))
-                self.versionNameEdit.setFocus()
+                self.version_name_edit.setFocus()
                 return False
             elif not license_copyright:
-                critical_error_message_box(UiStrings().EmptyField,
+                critical_error_message_box(
+                    UiStrings().EmptyField,
                     translate('BiblesPlugin.ImportWizardForm', 'You need to set a copyright for your Bible. '
-                        'Bibles in the Public Domain need to be marked as such.'))
-                self.copyrightEdit.setFocus()
+                              'Bibles in the Public Domain need to be marked as such.'))
+                self.copyright_edit.setFocus()
                 return False
             elif self.manager.exists(license_version):
-                critical_error_message_box(translate('BiblesPlugin.ImportWizardForm', 'Bible Exists'),
+                critical_error_message_box(
+                    translate('BiblesPlugin.ImportWizardForm', 'Bible Exists'),
                     translate('BiblesPlugin.ImportWizardForm',
-                        'This Bible already exists. Please import a different Bible or first delete the existing one.'))
-                self.versionNameEdit.setFocus()
+                              'This Bible already exists. Please import a different Bible or first delete the '
+                              'existing one.'))
+                self.version_name_edit.setFocus()
                 return False
-            elif os.path.exists(os.path.join(path, clean_filename(
-                license_version))):
+            elif os.path.exists(os.path.join(path, clean_filename(license_version))):
                 critical_error_message_box(
                     translate('BiblesPlugin.ImportWizardForm', 'Bible Exists'),
                     translate('BiblesPlugin.ImportWizardForm', 'This Bible already exists. Please import '
-                        'a different Bible or first delete the existing one.'))
-                self.versionNameEdit.setFocus()
+                              'a different Bible or first delete the existing one.'))
+                self.version_name_edit.setFocus()
                 return False
             return True
         if self.currentPage() == self.progress_page:
             return True
 
-    def onWebSourceComboBoxIndexChanged(self, index):
+    def on_web_source_combo_box_index_changed(self, index):
         """
-        Setup the list of Bibles when you select a different source on the web
-        download page.
+        Setup the list of Bibles when you select a different source on the web download page.
 
-        ``index``
-            The index of the combo box.
+        :param index: The index of the combo box.
         """
-        self.webTranslationComboBox.clear()
+        self.web_translation_combo_box.clear()
         bibles = list(self.web_bible_list[index].keys())
         bibles.sort(key=get_locale_key)
-        self.webTranslationComboBox.addItems(bibles)
+        self.web_translation_combo_box.addItems(bibles)
 
-    def onOsisBrowseButtonClicked(self):
+    def on_osis_browse_button_clicked(self):
         """
         Show the file open dialog for the OSIS file.
         """
-        self.get_file_name(WizardStrings.OpenTypeFile % WizardStrings.OSIS, self.osisFileEdit, 'last directory import')
+        self.get_file_name(WizardStrings.OpenTypeFile % WizardStrings.OSIS, self.osis_file_edit,
+                           'last directory import')
 
-    def onCsvBooksBrowseButtonClicked(self):
+    def on_csv_books_browse_button_clicked(self):
         """
         Show the file open dialog for the books CSV file.
         """
-        self.get_file_name(WizardStrings.OpenTypeFile % WizardStrings.CSV, self.csvBooksEdit, 'last directory import',
-            '%s (*.csv)' % translate('BiblesPlugin.ImportWizardForm', 'CSV File'))
+        self.get_file_name(
+            WizardStrings.OpenTypeFile % WizardStrings.CSV, self.csv_books_edit, 'last directory import', '%s (*.csv)' %
+            translate('BiblesPlugin.ImportWizardForm', 'CSV File'))
 
-    def onCsvVersesBrowseButtonClicked(self):
+    def on_csv_verses_browse_button_clicked(self):
         """
         Show the file open dialog for the verses CSV file.
         """
-        self.get_file_name(WizardStrings.OpenTypeFile % WizardStrings.CSV, self.csvVersesEdit, 'last directory import',
-            '%s (*.csv)' % translate('BiblesPlugin.ImportWizardForm', 'CSV File'))
+        self.get_file_name(WizardStrings.OpenTypeFile % WizardStrings.CSV, self.csv_verses_edit,
+                           'last directory import', '%s (*.csv)' %
+                                                    translate('BiblesPlugin.ImportWizardForm', 'CSV File'))
 
-    def onOpenSongBrowseButtonClicked(self):
+    def on_open_song_browse_button_clicked(self):
         """
         Show the file open dialog for the OpenSong file.
         """
-        self.get_file_name(WizardStrings.OpenTypeFile % WizardStrings.OS, self.openSongFileEdit, 'last directory import')
+        self.get_file_name(WizardStrings.OpenTypeFile % WizardStrings.OS, self.open_song_file_edit,
+                           'last directory import')
 
     def register_fields(self):
         """
         Register the bible import wizard fields.
         """
-        self.selectPage.registerField('source_format', self.formatComboBox)
-        self.selectPage.registerField('osis_location', self.osisFileEdit)
-        self.selectPage.registerField('csv_booksfile', self.csvBooksEdit)
-        self.selectPage.registerField('csv_versefile', self.csvVersesEdit)
-        self.selectPage.registerField('opensong_file', self.openSongFileEdit)
-        self.selectPage.registerField('web_location', self.webSourceComboBox)
-        self.selectPage.registerField('web_biblename', self.webTranslationComboBox)
-        self.selectPage.registerField('proxy_server', self.webServerEdit)
-        self.selectPage.registerField('proxy_username', self.webUserEdit)
-        self.selectPage.registerField('proxy_password', self.webPasswordEdit)
-        self.licenseDetailsPage.registerField('license_version', self.versionNameEdit)
-        self.licenseDetailsPage.registerField('license_copyright', self.copyrightEdit)
-        self.licenseDetailsPage.registerField('license_permissions', self.permissionsEdit)
+        self.select_page.registerField('source_format', self.format_combo_box)
+        self.select_page.registerField('osis_location', self.osis_file_edit)
+        self.select_page.registerField('csv_booksfile', self.csv_books_edit)
+        self.select_page.registerField('csv_versefile', self.csv_verses_edit)
+        self.select_page.registerField('opensong_file', self.open_song_file_edit)
+        self.select_page.registerField('web_location', self.web_source_combo_box)
+        self.select_page.registerField('web_biblename', self.web_translation_combo_box)
+        self.select_page.registerField('proxy_server', self.web_server_edit)
+        self.select_page.registerField('proxy_username', self.web_user_edit)
+        self.select_page.registerField('proxy_password', self.web_password_edit)
+        self.license_details_page.registerField('license_version', self.version_name_edit)
+        self.license_details_page.registerField('license_copyright', self.copyright_edit)
+        self.license_details_page.registerField('license_permissions', self.permissions_edit)
 
     def setDefaults(self):
         """
@@ -472,33 +480,32 @@
         self.setField('csv_versefile', '')
         self.setField('opensong_file', '')
         self.setField('web_location', WebDownload.Crosswalk)
-        self.setField('web_biblename', self.webTranslationComboBox.currentIndex())
+        self.setField('web_biblename', self.web_translation_combo_box.currentIndex())
         self.setField('proxy_server', settings.value('proxy address'))
         self.setField('proxy_username', settings.value('proxy username'))
         self.setField('proxy_password', settings.value('proxy password'))
-        self.setField('license_version', self.versionNameEdit.text())
-        self.setField('license_copyright', self.copyrightEdit.text())
-        self.setField('license_permissions', self.permissionsEdit.text())
-        self.onWebSourceComboBoxIndexChanged(WebDownload.Crosswalk)
+        self.setField('license_version', self.version_name_edit.text())
+        self.setField('license_copyright', self.copyright_edit.text())
+        self.setField('license_permissions', self.permissions_edit.text())
+        self.on_web_source_combo_box_index_changed(WebDownload.Crosswalk)
         settings.endGroup()
 
-    def loadWebBibles(self):
+    def load_Web_Bibles(self):
         """
         Load the lists of Crosswalk, BibleGateway and Bibleserver bibles.
         """
         # Load Crosswalk Bibles.
-        self.loadBibleResource(WebDownload.Crosswalk)
+        self.load_Bible_Resource(WebDownload.Crosswalk)
         # Load BibleGateway Bibles.
-        self.loadBibleResource(WebDownload.BibleGateway)
+        self.load_Bible_Resource(WebDownload.BibleGateway)
         # Load and Bibleserver Bibles.
-        self.loadBibleResource(WebDownload.Bibleserver)
+        self.load_Bible_Resource(WebDownload.Bibleserver)
 
-    def loadBibleResource(self, download_type):
+    def load_Bible_Resource(self, download_type):
         """
         Loads a web bible from bible_resources.sqlite.
 
-        ``download_type``
-            The WebDownload type e.g. bibleserver.
+        :param download_type: The WebDownload type e.g. bibleserver.
         """
         self.web_bible_list[download_type] = {}
         bibles = BiblesResourcesDB.get_webbibles(WebDownload.Names[download_type])
@@ -530,28 +537,22 @@
         importer = None
         if bible_type == BibleFormat.OSIS:
             # Import an OSIS bible.
-            importer = self.manager.import_bible(BibleFormat.OSIS,
-                name=license_version,
-                filename=self.field('osis_location')
-            )
+            importer = self.manager.import_bible(BibleFormat.OSIS, name=license_version,
+                                                 filename=self.field('osis_location'))
         elif bible_type == BibleFormat.CSV:
             # Import a CSV bible.
-            importer = self.manager.import_bible(BibleFormat.CSV,
-                name=license_version,
-                booksfile=self.field('csv_booksfile'),
-                versefile=self.field('csv_versefile')
-            )
+            importer = self.manager.import_bible(BibleFormat.CSV, name=license_version,
+                                                 booksfile=self.field('csv_booksfile'),
+                                                 versefile=self.field('csv_versefile'))
         elif bible_type == BibleFormat.OpenSong:
             # Import an OpenSong bible.
-            importer = self.manager.import_bible(BibleFormat.OpenSong,
-                name=license_version,
-                filename=self.field('opensong_file')
-            )
+            importer = self.manager.import_bible(BibleFormat.OpenSong, name=license_version,
+                                                 filename=self.field('opensong_file'))
         elif bible_type == BibleFormat.WebDownload:
             # Import a bible from the web.
             self.progress_bar.setMaximum(1)
             download_location = self.field('web_location')
-            bible_version = self.webTranslationComboBox.currentText()
+            bible_version = self.web_translation_combo_box.currentText()
             bible = self.web_bible_list[download_location][bible_version]
             importer = self.manager.import_bible(
                 BibleFormat.WebDownload, name=license_version,
@@ -562,13 +563,12 @@
                 proxy_password=self.field('proxy_password')
             )
         if importer.do_import(license_version):
-            self.manager.save_meta_data(license_version, license_version,
-                license_copyright, license_permissions)
+            self.manager.save_meta_data(license_version, license_version, license_copyright, license_permissions)
             self.manager.reload_bibles()
             if bible_type == BibleFormat.WebDownload:
                 self.progress_label.setText(
                     translate('BiblesPlugin.ImportWizardForm', 'Registered Bible. Please note, that verses will be '
-                    'downloaded on\ndemand and thus an internet connection is required.'))
+                              'downloaded on\ndemand and thus an internet connection is required.'))
             else:
                 self.progress_label.setText(WizardStrings.FinishedImport)
         else:

=== modified file 'openlp/plugins/bibles/forms/bibleupgradeform.py'
--- openlp/plugins/bibles/forms/bibleupgradeform.py	2014-03-17 19:05:55 +0000
+++ openlp/plugins/bibles/forms/bibleupgradeform.py	2014-03-21 21:59:15 +0000
@@ -96,34 +96,34 @@
         if not self.currentPage() == self.progress_page:
             self.done(QtGui.QDialog.Rejected)
 
-    def onCurrentIdChanged(self, pageId):
+    def onCurrentIdChanged(self, page_id):
         """
         Perform necessary functions depending on which wizard page is active.
         """
-        if self.page(pageId) == self.progress_page:
+        if self.page(page_id) == self.progress_page:
             self.pre_wizard()
             self.perform_wizard()
             self.post_wizard()
-        elif self.page(pageId) == self.selectPage and not self.files:
+        elif self.page(page_id) == self.selectPage and not self.files:
             self.next()
 
-    def onBackupBrowseButtonClicked(self):
+    def on_backup_browse_button_clicked(self):
         """
         Show the file open dialog for the OSIS file.
         """
-        filename = QtGui.QFileDialog.getExistingDirectory(self,
-            translate('BiblesPlugin.UpgradeWizardForm', 'Select a Backup Directory'), '')
+        filename = QtGui.QFileDialog.getExistingDirectory(self, translate('BiblesPlugin.UpgradeWizardForm',
+                                                                          'Select a Backup Directory'), '')
         if filename:
             self.backupDirectoryEdit.setText(filename)
 
-    def onNoBackupCheckBoxToggled(self, checked):
+    def on_no_backup_check_box_toggled(self, checked):
         """
         Enable or disable the backup directory widgets.
         """
         self.backupDirectoryEdit.setEnabled(not checked)
         self.backupBrowseButton.setEnabled(not checked)
 
-    def backupOldBibles(self, backup_directory):
+    def backup_old_bibles(self, backup_directory):
         """
         Backup old bible databases in a given folder.
         """
@@ -147,8 +147,8 @@
         """
         Set up the signals used in the bible importer.
         """
-        self.backupBrowseButton.clicked.connect(self.onBackupBrowseButtonClicked)
-        self.noBackupCheckBox.toggled.connect(self.onNoBackupCheckBoxToggled)
+        self.backupBrowseButton.clicked.connect(self.on_backup_browse_button_clicked)
+        self.noBackupCheckBox.toggled.connect(self.on_no_backup_check_box_toggled)
 
     def add_custom_pages(self):
         """
@@ -238,32 +238,34 @@
         Allow for localisation of the bible import wizard.
         """
         self.setWindowTitle(translate('BiblesPlugin.UpgradeWizardForm', 'Bible Upgrade Wizard'))
-        self.title_label.setText(WizardStrings.HeaderStyle %
-            translate('OpenLP.Ui', 'Welcome to the Bible Upgrade Wizard'))
-        self.information_label.setText(translate('BiblesPlugin.UpgradeWizardForm',
-            'This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. '
-            'Click the next button below to start the upgrade process.'))
+        self.title_label.setText(WizardStrings.HeaderStyle % translate('OpenLP.Ui',
+                                                                       'Welcome to the Bible Upgrade Wizard'))
+        self.information_label.setText(
+            translate('BiblesPlugin.UpgradeWizardForm',
+                      'This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. '
+                      'Click the next button below to start the upgrade process.'))
         self.backup_page.setTitle(translate('BiblesPlugin.UpgradeWizardForm', 'Select Backup Directory'))
-        self.backup_page.setSubTitle(translate('BiblesPlugin.UpgradeWizardForm',
-            'Please select a backup directory for your Bibles'))
-        self.backupInfoLabel.setText(translate('BiblesPlugin.UpgradeWizardForm',
-            'Previous releases of OpenLP 2.0 are unable to use upgraded Bibles.'
-            ' This will create a backup of your current Bibles so that you can '
-            'simply copy the files back to your OpenLP data directory if you '
-            'need to revert to a previous release of OpenLP. Instructions on '
-            'how to restore the files can be found in our <a href="'
-            'http://wiki.openlp.org/faq";>Frequently Asked Questions</a>.'))
-        self.selectLabel.setText(translate('BiblesPlugin.UpgradeWizardForm',
-            'Please select a backup location for your Bibles.'))
+        self.backup_page.setSubTitle(
+            translate('BiblesPlugin.UpgradeWizardForm', 'Please select a backup directory for your Bibles'))
+        self.backupInfoLabel.setText(
+            translate('BiblesPlugin.UpgradeWizardForm',
+                      'Previous releases of OpenLP 2.0 are unable to use upgraded Bibles.'
+                      ' This will create a backup of your current Bibles so that you can '
+                      'simply copy the files back to your OpenLP data directory if you '
+                      'need to revert to a previous release of OpenLP. Instructions on '
+                      'how to restore the files can be found in our <a href="'
+                      'http://wiki.openlp.org/faq";>Frequently Asked Questions</a>.'))
+        self.selectLabel.setText(
+            translate('BiblesPlugin.UpgradeWizardForm', 'Please select a backup location for your Bibles.'))
         self.backupDirectoryLabel.setText(translate('BiblesPlugin.UpgradeWizardForm', 'Backup Directory:'))
         self.noBackupCheckBox.setText(
             translate('BiblesPlugin.UpgradeWizardForm', 'There is no need to backup my Bibles'))
         self.selectPage.setTitle(translate('BiblesPlugin.UpgradeWizardForm', 'Select Bibles'))
-        self.selectPage.setSubTitle(translate('BiblesPlugin.UpgradeWizardForm',
-            'Please select the Bibles to upgrade'))
+        self.selectPage.setSubTitle(
+            translate('BiblesPlugin.UpgradeWizardForm', 'Please select the Bibles to upgrade'))
         self.progress_page.setTitle(translate('BiblesPlugin.UpgradeWizardForm', 'Upgrading'))
-        self.progress_page.setSubTitle(translate('BiblesPlugin.UpgradeWizardForm',
-            'Please wait while your Bibles are upgraded.'))
+        self.progress_page.setSubTitle(
+            translate('BiblesPlugin.UpgradeWizardForm', 'Please wait while your Bibles are upgraded.'))
         self.progress_label.setText(WizardStrings.Ready)
         self.progress_bar.setFormat('%p%')
 
@@ -277,16 +279,18 @@
             if not self.noBackupCheckBox.checkState() == QtCore.Qt.Checked:
                 backup_path = self.backupDirectoryEdit.text()
                 if not backup_path:
-                    critical_error_message_box(UiStrings().EmptyField,
-                        translate('BiblesPlugin.UpgradeWizardForm',
-                            'You need to specify a backup directory for your Bibles.'))
+                    critical_error_message_box(
+                        UiStrings().EmptyField,
+                        translate('BiblesPlugin.UpgradeWizardForm', 'You need to specify a backup directory for '
+                                                                    'your Bibles.'))
                     self.backupDirectoryEdit.setFocus()
                     return False
                 else:
-                    if not self.backupOldBibles(backup_path):
-                        critical_error_message_box(UiStrings().Error,
-                            translate('BiblesPlugin.UpgradeWizardForm', 'The backup was not successful.\nTo backup your '
-                                'Bibles you need permission to write to the given directory.'))
+                    if not self.backup_old_bibles(backup_path):
+                        critical_error_message_box(
+                            UiStrings().Error,
+                            translate('BiblesPlugin.UpgradeWizardForm', 'The backup was not successful.\nTo backup '
+                                      'your Bibles you need permission to write to the given directory.'))
                         return False
             return True
         elif self.currentPage() == self.selectPage:
@@ -340,8 +344,8 @@
         self.includeWebBible = False
         proxy_server = None
         if not self.files:
-            self.progress_label.setText(translate('BiblesPlugin.UpgradeWizardForm',
-                    'There are no Bibles that need to be upgraded.'))
+            self.progress_label.setText(
+                translate('BiblesPlugin.UpgradeWizardForm', 'There are no Bibles that need to be upgraded.'))
             self.progress_bar.hide()
             return
         max_bibles = 0
@@ -363,11 +367,11 @@
                 self.success[number] = False
                 continue
             self.progress_bar.reset()
-            old_bible = OldBibleDB(self.media_item, path=self.temp_dir,
-                file=filename[0])
+            old_bible = OldBibleDB(self.media_item, path=self.temp_dir, file=filename[0])
             name = filename[1]
-            self.progress_label.setText(translate('BiblesPlugin.UpgradeWizardForm',
-                'Upgrading Bible %s of %s: "%s"\nUpgrading ...') % (number + 1, max_bibles, name))
+            self.progress_label.setText(
+                translate('BiblesPlugin.UpgradeWizardForm',
+                          'Upgrading Bible %s of %s: "%s"\nUpgrading ...') % (number + 1, max_bibles, name))
             self.new_bibles[number] = BibleDB(self.media_item, path=self.path, name=name, file=filename[0])
             self.new_bibles[number].register(self.plugin.upgrade_wizard)
             metadata = old_bible.get_metadata()
@@ -404,7 +408,7 @@
                     critical_error_message_box(
                         translate('BiblesPlugin.UpgradeWizardForm', 'Download Error'),
                         translate('BiblesPlugin.UpgradeWizardForm',
-                            'To upgrade your Web Bibles an Internet connection is required.'))
+                                  'To upgrade your Web Bibles an Internet connection is required.'))
                     self.increment_progress_bar(translate(
                         'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\nFailed') %
                         (number + 1, max_bibles, name), self.progress_bar.maximum() - self.progress_bar.value())
@@ -415,16 +419,16 @@
                     meta_data['download_source'].lower())
                 if bible and bible['language_id']:
                     language_id = bible['language_id']
-                    self.new_bibles[number].save_meta('language_id',
-                        language_id)
+                    self.new_bibles[number].save_meta('language_id', language_id)
                 else:
                     language_id = self.new_bibles[number].get_language(name)
                 if not language_id:
                     log.warn('Upgrading from "%s" failed' % filename[0])
                     self.new_bibles[number].session.close()
                     del self.new_bibles[number]
-                    self.increment_progress_bar(translate('BiblesPlugin.UpgradeWizardForm',
-                        'Upgrading Bible %s of %s: "%s"\nFailed') % (number + 1, max_bibles, name),
+                    self.increment_progress_bar(
+                        translate('BiblesPlugin.UpgradeWizardForm',
+                                  'Upgrading Bible %s of %s: "%s"\nFailed') % (number + 1, max_bibles, name),
                         self.progress_bar.maximum() - self.progress_bar.value())
                     self.success[number] = False
                     continue
@@ -433,8 +437,10 @@
                     if self.stop_import_flag:
                         self.success[number] = False
                         break
-                    self.increment_progress_bar(translate('BiblesPlugin.UpgradeWizardForm',
-                        'Upgrading Bible %s of %s: "%s"\nUpgrading %s ...') % (number + 1, max_bibles, name, book))
+                    self.increment_progress_bar(
+                        translate('BiblesPlugin.UpgradeWizardForm',
+                                  'Upgrading Bible %s of %s: "%s"\nUpgrading %s ...') %
+                        (number + 1, max_bibles, name, book))
                     book_ref_id = self.new_bibles[number].\
                         get_book_ref_id_by_name(book, len(books), language_id)
                     if not book_ref_id:
@@ -445,8 +451,7 @@
                         self.success[number] = False
                         break
                     book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
-                    db_book = self.new_bibles[number].create_book(book,
-                        book_ref_id, book_details['testament_id'])
+                    db_book = self.new_bibles[number].create_book(book, book_ref_id, book_details['testament_id'])
                     # Try to import already downloaded verses.
                     oldbook = old_bible.get_book(book)
                     if oldbook:
@@ -458,9 +463,8 @@
                             if self.stop_import_flag:
                                 self.success[number] = False
                                 break
-                            self.new_bibles[number].create_verse(db_book.id,
-                                int(verse['chapter']),
-                                int(verse['verse']), str(verse['text']))
+                            self.new_bibles[number].create_verse(db_book.id, int(verse['chapter']),
+                                                                 int(verse['verse']), str(verse['text']))
                             self.application.process_events()
                         self.new_bibles[number].session.commit()
             else:
@@ -471,8 +475,9 @@
                     log.warn('Upgrading books from "%s" failed' % name)
                     self.new_bibles[number].session.close()
                     del self.new_bibles[number]
-                    self.increment_progress_bar(translate('BiblesPlugin.UpgradeWizardForm',
-                        'Upgrading Bible %s of %s: "%s"\nFailed') % (number + 1, max_bibles, name),
+                    self.increment_progress_bar(
+                        translate('BiblesPlugin.UpgradeWizardForm',
+                                  'Upgrading Bible %s of %s: "%s"\nFailed') % (number + 1, max_bibles, name),
                         self.progress_bar.maximum() - self.progress_bar.value())
                     self.success[number] = False
                     continue
@@ -482,8 +487,9 @@
                     if self.stop_import_flag:
                         self.success[number] = False
                         break
-                    self.increment_progress_bar(translate('BiblesPlugin.UpgradeWizardForm',
-                        'Upgrading Bible %s of %s: "%s"\nUpgrading %s ...') %
+                    self.increment_progress_bar(
+                        translate('BiblesPlugin.UpgradeWizardForm',
+                                  'Upgrading Bible %s of %s: "%s"\nUpgrading %s ...') %
                         (number + 1, max_bibles, name, book['name']))
                     book_ref_id = self.new_bibles[number].get_book_ref_id_by_name(book['name'], len(books), language_id)
                     if not book_ref_id:
@@ -493,8 +499,8 @@
                         self.success[number] = False
                         break
                     book_details = BiblesResourcesDB.get_book_by_id(book_ref_id)
-                    db_book = self.new_bibles[number].create_book(book['name'],
-                        book_ref_id, book_details['testament_id'])
+                    db_book = self.new_bibles[number].create_book(book['name'], book_ref_id,
+                                                                  book_details['testament_id'])
                     verses = old_bible.get_verses(book['id'])
                     if not verses:
                         log.warn('No verses found to import for book "%s"', book['name'])
@@ -504,20 +510,21 @@
                         if self.stop_import_flag:
                             self.success[number] = False
                             break
-                        self.new_bibles[number].create_verse(db_book.id,
-                            int(verse['chapter']),
-                            int(verse['verse']), str(verse['text']))
+                        self.new_bibles[number].create_verse(db_book.id, int(verse['chapter']), int(verse['verse']),
+                                                             str(verse['text']))
                         self.application.process_events()
                     self.new_bibles[number].session.commit()
             if not self.success.get(number, True):
-                self.increment_progress_bar(translate('BiblesPlugin.UpgradeWizardForm',
-                    'Upgrading Bible %s of %s: "%s"\nFailed') % (number + 1, max_bibles, name),
+                self.increment_progress_bar(
+                    translate('BiblesPlugin.UpgradeWizardForm',
+                              'Upgrading Bible %s of %s: "%s"\nFailed') % (number + 1, max_bibles, name),
                     self.progress_bar.maximum() - self.progress_bar.value())
             else:
                 self.success[number] = True
                 self.new_bibles[number].save_meta('name', name)
-                self.increment_progress_bar(translate('BiblesPlugin.UpgradeWizardForm',
-                    'Upgrading Bible %s of %s: "%s"\nComplete') % (number + 1, max_bibles, name))
+                self.increment_progress_bar(
+                    translate('BiblesPlugin.UpgradeWizardForm',
+                              'Upgrading Bible %s of %s: "%s"\nComplete') % (number + 1, max_bibles, name))
             if number in self.new_bibles:
                 self.new_bibles[number].session.close()
         # Close the last bible's connection if possible.
@@ -545,12 +552,15 @@
             failed_import_text = ''
         if successful_import > 0:
             if self.includeWebBible:
-                self.progress_label.setText(translate('BiblesPlugin.UpgradeWizardForm',
-                    'Upgrading Bible(s): %s successful%s\nPlease note that verses from Web Bibles will be downloaded '
-                    'on demand and so an Internet connection is required.') % (successful_import, failed_import_text))
+                self.progress_label.setText(
+                    translate('BiblesPlugin.UpgradeWizardForm',
+                              'Upgrading Bible(s): %s successful%s\nPlease note that verses from Web Bibles will be '
+                              'downloaded on demand and so an Internet connection is required.') %
+                    (successful_import, failed_import_text))
             else:
-                self.progress_label.setText(translate('BiblesPlugin.UpgradeWizardForm',
-                    'Upgrading Bible(s): %s successful%s') % (successful_import, failed_import_text))
+                self.progress_label.setText(
+                    translate('BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible(s): %s successful%s') % (
+                        successful_import, failed_import_text))
         else:
             self.progress_label.setText(translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade failed.'))
         # Remove temp directory.

=== modified file 'openlp/plugins/bibles/forms/booknamedialog.py'
--- openlp/plugins/bibles/forms/booknamedialog.py	2013-12-24 08:56:50 +0000
+++ openlp/plugins/bibles/forms/booknamedialog.py	2014-03-21 21:59:15 +0000
@@ -32,6 +32,7 @@
 from openlp.core.common import translate
 from openlp.core.lib.ui import create_button_box
 
+
 class Ui_BookNameDialog(object):
     def setupUi(self, book_name_dialog):
         book_name_dialog.setObjectName('book_name_dialog')
@@ -48,15 +49,15 @@
         self.corresponding_layout.setColumnStretch(1, 1)
         self.corresponding_layout.setSpacing(8)
         self.corresponding_layout.setObjectName('corresponding_layout')
-        self.currentLabel = QtGui.QLabel(book_name_dialog)
-        self.currentLabel.setObjectName('currentLabel')
-        self.corresponding_layout.addWidget(self.currentLabel, 0, 0, 1, 1)
+        self.current_label = QtGui.QLabel(book_name_dialog)
+        self.current_label.setObjectName('current_label')
+        self.corresponding_layout.addWidget(self.current_label, 0, 0, 1, 1)
         self.current_book_label = QtGui.QLabel(book_name_dialog)
         self.current_book_label.setObjectName('current_book_label')
         self.corresponding_layout.addWidget(self.current_book_label, 0, 1, 1, 1)
-        self.correspondingLabel = QtGui.QLabel(book_name_dialog)
-        self.correspondingLabel.setObjectName('correspondingLabel')
-        self.corresponding_layout.addWidget(self.correspondingLabel, 1, 0, 1, 1)
+        self.corresponding_label = QtGui.QLabel(book_name_dialog)
+        self.corresponding_label.setObjectName('corresponding_label')
+        self.corresponding_layout.addWidget(self.corresponding_label, 1, 0, 1, 1)
         self.corresponding_combo_box = QtGui.QComboBox(book_name_dialog)
         self.corresponding_combo_box.setObjectName('corresponding_combo_box')
         self.corresponding_layout.addWidget(self.corresponding_combo_box, 1, 1, 1, 1)
@@ -87,11 +88,11 @@
 
     def retranslateUi(self, book_name_dialog):
         book_name_dialog.setWindowTitle(translate('BiblesPlugin.BookNameDialog', 'Select Book Name'))
-        self.info_label.setText(translate('BiblesPlugin.BookNameDialog',
-            'The following book name cannot be matched up internally. '
-            'Please select the corresponding name from the list.'))
-        self.currentLabel.setText(translate('BiblesPlugin.BookNameDialog', 'Current name:'))
-        self.correspondingLabel.setText(translate('BiblesPlugin.BookNameDialog', 'Corresponding name:'))
+        self.info_label.setText(
+            translate('BiblesPlugin.BookNameDialog', 'The following book name cannot be matched up internally. '
+                      'Please select the corresponding name from the list.'))
+        self.current_label.setText(translate('BiblesPlugin.BookNameDialog', 'Current name:'))
+        self.corresponding_label.setText(translate('BiblesPlugin.BookNameDialog', 'Corresponding name:'))
         self.options_group_box.setTitle(translate('BiblesPlugin.BookNameDialog', 'Show Books From'))
         self.old_testament_check_box.setText(translate('BiblesPlugin.BookNameDialog', 'Old Testament'))
         self.new_testament_check_box.setText(translate('BiblesPlugin.BookNameDialog', 'New Testament'))

=== modified file 'openlp/plugins/bibles/forms/booknameform.py'
--- openlp/plugins/bibles/forms/booknameform.py	2013-12-24 08:56:50 +0000
+++ openlp/plugins/bibles/forms/booknameform.py	2014-03-21 21:59:15 +0000
@@ -52,7 +52,7 @@
     """
     log.info('BookNameForm loaded')
 
-    def __init__(self, parent = None):
+    def __init__(self, parent=None):
         """
         Constructor
         """
@@ -66,11 +66,11 @@
         """
         Set up the signals used in the booknameform.
         """
-        self.old_testament_check_box.stateChanged.connect(self.onCheckBoxIndexChanged)
-        self.new_testament_check_box.stateChanged.connect(self.onCheckBoxIndexChanged)
-        self.apocrypha_check_box.stateChanged.connect(self.onCheckBoxIndexChanged)
+        self.old_testament_check_box.stateChanged.connect(self.on_check_box_index_changed)
+        self.new_testament_check_box.stateChanged.connect(self.on_check_box_index_changed)
+        self.apocrypha_check_box.stateChanged.connect(self.on_check_box_index_changed)
 
-    def onCheckBoxIndexChanged(self, index):
+    def on_check_box_index_changed(self, index):
         """
         Reload Combobox if CheckBox state has changed
         """
@@ -119,7 +119,8 @@
             cor_book = self.corresponding_combo_box.currentText()
             for character in '\\.^$*+?{}[]()':
                 cor_book = cor_book.replace(character, '\\' + character)
-            books = [key for key in list(self.book_names.keys()) if re.match(cor_book, str(self.book_names[key]), re.UNICODE)]
+            books = [key for key in list(self.book_names.keys()) if re.match(cor_book, str(self.book_names[key]),
+                                                                             re.UNICODE)]
             books = [_f for _f in map(BiblesResourcesDB.get_book, books) if _f]
             if books:
                 self.book_id = books[0]['id']

=== modified file 'openlp/plugins/bibles/forms/editbibledialog.py'
--- openlp/plugins/bibles/forms/editbibledialog.py	2013-12-24 08:56:50 +0000
+++ openlp/plugins/bibles/forms/editbibledialog.py	2014-03-21 21:59:15 +0000
@@ -107,7 +107,7 @@
         self.book_name_widget_layout = QtGui.QFormLayout(self.book_name_widget)
         self.book_name_widget_layout.setObjectName('book_name_widget_layout')
         self.book_name_label = {}
-        self.book_name_edit= {}
+        self.book_name_edit = {}
         for book in BiblesResourcesDB.get_books():
             self.book_name_label[book['abbreviation']] = QtGui.QLabel(self.book_name_widget)
             self.book_name_label[book['abbreviation']].setObjectName('book_name_label[%s]' % book['abbreviation'])
@@ -131,24 +131,28 @@
         self.book_names = BibleStrings().BookNames
         edit_bible_dialog.setWindowTitle(translate('BiblesPlugin.EditBibleForm', 'Bible Editor'))
         # Meta tab
-        self.bible_tab_widget.setTabText( self.bible_tab_widget.indexOf(self.meta_tab),
-            translate('SongsPlugin.EditBibleForm', 'Meta Data'))
+        self.bible_tab_widget.setTabText(
+            self.bible_tab_widget.indexOf(self.meta_tab), translate('SongsPlugin.EditBibleForm', 'Meta Data'))
         self.license_details_group_box.setTitle(translate('BiblesPlugin.EditBibleForm', 'License Details'))
         self.version_name_label.setText(translate('BiblesPlugin.EditBibleForm', 'Version name:'))
         self.copyright_label.setText(translate('BiblesPlugin.EditBibleForm', 'Copyright:'))
         self.permissions_label.setText(translate('BiblesPlugin.EditBibleForm', 'Permissions:'))
         self.language_selection_group_box.setTitle(translate('BiblesPlugin.EditBibleForm', 'Default Bible Language'))
-        self.language_selection_label.setText(translate('BiblesPlugin.EditBibleForm',
-            'Book name language in search field, search results and on display:'))
+        self.language_selection_label.setText(
+            translate('BiblesPlugin.EditBibleForm', 'Book name language in search field, search results and '
+                                                    'on display:'))
         self.language_selection_combo_box.setItemText(0, translate('BiblesPlugin.EditBibleForm', 'Global Settings'))
-        self.language_selection_combo_box.setItemText(LanguageSelection.Bible + 1,
+        self.language_selection_combo_box.setItemText(
+            LanguageSelection.Bible + 1,
             translate('BiblesPlugin.EditBibleForm', 'Bible Language'))
-        self.language_selection_combo_box.setItemText(LanguageSelection.Application + 1,
-            translate('BiblesPlugin.EditBibleForm', 'Application Language'))
-        self.language_selection_combo_box.setItemText(LanguageSelection.English + 1,
+        self.language_selection_combo_box.setItemText(
+            LanguageSelection.Application + 1, translate('BiblesPlugin.EditBibleForm', 'Application Language'))
+        self.language_selection_combo_box.setItemText(
+            LanguageSelection.English + 1,
             translate('BiblesPlugin.EditBibleForm', 'English'))
         # Book name tab
-        self.bible_tab_widget.setTabText(self.bible_tab_widget.indexOf(self.book_name_tab),
+        self.bible_tab_widget.setTabText(
+            self.bible_tab_widget.indexOf(self.book_name_tab),
             translate('SongsPlugin.EditBibleForm', 'Custom Book Names'))
         for book in BiblesResourcesDB.get_books():
             self.book_name_label[book['abbreviation']].setText('%s:' % str(self.book_names[book['abbreviation']]))

=== modified file 'openlp/plugins/bibles/forms/editbibleform.py'
--- openlp/plugins/bibles/forms/editbibleform.py	2014-03-18 20:36:02 +0000
+++ openlp/plugins/bibles/forms/editbibleform.py	2014-03-21 21:59:15 +0000
@@ -176,7 +176,7 @@
             critical_error_message_box(
                 UiStrings().EmptyField,
                 translate('BiblesPlugin.BibleEditForm', 'You need to specify a book name for "%s".') %
-                           self.book_names[abbreviation])
+                self.book_names[abbreviation])
             return False
         elif not book_regex.match(new_book_name):
             self.book_name_edit[abbreviation].setFocus()

=== modified file 'openlp/plugins/bibles/forms/languagedialog.py'
--- openlp/plugins/bibles/forms/languagedialog.py	2013-12-24 08:56:50 +0000
+++ openlp/plugins/bibles/forms/languagedialog.py	2014-03-21 21:59:15 +0000
@@ -32,6 +32,7 @@
 from openlp.core.common import translate
 from openlp.core.lib.ui import create_button_box
 
+
 class Ui_LanguageDialog(object):
     def setupUi(self, language_dialog):
         language_dialog.setObjectName('language_dialog')
@@ -54,11 +55,11 @@
         self.language_label.setObjectName('language_label')
         self.language_h_box_layout.addWidget(self.language_label)
         self.language_combo_box = QtGui.QComboBox(language_dialog)
-        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.language_combo_box.sizePolicy().hasHeightForWidth())
-        self.language_combo_box.setSizePolicy(sizePolicy)
+        size_policy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed)
+        size_policy.setHorizontalStretch(0)
+        size_policy.setVerticalStretch(0)
+        size_policy.setHeightForWidth(self.language_combo_box.sizePolicy().hasHeightForWidth())
+        self.language_combo_box.setSizePolicy(size_policy)
         self.language_combo_box.setObjectName('language_combo_box')
         self.language_h_box_layout.addWidget(self.language_combo_box)
         self.language_layout.addLayout(self.language_h_box_layout)
@@ -70,7 +71,8 @@
     def retranslateUi(self, language_dialog):
         language_dialog.setWindowTitle(translate('BiblesPlugin.LanguageDialog', 'Select Language'))
         self.bible_label.setText(translate('BiblesPlugin.LanguageDialog', ''))
-        self.info_label.setText(translate('BiblesPlugin.LanguageDialog',
-            'OpenLP is unable to determine the language of this translation of the Bible. Please select the language '
-            'from the list below.'))
+        self.info_label.setText(
+            translate('BiblesPlugin.LanguageDialog',
+                      'OpenLP is unable to determine the language of this translation of the Bible. Please select '
+                      'the language from the list below.'))
         self.language_label.setText(translate('BiblesPlugin.LanguageDialog', 'Language:'))

=== modified file 'openlp/plugins/bibles/forms/languageform.py'
--- openlp/plugins/bibles/forms/languageform.py	2013-12-24 08:56:50 +0000
+++ openlp/plugins/bibles/forms/languageform.py	2014-03-21 21:59:15 +0000
@@ -36,8 +36,7 @@
 
 from openlp.core.common import translate
 from openlp.core.lib.ui import critical_error_message_box
-from openlp.plugins.bibles.forms.languagedialog import \
-    Ui_LanguageDialog
+from openlp.plugins.bibles.forms.languagedialog import Ui_LanguageDialog
 from openlp.plugins.bibles.lib.db import BiblesResourcesDB
 
 

=== modified file 'openlp/plugins/bibles/lib/__init__.py'
--- openlp/plugins/bibles/lib/__init__.py	2014-03-11 20:10:46 +0000
+++ openlp/plugins/bibles/lib/__init__.py	2014-03-21 21:59:15 +0000
@@ -218,9 +218,10 @@
     REFERENCE_MATCHES['range'] = re.compile('^\s*%s\s*$' % range_regex, re.UNICODE)
     REFERENCE_MATCHES['range_separator'] = re.compile(REFERENCE_SEPARATORS['sep_l'], re.UNICODE)
     # full reference match: <book>(<range>(,(?!$)|(?=$)))+
-    REFERENCE_MATCHES['full'] = re.compile('^\s*(?!\s)(?P<book>[\d]*[^\d]+)(?<!\s)\s*'
-        '(?P<ranges>(?:%(range_regex)s(?:%(sep_l)s(?!\s*$)|(?=\s*$)))+)\s*$' \
-        % dict(list(REFERENCE_SEPARATORS.items()) + [('range_regex', range_regex)]), re.UNICODE)
+    REFERENCE_MATCHES['full'] = \
+        re.compile('^\s*(?!\s)(?P<book>[\d]*[^\d]+)(?<!\s)\s*'
+                   '(?P<ranges>(?:%(range_regex)s(?:%(sep_l)s(?!\s*$)|(?=\s*$)))+)\s*$'
+                   % dict(list(REFERENCE_SEPARATORS.items()) + [('range_regex', range_regex)]), re.UNICODE)
 
 
 def get_reference_separator(separator_type):

=== modified file 'openlp/plugins/bibles/lib/biblestab.py'
--- openlp/plugins/bibles/lib/biblestab.py	2014-03-08 22:02:34 +0000
+++ openlp/plugins/bibles/lib/biblestab.py	2014-03-21 21:59:15 +0000
@@ -422,7 +422,7 @@
             color.setAlpha(128)
         palette.setColor(QtGui.QPalette.Active, QtGui.QPalette.Text, color)
         return palette
-    
+
     def check_is_verse_number_visible(self):
         """
         Enables / Disables verse settings dependent on is_verse_number_visible
@@ -430,4 +430,3 @@
         self.new_chapters_check_box.setEnabled(self.is_verse_number_visible)
         self.display_style_label.setEnabled(self.is_verse_number_visible)
         self.display_style_combo_box.setEnabled(self.is_verse_number_visible)
-

=== modified file 'openlp/plugins/bibles/lib/db.py'
--- openlp/plugins/bibles/lib/db.py	2014-03-18 20:36:02 +0000
+++ openlp/plugins/bibles/lib/db.py	2014-03-21 21:59:15 +0000
@@ -80,23 +80,20 @@
 
     meta_table = Table('metadata', metadata,
                        Column('key', types.Unicode(255), primary_key=True, index=True),
-                       Column('value', types.Unicode(255)),
-    )
+                       Column('value', types.Unicode(255)),)
 
     book_table = Table('book', metadata,
                        Column('id', types.Integer, primary_key=True),
                        Column('book_reference_id', types.Integer, index=True),
                        Column('testament_reference_id', types.Integer),
-                       Column('name', types.Unicode(50), index=True),
-    )
+                       Column('name', types.Unicode(50), index=True),)
     verse_table = Table('verse', metadata,
                         Column('id', types.Integer, primary_key=True, index=True),
                         Column('book_id', types.Integer, ForeignKey(
                             'book.id'), index=True),
                         Column('chapter', types.Integer, index=True),
                         Column('verse', types.Integer, index=True),
-                        Column('text', types.UnicodeText, index=True),
-    )
+                        Column('text', types.UnicodeText, index=True),)
 
     try:
         class_mapper(BibleMeta)
@@ -225,7 +222,8 @@
 
         :param book_id: The id of the book being appended.
         :param chapter: The chapter number.
-        :param text_list: A dict of the verses to be inserted. The key is the verse number, and the value is the verse text.
+        :param text_list: A dict of the verses to be inserted. The key is the verse number, and the value is the
+        verse text.
         """
         log.debug('BibleDBcreate_chapter("%s", "%s")', book_id, chapter)
         # Text list has book and chapter as first two elements of the array.
@@ -437,7 +435,7 @@
         """
         log.debug('BibleDB.get_chapter_count("%s")', book.name)
         count = self.session.query(func.max(Verse.chapter)).join(Book).filter(
-            Book.book_reference_id==book.book_reference_id).scalar()
+            Book.book_reference_id == book.book_reference_id).scalar()
         if not count:
             return 0
         return count
@@ -718,8 +716,8 @@
         if not isinstance(source, str):
             source = str(source)
         source = BiblesResourcesDB.get_download_source(source)
-        bibles = BiblesResourcesDB.run_sql('SELECT id, name, abbreviation, '
-            'language_id, download_source_id FROM webbibles WHERE download_source_id = ?', (source['id'],))
+        bibles = BiblesResourcesDB.run_sql('SELECT id, name, abbreviation, language_id, download_source_id '
+                                           'FROM webbibles WHERE download_source_id = ?', (source['id'],))
         if bibles:
             return [{
                 'id': bible[0],
@@ -824,10 +822,9 @@
         log.debug('BiblesResourcesDB.get_testament_reference()')
         testaments = BiblesResourcesDB.run_sql('SELECT id, name FROM testament_reference ORDER BY id')
         return [
-            {
-            'id': testament[0],
-            'name': str(testament[1])
-            }
+            {'id': testament[0],
+             'name': str(testament[1])
+             }
             for testament in testaments
         ]
 
@@ -934,7 +931,7 @@
         QtCore.QObject.__init__(self)
         if 'path' not in kwargs:
             raise KeyError('Missing keyword argument "path".')
-        if  'file' not in kwargs:
+        if 'file' not in kwargs:
             raise KeyError('Missing keyword argument "file".')
         if 'path' in kwargs:
             self.path = kwargs['path']

=== modified file 'openlp/plugins/bibles/lib/http.py'
--- openlp/plugins/bibles/lib/http.py	2014-03-18 20:36:02 +0000
+++ openlp/plugins/bibles/lib/http.py	2014-03-21 21:59:15 +0000
@@ -32,7 +32,9 @@
 import logging
 import re
 import socket
-import urllib.request, urllib.parse, urllib.error
+import urllib.request
+import urllib.parse
+import urllib.error
 from html.parser import HTMLParseError
 
 from bs4 import BeautifulSoup, NavigableString, Tag
@@ -487,7 +489,7 @@
                       (self.download_source, self.download_name))
             return False
         self.wizard.progress_bar.setMaximum(len(books) + 2)
-        self.wizard.increment_progress_bar(translate( 'BiblesPlugin.HTTPBible', 'Registering Language...'))
+        self.wizard.increment_progress_bar(translate('BiblesPlugin.HTTPBible', 'Registering Language...'))
         bible = BiblesResourcesDB.get_webbible(self.download_name, self.download_source.lower())
         if bible['language_id']:
             language_id = bible['language_id']

=== modified file 'openlp/plugins/bibles/lib/mediaitem.py'
--- openlp/plugins/bibles/lib/mediaitem.py	2014-03-17 19:05:55 +0000
+++ openlp/plugins/bibles/lib/mediaitem.py	2014-03-21 21:59:15 +0000
@@ -664,7 +664,7 @@
                     db_book = bibles[second_bible].get_book_by_book_ref_id(verse.book.book_reference_id)
                     if not db_book:
                         log.debug('Passage "%s %d:%d" not found in Second Bible' %
-                            (verse.book.name, verse.chapter, verse.verse))
+                                  (verse.book.name, verse.chapter, verse.verse))
                         passage_not_found = True
                         count += 1
                         continue
@@ -910,8 +910,8 @@
         elif old_verse + 1 != verse and old_chapter == chapter:
             # We are still in the same chapter, but a verse has been skipped.
             return True
-        elif old_chapter + 1 == chapter and (verse != 1 or
-            old_verse != self.plugin.manager.get_verse_count(old_bible, old_book, old_chapter)):
+        elif old_chapter + 1 == chapter and (verse != 1 or old_verse !=
+                                             self.plugin.manager.get_verse_count(old_bible, old_book, old_chapter)):
             # We are in the following chapter, but the last verse was not the
             # last verse of the chapter or the current verse is not the
             # first one of the chapter.

=== modified file 'openlp/plugins/custom/forms/editcustomslidedialog.py'
--- openlp/plugins/custom/forms/editcustomslidedialog.py	2013-12-24 08:56:50 +0000
+++ openlp/plugins/custom/forms/editcustomslidedialog.py	2014-03-21 21:59:15 +0000
@@ -33,6 +33,7 @@
 from openlp.core.lib import SpellTextEdit
 from openlp.core.lib.ui import create_button, create_button_box
 
+
 class Ui_CustomSlideEditDialog(object):
     def setupUi(self, custom_slide_edit_dialog):
         custom_slide_edit_dialog.setObjectName('custom_slide_edit_dialog')
@@ -45,7 +46,7 @@
         self.insert_button = create_button(custom_slide_edit_dialog, 'insertButton',
                                            icon=':/general/general_add.png')
         self.button_box = create_button_box(custom_slide_edit_dialog, 'button_box', ['cancel', 'save'],
-            [self.split_button, self.insert_button])
+                                            [self.split_button, self.insert_button])
         self.dialog_layout.addWidget(self.button_box)
         self.retranslateUi(custom_slide_edit_dialog)
 

=== modified file 'openlp/plugins/custom/lib/mediaitem.py'
--- openlp/plugins/custom/lib/mediaitem.py	2014-01-01 10:56:23 +0000
+++ openlp/plugins/custom/lib/mediaitem.py	2014-03-21 21:59:15 +0000
@@ -33,8 +33,8 @@
 from sqlalchemy.sql import or_, func, and_
 
 from openlp.core.common import Registry, Settings, UiStrings, translate
-from openlp.core.lib import MediaManagerItem, ItemCapabilities, ServiceItemContext, PluginStatus,\
-   check_item_selected
+from openlp.core.lib import MediaManagerItem, ItemCapabilities, ServiceItemContext, PluginStatus, \
+    check_item_selected
 from openlp.plugins.custom.forms.editcustomform import EditCustomForm
 from openlp.plugins.custom.lib import CustomXMLParser, CustomXMLBuilder
 from openlp.plugins.custom.lib.db import CustomSlide
@@ -105,12 +105,10 @@
         """
         Initialise the UI so it can provide Searches
         """
-        self.search_text_edit.set_search_types([(CustomSearch.Titles, ':/songs/song_search_title.png',
-                                                translate('SongsPlugin.MediaItem', 'Titles'),
-                                                translate('SongsPlugin.MediaItem', 'Search Titles...')),
-                                                (CustomSearch.Themes, ':/slides/slide_theme.png', UiStrings().Themes,
-                                                UiStrings().SearchThemes)
-                                                ])
+        self.search_text_edit.set_search_types(
+            [(CustomSearch.Titles, ':/songs/song_search_title.png', translate('SongsPlugin.MediaItem', 'Titles'),
+              translate('SongsPlugin.MediaItem', 'Search Titles...')),
+             (CustomSearch.Themes, ':/slides/slide_theme.png', UiStrings().Themes, UiStrings().SearchThemes)])
         self.search_text_edit.set_current_search_type(Settings().value('%s/last search type' % self.settings_section))
         self.load_list(self.plugin.db_manager.get_all_objects(CustomSlide, order_by_ref=CustomSlide.title))
         self.config_update()
@@ -191,10 +189,9 @@
             if QtGui.QMessageBox.question(self, UiStrings().ConfirmDelete,
                                           translate('CustomPlugin.MediaItem',
                                                     'Are you sure you want to delete the %n selected custom slide(s)?',
-                                                    '',
-                                          QtCore.QCoreApplication.CodecForTr, len(items)),
-                                          QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes
-                                                  | QtGui.QMessageBox.No),
+                                                    '', QtCore.QCoreApplication.CodecForTr, len(items)),
+                                          QtGui.QMessageBox.StandardButtons(
+                                              QtGui.QMessageBox.Yes | QtGui.QMessageBox.No),
                                           QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No:
                 return
             row_list = [item.row() for item in self.list_view.selectedIndexes()]
@@ -348,4 +345,3 @@
                                                                     func.lower(CustomSlide.text).like(search)),
                                                                 order_by_ref=CustomSlide.title)
         return [[custom.id, custom.title] for custom in search_results]
-

=== modified file 'openlp/plugins/images/forms/addgroupform.py'
--- openlp/plugins/images/forms/addgroupform.py	2014-03-08 20:39:36 +0000
+++ openlp/plugins/images/forms/addgroupform.py	2014-03-21 21:59:15 +0000
@@ -50,7 +50,8 @@
         Show the form.
 
         :param clear:  Set to False if the text input box should not be cleared when showing the dialog (default: True).
-        :param show_top_level_group:  Set to True when "-- Top level group --" should be showed as first item (default: False).
+        :param show_top_level_group:  Set to True when "-- Top level group --" should be showed as first item
+        (default: False).
         :param selected_group: The ID of the group that should be selected by default when showing the dialog.
         """
         if clear:

=== modified file 'openlp/plugins/images/lib/mediaitem.py'
--- openlp/plugins/images/lib/mediaitem.py	2014-03-08 20:53:22 +0000
+++ openlp/plugins/images/lib/mediaitem.py	2014-03-21 21:59:15 +0000
@@ -327,7 +327,8 @@
 
         :param images: A List of Image Filenames objects that will be used to reload the mediamanager list.
         :param initial_load: When set to False, the busy cursor and progressbar will be shown while loading images.
-        :param open_group: ImageGroups object of the group that must be expanded after reloading the list in the interface.
+        :param open_group: ImageGroups object of the group that must be expanded after reloading the list in the
+        interface.
         """
         if not initial_load:
             self.application.set_busy_cursor()
@@ -462,7 +463,8 @@
 
         :param images_list: A List of strings containing image filenames
         :param group_id: The ID of the group to save the images in
-        :param reload_list: This boolean is set to True when the list in the interface should be reloaded after saving the new images
+        :param reload_list: This boolean is set to True when the list in the interface should be reloaded after saving
+        the new images
         """
         for filename in images_list:
             if not isinstance(filename, str):

=== modified file 'openlp/plugins/media/lib/mediaitem.py'
--- openlp/plugins/media/lib/mediaitem.py	2014-03-17 07:14:51 +0000
+++ openlp/plugins/media/lib/mediaitem.py	2014-03-21 21:59:15 +0000
@@ -34,7 +34,7 @@
 
 from openlp.core.common import Registry, RegistryProperties, AppLocation, Settings, check_directory_exists, UiStrings,\
     translate
-from openlp.core.lib import ItemCapabilities, MediaManagerItem,MediaType, ServiceItem, ServiceItemContext, \
+from openlp.core.lib import ItemCapabilities, MediaManagerItem, MediaType, ServiceItem, ServiceItemContext, \
     build_icon, check_item_selected
 from openlp.core.lib.ui import critical_error_message_box, create_horizontal_adjusting_combo_box
 from openlp.core.ui import DisplayController, Display, DisplayControllerType
@@ -161,7 +161,7 @@
         Called to replace Live background with the media selected.
         """
         if check_item_selected(self.list_view,
-                               translate('MediaPlugin.MediaItem', 
+                               translate('MediaPlugin.MediaItem',
                                          'You must select a media file to replace the background with.')):
             item = self.list_view.currentItem()
             filename = item.data(QtCore.Qt.UserRole)
@@ -170,12 +170,12 @@
                 service_item.title = 'webkit'
                 service_item.processor = 'webkit'
                 (path, name) = os.path.split(filename)
-                service_item.add_from_command(path, name,CLAPPERBOARD)
+                service_item.add_from_command(path, name, CLAPPERBOARD)
                 if self.media_controller.video(DisplayControllerType.Live, service_item, video_behind_text=True):
                     self.reset_action.setVisible(True)
                 else:
                     critical_error_message_box(UiStrings().LiveBGError,
-                                               translate('MediaPlugin.MediaItem', 
+                                               translate('MediaPlugin.MediaItem',
                                                          'There was no display item to amend.'))
             else:
                 critical_error_message_box(UiStrings().LiveBGError,

=== modified file 'openlp/plugins/presentations/lib/impresscontroller.py'
--- openlp/plugins/presentations/lib/impresscontroller.py	2014-03-08 21:23:47 +0000
+++ openlp/plugins/presentations/lib/impresscontroller.py	2014-03-21 21:59:15 +0000
@@ -29,7 +29,8 @@
 
 # OOo API documentation:
 # http://api.openoffice.org/docs/common/ref/com/sun/star/presentation/XSlideShowController.html
-# http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Basic/Getting_Information_about_UNO_Objects#Inspecting_interfaces_during_debugging
+# http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Basic
+#                          /Getting_Information_about_UNO_Objects#Inspecting_interfaces_during_debugging
 # http://docs.go-oo.org/sd/html/classsd_1_1SlideShow.html
 # http://www.oooforum.org/forum/viewtopic.phtml?t=5252
 # http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Working_with_Presentations
@@ -45,6 +46,7 @@
     from win32com.client import Dispatch
     import pywintypes
     # Declare an empty exception to match the exception imported from UNO
+
     class ErrorCodeIOException(Exception):
         pass
 else:
@@ -204,7 +206,7 @@
     Class which holds information and controls a single presentation.
     """
 
-    def __init__ (self, controller, presentation):
+    def __init__(self, controller, presentation):
         """
         Constructor, store information about the file and initialise.
         """
@@ -353,7 +355,7 @@
         log.debug('unblank screen OpenOffice')
         return self.control.resume()
 
-    def blank_screen (self):
+    def blank_screen(self):
         """
         Blanks the screen.
         """

=== modified file 'openlp/plugins/presentations/lib/pdfcontroller.py'
--- openlp/plugins/presentations/lib/pdfcontroller.py	2014-03-14 17:34:36 +0000
+++ openlp/plugins/presentations/lib/pdfcontroller.py	2014-03-21 21:59:15 +0000
@@ -132,7 +132,8 @@
                 DEVNULL = open(os.devnull, 'wb')
                 # First try to find mupdf
                 try:
-                    self.mudrawbin = check_output(['which', 'mudraw'], stderr=DEVNULL).decode(encoding='UTF-8').rstrip('\n')
+                    self.mudrawbin = check_output(['which', 'mudraw'],
+                                                  stderr=DEVNULL).decode(encoding='UTF-8').rstrip('\n')
                 except CalledProcessError:
                     self.mudrawbin = ''
                 # if mupdf isn't installed, fallback to ghostscript
@@ -192,7 +193,8 @@
         :return: The resolution dpi to be used.
         """
         # Use a postscript script to get size of the pdf. It is assumed that all pages have same size
-        gs_resolution_script = AppLocation.get_directory(AppLocation.PluginsDir) + '/presentations/lib/ghostscript_get_resolution.ps'
+        gs_resolution_script = AppLocation.get_directory(
+            AppLocation.PluginsDir) + '/presentations/lib/ghostscript_get_resolution.ps'
         # Run the script on the pdf to get the size
         runlog = []
         try:

=== modified file 'openlp/plugins/presentations/lib/pptviewlib/ppttest.py'
--- openlp/plugins/presentations/lib/pptviewlib/ppttest.py	2013-12-24 08:56:50 +0000
+++ openlp/plugins/presentations/lib/pptviewlib/ppttest.py	2014-03-21 21:59:15 +0000
@@ -32,6 +32,7 @@
 from ctypes import *
 from ctypes.wintypes import RECT
 
+
 class PPTViewer(QtGui.QWidget):
     """
     Standalone Test Harness for the pptviewlib library
@@ -169,16 +170,16 @@
         app.processEvents()
 
     def openClick(self):
-        oldid = self.pptid;
+        oldid = self.pptid
         rect = RECT(int(self.xEdit.text()), int(self.yEdit.text()),
-            int(self.widthEdit.text()), int(self.heightEdit.text()))
+                    int(self.widthEdit.text()), int(self.heightEdit.text()))
         filename = str(self.pptEdit.text().replace('/', '\\'))
         folder = str(self.folderEdit.text().replace('/', '\\'))
         print(filename, folder)
         self.pptid = self.pptdll.OpenPPT(filename, None, rect, folder)
         print('id: ' + str(self.pptid))
         if oldid >= 0:
-            self.pptdll.ClosePPT(oldid);
+            self.pptdll.ClosePPT(oldid)
         slides = self.pptdll.GetSlideCount(self.pptid)
         print('slidecount: ' + str(slides))
         self.total.setNum(self.pptdll.GetSlideCount(self.pptid))
@@ -201,8 +202,7 @@
         app.processEvents()
 
     def openDialog(self):
-        self.pptEdit.setText(QtGui.QFileDialog.getOpenFileName(self,
-            'Open file'))
+        self.pptEdit.setText(QtGui.QFileDialog.getOpenFileName(self, 'Open file'))
 
 if __name__ == '__main__':
     pptdll = cdll.LoadLibrary(r'pptviewlib.dll')

=== modified file 'openlp/plugins/remotes/lib/httpserver.py'
--- openlp/plugins/remotes/lib/httpserver.py	2014-03-17 19:05:55 +0000
+++ openlp/plugins/remotes/lib/httpserver.py	2014-03-21 21:59:15 +0000
@@ -144,6 +144,3 @@
             server_side=True)
         self.server_bind()
         self.server_activate()
-
-
-

=== modified file 'openlp/plugins/remotes/lib/remotetab.py'
--- openlp/plugins/remotes/lib/remotetab.py	2014-03-17 19:05:55 +0000
+++ openlp/plugins/remotes/lib/remotetab.py	2014-03-21 21:59:15 +0000
@@ -225,7 +225,8 @@
                     continue
                 for address in interface.addressEntries():
                     ip = address.ip()
-                    if ip.protocol() == QtNetwork.QAbstractSocket.IPv4Protocol and ip != QtNetwork.QHostAddress.LocalHost:
+                    if ip.protocol() == QtNetwork.QAbstractSocket.IPv4Protocol and \
+                       ip != QtNetwork.QHostAddress.LocalHost:
                         return ip.toString()
         return ip_address
 
@@ -262,9 +263,9 @@
                 Settings().value(self.settings_section + '/port') != self.port_spin_box.value() or \
                 Settings().value(self.settings_section + '/https port') != self.https_port_spin_box.value() or \
                 Settings().value(self.settings_section + '/https enabled') != \
-                        self.https_settings_group_box.isChecked() or \
+                self.https_settings_group_box.isChecked() or \
                 Settings().value(self.settings_section + '/authentication enabled') != \
-                        self.user_login_group_box.isChecked():
+                self.user_login_group_box.isChecked():
             self.settings_form.register_post_process('remotes_config_updated')
         Settings().setValue(self.settings_section + '/port', self.port_spin_box.value())
         Settings().setValue(self.settings_section + '/https port', self.https_port_spin_box.value())

=== modified file 'openlp/plugins/remotes/remoteplugin.py'
--- openlp/plugins/remotes/remoteplugin.py	2014-03-17 19:05:55 +0000
+++ openlp/plugins/remotes/remoteplugin.py	2014-03-21 21:59:15 +0000
@@ -36,14 +36,14 @@
 log = logging.getLogger(__name__)
 
 __default_settings__ = {
-        'remotes/twelve hour': True,
-        'remotes/port': 4316,
-        'remotes/https port': 4317,
-        'remotes/https enabled': False,
-        'remotes/user id': 'openlp',
-        'remotes/password': 'password',
-        'remotes/authentication enabled': False,
-        'remotes/ip address': '0.0.0.0'
+    'remotes/twelve hour': True,
+    'remotes/port': 4316,
+    'remotes/https port': 4317,
+    'remotes/https enabled': False,
+    'remotes/user id': 'openlp',
+    'remotes/password': 'password',
+    'remotes/authentication enabled': False,
+    'remotes/ip address': '0.0.0.0'
 }
 
 

=== modified file 'openlp/plugins/songs/forms/duplicatesongremovalform.py'
--- openlp/plugins/songs/forms/duplicatesongremovalform.py	2014-03-16 21:25:23 +0000
+++ openlp/plugins/songs/forms/duplicatesongremovalform.py	2014-03-21 21:59:15 +0000
@@ -64,8 +64,8 @@
         # Used to interrupt ongoing searches when cancel is clicked.
         self.break_search = False
         super(DuplicateSongRemovalForm, self).__init__(
-            Registry().get('main_window'), plugin, 'duplicateSongRemovalWizard', ':/wizards/wizard_duplicateremoval.bmp'
-            , False)
+            Registry().get('main_window'), plugin, 'duplicateSongRemovalWizard',
+            ':/wizards/wizard_duplicateremoval.bmp', False)
         self.setMinimumWidth(730)
 
     def custom_signals(self):
@@ -327,4 +327,4 @@
             self.button(QtGui.QWizard.FinishButton).show()
             self.button(QtGui.QWizard.FinishButton).setEnabled(True)
             self.button(QtGui.QWizard.NextButton).hide()
-            self.button(QtGui.QWizard.CancelButton).hide()
\ No newline at end of file
+            self.button(QtGui.QWizard.CancelButton).hide()

=== modified file 'openlp/plugins/songs/forms/editsongform.py'
--- openlp/plugins/songs/forms/editsongform.py	2014-03-16 21:25:23 +0000
+++ openlp/plugins/songs/forms/editsongform.py	2014-03-21 21:59:15 +0000
@@ -185,11 +185,11 @@
             if len(invalid_verses) > 1:
                 msg = translate('SongsPlugin.EditSongForm', 'There are no verses corresponding to "%(invalid)s".'
                                 'Valid entries are %(valid)s.\nPlease enter the verses separated by spaces.') % \
-                    {'invalid': ', '.join(invalid_verses), 'valid' : valid}
+                    {'invalid': ', '.join(invalid_verses), 'valid': valid}
             else:
                 msg = translate('SongsPlugin.EditSongForm', 'There is no verse corresponding to "%(invalid)s".'
                                 'Valid entries are %(valid)s.\nPlease enter the verses separated by spaces.') % \
-                    {'invalid': invalid_verses[0], 'valid' : valid}
+                    {'invalid': invalid_verses[0], 'valid': valid}
             critical_error_message_box(title=translate('SongsPlugin.EditSongForm', 'Invalid Verse Order'),
                                        message=msg)
         return len(invalid_verses) == 0
@@ -257,7 +257,7 @@
             self.song.lyrics = str(sxml.extract_xml(), 'utf-8')
             for verse in multiple:
                 self.song.verse_order = re.sub('([' + verse.upper() + verse.lower() + '])(\W|$)',
-                    r'\g<1>1\2', self.song.verse_order)
+                                               r'\g<1>1\2', self.song.verse_order)
         except:
             log.exception('Problem processing song Lyrics \n%s', sxml.dump_xml())
             raise
@@ -955,4 +955,4 @@
                 log.exception('Could not remove directory: %s', save_path)
         clean_song(self.manager, self.song)
         self.manager.save_object(self.song)
-        self.media_item.auto_select_id = self.song.id
\ No newline at end of file
+        self.media_item.auto_select_id = self.song.id

=== modified file 'openlp/plugins/songs/forms/mediafilesdialog.py'
--- openlp/plugins/songs/forms/mediafilesdialog.py	2014-03-04 18:49:30 +0000
+++ openlp/plugins/songs/forms/mediafilesdialog.py	2014-03-21 21:59:15 +0000
@@ -71,4 +71,3 @@
         self.select_label.setText(translate('SongsPlugin.MediaFilesForm',
                                   'Select one or more audio files from the list below, and click OK to import them '
                                   'into this song.'))
-

=== modified file 'openlp/plugins/songs/forms/mediafilesform.py'
--- openlp/plugins/songs/forms/mediafilesform.py	2014-03-04 18:49:30 +0000
+++ openlp/plugins/songs/forms/mediafilesform.py	2014-03-21 21:59:15 +0000
@@ -56,4 +56,3 @@
 
     def get_selected_files(self):
         return [item.data(QtCore.Qt.UserRole) for item in self.file_list_widget.selectedItems()]
-

=== modified file 'openlp/plugins/songs/forms/songimportform.py'
--- openlp/plugins/songs/forms/songimportform.py	2014-03-17 07:14:51 +0000
+++ openlp/plugins/songs/forms/songimportform.py	2014-03-21 21:59:15 +0000
@@ -99,7 +99,8 @@
                 self.format_widgets[song_format]['removeButton'].clicked.connect(self.on_remove_button_clicked)
             else:
                 self.format_widgets[song_format]['browseButton'].clicked.connect(self.on_browse_button_clicked)
-                self.format_widgets[song_format]['file_path_edit'].textChanged.connect(self.on_filepath_edit_text_changed)
+                self.format_widgets[song_format]['file_path_edit'].textChanged.\
+                    connect(self.on_filepath_edit_text_changed)
 
     def add_custom_pages(self):
         """
@@ -163,7 +164,8 @@
                 f_label = 'Filename:'
                 if select_mode == SongFormatSelect.SingleFolder:
                     f_label = 'Folder:'
-                self.format_widgets[format_list]['filepathLabel'].setText(translate('SongsPlugin.ImportWizardForm', f_label))
+                self.format_widgets[format_list]['filepathLabel'].setText(
+                    translate('SongsPlugin.ImportWizardForm', f_label))
         for format_list in self.disablable_formats:
             self.format_widgets[format_list]['disabled_label'].setText(SongFormat.get(format_list, 'disabledLabelText'))
         self.progress_page.setTitle(WizardStrings.Importing)
@@ -244,7 +246,7 @@
         if file_names:
             listbox.addItems(file_names)
             Settings().setValue(self.plugin.settings_section + '/last directory import',
-                os.path.split(str(file_names[0]))[0])
+                                os.path.split(str(file_names[0]))[0])
 
     def get_list_of_files(self, list_box):
         """

=== modified file 'openlp/plugins/songs/forms/songmaintenancedialog.py'
--- openlp/plugins/songs/forms/songmaintenancedialog.py	2014-03-04 18:49:30 +0000
+++ openlp/plugins/songs/forms/songmaintenancedialog.py	2014-03-21 21:59:15 +0000
@@ -162,6 +162,6 @@
         self.edit_book_button.setText(UiStrings().Edit)
         self.delete_book_button.setText(UiStrings().Delete)
         type_list_width = max(self.fontMetrics().width(SongStrings.Authors),
-                            self.fontMetrics().width(SongStrings.Topics),
-                            self.fontMetrics().width(SongStrings.SongBooks))
+                              self.fontMetrics().width(SongStrings.Topics),
+                              self.fontMetrics().width(SongStrings.SongBooks))
         self.type_list_widget.setFixedWidth(type_list_width + self.type_list_widget.iconSize().width() + 32)

=== modified file 'openlp/plugins/songs/forms/songmaintenanceform.py'
--- openlp/plugins/songs/forms/songmaintenanceform.py	2014-03-18 20:36:02 +0000
+++ openlp/plugins/songs/forms/songmaintenanceform.py	2014-03-21 21:59:15 +0000
@@ -531,4 +531,4 @@
             edit_button.setEnabled(False)
         else:
             delete_button.setEnabled(True)
-            edit_button.setEnabled(True)
\ No newline at end of file
+            edit_button.setEnabled(True)

=== modified file 'openlp/plugins/songs/forms/songreviewwidget.py'
--- openlp/plugins/songs/forms/songreviewwidget.py	2014-03-17 19:05:55 +0000
+++ openlp/plugins/songs/forms/songreviewwidget.py	2014-03-21 21:59:15 +0000
@@ -191,7 +191,7 @@
         self.song_remove_button.setObjectName('song_remove_button')
         self.song_remove_button.setIcon(build_icon(':/songs/song_delete.png'))
         self.song_remove_button.setSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
-        self.song_vertical_layout.addWidget(self.song_remove_button, alignment = QtCore.Qt.AlignHCenter)
+        self.song_vertical_layout.addWidget(self.song_remove_button, alignment=QtCore.Qt.AlignHCenter)
 
     def retranslateUi(self):
         self.song_remove_button.setText('Remove')

=== modified file 'openlp/plugins/songs/lib/__init__.py'
--- openlp/plugins/songs/lib/__init__.py	2014-03-11 20:17:18 +0000
+++ openlp/plugins/songs/lib/__init__.py	2014-03-21 21:59:15 +0000
@@ -549,4 +549,3 @@
     except OSError:
         log.exception('Could not remove directory: %s', save_path)
     song_plugin.manager.delete_object(Song, song_id)
-

=== modified file 'openlp/plugins/songs/lib/cclifileimport.py'
--- openlp/plugins/songs/lib/cclifileimport.py	2014-03-06 20:40:08 +0000
+++ openlp/plugins/songs/lib/cclifileimport.py	2014-03-21 21:59:15 +0000
@@ -89,8 +89,8 @@
                     if not self.do_import_txt_file(lines):
                         self.log_error(filename)
                 else:
-                    self.log_error(filename,
-                        translate('SongsPlugin.CCLIFileImport', 'The file does not have a valid extension.'))
+                    self.log_error(filename, translate('SongsPlugin.CCLIFileImport', 'The file does not have a valid '
+                                                                                     'extension.'))
                     log.info('Extension %s is not valid', filename)
             if self.stop_import_flag:
                 return

=== modified file 'openlp/plugins/songs/lib/db.py'
--- openlp/plugins/songs/lib/db.py	2014-03-17 19:05:55 +0000
+++ openlp/plugins/songs/lib/db.py	2014-03-21 21:59:15 +0000
@@ -172,7 +172,8 @@
     session, metadata = init_db(url)
 
     # Definition of the "authors" table
-    authors_table = Table('authors', metadata,
+    authors_table = Table(
+        'authors', metadata,
         Column('id', types.Integer(), primary_key=True),
         Column('first_name', types.Unicode(128)),
         Column('last_name', types.Unicode(128)),
@@ -180,7 +181,8 @@
     )
 
     # Definition of the "media_files" table
-    media_files_table = Table('media_files', metadata,
+    media_files_table = Table(
+        'media_files', metadata,
         Column('id', types.Integer(), primary_key=True),
         Column('song_id', types.Integer(), ForeignKey('songs.id'), default=None),
         Column('file_name', types.Unicode(255), nullable=False),
@@ -189,14 +191,16 @@
     )
 
     # Definition of the "song_books" table
-    song_books_table = Table('song_books', metadata,
+    song_books_table = Table(
+        'song_books', metadata,
         Column('id', types.Integer(), primary_key=True),
         Column('name', types.Unicode(128), nullable=False),
         Column('publisher', types.Unicode(128))
     )
 
     # Definition of the "songs" table
-    songs_table = Table('songs', metadata,
+    songs_table = Table(
+        'songs', metadata,
         Column('id', types.Integer(), primary_key=True),
         Column('song_book_id', types.Integer(), ForeignKey('song_books.id'), default=None),
         Column('title', types.Unicode(255), nullable=False),
@@ -216,19 +220,22 @@
     )
 
     # Definition of the "topics" table
-    topics_table = Table('topics', metadata,
+    topics_table = Table(
+        'topics', metadata,
         Column('id', types.Integer(), primary_key=True),
         Column('name', types.Unicode(128), index=True, nullable=False)
     )
 
     # Definition of the "authors_songs" table
-    authors_songs_table = Table('authors_songs', metadata,
+    authors_songs_table = Table(
+        'authors_songs', metadata,
         Column('author_id', types.Integer(), ForeignKey('authors.id'), primary_key=True),
         Column('song_id', types.Integer(), ForeignKey('songs.id'), primary_key=True)
     )
 
     # Definition of the "songs_topics" table
-    songs_topics_table = Table('songs_topics', metadata,
+    songs_topics_table = Table(
+        'songs_topics', metadata,
         Column('song_id', types.Integer(), ForeignKey('songs.id'), primary_key=True),
         Column('topic_id', types.Integer(), ForeignKey('topics.id'), primary_key=True)
     )
@@ -236,13 +243,12 @@
     mapper(Author, authors_table)
     mapper(Book, song_books_table)
     mapper(MediaFile, media_files_table)
-    mapper(Song, songs_table,
-        properties={
-            'authors': relation(Author, backref='songs', secondary=authors_songs_table, lazy=False),
-            'book': relation(Book, backref='songs'),
-            'media_files': relation(MediaFile, backref='songs', order_by=media_files_table.c.weight),
-            'topics': relation(Topic, backref='songs', secondary=songs_topics_table)
-        })
+    mapper(Song, songs_table, properties={
+        'authors': relation(Author, backref='songs', secondary=authors_songs_table, lazy=False),
+        'book': relation(Book, backref='songs'),
+        'media_files': relation(MediaFile, backref='songs', order_by=media_files_table.c.weight),
+        'topics': relation(Topic, backref='songs', secondary=songs_topics_table)
+    })
     mapper(Topic, topics_table)
 
     metadata.create_all(checkfirst=True)

=== modified file 'openlp/plugins/songs/lib/dreambeamimport.py'
--- openlp/plugins/songs/lib/dreambeamimport.py	2014-03-06 20:40:08 +0000
+++ openlp/plugins/songs/lib/dreambeamimport.py	2014-03-21 21:59:15 +0000
@@ -120,7 +120,7 @@
                         author_copyright = song_xml.Author.text
                     if hasattr(song_xml, 'SongLyrics'):
                         for lyrics_item in song_xml.SongLyrics.iterchildren():
-                            verse_type =  lyrics_item.get('Type')
+                            verse_type = lyrics_item.get('Type')
                             verse_number = lyrics_item.get('Number')
                             verse_text = str(lyrics_item.text)
                             self.add_verse(verse_text, ('%s%s' % (verse_type[:1], verse_number)))
@@ -145,8 +145,7 @@
                         author_copyright = song_xml.Text2.Text.text
                 if author_copyright:
                     author_copyright = str(author_copyright)
-                    if author_copyright.find(
-                        str(SongStrings.CopyrightSymbol)) >= 0:
+                    if author_copyright.find(str(SongStrings.CopyrightSymbol)) >= 0:
                         self.add_copyright(author_copyright)
                     else:
                         self.parse_author(author_copyright)

=== modified file 'openlp/plugins/songs/lib/foilpresenterimport.py'
--- openlp/plugins/songs/lib/foilpresenterimport.py	2014-03-17 19:05:55 +0000
+++ openlp/plugins/songs/lib/foilpresenterimport.py	2014-03-21 21:59:15 +0000
@@ -298,10 +298,10 @@
                 temp = copyright.partition('Rechte')
                 copyright = temp[0]
             markers = ['Text +u\.?n?d? +Melodie[\w\,\. ]*:',
-                'Text +u\.?n?d? +Musik', 'T & M', 'Melodie und Satz',
-                'Text[\w\,\. ]*:', 'Melodie', 'Musik', 'Satz',
-                'Weise', '[dD]eutsch', '[dD]t[\.\:]', 'Englisch',
-                '[oO]riginal', 'Bearbeitung', '[R|r]efrain']
+                       'Text +u\.?n?d? +Musik', 'T & M', 'Melodie und Satz',
+                       'Text[\w\,\. ]*:', 'Melodie', 'Musik', 'Satz',
+                       'Weise', '[dD]eutsch', '[dD]t[\.\:]', 'Englisch',
+                       '[oO]riginal', 'Bearbeitung', '[R|r]efrain']
             for marker in markers:
                 copyright = re.compile(marker).sub('<marker>', copyright, re.U)
             copyright = re.compile('(?<=<marker>) *:').sub('', copyright)
@@ -324,12 +324,9 @@
                 for tempx in temp:
                     author_temp.append(tempx)
                 for author in author_temp:
-                    regex = '^[\/,;\-\s\.]+|[\/,;\-\s\.]+$|'\
-                        '\s*[0-9]{4}\s*[\-\/]?\s*([0-9]{4})?[\/,;\-\s\.]*$'
+                    regex = '^[\/,;\-\s\.]+|[\/,;\-\s\.]+$|\s*[0-9]{4}\s*[\-\/]?\s*([0-9]{4})?[\/,;\-\s\.]*$'
                     author = re.compile(regex).sub('', author)
-                    author = re.compile(
-                        '[0-9]{1,2}\.\s?J(ahr)?h\.|um\s*$|vor\s*$').sub('',
-                        author)
+                    author = re.compile('[0-9]{1,2}\.\s?J(ahr)?h\.|um\s*$|vor\s*$').sub('', author)
                     author = re.compile('[N|n]ach.*$').sub('', author)
                     author = author.strip()
                     if re.search('\w+\.?\s+\w{3,}\s+[a|u]nd\s|\w+\.?\s+\w{3,}\s+&\s', author, re.U):

=== modified file 'openlp/plugins/songs/lib/mediaitem.py'
--- openlp/plugins/songs/lib/mediaitem.py	2014-03-06 22:05:15 +0000
+++ openlp/plugins/songs/lib/mediaitem.py	2014-03-21 21:59:15 +0000
@@ -493,9 +493,9 @@
             # FIXME: This file seems to be an old one (prior to 1.9.5), which means, that the search title
             # (data_string[u'title']) is probably wrong. We add "@" to search title and hope that we do not add any
             # duplicate. This should work for songs without alternate title.
-            search_results = self.plugin.manager.get_all_objects(Song,
-                Song.search_title == (re.compile(r'\W+', re.UNICODE).sub(' ',
-                item.data_string['title'].strip()) + '@').strip().lower(), Song.search_title.asc())
+            temp = (re.compile(r'\W+', re.UNICODE).sub(' ', item.data_string['title'].strip()) + '@').strip().lower()
+            search_results = \
+                self.plugin.manager.get_all_objects(Song, Song.search_title == temp, Song.search_title.asc())
         else:
             search_results = self.plugin.manager.get_all_objects(
                 Song, Song.search_title == item.data_string['title'], Song.search_title.asc())

=== modified file 'openlp/plugins/songs/lib/olpimport.py'
--- openlp/plugins/songs/lib/olpimport.py	2014-03-17 19:05:55 +0000
+++ openlp/plugins/songs/lib/olpimport.py	2014-03-21 21:59:15 +0000
@@ -128,11 +128,9 @@
             except UnmappedClassError:
                 mapper(OldMediaFile, source_media_files_table)
         song_props = {
-            'authors': relation(OldAuthor, backref='songs',
-            secondary=source_authors_songs_table),
+            'authors': relation(OldAuthor, backref='songs', secondary=source_authors_songs_table),
             'book': relation(OldBook, backref='songs'),
-            'topics': relation(OldTopic, backref='songs',
-            secondary=source_songs_topics_table)
+            'topics': relation(OldTopic, backref='songs', secondary=source_songs_topics_table)
         }
         if has_media_files:
             if isinstance(source_media_files_songs_table, Table):

=== modified file 'openlp/plugins/songs/lib/openlyricsexport.py'
--- openlp/plugins/songs/lib/openlyricsexport.py	2014-03-17 07:14:51 +0000
+++ openlp/plugins/songs/lib/openlyricsexport.py	2014-03-21 21:59:15 +0000
@@ -68,8 +68,8 @@
             self.application.process_events()
             if self.parent.stop_export_flag:
                 return False
-            self.parent.increment_progress_bar(translate('SongsPlugin.OpenLyricsExport', 'Exporting "%s"...') %
-                                                         song.title)
+            self.parent.increment_progress_bar(
+                translate('SongsPlugin.OpenLyricsExport', 'Exporting "%s"...') % song.title)
             xml = open_lyrics.song_to_xml(song)
             tree = etree.ElementTree(etree.fromstring(xml.encode()))
             filename = '%s (%s)' % (song.title, ', '.join([author.display_name for author in song.authors]))
@@ -81,4 +81,3 @@
             tree.write(open(os.path.join(self.save_path, filename), 'wb'), encoding='utf-8', xml_declaration=True,
                        pretty_print=True)
         return True
-

=== modified file 'openlp/plugins/songs/lib/powersongimport.py'
--- openlp/plugins/songs/lib/powersongimport.py	2014-03-06 22:05:15 +0000
+++ openlp/plugins/songs/lib/powersongimport.py	2014-03-21 21:59:15 +0000
@@ -122,7 +122,7 @@
                         parse_error = True
                         self.log_error(os.path.basename(file), str(
                             translate('SongsPlugin.PowerSongImport', 'Invalid %s file. Unexpected byte value.')) %
-                                ps_string)
+                            ps_string)
                         break
                     else:
                         if label == 'TITLE':
@@ -145,7 +145,7 @@
             if not found_copyright:
                 self.log_error(self.title, str(
                     translate('SongsPlugin.PowerSongImport', 'Invalid %s file. Missing "COPYRIGHTLINE" header.')) %
-                        ps_string)
+                    ps_string)
                 continue
             # Check that file had at least one verse
             if not self.verses:

=== modified file 'openlp/plugins/songs/lib/sofimport.py'
--- openlp/plugins/songs/lib/sofimport.py	2014-03-08 19:58:58 +0000
+++ openlp/plugins/songs/lib/sofimport.py	2014-03-21 21:59:15 +0000
@@ -287,8 +287,7 @@
 
         :param text: The verse text
         """
-        if self.italics != self.is_chorus and ((len(self.verses) > 0) or
-            (self.current__verse.count('\n') > 1)):
+        if self.italics != self.is_chorus and ((len(self.verses) > 0) or (self.current__verse.count('\n') > 1)):
             self.finish_verse()
         if self.italics:
             self.is_chorus = True
@@ -348,10 +347,10 @@
         for i in range(1, len(text_arr)):
             # Do not translate these. Fixed strings in SOF song file
             if text_arr[i] in ('JESUS', 'CHRIST', 'KING', 'ALMIGHTY', 'REDEEMER', 'SHEPHERD', 'SON', 'GOD', 'LORD',
-                              'FATHER', 'HOLY', 'SPIRIT', 'LAMB', 'YOU', 'YOUR', 'I', 'I\'VE', 'I\'M', 'I\'LL',
-                              'SAVIOUR', 'O', 'YOU\'RE', 'HE', 'HIS', 'HIM', 'ZION', 'EMMANUEL', 'MAJESTY', 'JESUS\'',
-                              'JIREH', 'JUDAH', 'LION', 'LORD\'S', 'ABRAHAM', 'GOD\'S', 'FATHER\'S', 'ELIJAH' 'MARTHA',
-                              'CHRISTMAS', 'ALPHA', 'OMEGA'):
+                               'FATHER', 'HOLY', 'SPIRIT', 'LAMB', 'YOU', 'YOUR', 'I', 'I\'VE', 'I\'M', 'I\'LL',
+                               'SAVIOUR', 'O', 'YOU\'RE', 'HE', 'HIS', 'HIM', 'ZION', 'EMMANUEL', 'MAJESTY', 'JESUS\'',
+                               'JIREH', 'JUDAH', 'LION', 'LORD\'S', 'ABRAHAM', 'GOD\'S', 'FATHER\'S',
+                               'ELIJAH' 'MARTHA', 'CHRISTMAS', 'ALPHA', 'OMEGA'):
                 text_arr[i] = text_arr[i].capitalize()
             else:
                 text_arr[i] = text_arr[i].lower()

=== modified file 'openlp/plugins/songs/lib/songcompare.py'
--- openlp/plugins/songs/lib/songcompare.py	2014-03-08 19:58:58 +0000
+++ openlp/plugins/songs/lib/songcompare.py	2014-03-21 21:59:15 +0000
@@ -113,7 +113,7 @@
     if len(diff) >= 3:
         for index in range(len(diff) - 3, -1, -1):
             if _op_length(diff[index]) >= MIN_FRAGMENT_SIZE and diff[index + 1][0] != "equal" and \
-                _op_length(diff[index + 1]) <= MAX_TYPO_SIZE and _op_length(diff[index + 2]) >= MIN_FRAGMENT_SIZE:
+                    _op_length(diff[index + 1]) <= MAX_TYPO_SIZE and _op_length(diff[index + 2]) >= MIN_FRAGMENT_SIZE:
                 del diff[index + 1]
     # Remove typo at the end of the string.
     if len(diff) >= 2:

=== modified file 'openlp/plugins/songs/lib/songimport.py'
--- openlp/plugins/songs/lib/songimport.py	2014-03-08 19:58:58 +0000
+++ openlp/plugins/songs/lib/songimport.py	2014-03-21 21:59:15 +0000
@@ -364,7 +364,7 @@
         """
         if not hasattr(self, 'save_path'):
             self.save_path = os.path.join(AppLocation.get_section_data_path(self.import_wizard.plugin.name),
-                                                                            'audio', str(song_id))
+                                          'audio', str(song_id))
         check_directory_exists(self.save_path)
         if not filename.startswith(self.save_path):
             old_file, filename = filename, os.path.join(self.save_path, os.path.split(filename)[1])

=== modified file 'openlp/plugins/songs/lib/songshowplusimport.py'
--- openlp/plugins/songs/lib/songshowplusimport.py	2014-03-08 19:58:58 +0000
+++ openlp/plugins/songs/lib/songshowplusimport.py	2014-03-21 21:59:15 +0000
@@ -140,7 +140,7 @@
                 elif block_key == AUTHOR:
                     authors = self.decode(data).split(" / ")
                     for author in authors:
-                        if author.find(",") !=-1:
+                        if author.find(",") != -1:
                             author_parts = author.split(", ")
                             author = author_parts[1] + " " + author_parts[0]
                         self.parse_author(author)
@@ -220,4 +220,4 @@
         try:
             return str(data, chardet.detect(data)['encoding'])
         except:
-            return str(data, retrieve_windows_encoding())
\ No newline at end of file
+            return str(data, retrieve_windows_encoding())

=== modified file 'openlp/plugins/songs/lib/sundayplusimport.py'
--- openlp/plugins/songs/lib/sundayplusimport.py	2014-03-08 19:58:58 +0000
+++ openlp/plugins/songs/lib/sundayplusimport.py	2014-03-21 21:59:15 +0000
@@ -138,7 +138,7 @@
                     elif name == 'Copyright':
                         self.copyright = self.decode(self.unescape(value))
                     elif name[0:4] == 'CELL':
-                        self.parse(value, cell = name[4:])
+                        self.parse(value, cell=name[4:])
                 # We are in a verse group.
                 else:
                     if name == 'MARKER_NAME':
@@ -207,4 +207,3 @@
         text = text.replace('^^', '"')
         text = text.replace('^', '\'')
         return text.strip()
-

=== removed directory 'openlp/plugins/songs/lib/test'
=== removed file 'openlp/plugins/songs/lib/test/test.opensong'
--- openlp/plugins/songs/lib/test/test.opensong	2010-09-19 08:47:00 +0000
+++ openlp/plugins/songs/lib/test/test.opensong	1970-01-01 00:00:00 +0000
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<song>
-  <title>Martins Test</title>
-  <author>MartiÑ &amp; Martin2 Thómpson</author>
-  <copyright>2010 Martin Thompson</copyright>
-  <hymn_number>1</hymn_number>
-  <presentation>V1 C V2 C2 3a B1 V1 T U Rap1 Rap2 Rap3</presentation>
-  <ccli>Blah</ccli>
-  <capo print="false"></capo>
-  <key></key>
-  <aka></aka>
-  <key_line></key_line>
-  <user1></user1>
-  <user2></user2>
-  <user3></user3>
-  <theme>TestTheme</theme>
-  <alttheme>TestAltTheme</alttheme>
-  <tempo></tempo>
-  <time_sig></time_sig>
-  <lyrics>[3a]
-. G A B
- V3 Line 1
-. G A B
- V3 Line 2
-
-. A   B C
-1 v1 Line 1___
-2 v2 Line 1___
-. A B C7
-1 V1 Line 2
-2 V2 Line 2
- 
-[b1]
- Bridge 1
----
--!!
- Bridge 1 line 2
-
-[C]
-    . A     B
- Chorus 1
- 
-[C2]
-.  A    B
- Chorus 2
-
-[T]
-  T Line 1
-
-[Rap]
-1 Rap 1 Line 1
-2 Rap 2 Line 1
-1 Rap 1 Line 2
-2 Rap 2 Line 2
-
-[rap3]
- Rap 3 Line 1
- Rap 3 Line 2
-
-
-[X]
-  Unreferenced verse line 1
- </lyrics>
-  <style index="default_style">
-  <title enabled="true" valign="bottom" align="center" include_verse="false" margin-left="0" margin-right="0" margin-top="0" margin-bottom="0" font="Helvetica" size="26" bold="true" italic="true" underline="false" color="#FFFFFF" border="true" border_color="#000000" shadow="true" shadow_color="#000000" fill="false" fill_color="#000000"/>
-  <subtitle enabled="true" valign="bottom" align="center" descriptive="false" margin-left="0" margin-right="0" margin-top="0" margin-bottom="0" font="Helvetica" size="18" bold="true" italic="true" underline="false" color="#FFFFFF" border="true" border_color="#000000" shadow="true" shadow_color="#000000" fill="false" fill_color="#000000"/>
-  <song_subtitle>author</song_subtitle>
-  <body enabled="true" auto_scale="false" valign="middle" align="center" highlight_chorus="true" margin-left="0" margin-right="0" margin-top="0" margin-bottom="0" font="Helvetica" size="34" bold="true" italic="false" underline="false" color="#FFFFFF" border="true" border_color="#000000" shadow="true" shadow_color="#000000" fill="false" fill_color="#FF0000">
-  <tabs/>
-</body>
-  <background strip_footer="0" color="#408080" position="1"/>
-</style></song>

=== removed file 'openlp/plugins/songs/lib/test/test.opensong.zip'
Binary files openlp/plugins/songs/lib/test/test.opensong.zip	2010-09-14 18:18:47 +0000 and openlp/plugins/songs/lib/test/test.opensong.zip	1970-01-01 00:00:00 +0000 differ
=== removed file 'openlp/plugins/songs/lib/test/test2.opensong'
--- openlp/plugins/songs/lib/test/test2.opensong	2010-09-14 18:18:47 +0000
+++ openlp/plugins/songs/lib/test/test2.opensong	1970-01-01 00:00:00 +0000
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<song>
-  <title>Martins 2nd Test</title>
-  <author>Martin Thompson</author>
-  <copyright>2010 Martin Thompson</copyright>
-  <hymn_number>2</hymn_number>
-  <presentation></presentation>
-  <ccli>Blah</ccli>
-  <capo print="false"></capo>
-  <key></key>
-  <aka></aka>
-  <key_line></key_line>
-  <user1></user1>
-  <user2></user2>
-  <user3></user3>
-  <theme></theme>
-  <tempo></tempo>
-  <time_sig></time_sig>
-  <lyrics>;Comment
-[V]
-. A   B C
-1 v1 Line 1___
-2 v2 Line 1___
-. A B C7
-1 V1 Line 2
-2 V2 Line 2
- 
-[b1]
- Bridge 1
- Bridge 1 line 2
-[C1]
- Chorus 1
- 
-[C2]
- Chorus 2
- </lyrics>
-  <style index="default_style">
-  <title enabled="true" valign="bottom" align="center" include_verse="false" margin-left="0" margin-right="0" margin-top="0" margin-bottom="0" font="Helvetica" size="26" bold="true" italic="true" underline="false" color="#FFFFFF" border="true" border_color="#000000" shadow="true" shadow_color="#000000" fill="false" fill_color="#000000"/>
-  <subtitle enabled="true" valign="bottom" align="center" descriptive="false" margin-left="0" margin-right="0" margin-top="0" margin-bottom="0" font="Helvetica" size="18" bold="true" italic="true" underline="false" color="#FFFFFF" border="true" border_color="#000000" shadow="true" shadow_color="#000000" fill="false" fill_color="#000000"/>
-  <song_subtitle>author</song_subtitle>
-  <body enabled="true" auto_scale="false" valign="middle" align="center" highlight_chorus="true" margin-left="0" margin-right="0" margin-top="0" margin-bottom="0" font="Helvetica" size="34" bold="true" italic="false" underline="false" color="#FFFFFF" border="true" border_color="#000000" shadow="true" shadow_color="#000000" fill="false" fill_color="#FF0000">
-  <tabs/>
-</body>
-  <background strip_footer="0" color="#408080" position="1"/>
-</style></song>

=== removed file 'openlp/plugins/songs/lib/test/test3.opensong'
--- openlp/plugins/songs/lib/test/test3.opensong	2010-09-27 18:34:40 +0000
+++ openlp/plugins/songs/lib/test/test3.opensong	1970-01-01 00:00:00 +0000
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<song>
-  <title>Test single verse</title>
-  <author>Martin Thompson</author>
-  <copyright>2010</copyright>
-  <ccli>123456</ccli>
-  <theme>Worship: Declaration</theme>
-  <lyrics> Line 1
-Line 2
-</lyrics></song>

=== removed file 'openlp/plugins/songs/lib/test/test_import_file.py'
--- openlp/plugins/songs/lib/test/test_import_file.py	2013-12-24 08:56:50 +0000
+++ openlp/plugins/songs/lib/test/test_import_file.py	1970-01-01 00:00:00 +0000
@@ -1,50 +0,0 @@
-# -*- 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                          #
-###############################################################################
-import sys
-
-from openlp.plugins.songs.lib.opensongimport import OpenSongImport
-from openlp.core.lib.db import Manager
-from openlp.plugins.songs.lib.db import init_schema
-
-import logging
-LOG_FILENAME = 'test_import_file.log'
-logging.basicConfig(filename=LOG_FILENAME,level=logging.INFO)
-
-from test_opensongimport import wizard_stub
-
-def test(filenames):
-    manager = Manager('songs', init_schema)
-    o = OpenSongImport(manager, filenames=filenames)
-    o.import_wizard = wizard_stub()
-    o.commit = False
-    o.do_import()
-    o.print_song()
-
-if __name__ == "__main__":
-    test(sys.argv[1:])

=== removed file 'openlp/plugins/songs/lib/test/test_importing_lots.py'
--- openlp/plugins/songs/lib/test/test_importing_lots.py	2013-12-24 08:56:50 +0000
+++ openlp/plugins/songs/lib/test/test_importing_lots.py	1970-01-01 00:00:00 +0000
@@ -1,61 +0,0 @@
-# -*- 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                          #
-###############################################################################
-
-from openlp.plugins.songs.lib.opensongimport import OpenSongImport
-from openlp.plugins.songs.lib.db import init_schema
-from openlp.core.lib.db import Manager
-import os
-import codecs
-
-import logging
-LOG_FILENAME = 'import.log'
-logging.basicConfig(filename=LOG_FILENAME,level=logging.INFO)
-
-from test_opensongimport import wizard_stub
-
-# Useful test function for importing a variety of different files
-# Uncomment below depending on what problem trying to make occur!
-
-def opensong_import_lots():
-    ziploc = '/home/mjt/openlp/OpenSong_Data/'
-    files = []
-    files = [os.path.join(ziploc, 'RaoulSongs', 'Songs', 'Jesus Freak')]
-    # files.extend(glob(ziploc+u'Songs.zip'))
-    # files.extend(glob(ziploc+u'RaoulSongs.zip'))
-    # files.extend(glob(ziploc+u'SOF.zip'))
-    # files.extend(glob(ziploc+u'spanish_songs_for_opensong.zip'))
-    # files.extend(glob(ziploc+u'opensong_*.zip'))
-    errfile = codecs.open('import_lots_errors.txt', 'w', 'utf8')
-    manager = Manager('songs', init_schema)
-    o = OpenSongImport(manager, filenames=files)
-    o.import_wizard=wizard_stub()
-    o.do_import()
-
-if __name__ == "__main__":
-    opensong_import_lots()

=== modified file 'openlp/plugins/songs/lib/ui.py'
--- openlp/plugins/songs/lib/ui.py	2013-12-24 08:56:50 +0000
+++ openlp/plugins/songs/lib/ui.py	2014-03-21 21:59:15 +0000
@@ -40,11 +40,11 @@
     # These strings should need a good reason to be retranslated elsewhere.
     Author = translate('OpenLP.Ui', 'Author', 'Singular')
     Authors = translate('OpenLP.Ui', 'Authors', 'Plural')
-    AuthorUnknown = 'Author Unknown' # Used to populate the database.
+    AuthorUnknown = 'Author Unknown'  # Used to populate the database.
     CopyrightSymbol = translate('OpenLP.Ui', '\xa9', 'Copyright symbol.')
     SongBook = translate('OpenLP.Ui', 'Song Book', 'Singular')
     SongBooks = translate('OpenLP.Ui', 'Song Books', 'Plural')
-    SongIncomplete = translate('OpenLP.Ui','Title and/or verses not found')
+    SongIncomplete = translate('OpenLP.Ui', 'Title and/or verses not found')
     SongMaintenance = translate('OpenLP.Ui', 'Song Maintenance')
     Topic = translate('OpenLP.Ui', 'Topic', 'Singular')
     Topics = translate('OpenLP.Ui', 'Topics', 'Plural')

=== modified file 'openlp/plugins/songs/lib/upgrade.py'
--- openlp/plugins/songs/lib/upgrade.py	2013-12-24 08:56:50 +0000
+++ openlp/plugins/songs/lib/upgrade.py	2014-03-21 21:59:15 +0000
@@ -82,4 +82,3 @@
         op.add_column('songs', Column('temporary', types.Boolean(create_constraint=False), server_default=false()))
     else:
         op.add_column('songs', Column('temporary', types.Boolean(), server_default=false()))
-

=== modified file 'openlp/plugins/songs/lib/worshipcenterproimport.py'
--- openlp/plugins/songs/lib/worshipcenterproimport.py	2014-03-06 20:40:08 +0000
+++ openlp/plugins/songs/lib/worshipcenterproimport.py	2014-03-21 21:59:15 +0000
@@ -56,12 +56,12 @@
         Receive a single file to import.
         """
         try:
-           conn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb)};DBQ=%s' % self.import_source)
+            conn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb)};DBQ=%s' % self.import_source)
         except (pyodbc.DatabaseError, pyodbc.IntegrityError, pyodbc.InternalError, pyodbc.OperationalError) as e:
             log.warn('Unable to connect the WorshipCenter Pro database %s. %s', self.import_source, str(e))
             # Unfortunately no specific exception type
-            self.log_error(self.import_source,
-                translate('SongsPlugin.WorshipCenterProImport', 'Unable to connect the WorshipCenter Pro database.'))
+            self.log_error(self.import_source, translate('SongsPlugin.WorshipCenterProImport',
+                                                         'Unable to connect the WorshipCenter Pro database.'))
             return
         cursor = conn.cursor()
         cursor.execute('SELECT ID, Field, Value FROM __SONGDATA')

=== modified file 'openlp/plugins/songs/lib/xml.py'
--- openlp/plugins/songs/lib/xml.py	2014-03-08 19:58:58 +0000
+++ openlp/plugins/songs/lib/xml.py	2014-03-21 21:59:15 +0000
@@ -340,7 +340,8 @@
 
         The first unicode string are the start tags (for the next slide). The second unicode string are the end tags.
 
-        :param text: The text to test. The text must **not** contain html tags, only OpenLP formatting tags are allowed::
+        :param text: The text to test. The text must **not** contain html tags, only OpenLP formatting tags
+        are allowed::
 
                 {st}{r}Text text text
         """

=== modified file 'openlp/plugins/songs/lib/zionworximport.py'
--- openlp/plugins/songs/lib/zionworximport.py	2014-03-08 19:58:58 +0000
+++ openlp/plugins/songs/lib/zionworximport.py	2014-03-21 21:59:15 +0000
@@ -39,7 +39,7 @@
 log = logging.getLogger(__name__)
 
 # Used to strip control chars (except 10=LF, 13=CR)
-CONTROL_CHARS_MAP = dict.fromkeys(list(range(10)) + [11, 12] + list(range(14,32)) + [127])
+CONTROL_CHARS_MAP = dict.fromkeys(list(range(10)) + [11, 12] + list(range(14, 32)) + [127])
 
 
 class ZionWorxImport(SongImport):

=== modified file 'openlp/plugins/songs/songsplugin.py'
--- openlp/plugins/songs/songsplugin.py	2014-03-11 20:17:18 +0000
+++ openlp/plugins/songs/songsplugin.py	2014-03-21 21:59:15 +0000
@@ -342,7 +342,7 @@
         """
         Remove temporary songs from the database
         """
-        songs = self.manager.get_all_objects(Song, Song.temporary == True)
+        songs = self.manager.get_all_objects(Song, Song.temporary is True)
         for song in songs:
             self.manager.delete_object(Song, song.id)
 

=== modified file 'openlp/plugins/songusage/forms/songusagedeleteform.py'
--- openlp/plugins/songusage/forms/songusagedeleteform.py	2014-03-16 21:25:23 +0000
+++ openlp/plugins/songusage/forms/songusagedeleteform.py	2014-03-21 21:59:15 +0000
@@ -70,4 +70,4 @@
                 )
                 self.accept()
         else:
-            self.reject()
\ No newline at end of file
+            self.reject()

=== modified file 'openlp/plugins/songusage/forms/songusagedetailform.py'
--- openlp/plugins/songusage/forms/songusagedetailform.py	2014-03-16 21:25:23 +0000
+++ openlp/plugins/songusage/forms/songusagedetailform.py	2014-03-21 21:59:15 +0000
@@ -87,15 +87,14 @@
             )
             return
         check_directory_exists(path)
-        file_name = translate('SongUsagePlugin.SongUsageDetailForm', 'usage_detail_%s_%s.txt') % (
-            self.from_date_calendar.selectedDate().toString('ddMMyyyy'),
-            self.to_date_calendar.selectedDate().toString('ddMMyyyy'))
+        file_name = translate('SongUsagePlugin.SongUsageDetailForm', 'usage_detail_%s_%s.txt') % \
+            (self.from_date_calendar.selectedDate().toString('ddMMyyyy'),
+             self.to_date_calendar.selectedDate().toString('ddMMyyyy'))
         Settings().setValue(self.plugin.settings_section + '/from date', self.from_date_calendar.selectedDate())
         Settings().setValue(self.plugin.settings_section + '/to date', self.to_date_calendar.selectedDate())
         usage = self.plugin.manager.get_all_objects(
-            SongUsageItem, and_(
-            SongUsageItem.usagedate >= self.from_date_calendar.selectedDate().toPyDate(),
-            SongUsageItem.usagedate < self.to_date_calendar.selectedDate().toPyDate()),
+            SongUsageItem, and_(SongUsageItem.usagedate >= self.from_date_calendar.selectedDate().toPyDate(),
+                                SongUsageItem.usagedate < self.to_date_calendar.selectedDate().toPyDate()),
             [SongUsageItem.usagedate, SongUsageItem.usagetime])
         report_file_name = os.path.join(path, file_name)
         file_handle = None
@@ -103,9 +102,9 @@
             file_handle = open(report_file_name, 'w')
             for instance in usage:
                 record = '\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",' \
-                    '\"%s\",\"%s\"\n' % (instance.usagedate,
-                    instance.usagetime, instance.title, instance.copyright,
-                    instance.ccl_number, instance.authors, instance.plugin_name, instance.source)
+                    '\"%s\",\"%s\"\n' % \
+                         (instance.usagedate, instance.usagetime, instance.title, instance.copyright,
+                          instance.ccl_number, instance.authors, instance.plugin_name, instance.source)
                 file_handle.write(record.encode('utf-8'))
             self.main_window.information_message(
                 translate('SongUsagePlugin.SongUsageDetailForm', 'Report Creation'),

=== modified file 'openlp/plugins/songusage/lib/db.py'
--- openlp/plugins/songusage/lib/db.py	2014-01-11 22:01:41 +0000
+++ openlp/plugins/songusage/lib/db.py	2014-03-21 21:59:15 +0000
@@ -62,7 +62,7 @@
                             Column('ccl_number', types.Unicode(65)),
                             Column('plugin_name', types.Unicode(20)),
                             Column('source', types.Unicode(10))
-    )
+                            )
 
     mapper(SongUsageItem, songusage_table)
 


Follow ups