Skip to content

Commit

Permalink
Merge pull request #107 from indentlabs/exporting
Browse files Browse the repository at this point in the history
Add notebook exporting to TXT, CSV, and JSON
  • Loading branch information
drusepth authored Oct 4, 2016
2 parents e53201e + 00563e5 commit b303197
Show file tree
Hide file tree
Showing 13 changed files with 192 additions and 4 deletions.
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

0 comments on commit b303197

Please sign in to comment.