Export follow/block lists as CSV
This commit is contained in:
		@@ -1,16 +1,46 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require 'csv'
 | 
			
		||||
 | 
			
		||||
class Settings::ExportsController < ApplicationController
 | 
			
		||||
  layout 'admin'
 | 
			
		||||
 | 
			
		||||
  before_action :authenticate_user!
 | 
			
		||||
  before_action :set_account
 | 
			
		||||
 | 
			
		||||
  def show; end
 | 
			
		||||
  def show
 | 
			
		||||
    @total_storage = current_account.media_attachments.sum(:file_file_size)
 | 
			
		||||
    @total_follows = current_account.following.count
 | 
			
		||||
    @total_blocks  = current_account.blocking.count
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def download_following_list
 | 
			
		||||
    @accounts = current_account.following
 | 
			
		||||
 | 
			
		||||
    respond_to do |format|
 | 
			
		||||
      format.csv { render text: accounts_list_to_csv(@accounts) }
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def download_blocking_list
 | 
			
		||||
    @accounts = current_account.blocking
 | 
			
		||||
 | 
			
		||||
    respond_to do |format|
 | 
			
		||||
      format.csv { render text: accounts_list_to_csv(@accounts) }
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def set_account
 | 
			
		||||
    @account = current_user.account
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def accounts_list_to_csv(list)
 | 
			
		||||
    CSV.generate do |csv|
 | 
			
		||||
      list.each do |account|
 | 
			
		||||
        csv << [(account.local? ? "#{account.username}@#{Rails.configuration.x.local_domain}" : account.acct)]
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -1,2 +1,17 @@
 | 
			
		||||
- content_for :page_title do
 | 
			
		||||
  = t('settings.export')
 | 
			
		||||
 | 
			
		||||
%table.table
 | 
			
		||||
  %tbody
 | 
			
		||||
    %tr
 | 
			
		||||
      %th= t('exports.storage')
 | 
			
		||||
      %td= number_to_human_size @total_storage
 | 
			
		||||
      %td
 | 
			
		||||
    %tr
 | 
			
		||||
      %th= t('exports.follows')
 | 
			
		||||
      %td= @total_follows
 | 
			
		||||
      %td= table_link_to 'download', t('exports.csv'), follows_settings_export_path(format: :csv)
 | 
			
		||||
    %tr
 | 
			
		||||
      %th= t('exports.blocks')
 | 
			
		||||
      %td= @total_blocks
 | 
			
		||||
      %td= table_link_to 'download', t('exports.csv'), blocks_settings_export_path(format: :csv)
 | 
			
		||||
 
 | 
			
		||||
@@ -29,8 +29,8 @@ en:
 | 
			
		||||
    remote_follow: Remote follow
 | 
			
		||||
    unfollow: Unfollow
 | 
			
		||||
  application_mailer:
 | 
			
		||||
    signature: Mastodon notifications from %{instance}
 | 
			
		||||
    settings: 'Change e-mail preferences: %{link}'
 | 
			
		||||
    signature: Mastodon notifications from %{instance}
 | 
			
		||||
    view: 'View:'
 | 
			
		||||
  applications:
 | 
			
		||||
    invalid_url: The provided URL is invalid
 | 
			
		||||
@@ -63,6 +63,11 @@ en:
 | 
			
		||||
      x_minutes: "%{count}m"
 | 
			
		||||
      x_months: "%{count}mo"
 | 
			
		||||
      x_seconds: "%{count}s"
 | 
			
		||||
  exports:
 | 
			
		||||
    blocks: You block
 | 
			
		||||
    csv: CSV
 | 
			
		||||
    follows: You follow
 | 
			
		||||
    storage: Media storage
 | 
			
		||||
  generic:
 | 
			
		||||
    changes_saved_msg: Changes successfully saved!
 | 
			
		||||
    powered_by: powered by %{link}
 | 
			
		||||
@@ -71,6 +76,15 @@ en:
 | 
			
		||||
      one: Something isn't quite right yet! Please review the error below
 | 
			
		||||
      other: Something isn't quite right yet! Please review %{count} errors below
 | 
			
		||||
  notification_mailer:
 | 
			
		||||
    digest:
 | 
			
		||||
      body: 'Here is a brief summary of what you missed on %{instance} since your last visit on %{since}:'
 | 
			
		||||
      mention: "%{name} mentioned you in:"
 | 
			
		||||
      new_followers_summary:
 | 
			
		||||
        one: You have acquired one new follower! Yay!
 | 
			
		||||
        other: You have gotten %{count} new followers! Amazing!
 | 
			
		||||
      subject:
 | 
			
		||||
        one: "1 new notification since your last visit \U0001F418"
 | 
			
		||||
        other: "%{count} new notifications since your last visit \U0001F418"
 | 
			
		||||
    favourite:
 | 
			
		||||
      body: 'Your status was favourited by %{name}:'
 | 
			
		||||
      subject: "%{name} favourited your status"
 | 
			
		||||
