Пример #1
0
    def on_export_theme(self, checked=None):
        """
        Export the theme to a zip file

        :param bool checked: Sent by the QAction.triggered signal. It's not used in this method.
        :rtype: None
        """
        item = self.theme_list_widget.currentItem()
        if item is None:
            critical_error_message_box(message=translate(
                'OpenLP.ThemeManager', 'You have not selected a theme.'))
            return
        theme_name = item.data(QtCore.Qt.UserRole)
        export_path, filter_used = \
            FileDialog.getSaveFileName(self.main_window,
                                       translate('OpenLP.ThemeManager',
                                                 'Save Theme - ({name})').format(name=theme_name),
                                       Settings().value(self.settings_section + '/last directory export'),
                                       translate('OpenLP.ThemeManager', 'OpenLP Themes (*.otz)'),
                                       translate('OpenLP.ThemeManager', 'OpenLP Themes (*.otz)'))
        self.application.set_busy_cursor()
        if export_path:
            Settings().setValue(
                self.settings_section + '/last directory export',
                export_path.parent)
            if self._export_theme(export_path.with_suffix('.otz'), theme_name):
                QtWidgets.QMessageBox.information(
                    self, translate('OpenLP.ThemeManager', 'Theme Exported'),
                    translate('OpenLP.ThemeManager',
                              'Your theme has been successfully exported.'))
        self.application.set_normal_cursor()
Пример #2
0
    def on_error_save_to_button_clicked(self):
        """
        Save the error report to a file.

        :rtype: None
        """
        file_path, filter_used = FileDialog.getSaveFileName(
            self, self.settings.value(self.plugin.settings_section + '/last directory import'))
        if file_path is None:
            return
        file_path.write_text(self.error_report_text_edit.toPlainText(), encoding='utf-8')
Пример #3
0
    def test_get_save_file_name_selected_filter(self):
        """
        Test that `getSaveFileName` does not modify the selectedFilter as returned by `QFileDialog.getSaveFileName`
        """
        # GIVEN: FileDialog with a mocked QDialog.get_save_file_name method
        # WHEN: Calling FileDialog.getSaveFileName, and `QFileDialog.getSaveFileName` returns a known `selectedFilter`
        with patch('PyQt5.QtWidgets.QFileDialog.getSaveFileName',
                   return_value=('', 'selected filter')):
            result = FileDialog.getSaveFileName()

            # THEN: getSaveFileName() should return a tuple with the second value set to a the selected filter
            assert result[1] == 'selected filter'
Пример #4
0
    def test_get_save_file_name_user_abort(self):
        """
        Test that `getSaveFileName` handles the case when the user cancels the dialog
        """
        # GIVEN: FileDialog with a mocked QDialog.get_save_file_name method
        # WHEN: Calling FileDialog.getSaveFileName and the user cancels the dialog (it returns a tuple with the first
        #       value set as an empty string)
        with patch('PyQt5.QtWidgets.QFileDialog.getSaveFileName',
                   return_value=('', '')):
            result = FileDialog.getSaveFileName()

            # THEN: First value should be None
            assert result[0] is None
Пример #5
0
    def test_get_save_file_name_user_accepts(self):
        """
        Test that `getSaveFileName` handles the case when the user accepts the dialog
        """
        # GIVEN: FileDialog with a mocked QDialog.getSaveFileName method
        # WHEN: Calling FileDialog.getSaveFileName, the user chooses a file and accepts the dialog (it returns a
        #       tuple with the first value set as an string pointing to the file)
        with patch('PyQt5.QtWidgets.QFileDialog.getSaveFileName',
                   return_value=(os.path.join('test', 'chosen.file'), '')):
            result = FileDialog.getSaveFileName()

            # THEN: getSaveFileName() should return a tuple with the first value set to a Path object pointing to the
            #       chosen file
            assert result[0] == Path('test', 'chosen.file')
