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..0364b4de 100644 --- a/app/models/map.rb +++ b/app/models/map.rb @@ -82,6 +82,24 @@ class Map < ActiveRecord::Base json end + def to_csv(options = {}) + CSV.generate(options) do |csv| + 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") + ] + end + end + end + ##### PERMISSIONS ###### def authorize_to_delete(user) diff --git a/app/models/topic.rb b/app/models/topic.rb index 7e5fff94..0af94656 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -1,128 +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 - - ##### 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 diff --git a/app/views/maps/show.xls.erb b/app/views/maps/show.xls.erb new file mode 100644 index 00000000..d00dd36e --- /dev/null +++ b/app/views/maps/show.xls.erb @@ -0,0 +1,26 @@ +
ID | +Name | +Metacode | +Description | +Link | +Username | +Permission | +Synapses | +
---|---|---|---|---|---|---|---|
<%= topic.id %> | +<%= topic.name %> | +<%= topic.metacode.name %> | +<%= topic.desc %> | +<%= topic.link %> | +<%= topic.user.name %> | +<%= topic.permission %> | + <% topic.synapses_csv.each do |s_text| %> +<%= s_text %> | + <% end %> +