Beispiel #1
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))