diff --git a/app/controllers/maps_controller.rb b/app/controllers/maps_controller.rb index f3bdda49..bd29ae90 100644 --- a/app/controllers/maps_controller.rb +++ b/app/controllers/maps_controller.rb @@ -1,7 +1,7 @@ class MapsController < ApplicationController before_action :require_user, only: [:create, :update, :screenshot, :destroy] - respond_to :html, :json + respond_to :html, :json, :csv autocomplete :map, :name, :full => true, :extra_data => [:user_id] @@ -46,7 +46,6 @@ class MapsController < ApplicationController # GET maps/:id def show - @current = current_user @map = Map.find(params[:id]).authorize_to_show(@current) @@ -67,6 +66,8 @@ class MapsController < ApplicationController respond_with(@allmappers, @allmappings, @allsynapses, @alltopics, @map) } format.json { render json: @map } + format.csv { send_data @map.to_csv } + format.xls end end diff --git a/app/models/map.rb b/app/models/map.rb index 6c2caca2..87ee5839 100644 --- a/app/models/map.rb +++ b/app/models/map.rb @@ -79,6 +79,50 @@ class Map < ActiveRecord::Base json end + def to_spreadsheet + spreadsheet = [] + spreadsheet << ["Topics"] + spreadsheet << ["Id", "Name", "Metacode", "X", "Y", "Description", "Link", "User", "Permission"] + self.topicmappings.each do |mapping| + topic = mapping.mappable + next if topic.nil? + spreadsheet << [ + topic.id, + topic.name, + topic.metacode.name, + mapping.xloc, + mapping.yloc, + topic.desc, + topic.link, + topic.user.name, + topic.permission + ] + end + spreadsheet << [] + spreadsheet << ["Synapses"] + spreadsheet << ["Id", "Description", "Category", "Topic1", "Topic2", "User", "Permission"] + self.synapses.each do |synapse| + spreadsheet << [ + synapse.id, + synapse.desc, + synapse.category, + synapse.node1_id, + synapse.node2_id, + synapse.user.name, + synapse.permission + ] + end + spreadsheet + end + + def to_csv(options = {}) + CSV.generate(options) do |csv| + to_spreadsheet.each do |line| + csv << line + end + end + end + ##### PERMISSIONS ###### def authorize_to_delete(user) diff --git a/app/models/topic.rb b/app/models/topic.rb index c528aa6e..3e66366b 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -87,6 +87,38 @@ class Topic < ActiveRecord::Base end result end + + # TODO move to a decorator? + def synapses_csv(output_format = 'array') + output = [] + synapses.each do |synapse| + if synapse.category == 'from-to' + if synapse.node1_id == id + output << synapse.node1_id.to_s + '->' + synapse.node2_id.to_s + elsif synapse.node2_id == id + output << synapse.node2_id.to_s + '<-' + synapse.node1_id.to_s + else + fail 'invalid synapse on topic in synapse_csv' + end + elsif synapse.category == 'both' + if synapse.node1_id == id + output << synapse.node1_id.to_s + '<->' + synapse.node2_id.to_s + elsif synapse.node2_id == id + output << synapse.node2_id.to_s + '<->' + synapse.node1_id.to_s + else + fail 'invalid synapse on topic in synapse_csv' + end + end + end + if output_format == 'array' + return output + elsif output_format == 'text' + return output.join('; ') + else + fail 'invalid argument to synapses_csv' + end + output + end ##### PERMISSIONS ###### diff --git a/app/views/maps/show.xls.erb b/app/views/maps/show.xls.erb new file mode 100644 index 00000000..2f11a946 --- /dev/null +++ b/app/views/maps/show.xls.erb @@ -0,0 +1,9 @@ +
<%= field %> | + <% end %> +