From b5b13841bc3047093fe3412d0fa2354ed511212f Mon Sep 17 00:00:00 2001 From: Devin Howard Date: Sat, 28 Feb 2015 19:55:45 -0500 Subject: [PATCH 1/5] implement CSV and XLS export for map topics --- app/controllers/maps_controller.rb | 4 +++- app/models/map.rb | 14 ++++++++++++++ app/views/maps/show.xls.erb | 16 ++++++++++++++++ config/application.rb | 1 + config/initializers/mime_types.rb | 2 ++ 5 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 app/views/maps/show.xls.erb diff --git a/app/controllers/maps_controller.rb b/app/controllers/maps_controller.rb index 8f0ced9b..2bd56aca 100644 --- a/app/controllers/maps_controller.rb +++ b/app/controllers/maps_controller.rb @@ -2,7 +2,7 @@ class MapsController < ApplicationController before_filter :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] @@ -86,6 +86,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 3bf5a4a6..6bc5704e 100644 --- a/app/models/map.rb +++ b/app/models/map.rb @@ -82,6 +82,20 @@ class Map < ActiveRecord::Base json end + def to_csv(options = {}) + CSV.generate(options) do |csv| + csv << ["id", "name", "permission", "user.name"] + self.topics.each do |topic| + csv << [ + topic.id, + topic.name, + topic.permission, + topic.user.name + ] + end + end + end + ##### PERMISSIONS ###### def authorize_to_delete(user) diff --git a/app/views/maps/show.xls.erb b/app/views/maps/show.xls.erb new file mode 100644 index 00000000..7c4f8078 --- /dev/null +++ b/app/views/maps/show.xls.erb @@ -0,0 +1,16 @@ + + + + + + + + <% @map.topics.each do |topic| %> + + + + + + + <% end %> +
IDNamePermissionUsername
<%= topic.id %><%= topic.name %><%= topic.permission %><%= topic.user.name %>
diff --git a/config/application.rb b/config/application.rb index d9f5f0f1..8769db39 100644 --- a/config/application.rb +++ b/config/application.rb @@ -1,5 +1,6 @@ require File.expand_path('../boot', __FILE__) +require 'csv' require 'rails/all' if defined?(Bundler) diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb index 72aca7e4..8b5e5425 100644 --- a/config/initializers/mime_types.rb +++ b/config/initializers/mime_types.rb @@ -3,3 +3,5 @@ # Add new mime types for use in respond_to blocks: # Mime::Type.register "text/richtext", :rtf # Mime::Type.register_alias "text/html", :iphone + +Mime::Type.register "application/xls", :xls From 657925e0e26e07c380ef597e6c1663371171be28 Mon Sep 17 00:00:00 2001 From: Devin Howard Date: Sun, 1 Mar 2015 13:13:52 -0500 Subject: [PATCH 2/5] added metacode to the xls and csv views --- app/models/map.rb | 7 ++++--- app/views/maps/show.xls.erb | 6 ++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/models/map.rb b/app/models/map.rb index 6bc5704e..ddcefb86 100644 --- a/app/models/map.rb +++ b/app/models/map.rb @@ -84,13 +84,14 @@ class Map < ActiveRecord::Base def to_csv(options = {}) CSV.generate(options) do |csv| - csv << ["id", "name", "permission", "user.name"] + csv << ["id", "name", "metacode", "user.name", "permission"] self.topics.each do |topic| csv << [ topic.id, topic.name, - topic.permission, - topic.user.name + topic.metacode.name, + topic.user.name, + topic.permission ] end end diff --git a/app/views/maps/show.xls.erb b/app/views/maps/show.xls.erb index 7c4f8078..f455ff1d 100644 --- a/app/views/maps/show.xls.erb +++ b/app/views/maps/show.xls.erb @@ -2,15 +2,17 @@ ID Name - Permission + Metacode Username + Permission <% @map.topics.each do |topic| %> <%= topic.id %> <%= topic.name %> - <%= topic.permission %> + <%= topic.metacode.name %> <%= topic.user.name %> + <%= topic.permission %> <% end %> From 44c8779d8915ba89672a57d751d33f06785c6132 Mon Sep 17 00:00:00 2001 From: Devin Howard Date: Sun, 1 Mar 2015 20:25:23 -0500 Subject: [PATCH 3/5] add synapses to XLS and CSV output --- app/models/map.rb | 5 +++-- app/models/topic.rb | 31 +++++++++++++++++++++++++++++++ app/views/maps/show.xls.erb | 4 ++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/app/models/map.rb b/app/models/map.rb index ddcefb86..280fcef3 100644 --- a/app/models/map.rb +++ b/app/models/map.rb @@ -84,14 +84,15 @@ class Map < ActiveRecord::Base def to_csv(options = {}) CSV.generate(options) do |csv| - csv << ["id", "name", "metacode", "user.name", "permission"] + csv << ["id", "name", "metacode", "user.name", "permission", "synapses"] self.topics.each do |topic| csv << [ topic.id, topic.name, topic.metacode.name, topic.user.name, - topic.permission + topic.permission, + topic.synapses_csv("text") ] end end diff --git a/app/models/topic.rb b/app/models/topic.rb index 7e5fff94..b4218202 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -90,6 +90,37 @@ class Topic < ActiveRecord::Base end return result end + + def synapses_csv(output_format = "array") + output = [] + self.synapses.each do |synapse| + if synapse.category == "from-to" + if synapse.node1_id == self.id + output << synapse.node1_id.to_s + "->" + synapse.node2_id.to_s + elsif synapse.node2_id == self.id + output << synapse.node2_id.to_s + "<-" + synapse.node1_id.to_s + else + abort("invalid synapse on topic in synapse_csv") + end + elsif synapse.category == "both" + if synapse.node1_id == self.id + output << synapse.node1_id.to_s + "<->" + synapse.node2_id.to_s + elsif synapse.node2_id == self.id + output << synapse.node2_id.to_s + "<->" + synapse.node1_id.to_s + else + abort("invalid synapse on topic in synapse_csv") + end + end + end + if output_format == "array" + return output + elsif output_format == "text" + return output.join("; ") + else + abort("invalid argument to synapses_csv") + end + return output + end ##### PERMISSIONS ###### diff --git a/app/views/maps/show.xls.erb b/app/views/maps/show.xls.erb index f455ff1d..55b89552 100644 --- a/app/views/maps/show.xls.erb +++ b/app/views/maps/show.xls.erb @@ -5,6 +5,7 @@ Metacode Username Permission + Synapses <% @map.topics.each do |topic| %> @@ -13,6 +14,9 @@ <%= topic.metacode.name %> <%= topic.user.name %> <%= topic.permission %> + <% topic.synapses_csv.each do |s_text| %> + <%= s_text %> + <% end %> <% end %> From a525f9d89ebb188b02f066b38a35b00bcaf962af Mon Sep 17 00:00:00 2001 From: Devin Howard Date: Sun, 1 Mar 2015 20:25:39 -0500 Subject: [PATCH 4/5] change line encoding of models/topic.rb to unix --- app/models/topic.rb | 318 ++++++++++++++++++++++---------------------- 1 file changed, 159 insertions(+), 159 deletions(-) diff --git a/app/models/topic.rb b/app/models/topic.rb index b4218202..0af94656 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -1,159 +1,159 @@ -class Topic < ActiveRecord::Base - include TopicsHelper - - belongs_to :user - - has_many :synapses1, :class_name => 'Synapse', :foreign_key => 'node1_id' - has_many :synapses2, :class_name => 'Synapse', :foreign_key => 'node2_id' - has_many :topics1, :through => :synapses2, :source => :topic1 - has_many :topics2, :through => :synapses1, :source => :topic2 - - has_many :mappings - has_many :maps, :through => :mappings - - # This method associates the attribute ":image" with a file attachment - has_attached_file :image - - #, styles: { - # thumb: '100x100>', - # square: '200x200#', - # medium: '300x300>' - #} - - # Validate the attached image is image/jpg, image/png, etc - validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/ - - # This method associates the attribute ":image" with a file attachment - has_attached_file :audio - # Validate the attached audio is audio/wav, audio/mp3, etc - validates_attachment_content_type :audio, :content_type => /\Aaudio\/.*\Z/ - - def synapses - synapses1 + synapses2 - end - - def relatives - topics1 + topics2 - end - - belongs_to :metacode - - def user_name - self.user.name - end - - def user_image - self.user.image.url - end - - def map_count - self.maps.count - end - - def synapse_count - self.synapses.count - end - - def inmaps - self.maps.map(&:name) - end - - def inmapsLinks - self.maps.map(&:id) - end - - def as_json(options={}) - super(:methods =>[:user_name, :user_image, :map_count, :synapse_count, :inmaps, :inmapsLinks]) - end - - def topic_autocomplete_method - "Get: #{self.name}" - end - - def mk_permission - if self.permission == "commons" - "co" - elsif self.permission == "public" - "pu" - elsif self.permission == "private" - "pr" - end - end - - # has no viewable synapses helper function - def has_viewable_synapses(current) - result = false - self.synapses.each do |synapse| - if synapse.authorize_to_view(current) - result = true - end - end - return result - end - - def synapses_csv(output_format = "array") - output = [] - self.synapses.each do |synapse| - if synapse.category == "from-to" - if synapse.node1_id == self.id - output << synapse.node1_id.to_s + "->" + synapse.node2_id.to_s - elsif synapse.node2_id == self.id - output << synapse.node2_id.to_s + "<-" + synapse.node1_id.to_s - else - abort("invalid synapse on topic in synapse_csv") - end - elsif synapse.category == "both" - if synapse.node1_id == self.id - output << synapse.node1_id.to_s + "<->" + synapse.node2_id.to_s - elsif synapse.node2_id == self.id - output << synapse.node2_id.to_s + "<->" + synapse.node1_id.to_s - else - abort("invalid synapse on topic in synapse_csv") - end - end - end - if output_format == "array" - return output - elsif output_format == "text" - return output.join("; ") - else - abort("invalid argument to synapses_csv") - end - return output - end - - ##### PERMISSIONS ###### - - # returns false if user not allowed to 'show' Topic, Synapse, or Map - def authorize_to_show(user) - if (self.permission == "private" && self.user != user) - return false - end - return self - end - - # returns false if user not allowed to 'edit' Topic, Synapse, or Map - def authorize_to_edit(user) - if (self.permission == "private" && self.user != user) - return false - elsif (self.permission == "public" && self.user != user) - return false - end - return self - end - - def authorize_to_delete(user) - if (self.user != user) - return false - end - return self - end - - # returns Boolean if user allowed to view Topic, Synapse, or Map - def authorize_to_view(user) - if (self.permission == "private" && self.user != user) - return false - end - return true - end -end +class Topic < ActiveRecord::Base + include TopicsHelper + + belongs_to :user + + has_many :synapses1, :class_name => 'Synapse', :foreign_key => 'node1_id' + has_many :synapses2, :class_name => 'Synapse', :foreign_key => 'node2_id' + has_many :topics1, :through => :synapses2, :source => :topic1 + has_many :topics2, :through => :synapses1, :source => :topic2 + + has_many :mappings + has_many :maps, :through => :mappings + + # This method associates the attribute ":image" with a file attachment + has_attached_file :image + + #, styles: { + # thumb: '100x100>', + # square: '200x200#', + # medium: '300x300>' + #} + + # Validate the attached image is image/jpg, image/png, etc + validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/ + + # This method associates the attribute ":image" with a file attachment + has_attached_file :audio + # Validate the attached audio is audio/wav, audio/mp3, etc + validates_attachment_content_type :audio, :content_type => /\Aaudio\/.*\Z/ + + def synapses + synapses1 + synapses2 + end + + def relatives + topics1 + topics2 + end + + belongs_to :metacode + + def user_name + self.user.name + end + + def user_image + self.user.image.url + end + + def map_count + self.maps.count + end + + def synapse_count + self.synapses.count + end + + def inmaps + self.maps.map(&:name) + end + + def inmapsLinks + self.maps.map(&:id) + end + + def as_json(options={}) + super(:methods =>[:user_name, :user_image, :map_count, :synapse_count, :inmaps, :inmapsLinks]) + end + + def topic_autocomplete_method + "Get: #{self.name}" + end + + def mk_permission + if self.permission == "commons" + "co" + elsif self.permission == "public" + "pu" + elsif self.permission == "private" + "pr" + end + end + + # has no viewable synapses helper function + def has_viewable_synapses(current) + result = false + self.synapses.each do |synapse| + if synapse.authorize_to_view(current) + result = true + end + end + return result + end + + def synapses_csv(output_format = "array") + output = [] + self.synapses.each do |synapse| + if synapse.category == "from-to" + if synapse.node1_id == self.id + output << synapse.node1_id.to_s + "->" + synapse.node2_id.to_s + elsif synapse.node2_id == self.id + output << synapse.node2_id.to_s + "<-" + synapse.node1_id.to_s + else + abort("invalid synapse on topic in synapse_csv") + end + elsif synapse.category == "both" + if synapse.node1_id == self.id + output << synapse.node1_id.to_s + "<->" + synapse.node2_id.to_s + elsif synapse.node2_id == self.id + output << synapse.node2_id.to_s + "<->" + synapse.node1_id.to_s + else + abort("invalid synapse on topic in synapse_csv") + end + end + end + if output_format == "array" + return output + elsif output_format == "text" + return output.join("; ") + else + abort("invalid argument to synapses_csv") + end + return output + end + + ##### PERMISSIONS ###### + + # returns false if user not allowed to 'show' Topic, Synapse, or Map + def authorize_to_show(user) + if (self.permission == "private" && self.user != user) + return false + end + return self + end + + # returns false if user not allowed to 'edit' Topic, Synapse, or Map + def authorize_to_edit(user) + if (self.permission == "private" && self.user != user) + return false + elsif (self.permission == "public" && self.user != user) + return false + end + return self + end + + def authorize_to_delete(user) + if (self.user != user) + return false + end + return self + end + + # returns Boolean if user allowed to view Topic, Synapse, or Map + def authorize_to_view(user) + if (self.permission == "private" && self.user != user) + return false + end + return true + end +end From 3473cf3736def2777b0cc0b3cfedbd44beb35f81 Mon Sep 17 00:00:00 2001 From: Devin Howard Date: Mon, 2 Mar 2015 17:45:15 -0500 Subject: [PATCH 5/5] add desc and link to xls and csv exporters --- app/models/map.rb | 4 +++- app/views/maps/show.xls.erb | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/models/map.rb b/app/models/map.rb index 280fcef3..0364b4de 100644 --- a/app/models/map.rb +++ b/app/models/map.rb @@ -84,12 +84,14 @@ class Map < ActiveRecord::Base def to_csv(options = {}) CSV.generate(options) do |csv| - csv << ["id", "name", "metacode", "user.name", "permission", "synapses"] + csv << ["id", "name", "metacode", "desc", "link", "user.name", "permission", "synapses"] self.topics.each do |topic| csv << [ topic.id, topic.name, topic.metacode.name, + topic.desc, + topic.link, topic.user.name, topic.permission, topic.synapses_csv("text") diff --git a/app/views/maps/show.xls.erb b/app/views/maps/show.xls.erb index 55b89552..d00dd36e 100644 --- a/app/views/maps/show.xls.erb +++ b/app/views/maps/show.xls.erb @@ -3,6 +3,8 @@ ID Name Metacode + Description + Link Username Permission Synapses @@ -12,6 +14,8 @@ <%= topic.id %> <%= topic.name %> <%= topic.metacode.name %> + <%= topic.desc %> + <%= topic.link %> <%= topic.user.name %> <%= topic.permission %> <% topic.synapses_csv.each do |s_text| %>