@@ -86,15 +100,6 @@ en:
 | 
			
		||||
    reblog:
 | 
			
		||||
      body: 'Your status was boosted by %{name}:'
 | 
			
		||||
      subject: "%{name} boosted your status"
 | 
			
		||||
    digest:
 | 
			
		||||
      subject:
 | 
			
		||||
        one: "1 new notification since your last visit 🐘"
 | 
			
		||||
        other: "%{count} new notifications since your last visit 🐘"
 | 
			
		||||
      body: 'Here is a brief summary of what you missed on %{instance} since your last visit on %{since}:'
 | 
			
		||||
      mention: "%{name} mentioned you in:"
 | 
			
		||||
      new_followers_summary:
 | 
			
		||||
        one: You have acquired one new follower! Yay!
 | 
			
		||||
        other: You have gotten %{count} new followers! Amazing!
 | 
			
		||||
  pagination:
 | 
			
		||||
    next: Next
 | 
			
		||||
    prev: Prev
 | 
			
		||||
@@ -104,6 +109,7 @@ en:
 | 
			
		||||
    proceed: Proceed to follow
 | 
			
		||||
    prompt: 'You are going to follow:'
 | 
			
		||||
  settings:
 | 
			
		||||
    authorized_apps: Authorized apps
 | 
			
		||||
    back: Back to Mastodon
 | 
			
		||||
    edit_profile: Edit profile
 | 
			
		||||
    export: Data export
 | 
			
		||||
 
 | 
			
		||||
@@ -29,12 +29,12 @@ en:
 | 
			
		||||
        must_be_follower: Block notifications from non-followers
 | 
			
		||||
        must_be_following: Block notifications from people you don't follow
 | 
			
		||||
      notification_emails:
 | 
			
		||||
        digest: Send digest e-mails
 | 
			
		||||
        favourite: Send e-mail when someone favourites your status
 | 
			
		||||
        follow: Send e-mail when someone follows you
 | 
			
		||||
        follow_request: Send e-mail when someone requests to follow you
 | 
			
		||||
        mention: Send e-mail when someone mentions you
 | 
			
		||||
        reblog: Send e-mail when someone reblogs your status
 | 
			
		||||
        digest: Send digest e-mails
 | 
			
		||||
    'no': 'No'
 | 
			
		||||
    required:
 | 
			
		||||
      mark: "*"
 | 
			
		||||
 
 | 
			
		||||
@@ -9,8 +9,8 @@ SimpleNavigation::Configuration.run do |navigation|
 | 
			
		||||
      settings.item :preferences, safe_join([fa_icon('sliders fw'), t('settings.preferences')]), settings_preferences_url
 | 
			
		||||
      settings.item :password, safe_join([fa_icon('cog fw'), t('auth.change_password')]), edit_user_registration_url
 | 
			
		||||
      settings.item :two_factor_auth, safe_join([fa_icon('mobile fw'), t('settings.two_factor_auth')]), settings_two_factor_auth_url
 | 
			
		||||
      # settings.item :export, safe_join([fa_icon('cloud-download fw'), t('settings.export')]), settings_export_url
 | 
			
		||||
      settings.item :authorized_apps, safe_join([fa_icon('list fw'), 'Authorized Apps']), oauth_authorized_applications_url
 | 
			
		||||
      settings.item :export, safe_join([fa_icon('cloud-download fw'), t('settings.export')]), settings_export_url
 | 
			
		||||
      settings.item :authorized_apps, safe_join([fa_icon('list fw'), t('settings.authorized_apps')]), oauth_authorized_applications_url
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    primary.item :admin, safe_join([fa_icon('cogs fw'), 'Administration']), admin_accounts_url, if: proc { current_user.admin? } do |admin|
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,13 @@ Rails.application.routes.draw do
 | 
			
		||||
  namespace :settings do
 | 
			
		||||
    resource :profile, only: [:show, :update]
 | 
			
		||||
    resource :preferences, only: [:show, :update]
 | 
			
		||||
    resource :export, only: [:show]
 | 
			
		||||
 | 
			
		||||
    resource :export, only: [:show] do
 | 
			
		||||
      collection do
 | 
			
		||||
        get :follows, to: 'exports#download_following_list'
 | 
			
		||||
        get :blocks, to: 'exports#download_blocking_list'
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    resource :two_factor_auth, only: [:show] do
 | 
			
		||||
      member do
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user