Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 124 additions & 0 deletions app/controllers/export_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
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?
value = Universe.find(value.to_i).name
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?
value = Universe.find(value.to_i).name
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?
value = Universe.find(value.to_i).name
end

text << " #{attr}: #{value.split("\n").join("\n ")}\n"
end

text << "\n"
end
end

text
end
end
2 changes: 2 additions & 0 deletions app/helpers/export_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
module ExportHelper
end
2 changes: 2 additions & 0 deletions app/views/export/csv.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<h1>Export#csv</h1>
<p>Find me in app/views/export/csv.html.erb</p>
2 changes: 2 additions & 0 deletions app/views/export/html.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<h1>Export#html</h1>
<p>Find me in app/views/export/html.html.erb</p>
35 changes: 35 additions & 0 deletions app/views/export/index.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<div class="row">
<div class="col s12">
<ul class="collection with-header hoverable">
<li class="collection-header">
<h4>Download your Notebook</h4>
<div>We offer the following download formats, with more coming soon.</div>
</li>
<li class="collection-item avatar">
<i class="material-icons circle">file_download</i>
<div class="title">Outline (TXT)</div>
<ul>
<li><%= link_to "notebook.txt", notebook_outline_path %></li>
</ul>
</li>
<li class="collection-item avatar">
<i class="material-icons circle">file_download</i>
<div class="title">Excel (CSV)</div>
<ul>
<li><%= link_to "universes.csv", universes_csv_path %></li>
<li><%= link_to "characters.csv", characters_csv_path %></li>
<li><%= link_to "locations.csv", locations_csv_path %></li>
<li><%= link_to "items.csv", items_csv_path %></li>
</ul>
</li>
<li class="collection-item avatar">
<i class="material-icons circle">file_download</i>
<div class="title">JSON</div>
<ul>
<li><%= link_to "notebook.json", notebook_json_path %></li>
</ul>
</li>
</ul>

</div>
</div>
2 changes: 2 additions & 0 deletions app/views/export/json.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<h1>Export#json</h1>
<p>Find me in app/views/export/json.html.erb</p>
2 changes: 2 additions & 0 deletions app/views/export/outline.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<h1>Export#outline</h1>
<p>Find me in app/views/export/outline.html.erb</p>
2 changes: 2 additions & 0 deletions app/views/export/pdf.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<h1>Export#pdf</h1>
<p>Find me in app/views/export/pdf.html.erb</p>
2 changes: 2 additions & 0 deletions app/views/export/scrivener.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<h1>Export#scrivener</h1>
<p>Find me in app/views/export/scrivener.html.erb</p>
2 changes: 2 additions & 0 deletions app/views/export/xml.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<h1>Export#xml</h1>
<p>Find me in app/views/export/xml.html.erb</p>
2 changes: 2 additions & 0 deletions app/views/layouts/_navbar.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
<li><%= link_to 'Request a feature', 'https://docs.google.com/forms/d/e/1FAIpQLScOhSMdDqWqJu9HGPQdmd0R9s90_AcSo0g6_Nc1qNjQIbSaXA/viewform', target: '_new' %></li>
<li><%= link_to 'Leave feedback', 'https://docs.google.com/forms/d/e/1FAIpQLScZWEVMgm8hBWIIVj1LPzo0GqflmWUrLQlc4TAYqsaS087oAA/viewform', target: '_new' %></li>
<li class="divider"></li>
<li><%= link_to 'Notebook downloads', notebook_export_path %></li>
<li><%= link_to 'Privacy policy', privacy_policy_path %></li>
<li class="divider"></li>
<li><%= link_to "Sign out", destroy_user_session_path %></li>
Expand All @@ -24,6 +25,7 @@
<li><%= link_to 'Request a feature', 'https://docs.google.com/forms/d/e/1FAIpQLScOhSMdDqWqJu9HGPQdmd0R9s90_AcSo0g6_Nc1qNjQIbSaXA/viewform', target: '_new' %></li>
<li><%= link_to 'Leave feedback', 'https://docs.google.com/forms/d/e/1FAIpQLScZWEVMgm8hBWIIVj1LPzo0GqflmWUrLQlc4TAYqsaS087oAA/viewform', target: '_new' %></li>
<li class="divider"></li>
<li><%= link_to 'Notebook downloads', notebook_export_path %></li>
<li><%= link_to 'Privacy policy', privacy_policy_path %></li>
<li class="divider"></li>
<li><%= link_to "Sign out", destroy_user_session_path %></li>
Expand Down
1 change: 1 addition & 0 deletions config/application.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
require File.expand_path('../boot', __FILE__)

require 'rails/all'
require 'csv'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Expand Down
18 changes: 14 additions & 4 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,6 @@
get '/plots', to: 'main#comingsoon'
end

scope '/scene/:scene_id' do
get 'editor', to: 'write#editor'
end

scope 'admin' do
get '/', to: 'admin#dashboard', as: :admin_dashboard
get '/universes', to: 'admin#universes', as: :admin_universes
Expand All @@ -51,6 +47,20 @@
get '/items', to: 'admin#items', as: :admin_items
end

scope 'export' do
get '/', to: 'export#index', as: :notebook_export
get '/universes.csv', to: 'export#universes_csv', as: :universes_csv
get '/characters.csv', to: 'export#characters_csv', as: :characters_csv
get '/locations.csv', to: 'export#locations_csv', as: :locations_csv
get '/items.csv', to: 'export#items_csv', as: :items_csv
get '/outline', to: 'export#outline', as: :notebook_outline
get '/notebook.json', to: 'export#notebook_json', as: :notebook_json
end

scope '/scene/:scene_id' do
get 'editor', to: 'write#editor'
end

# API Endpoints
scope '/generate' do
# General information
Expand Down