-
Notifications
You must be signed in to change notification settings - Fork 210
/
images_controller.rb
112 lines (102 loc) · 3.35 KB
/
images_controller.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
require 'open-uri'
class ImagesController < ApplicationController
rescue_from Errno::ENOENT, Errno::ETIMEDOUT,
OpenURI::HTTPError, Timeout::Error,
with: :url_upload_not_found
protect_from_forgery except: %i(update delete)
# Convert model to json without including root name. Eg. 'warpable'
ActiveRecord::Base.include_root_in_json = false
# proxy, used if MapKnitter is being backed by Amazon S3 file storage,
# to enable client-side distortion using webgl-distort, which requires same-origin
def fetch
if Rails.env.production?
if params[:url][0..42] == 'https://s3.amazonaws.com/grassrootsmapping/'
url = URI.parse(params[:url])
result = Net::HTTP.get_response(url)
send_data result.body, type: result.content_type, disposition: 'inline'
end
else
redirect_to params[:url]
end
end
# assign attributes directly after rails update
def create
@warpable = Warpable.new
@warpable.image = params[:uploaded_data]
map = Map.find_by(slug: params[:map_id])
@warpable.history = ''
@warpable.map_id = map.id
map.updated_at = Time.now
map.save
respond_to do |format|
if @warpable.save
format.html { render json: [@warpable.fup_json].to_json, content_type: 'text/html' }
format.json { render json: { files: [@warpable.fup_json] }, status: :created, location: @warpable.image.url }
else
format.html { render action: 'new' }
format.json { render json: { files: [@warpable.fup_error_json] }, layout: false }
end
end
end
# mapknitter.org/import/<map-name>/?url=http://myurl.com/image.jpg
def import
map = Map.find_by_name params[:name]
@warpable = Warpable.new
@warpable.map_id = map.id
@warpable.url = params[:url]
map.updated_at = Time.now
map.save
if @warpable.save
redirect_to '/maps/' + params[:name]
else
flash[:notice] = 'Sorry, the image failed to import.'
redirect_to '/map/edit/' + params[:name]
end
end
def url_upload_not_found
flash[:notice] = 'Sorry, the URL you provided was not valid.'
redirect_to '/map/edit/' + params[:id]
end
def show
@image = Warpable.find params[:id]
respond_to do |format|
format.html
format.json { render json: @image.map(&:fup_json) }
end
end
def update
@warpable = Warpable.find params[:warpable_id]
nodes = []
author = @warpable.map.author
# is it really necessary to make new points each time?
params[:points].split(':').each do |point|
lon = point.split(',')[0]
lat = point.split(',')[1]
node = Node.new(color: 'black',
lat: lat,
lon: lon,
author: author,
name: '')
node.save
nodes << node
end
@warpable.nodes = nodes.collect(&:id).join(',')
@warpable.locked = params[:locked]
@warpable.cm_per_pixel = @warpable.get_cm_per_pixel
@warpable.save
render html: 'success'
end
def destroy
@warpable = Warpable.find params[:id]
if logged_in? && current_user.can_delete?(@warpable)
@warpable.destroy
respond_to do |format|
format.html { redirect_to @warpable.map }
format.json { render json: @warpable }
end
else
flash[:error] = 'You must be logged in to delete images.'
redirect_to '/login'
end
end
end