notebook/app/controllers/export_controller.rb
2016-10-04 23:03:27 +02:00

128 lines
3.1 KiB
Ruby

class ExportController < ApplicationController
def index
end
# Formats
def universes_csv
send_data to_csv(current_user.universes), filename: "universes-#{Date.today}.csv"
end
def characters_csv
send_data to_csv(current_user.characters), filename: "characters-#{Date.today}.csv"
end
def locations_csv
send_data to_csv(current_user.locations), filename: "locations-#{Date.today}.csv"
end
def items_csv
send_data to_csv(current_user.items), filename: "items-#{Date.today}.csv"
end
def outline
send_data content_to_outline, filename: "notebook-#{Date.today}.txt"
end
def notebook_json
json_dump = current_user.content.map { |_, content| to_json(content) }.to_json
send_data json_dump, filename: "notebook-#{Date.today}.json"
end
def pdf
end
def html
end
def xml
end
def scrivener
end
private
def to_csv ar_relation
ar_class = ar_relation.build.class
attributes = ar_class.attribute_categories.flat_map { |k, v| v[:attributes] }
CSV.generate(headers: true) do |csv|
csv << attributes
ar_relation.each do |content|
csv << attributes.map do |attr|
value = content.send(attr)
if value.is_a?(ActiveRecord::Associations::CollectionProxy)
value = value.map(&:name).to_sentence
elsif attr.end_with?('_id') && value.present?
universe = Universe.where(id: value.to_i).first
value = universe.name if universe
end
value
end
end
end
end
def to_json ar_relation
ar_class = ar_relation.build.class
attributes = ar_class.attribute_categories.flat_map { |k, v| v[:attributes] }
ar_relation.map do |content|
content_json = {}
attributes.each do |attr|
value = content.send(attr)
if value.is_a?(ActiveRecord::Associations::CollectionProxy)
value = value.map(&:name).to_sentence
elsif attr.end_with?('_id') && value.present?
universe = Universe.where(id: value.to_i)
value = universe.name if universe
end
content_json[attr] = value
end
content_json
end
end
def content_to_outline
content_types = %w(universes characters locations items)
text = ""
content_types.each do |content_type|
ar_class = current_user.send(content_type).build.class
attributes = ar_class.attribute_categories.flat_map { |k, v| v[:attributes] }
text << "\n#{content_type.upcase}\n"
current_user.send(content_type).each do |content|
text << " #{content.name}\n"
attributes.each do |attr|
value = content.send(attr)
next if value.nil? || value.blank? || (value.respond_to?(:empty) && value.empty?)
if value.is_a?(ActiveRecord::Associations::CollectionProxy)
value = value.map(&:name).to_sentence
elsif attr.end_with?('_id') && value.present?
universe = Universe.where(id: value.to_i)
value = universe.name if universe
end
text << " #{attr}: #{value.split("\n").join("\n ")}\n"
end
text << "\n"
end
end
text
end
end