]> git.openstreetmap.org Git - rails.git/blob - app/controllers/user_controller.rb
Cope with not having a layer configuration at all.
[rails.git] / app / controllers / user_controller.rb
1 class UserController < ApplicationController
2   layout 'site'
3
4   before_filter :authorize, :only => [:api_details, :api_gpx_files]
5   before_filter :authorize_web, :only => [:account, :go_public, :view, :diary, :make_friend, :remove_friend, :upload_image]
6   before_filter :require_user, :only => [:set_home, :account, :go_public, :make_friend, :remove_friend, :upload_image]
7
8   filter_parameter_logging :password, :pass_crypt, :pass_crypt_confirmation
9
10   def save
11     @title = 'create account'
12     @user = User.new(params[:user])
13
14     @user.data_public = true
15       
16     if @user.save
17       token = @user.tokens.create
18       flash[:notice] = "User was successfully created. Check your email for a confirmation note, and you\'ll be mapping in no time :-)<br>Please note that you won't be able to login until you've received and confirmed your email address."
19       Notifier::deliver_signup_confirm(@user, token)
20       redirect_to :action => 'login'
21     else
22       render :action => 'new'
23     end
24   end
25
26   def account
27     @title = 'edit account'
28     if params[:user] and params[:user][:display_name] and params[:user][:description]
29       home_lat =  params[:user][:home_lat]
30       home_lon =  params[:user][:home_lon]
31
32       @user.display_name = params[:user][:display_name]
33       if params[:user][:pass_crypt].length > 0 or params[:user][:pass_crypt_confirmation].length > 0
34         @user.pass_crypt = params[:user][:pass_crypt]
35         @user.pass_crypt_confirmation = params[:user][:pass_crypt_confirmation]
36       end
37       @user.description = params[:user][:description]
38       @user.home_lat = home_lat
39       @user.home_lon = home_lon
40       if @user.save
41         flash[:notice] = "User information updated successfully."
42       else
43         flash.delete(:notice)
44       end
45     end
46   end
47
48   def set_home
49     if params[:user][:home_lat] and params[:user][:home_lon]
50       @user.home_lat = params[:user][:home_lat].to_f
51       @user.home_lon = params[:user][:home_lon].to_f
52       if @user.save
53         flash[:notice] = "Home location saved successfully."
54         redirect_to :controller => 'user', :action => 'account'
55       end
56     end
57   end
58
59   def go_public
60     @user.data_public = true
61     @user.save
62     flash[:notice] = 'All your edits are now public.'
63     redirect_to :controller => 'user', :action => 'account', :display_name => @user.display_name
64   end
65
66   def lost_password
67     @title = 'lost password'
68     if params[:user] and params[:user][:email]
69       user = User.find_by_email(params[:user][:email])
70       if user
71         token = user.tokens.create
72         Notifier::deliver_lost_password(user, token)
73         flash[:notice] = "Sorry you lost it :-( but an email is on its way so you can reset it soon."
74       else
75         flash[:notice] = "Couldn't find that email address, sorry."
76       end
77     else
78       render :action => 'lost_password'
79     end
80   end
81
82   def reset_password
83     @title = 'reset password'
84     if params['token']
85       token = UserToken.find_by_token(params[:token])
86       if token
87         pass = OSM::make_token(8)
88         user = token.user
89         user.pass_crypt = pass
90         user.pass_crypt_confirmation = pass
91         user.active = true
92         user.save!
93         token.destroy
94         Notifier::deliver_reset_password(user, pass)
95         flash[:notice] = "Your password has been changed and is on its way to your mailbox :-)"
96       else
97         flash[:notice] = "Didn't find that token, check the URL maybe?"
98       end
99     end
100     redirect_to :action => 'login'
101   end
102
103   def new
104     @title = 'create account'
105   end
106
107   def login
108     @title = 'login'
109     if params[:user]
110       email_or_display_name = params[:user][:email]
111       pass = params[:user][:password]
112       user = User.authenticate(:username => email_or_display_name, :password => pass)
113       if user
114         session[:user] = user.id
115         if params[:referer]
116           redirect_to params[:referer]
117         else
118           redirect_to :controller => 'site', :action => 'index'
119         end
120         return
121       elsif User.authenticate(:username => email_or_display_name, :password => pass, :inactive => true)
122         flash[:notice] = "Sorry, your account is not active yet.<br>Please click on the link in the account confirmation email to activate your account."
123       else
124         flash[:notice] = "Sorry, couldn't log in with those details."
125       end
126     end
127   end
128
129   def logout
130     if session[:token]
131       token = UserToken.find_by_token(session[:token])
132       if token
133         token.destroy
134       end
135       session[:token] = nil
136     end
137     session[:user] = nil
138     if params[:referer]
139       redirect_to params[:referer]
140     else
141       redirect_to :controller => 'site', :action => 'index'
142     end
143   end
144
145   def confirm
146     if params[:confirm_action]
147       token = UserToken.find_by_token(params[:confirm_string])
148       if token and !token.user.active?
149         @user = token.user
150         @user.active = true
151         @user.save!
152         token.destroy
153         flash[:notice] = 'Confirmed your account, thanks for signing up!'
154         session[:user] = @user.id
155         redirect_to :action => 'account', :display_name => @user.display_name
156       else
157         flash[:notice] = 'Something went wrong confirming that user.'
158       end
159     end
160   end
161
162   def upload_image
163     @user.image = params[:user][:image]
164     @user.save!
165     redirect_to :controller => 'user', :action => 'view', :display_name => @user.display_name
166   end
167
168   def api_details
169     render :text => @user.to_xml.to_s, :content_type => "text/xml"
170   end
171
172   def api_gpx_files
173     doc = OSM::API.new.get_xml_doc
174     @user.traces.each do |trace|
175       doc.root << trace.to_xml_node() if trace.public? or trace.user == @user
176     end
177     render :text => doc.to_s, :content_type => "text/xml"
178   end
179
180   def view
181     @this_user = User.find_by_display_name(params[:display_name])
182
183     if @this_user
184       @title = @this_user.display_name
185     else
186       @not_found_user = params[:display_name]
187       render :action => 'no_such_user', :status => :not_found
188     end
189   end
190
191   def make_friend
192     if params[:display_name]     
193       name = params[:display_name]
194       new_friend = User.find_by_display_name(name)
195       friend = Friend.new
196       friend.user_id = @user.id
197       friend.friend_user_id = new_friend.id
198       unless @user.is_friends_with?(new_friend)
199         if friend.save
200           flash[:notice] = "#{name} is now your friend."
201           Notifier::deliver_friend_notification(friend)
202         else
203           friend.add_error("Sorry, failed to add #{name} as a friend.")
204         end
205       else
206         flash[:notice] = "You are already friends with #{name}."  
207       end
208       redirect_to :controller => 'user', :action => 'view'
209     end
210   end
211
212   def remove_friend
213     if params[:display_name]     
214       name = params[:display_name]
215       friend = User.find_by_display_name(name)
216       if @user.is_friends_with?(friend)
217         Friend.delete_all "user_id = #{@user.id} AND friend_user_id = #{friend.id}"
218         flash[:notice] = "#{friend.display_name} was removed from your friends."
219       else
220         flash[:notice] = "#{friend.display_name} was not already one of your friends."
221       end
222       redirect_to :controller => 'user', :action => 'view'
223     end
224   end
225
226 end
227