DRY map exporting with policy_scoping
This commit is contained in:
parent
14bdc8546b
commit
d3649f1d26
5 changed files with 102 additions and 47 deletions
|
@ -85,11 +85,24 @@ class MapsController < ApplicationController
|
|||
respond_with(@allmappers, @allmappings, @allsynapses, @alltopics, @allmessages, @map)
|
||||
}
|
||||
format.json { render json: @map }
|
||||
format.csv { send_data @map.to_csv }
|
||||
format.xls
|
||||
format.csv { redirect_to :export }
|
||||
format.xls { redirect_to :export }
|
||||
end
|
||||
end
|
||||
|
||||
# GET maps/:id/export
|
||||
def export
|
||||
map = Map.find(params[:id])
|
||||
authorize map
|
||||
exporter = MapExportService(current_user, map)
|
||||
respond_to do |format|
|
||||
format.json { render json: exporter.json }
|
||||
format.csv { send_data exporter.csv }
|
||||
format.xls { @spreadsheet = exporter.xls }
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# GET maps/:id/contains
|
||||
def contains
|
||||
@map = Map.find(params[:id])
|
||||
|
|
|
@ -84,50 +84,6 @@ 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
|
||||
|
||||
def decode_base64(imgBase64)
|
||||
decoded_data = Base64.decode64(imgBase64)
|
||||
|
||||
|
|
84
app/services/map_export_service.rb
Normal file
84
app/services/map_export_service.rb
Normal file
|
@ -0,0 +1,84 @@
|
|||
class MapExportService < Struct.new(:user, :map)
|
||||
def json
|
||||
# marshal_dump turns OpenStruct into a Hash
|
||||
{
|
||||
topics: exportable_topics.map(:marshal_dump),
|
||||
synapses: exportable_synapses.map(:marshal_dump)
|
||||
}
|
||||
end
|
||||
|
||||
def csv(options = {})
|
||||
CSV.generate(options) do |csv|
|
||||
to_spreadsheet.each do |line|
|
||||
csv << line
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def xls
|
||||
to_spreadsheet
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def topic_headings
|
||||
[:id, :name, :metacode, :x, :y, :description, :link, :user, :permission]
|
||||
end
|
||||
def synapse_headings
|
||||
[:topic1, :topic2, :category, :description, :user, :permission]
|
||||
end
|
||||
|
||||
def exportable_topics
|
||||
visible_topics ||= Pundit.policy_scope!(@user, @map.topics)
|
||||
topic_mappings = Mapping.includes(mappable: [:metacode, :user])
|
||||
.where(mappable: visible_topics, map: @map)
|
||||
topic_mappings.map do |mapping|
|
||||
topic = mapping.mappable
|
||||
OpenStruct.new(
|
||||
id: topic.id,
|
||||
name: topic.name,
|
||||
metacode: topic.metacode.name,
|
||||
x: mapping.xloc,
|
||||
y: mapping.yloc,
|
||||
description: topic.desc,
|
||||
link: topic.link,
|
||||
user: topic.user.name,
|
||||
permission: topic.permission
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
def exportable_synapses
|
||||
visible_synapses = Pundit.policy_scope!(@user, @map.synapses)
|
||||
visible_synapses.map do |synapse|
|
||||
OpenStruct.new(
|
||||
topic1: synapse.node1_id,
|
||||
topic2: synapse.node2_id,
|
||||
category: synapse.category,
|
||||
description: synapse.desc,
|
||||
user: synapse.user.name,
|
||||
permission: synapse.permission
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
def to_spreadsheet
|
||||
spreadsheet = []
|
||||
spreadsheet << ["Topics"]
|
||||
spreadsheet << topic_headings.map(:capitalize)
|
||||
exportable_topics.each do |topics|
|
||||
# convert exportable_topics into an array of arrays
|
||||
topic_headings.map do { |h| topics.send(h) }
|
||||
end
|
||||
|
||||
spreadsheet << []
|
||||
spreadsheet << ["Synapses"]
|
||||
spreadsheet << synapse_headings.map(:capitalize)
|
||||
exportable_synapses.each do |synapse|
|
||||
# convert exportable_synapses into an array of arrays
|
||||
synapse_headings.map do { |h| synapse.send(h) }
|
||||
end
|
||||
|
||||
spreadsheet
|
||||
end
|
||||
end
|
|
@ -1,5 +1,5 @@
|
|||
<table>
|
||||
<% @map.to_spreadsheet.each do |line| %>
|
||||
<% @spreadsheet.each do |line| %>
|
||||
<tr>
|
||||
<% line.each do |field| %>
|
||||
<td><%= field %></td>
|
|
@ -36,6 +36,8 @@ Metamaps::Application.routes.draw do
|
|||
get 'topics/:id/relatives', to: 'topics#relatives', as: :relatives
|
||||
|
||||
resources :maps, except: [:index, :new, :edit]
|
||||
get 'maps/:id/export', to: 'maps#export'
|
||||
|
||||
get 'explore/active', to: 'maps#activemaps'
|
||||
get 'explore/featured', to: 'maps#featuredmaps'
|
||||
get 'explore/mine', to: 'maps#mymaps'
|
||||
|
|
Loading…
Reference in a new issue