Make setting of user_preferred_languages work.
[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, :except => [:api_details, :api_gpx_files]
6   before_filter :set_locale, :except => [:api_details, :api_gpx_files]
7   before_filter :require_user, :only => [:set_home, :account, :go_public, :make_friend, :remove_friend, :upload_image, :delete_image]
8   before_filter :check_database_readable, :except => [:api_details, :api_gpx_files]
9   before_filter :check_database_writable, :only => [:login, :new, :set_home, :account, :go_public, :make_friend, :remove_friend, :upload_image, :delete_image]
10   before_filter :check_api_readable, :only => [:api_details, :api_gpx_files]
11
12   filter_parameter_logging :password, :pass_crypt, :pass_crypt_confirmation
13
14   def save
15     @title = 'create account'
16
17     if Acl.find_by_address(request.remote_ip, :conditions => {:k => "no_account_creation"})
18       render :action => 'new'
19     else
20       @user = User.new(params[:user])
21
22       @user.visible = true
23       @user.data_public = true
24       @user.description = "" if @user.description.nil?
25       @user.creation_ip = request.remote_ip
26       @user.languages = request.user_preferred_languages
27
28       if @user.save
29         flash[:notice] = I18n.t('user.new.flash create success message')
30         Notifier.deliver_signup_confirm(@user, @user.tokens.create)
31         redirect_to :action => 'login'
32       else
33         render :action => 'new'
34       end
35     end
36   end
37
38   def account
39     @title = 'edit account'
40     if params[:user] and params[:user][:display_name] and params[:user][:description]
41       if params[:user][:email] != @user.email
42         @user.new_email = params[:user][:email]
43       end
44
45       @user.display_name = params[:user][:display_name]
46
47       if params[:user][:pass_crypt].length > 0 or params[:user][:pass_crypt_confirmation].length > 0
48         @user.pass_crypt = params[:user][:pass_crypt]
49         @user.pass_crypt_confirmation = params[:user][:pass_crypt_confirmation]
50       end
51
52       @user.description = params[:user][:description]
53       @user.home_lat = params[:user][:home_lat]
54       @user.home_lon = params[:user][:home_lon]
55
56       if @user.save
57         if params[:user][:email] == @user.new_email
58           flash[:notice] = I18n.t('user.account.flash update success confirm needed')
59           Notifier.deliver_email_confirm(@user, @user.tokens.create)
60         else
61           flash[:notice] = I18n.t('user.account.flash update success')
62         end
63       end
64     end
65   end
66
67   def set_home
68     if params[:user][:home_lat] and params[:user][:home_lon]
69       @user.home_lat = params[:user][:home_lat].to_f
70       @user.home_lon = params[:user][:home_lon].to_f
71       if @user.save
72         flash[:notice] = I18n.t('user.set_home.flash success')
73         redirect_to :controller => 'user', :action => 'account'
74       end
75     end
76   end
77
78   def go_public
79     @user.data_public = true
80     @user.save
81     flash[:notice] = I18n.t('user.go_public.flash success')
82     redirect_to :controller => 'user', :action => 'account', :display_name => @user.display_name
83   end
84
85   def lost_password
86     @title = I18n.t('user.lost_password.title')
87     if params[:user] and params[:user][:email]
88       user = User.find_by_email(params[:user][:email], :conditions => {:visible => true})
89
90       if user
91         token = user.tokens.create
92         Notifier.deliver_lost_password(user, token)
93         flash[:notice] = I18n.t('user.lost_password.notice.email on way')
94       else
95         flash[:notice] = I18n.t('user.lost_password.notice email cannot find')
96       end
97     end
98   end
99
100   def reset_password
101     @title = I18n.t('user.reset_password.title')
102     if params['token']
103       token = UserToken.find_by_token(params[:token])
104       if token
105         pass = OSM::make_token(8)
106         user = token.user
107         user.pass_crypt = pass
108         user.pass_crypt_confirmation = pass
109         user.active = true
110         user.email_valid = true
111         user.save!
112         token.destroy
113         Notifier.deliver_reset_password(user, pass)
114         flash[:notice] = I18n.t('user.reset_password.flash changed check mail')
115       else
116         flash[:notice] = I18n.t('user.reset_password.flash token bad')
117       end
118     end
119
120     redirect_to :action => 'login'
121   end
122
123   def new
124     @title = 'create account'
125     # The user is logged in already, so don't show them the signup page, instead
126     # send them to the home page
127     redirect_to :controller => 'site', :action => 'index' if session[:user]
128   end
129
130   def login
131     if session[:user]
132       # The user is logged in already, if the referer param exists, redirect them to that
133       if params[:referer]
134         redirect_to params[:referer]
135       else
136         redirect_to :controller => 'site', :action => 'index'
137       end
138       return
139     end
140     @title = 'login'
141     if params[:user]
142       email_or_display_name = params[:user][:email]
143       pass = params[:user][:password]
144       user = User.authenticate(:username => email_or_display_name, :password => pass)
145       if user
146         session[:user] = user.id
147         if params[:referer]
148           redirect_to params[:referer]
149         else
150           redirect_to :controller => 'site', :action => 'index'
151         end
152         return
153       elsif User.authenticate(:username => email_or_display_name, :password => pass, :inactive => true)
154         @notice = "Sorry, your account is not active yet.<br>Please click on the link in the account confirmation email to activate your account."
155       else
156         @notice = "Sorry, couldn't log in with those details."
157       end
158     end
159   end
160
161   def logout
162     if session[:token]
163       token = UserToken.find_by_token(session[:token])
164       if token
165         token.destroy
166       end
167       session[:token] = nil
168     end
169     session[:user] = nil
170     if params[:referer]
171       redirect_to params[:referer]
172     else
173       redirect_to :controller => 'site', :action => 'index'
174     end
175   end
176
177   def confirm
178     if params[:confirm_action]
179       token = UserToken.find_by_token(params[:confirm_string])
180       if token and !token.user.active?
181         @user = token.user
182         @user.active = true
183         @user.email_valid = true
184         @user.save!
185         token.destroy
186         flash[:notice] = 'Confirmed your account, thanks for signing up!'
187         session[:user] = @user.id
188         redirect_to :action => 'account', :display_name => @user.display_name
189       else
190         @notice = 'Something went wrong confirming that user.'
191       end
192     end
193   end
194
195   def confirm_email
196     if params[:confirm_action]
197       token = UserToken.find_by_token(params[:confirm_string])
198       if token and token.user.new_email?
199         @user = token.user
200         @user.email = @user.new_email
201         @user.new_email = nil
202         @user.active = true
203         @user.email_valid = true
204         @user.save!
205         token.destroy
206         flash[:notice] = 'Confirmed your email address, thanks for signing up!'
207         session[:user] = @user.id
208         redirect_to :action => 'account', :display_name => @user.display_name
209       else
210         @notice = 'Something went wrong confirming that email address.'
211       end
212     end
213   end
214
215   def upload_image
216     @user.image = params[:user][:image]
217     @user.save!
218     redirect_to :controller => 'user', :action => 'view', :display_name => @user.display_name
219   end
220
221   def delete_image
222     @user.image = nil
223     @user.save!
224     redirect_to :controller => 'user', :action => 'view', :display_name => @user.display_name
225   end
226
227   def api_details
228     render :text => @user.to_xml.to_s, :content_type => "text/xml"
229   end
230
231   def api_gpx_files
232     doc = OSM::API.new.get_xml_doc
233     @user.traces.each do |trace|
234       doc.root << trace.to_xml_node() if trace.public? or trace.user == @user
235     end
236     render :text => doc.to_s, :content_type => "text/xml"
237   end
238
239   def view
240     @this_user = User.find_by_display_name(params[:display_name], :conditions => {:visible => true})
241
242     if @this_user
243       @title = @this_user.display_name
244     else
245       @not_found_user = params[:display_name]
246       render :action => 'no_such_user', :status => :not_found
247     end
248   end
249
250   def make_friend
251     if params[:display_name]     
252       name = params[:display_name]
253       new_friend = User.find_by_display_name(name, :conditions => {:visible => true})
254       friend = Friend.new
255       friend.user_id = @user.id
256       friend.friend_user_id = new_friend.id
257       unless @user.is_friends_with?(new_friend)
258         if friend.save
259           flash[:notice] = "#{name} is now your friend."
260           Notifier.deliver_friend_notification(friend)
261         else
262           friend.add_error("Sorry, failed to add #{name} as a friend.")
263         end
264       else
265         flash[:notice] = "You are already friends with #{name}."  
266       end
267
268       redirect_to :controller => 'user', :action => 'view'
269     end
270   end
271
272   def remove_friend
273     if params[:display_name]     
274       name = params[:display_name]
275       friend = User.find_by_display_name(name, :conditions => {:visible => true})
276       if @user.is_friends_with?(friend)
277         Friend.delete_all "user_id = #{@user.id} AND friend_user_id = #{friend.id}"
278         flash[:notice] = "#{friend.display_name} was removed from your friends."
279       else
280         flash[:notice] = "#{friend.display_name} is not one of your friends."
281       end
282
283       redirect_to :controller => 'user', :action => 'view'
284     end
285   end
286 end