]> git.openstreetmap.org Git - rails.git/blob - app/controllers/site_controller.rb
Merge pull request #35 from tomhughes/routing
[rails.git] / app / controllers / site_controller.rb
1 class SiteController < ApplicationController
2   layout 'site'
3   layout :map_layout, :only => [:index, :export]
4
5   before_filter :authorize_web
6   before_filter :set_locale
7   before_filter :redirect_browse_params, :only => :index
8   before_filter :redirect_map_params, :only => [:index, :edit, :export]
9   before_filter :require_user, :only => [:welcome]
10   before_filter :require_oauth, :only => [:index]
11
12   def index
13     unless STATUS == :database_readonly or STATUS == :database_offline
14       session[:location] ||= OSM::IPLocation(request.env['REMOTE_ADDR'])
15     end
16   end
17
18   def permalink
19     lon, lat, zoom = ShortLink::decode(params[:code])
20     new_params = params.except(:code, :lon, :lat, :zoom, :layers, :node, :way, :relation, :changeset)
21
22     if new_params.has_key? :m
23       new_params.delete :m
24       new_params[:mlat] = lat
25       new_params[:mlon] = lon
26     end
27
28     if params.has_key? :node
29       new_params[:controller] = 'browse'
30       new_params[:action] = 'node'
31       new_params[:id] = params[:node]
32     elsif params.has_key? :way
33       new_params[:controller] = 'browse'
34       new_params[:action] = 'way'
35       new_params[:id] = params[:way]
36     elsif params.has_key? :relation
37       new_params[:controller] = 'browse'
38       new_params[:action] = 'relation'
39       new_params[:id] = params[:relation]
40     elsif params.has_key? :changeset
41       new_params[:controller] = 'browse'
42       new_params[:action] = 'changeset'
43       new_params[:id] = params[:changeset]
44     else
45       new_params[:controller] = 'site'
46       new_params[:action] = 'index'
47     end
48
49     new_params[:anchor] = "map=#{zoom}/#{lat}/#{lon}"
50
51     if params.has_key? :layers
52       new_params[:anchor] += "&layers=#{params[:layers]}"
53     end
54
55     redirect_to Hash[new_params]
56   end
57
58   def key
59     expires_in 7.days, :public => true
60     render :layout => false
61   end
62
63   def edit
64     editor = preferred_editor
65
66     if editor == "remote"
67       require_oauth
68       render :action => :index, :layout => map_layout
69       return
70     else
71       require_user
72     end
73
74     if params[:node]
75       bbox = Node.find(params[:node]).bbox.to_unscaled
76       @lat = bbox.centre_lat
77       @lon = bbox.centre_lon
78       @zoom = 18
79     elsif params[:way]
80       bbox = Way.find(params[:way]).bbox.to_unscaled
81       @lat = bbox.centre_lat
82       @lon = bbox.centre_lon
83       @zoom = 17
84     elsif params[:note]
85       note = Note.find(params[:note])
86       @lat = note.lat
87       @lon = note.lon
88       @zoom = 17
89     elsif params[:gpx]
90       trace = Trace.visible_to(@user).find(params[:gpx])
91       @lat = trace.latitude
92       @lon = trace.longitude
93       @zoom = 16
94     end
95   end
96
97   def copyright
98     @locale = params[:copyright_locale] || I18n.locale
99   end
100
101   def welcome
102   end
103
104   def help
105   end
106
107   def about
108   end
109
110   def export
111   end
112
113   def offline
114   end
115
116   def preview
117     render :text => RichText.new(params[:format], params[:text]).to_html
118   end
119
120   def id
121     render "id", :layout => false
122   end
123
124   private
125
126   def redirect_browse_params
127     if params[:node]
128       redirect_to node_path(params[:node])
129     elsif params[:way]
130       redirect_to way_path(params[:way])
131     elsif params[:relation]
132       redirect_to relation_path(params[:relation])
133     elsif params[:note]
134       redirect_to browse_note_path(params[:note])
135     elsif params[:query]
136       redirect_to search_path(:query => params[:query])
137     end
138   end
139
140   def redirect_map_params
141     anchor = []
142
143     if params[:lat] && params[:lon]
144       anchor << "map=#{params.delete(:zoom) || 5}/#{params.delete(:lat)}/#{params.delete(:lon)}"
145     end
146
147     if params[:layers]
148       anchor << "layers=#{params.delete(:layers)}"
149     elsif params.delete(:notes) == 'yes'
150       anchor << "layers=N"
151     end
152
153     if anchor.present?
154       redirect_to Hash[params].merge(:anchor => anchor.join('&'))
155     end
156   end
157 end