send email when admin logs in
[shapado:shapado.git] / app / controllers / users_controller.rb
1 class UsersController < ApplicationController
2   before_filter :login_required, :only => [:edit, :update, :follow]
3   tabs :default => :users
4
5   subtabs :index => [[:reputation, "reputation"],
6                      [:newest, %w(created_at desc)],
7                      [:oldest, %w(created_at asc)],
8                      [:name, %w(login asc)],
9                      [:near, ""]]
10
11   def index
12     set_page_title(t("users.index.title"))
13
14     order = current_order
15     options =  {:per_page => params[:per_page]||24,
16                :page => params[:page] || 1}
17     conditions = {}
18     conditions = {:login => /^#{Regexp.escape(params[:q])}/} if params[:q]
19
20     if order == "reputation"
21       order = %w(membership_list.#{current_group.id}.reputation desc)
22     end
23
24     @users = if order.blank?
25                current_group.users(conditions.merge(:near => current_user.point)).paginate(options)
26              else
27                current_group.users(conditions).order_by(order).paginate(options)
28              end
29     respond_to do |format|
30       format.html
31       format.json {
32         render :json => @users.to_json(:only => %w[name login membership_list bio website location language])
33       }
34       format.js {
35         html = render_to_string(:partial => "user", :collection  => @users)
36         pagination = render_to_string(:partial => "shared/pagination", :object => @users,
37                                       :format => "html")
38         render :json => {:html => html, :pagination => pagination }
39       }
40     end
41
42   end
43
44   # render new.rhtml
45   def new
46     @user = User.new
47     @user.timezone = AppConfig.default_timezone
48   end
49
50   def create
51     @user = User.new
52     @user.safe_update(%w[login email name password_confirmation password preferred_languages website
53                          language timezone identity_url bio hide_country], params[:user])
54     if params[:user]["birthday(1i)"]
55       @user.birthday = build_date(params[:user], "birthday")
56     end
57     success = @user && @user.save
58     if success && @user.errors.empty?
59       # Protects against session fixation attacks, causes request forgery
60       # protection if visitor resubmits an earlier form using back
61       # button. Uncomment if you understand the tradeoffs.
62       # reset session
63       sweep_new_users(current_group)
64       flash[:notice] = t("flash_notice", :scope => "users.create")
65       sign_in_and_redirect(:user, @user) # !! now logged in
66     else
67       flash[:error]  = t("flash_error", :scope => "users.create")
68       render :action => 'new'
69     end
70   end
71
72   def show
73     conds = {}
74     conds[:se_id] = params[:se_id] if params[:se_id]
75     @user = User.find_by_login_or_id(params[:id], conds)
76     raise Goalie::NotFound unless @user
77
78     set_page_title(t("users.show.title", :user => @user.login))
79
80     @q_sort, order = active_subtab(:q_sort)
81     @questions = @user.questions.paginate(:page=>params[:questions_page],
82                                           :order => order,
83                                           :per_page => 10,
84                                           :group_id => current_group.id,
85                                           :banned => false,
86                                           :anonymous => false)
87
88     @a_sort, order = active_subtab(:a_sort)
89     @answers = @user.answers.paginate(:page=>params[:answers_page],
90                                       :order => order,
91                                       :group_id => current_group.id,
92                                       :per_page => 10,
93                                       :banned => false,
94                                       :anonymous => false)
95
96     @badges = @user.badges.paginate(:page => params[:badges_page],
97                                     :group_id => current_group.id,
98                                     :per_page => 25)
99
100     @f_sort, order = active_subtab(:f_sort)
101
102     @favorites = @user.favorites(:group_id => current_group.id).
103       paginate(:page => params[:favorites_page],
104                :per_page => 25,
105                :order => order
106                )
107
108     add_feeds_url(url_for(:format => "atom"), t("feeds.user"))
109
110     @user.viewed_on!(current_group) if @user != current_user && !is_bot?
111
112     respond_to do |format|
113       format.html
114       format.atom
115       format.json {
116         render :json => @user.to_json(:only => %w[name login membership_list bio website location language])
117       }
118     end
119   end
120
121   def edit
122     @user = current_user
123     @user.timezone = AppConfig.default_timezone if @user.timezone.blank?
124   end
125
126   def update
127     if params[:id] == 'login' && params[:user].nil? # HACK for facebook-connectable
128       redirect_to root_path
129       return
130     end
131
132     @user = current_user
133
134     if params[:current_password] && @user.valid_password?(params[:current_password])
135       @user.encrypted_password = ""
136       @user.password = params[:user][:password]
137       @user.password_confirmation = params[:user][:password_confirmation]
138     end
139
140     @user.safe_update(%w[login email name language timezone preferred_languages
141                          notification_opts bio hide_country website avatar use_gravatar], params[:user])
142
143     if params[:user]["birthday(1i)"]
144       @user.birthday = build_date(params[:user], "birthday")
145     end
146
147     Jobs::Users.async.on_update_user(@user.id, current_group.id).commit!
148
149     preferred_tags = params[:user][:preferred_tags]
150     if @user.valid? && @user.save
151       @user.add_preferred_tags(preferred_tags, current_group) if preferred_tags
152       redirect_to root_path
153     else
154       render :action => "edit"
155     end
156   end
157
158   def feed
159     @user = params[:id] ? current_group.users.where(:login => params[:id]).first : current_user
160
161     find_questions(:follower_ids => @user.id)
162   end
163
164   def by_me
165     @user = params[:id] ? current_group.users.where(:login => params[:id]).first : current_user
166     find_questions(:user_id => @user.id)
167   end
168
169   def preferred
170     @user = params[:id] ? current_group.users.where(:login => params[:id]).first : current_user
171     tags = @user.config_for(current_group).preferred_tags
172
173     find_questions(:tags.in => tags)
174   end
175
176   def expertise
177     @user = params[:id] ? current_group.users.where(:login => params[:id]).first : current_user
178     tags = @user.stats(:expert_tags).expert_tags # TODO: optimize
179
180     find_questions(:tags.in => tags)
181   end
182
183   def contributed
184     @user = params[:id] ? current_group.users.where(:login => params[:id]).first : current_user
185
186     find_questions(:contributor_ids => @user.id)
187   end
188
189   def connect
190     authenticate_user!
191     warden.authenticate!(:scope => :openid_identity, :recall => "show")
192     current_openid_identity.user = current_user
193     current_openid_identity.save!
194     sign_out :openid_identity
195
196     redirect_to settings_path
197   end
198
199   def change_preferred_tags
200     @user = current_user
201     if tags = params[:tags]
202       if params[:opt] == "add"
203         @user.add_preferred_tags(tags, current_group) if tags
204       elsif params[:opt] == "remove"
205         @user.remove_preferred_tags(tags, current_group)
206       end
207     end
208
209     respond_to do |format|
210       format.html {redirect_to questions_path}
211     end
212   end
213
214   def follow
215     @user = User.find_by_login_or_id(params[:id])
216     current_user.add_friend(@user)
217
218     flash[:notice] = t("flash_notice", :scope => "users.follow", :user => @user.login)
219
220     Jobs::Activities.async.on_follow(current_user.id, @user.id, current_group.id).commit!
221     Jobs::Mailer.async.on_follow(current_user.id, @user.id, current_group.id).commit!
222
223     respond_to do |format|
224       format.html do
225         redirect_to user_path(@user)
226       end
227       format.js {
228         render(:json => {:success => true,
229                  :message => flash[:notice] }.to_json)
230       }
231     end
232   end
233
234   def unfollow
235     @user = User.find_by_login_or_id(params[:id])
236     current_user.remove_friend(@user)
237
238     flash[:notice] = t("flash_notice", :scope => "users.unfollow", :user => @user.login)
239
240     Jobs::Activities.async.on_unfollow(current_user.id, @user.id, current_group.id).commit!
241
242     respond_to do |format|
243       format.html do
244         redirect_to user_path(@user)
245       end
246       format.js {
247         render(:json => {:success => true,
248                  :message => flash[:notice] }.to_json)
249       }
250     end
251   end
252
253   def autocomplete_for_user_login
254     @users = User.only(:login).
255                   where(:login =>  /^#{Regexp.escape(params[:term].to_s.downcase)}.*/).
256                   limit(20).
257                   order_by(:login.desc).
258                   all
259
260     respond_to do |format|
261       format.json {render :json=>@users}
262     end
263   end
264
265   def destroy
266     if false && current_user.delete # FIXME We need a better way to delete users
267       flash[:notice] = t("destroyed", :scope => "devise.registrations")
268     else
269       flash[:notice] = t("destroy_failed", :scope => "devise.registrations")
270     end
271     return redirect_to(:root)
272   end
273
274   protected
275   def active_subtab(param)
276     key = params.fetch(param, "votes")
277     order = "votes_average desc, created_at desc"
278     case key
279       when "votes"
280         order = "votes_average desc, created_at desc"
281       when "views"
282         order = "views desc, created_at desc"
283       when "newest"
284         order = "created_at desc"
285       when "oldest"
286         order = "created_at asc"
287     end
288     [key, order]
289   end
290 end
291
292