Пример #6
0
 def on_save_report_button_clicked(self):
     """
     Saving exception log and system information to a file.
     """
     while True:
         file_path, filter_used = FileDialog.getSaveFileName(
             self, translate('OpenLP.ExceptionForm', 'Save Crash Report'),
             Settings().value(self.settings_section + '/last directory'),
             translate('OpenLP.ExceptionForm',
                       'Text files (*.txt *.log *.text)'))
         if file_path is None:
             break
         Settings().setValue(self.settings_section + '/last directory',
                             file_path.parent)
         opts = self._create_report()
         report_text = self.report_text.format(
             version=opts['version'],
             description=opts['description'],
             traceback=opts['traceback'],
             libs=opts['libs'],
             system=opts['system'])
         try:
             with file_path.open('w') as report_file:
                 report_file.write(report_text)
                 break
         except OSError as e:
             log.exception('Failed to write crash report')
             QtWidgets.QMessageBox.warning(
                 self,
                 translate('OpenLP.ExceptionDialog',
                           'Failed to Save Report'),
                 translate(
                     'OpenLP.ExceptionDialog',
                     'The following error occurred when saving the report.\n\n'
                     '{exception}').format(file_name=file_path,
                                           exception=e))
Пример #7
0
 def on_save_report_button_clicked(self):
     """
     Saving exception log and system information to a file.
     """
     file_path, filter_used = FileDialog.getSaveFileName(
         self, translate('OpenLP.ExceptionForm', 'Save Crash Report'),
         Settings().value(self.settings_section + '/last directory'),
         translate('OpenLP.ExceptionForm',
                   'Text files (*.txt *.log *.text)'))
     if file_path:
         Settings().setValue(self.settings_section + '/last directory',
                             file_path.parent)
         opts = self._create_report()
         report_text = self.report_text.format(
             version=opts['version'],
             description=opts['description'],
             traceback=opts['traceback'],
             libs=opts['libs'],
             system=opts['system'])
         try:
             with file_path.open('w') as report_file:
                 report_file.write(report_text)
         except OSError:
             log.exception('Failed to write crash report')
Пример #8
0
def report_song_list():
    """
    Export the song list as a CSV file.
    :return: Nothing
    """
    main_window = Registry().get('main_window')
    plugin = Registry().get('songs').plugin
    report_file_path, filter_used = FileDialog.getSaveFileName(
        main_window, translate('SongPlugin.ReportSongList', 'Save File'),
        Path(translate('SongPlugin.ReportSongList', 'song_extract.csv')),
        translate('SongPlugin.ReportSongList', 'CSV format (*.csv)'))

    if report_file_path is None:
        main_window.error_message(
            translate('SongPlugin.ReportSongList', 'Output Path Not Selected'),
            translate(
                'SongPlugin.ReportSongList',
                'You have not set a valid output location for your report. \n'
                'Please select an existing path on your computer.'))
        return
    report_file_path.with_suffix('.csv')
    Registry().get('application').set_busy_cursor()
    try:
        with report_file_path.open('wt') as export_file:
            fieldnames = ('Title', 'Alternative Title', 'Copyright',
                          'Author(s)', 'Song Book', 'Topic')
            writer = csv.DictWriter(export_file,
                                    fieldnames=fieldnames,
                                    quoting=csv.QUOTE_ALL)
            headers = dict((n, n) for n in fieldnames)
            writer.writerow(headers)
            song_list = plugin.manager.get_all_objects(Song)
            for song in song_list:
                author_list = []
                for author_song in song.authors_songs:
                    author_list.append(author_song.author.display_name)
                author_string = ' | '.join(author_list)
                book_list = []
                for book_song in song.songbook_entries:
                    if hasattr(book_song, 'entry') and book_song.entry:
                        book_list.append('{name} #{entry}'.format(
                            name=book_song.songbook.name,
                            entry=book_song.entry))
                book_string = ' | '.join(book_list)
                topic_list = []
                for topic_song in song.topics:
                    if hasattr(topic_song, 'name'):
                        topic_list.append(topic_song.name)
                topic_string = ' | '.join(topic_list)
                writer.writerow({
                    'Title': song.title,
                    'Alternative Title': song.alternate_title,
                    'Copyright': song.copyright,
                    'Author(s)': author_string,
                    'Song Book': book_string,
                    'Topic': topic_string
                })
            Registry().get('application').set_normal_cursor()
            main_window.information_message(
                translate('SongPlugin.ReportSongList', 'Report Creation'),
                translate('SongPlugin.ReportSongList',
                          'Report \n{name} \nhas been successfully created. ').
                format(name=report_file_path))
    except OSError as ose:
        Registry().get('application').set_normal_cursor()
        log.exception('Failed to write out song usage records')
        critical_error_message_box(
            translate('SongPlugin.ReportSongList', 'Song Extraction Failed'),
            translate('SongPlugin.ReportSongList',
                      'An error occurred while extracting: {error}').format(
                          error=ose.strerror))