Description:
confusing merge
Commit status:
[Not Reviewed]
References:
merge default
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r483:7cf62e1e74ba - - 1 file changed: 0 inserted, 1 deleted

@@ -1,389 +1,388
1 require 'csv'
1 require 'csv'
2
2
3 class UserAdminController < ApplicationController
3 class UserAdminController < ApplicationController
4
4
5 -
6 include MailHelperMethods
5 include MailHelperMethods
7
6
8 before_filter :admin_authorization
7 before_filter :admin_authorization
9
8
10 # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
9 # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
11 verify :method => :post, :only => [ :destroy,
10 verify :method => :post, :only => [ :destroy,
12 :create, :create_from_list,
11 :create, :create_from_list,
13 :update,
12 :update,
14 :manage_contest,
13 :manage_contest,
15 :bulk_mail
14 :bulk_mail
16 ],
15 ],
17 :redirect_to => { :action => :list }
16 :redirect_to => { :action => :list }
18
17
19 def index
18 def index
20 list
19 list
21 render :action => 'list'
20 render :action => 'list'
22 end
21 end
23
22
24 def list
23 def list
25 @user_count = User.count
24 @user_count = User.count
26 if params[:page] == 'all'
25 if params[:page] == 'all'
27 @users = User.all
26 @users = User.all
28 @paginated = false
27 @paginated = false
29 else
28 else
30 @users = User.paginate :page => params[:page]
29 @users = User.paginate :page => params[:page]
31 @paginated = true
30 @paginated = true
32 end
31 end
33 @hidden_columns = ['hashed_password', 'salt', 'created_at', 'updated_at']
32 @hidden_columns = ['hashed_password', 'salt', 'created_at', 'updated_at']
34 @contests = Contest.enabled
33 @contests = Contest.enabled
35 end
34 end
36
35
37 def active
36 def active
38 sessions = ActiveRecord::SessionStore::Session.find(:all, :conditions => ["updated_at >= ?", 60.minutes.ago])
37 sessions = ActiveRecord::SessionStore::Session.find(:all, :conditions => ["updated_at >= ?", 60.minutes.ago])
39 @users = []
38 @users = []
40 sessions.each do |session|
39 sessions.each do |session|
41 if session.data[:user_id]
40 if session.data[:user_id]
42 @users << User.find(session.data[:user_id])
41 @users << User.find(session.data[:user_id])
43 end
42 end
44 end
43 end
45 end
44 end
46
45
47 def show
46 def show
48 @user = User.find(params[:id])
47 @user = User.find(params[:id])
49 end
48 end
50
49
51 def new
50 def new
52 @user = User.new
51 @user = User.new
53 end
52 end
54
53
55 def create
54 def create
56 @user = User.new(params[:user])
55 @user = User.new(params[:user])
57 @user.activated = true
56 @user.activated = true
58 if @user.save
57 if @user.save
59 flash[:notice] = 'User was successfully created.'
58 flash[:notice] = 'User was successfully created.'
60 redirect_to :action => 'list'
59 redirect_to :action => 'list'
61 else
60 else
62 render :action => 'new'
61 render :action => 'new'
63 end
62 end
64 end
63 end
65
64
66 def create_from_list
65 def create_from_list
67 lines = params[:user_list]
66 lines = params[:user_list]
68
67
69 note = []
68 note = []
70
69
71 lines.split("\n").each do |line|
70 lines.split("\n").each do |line|
72 items = line.chomp.split(',')
71 items = line.chomp.split(',')
73 if items.length>=2
72 if items.length>=2
74 login = items[0]
73 login = items[0]
75 full_name = items[1]
74 full_name = items[1]
76
75
77 added_random_password = false
76 added_random_password = false
78 if items.length>=3
77 if items.length>=3
79 password = items[2].chomp(" ")
78 password = items[2].chomp(" ")
80 user_alias = (items.length>=4) ? items[3] : login
79 user_alias = (items.length>=4) ? items[3] : login
81 else
80 else
82 password = random_password
81 password = random_password
83 user_alias = (items.length>=4) ? items[3] : login
82 user_alias = (items.length>=4) ? items[3] : login
84 added_random_password = true
83 added_random_password = true
85 end
84 end
86
85
87 user = User.find_by_login(login)
86 user = User.find_by_login(login)
88 if (user)
87 if (user)
89 user.full_name = full_name
88 user.full_name = full_name
90 user.password = password
89 user.password = password
91 else
90 else
92 user = User.new({:login => login,
91 user = User.new({:login => login,
93 :full_name => full_name,
92 :full_name => full_name,
94 :password => password,
93 :password => password,
95 :password_confirmation => password,
94 :password_confirmation => password,
96 :alias => user_alias})
95 :alias => user_alias})
97 end
96 end
98 user.activated = true
97 user.activated = true
99 user.save
98 user.save
100
99
101 if added_random_password
100 if added_random_password
102 note << "'#{login}' (+)"
101 note << "'#{login}' (+)"
103 else
102 else
104 note << login
103 note << login
105 end
104 end
106 end
105 end
107 end
106 end
108 flash[:notice] = 'User(s) ' + note.join(', ') +
107 flash[:notice] = 'User(s) ' + note.join(', ') +
109 ' were successfully created. ' +
108 ' were successfully created. ' +
110 '( (+) - created with random passwords.)'
109 '( (+) - created with random passwords.)'
111 redirect_to :action => 'list'
110 redirect_to :action => 'list'
112 end
111 end
113
112
114 def edit
113 def edit
115 @user = User.find(params[:id])
114 @user = User.find(params[:id])
116 end
115 end
117
116
118 def update
117 def update
119 @user = User.find(params[:id])
118 @user = User.find(params[:id])
120 if @user.update_attributes(params[:user])
119 if @user.update_attributes(params[:user])
121 flash[:notice] = 'User was successfully updated.'
120 flash[:notice] = 'User was successfully updated.'
122 redirect_to :action => 'show', :id => @user
121 redirect_to :action => 'show', :id => @user
123 else
122 else
124 render :action => 'edit'
123 render :action => 'edit'
125 end
124 end
126 end
125 end
127
126
128 def destroy
127 def destroy
129 User.find(params[:id]).destroy
128 User.find(params[:id]).destroy
130 redirect_to :action => 'list'
129 redirect_to :action => 'list'
131 end
130 end
132
131
133 def user_stat
132 def user_stat
134 if params[:commit] == 'download csv'
133 if params[:commit] == 'download csv'
135 @problems = Problem.all
134 @problems = Problem.all
136 else
135 else
137 @problems = Problem.find_available_problems
136 @problems = Problem.find_available_problems
138 end
137 end
139 @users = User.find(:all, :include => [:contests, :contest_stat])
138 @users = User.find(:all, :include => [:contests, :contest_stat])
140 @scorearray = Array.new
139 @scorearray = Array.new
141 @users.each do |u|
140 @users.each do |u|
142 ustat = Array.new
141 ustat = Array.new
143 ustat[0] = u
142 ustat[0] = u
144 @problems.each do |p|
143 @problems.each do |p|
145 sub = Submission.find_last_by_user_and_problem(u.id,p.id)
144 sub = Submission.find_last_by_user_and_problem(u.id,p.id)
146 if (sub!=nil) and (sub.points!=nil)
145 if (sub!=nil) and (sub.points!=nil)
147 ustat << [(sub.points.to_f*100/p.full_score).round, (sub.points>=p.full_score)]
146 ustat << [(sub.points.to_f*100/p.full_score).round, (sub.points>=p.full_score)]
148 else
147 else
149 ustat << [0,false]
148 ustat << [0,false]
150 end
149 end
151 end
150 end
152 @scorearray << ustat
151 @scorearray << ustat
153 end
152 end
154 end
153 end
155
154
156 def user_stat_max
155 def user_stat_max
157 @problems = Problem.find_available_problems
156 @problems = Problem.find_available_problems
158 @users = User.find(:all, :include => [:contests, :contest_stat])
157 @users = User.find(:all, :include => [:contests, :contest_stat])
159 @scorearray = Array.new
158 @scorearray = Array.new
160 #set up range from param
159 #set up range from param
161 since_id = params.fetch(:since_id, 0).to_i
160 since_id = params.fetch(:since_id, 0).to_i
162 until_id = params.fetch(:until_id, 0).to_i
161 until_id = params.fetch(:until_id, 0).to_i
163 @users.each do |u|
162 @users.each do |u|
164 ustat = Array.new
163 ustat = Array.new
165 ustat[0] = u
164 ustat[0] = u
166 @problems.each do |p|
165 @problems.each do |p|
167 max_points = 0
166 max_points = 0
168 Submission.find_in_range_by_user_and_problem(u.id,p.id,since_id,until_id).each do |sub|
167 Submission.find_in_range_by_user_and_problem(u.id,p.id,since_id,until_id).each do |sub|
169 max_points = sub.points if sub and sub.points and (sub.points > max_points)
168 max_points = sub.points if sub and sub.points and (sub.points > max_points)
170 end
169 end
171 ustat << [(max_points.to_f*100/p.full_score).round, (max_points>=p.full_score)]
170 ustat << [(max_points.to_f*100/p.full_score).round, (max_points>=p.full_score)]
172 end
171 end
173 @scorearray << ustat
172 @scorearray << ustat
174 end
173 end
175
174
176 if params[:commit] == 'download csv' then
175 if params[:commit] == 'download csv' then
177 csv = gen_csv_from_scorearray(@scorearray,@problems)
176 csv = gen_csv_from_scorearray(@scorearray,@problems)
178 send_data csv, filename: 'last_score.csv'
177 send_data csv, filename: 'last_score.csv'
179 else
178 else
180 render template: 'user_admin/user_stat'
179 render template: 'user_admin/user_stat'
181 end
180 end
182 end
181 end
183
182
184 def user_stat_max
183 def user_stat_max
185 if params[:commit] == 'download csv'
184 if params[:commit] == 'download csv'
186 @problems = Problem.all
185 @problems = Problem.all
187 else
186 else
188 @problems = Problem.find_available_problems
187 @problems = Problem.find_available_problems
189 end
188 end
190 @users = User.find(:all, :include => [:contests, :contest_stat])
189 @users = User.find(:all, :include => [:contests, :contest_stat])
191 @scorearray = Array.new
190 @scorearray = Array.new
192 #set up range from param
191 #set up range from param
193 since_id = params.fetch(:since_id, 0).to_i
192 since_id = params.fetch(:since_id, 0).to_i
194 until_id = params.fetch(:until_id, 0).to_i
193 until_id = params.fetch(:until_id, 0).to_i
195 @users.each do |u|
194 @users.each do |u|
196 ustat = Array.new
195 ustat = Array.new
197 ustat[0] = u
196 ustat[0] = u
198 @problems.each do |p|
197 @problems.each do |p|
199 max_points = 0
198 max_points = 0
200 Submission.find_in_range_by_user_and_problem(u.id,p.id,since_id,until_id).each do |sub|
199 Submission.find_in_range_by_user_and_problem(u.id,p.id,since_id,until_id).each do |sub|
201 max_points = sub.points if sub and sub.points and (sub.points > max_points)
200 max_points = sub.points if sub and sub.points and (sub.points > max_points)
202 end
201 end
203 ustat << [(max_points.to_f*100/p.full_score).round, (max_points>=p.full_score)]
202 ustat << [(max_points.to_f*100/p.full_score).round, (max_points>=p.full_score)]
204 end
203 end
205 @scorearray << ustat
204 @scorearray << ustat
206 end
205 end
207
206
208 if params[:commit] == 'download csv' then
207 if params[:commit] == 'download csv' then
209 csv = gen_csv_from_scorearray(@scorearray,@problems)
208 csv = gen_csv_from_scorearray(@scorearray,@problems)
210 send_data csv, filename: 'max_score.csv'
209 send_data csv, filename: 'max_score.csv'
211 else
210 else
212 render template: 'user_admin/user_stat'
211 render template: 'user_admin/user_stat'
213 end
212 end
214 end
213 end
215
214
216 def import
215 def import
217 if params[:file]==''
216 if params[:file]==''
218 flash[:notice] = 'Error importing no file'
217 flash[:notice] = 'Error importing no file'
219 redirect_to :action => 'list' and return
218 redirect_to :action => 'list' and return
220 end
219 end
221 import_from_file(params[:file])
220 import_from_file(params[:file])
222 end
221 end
223
222
224 def random_all_passwords
223 def random_all_passwords
225 users = User.find(:all)
224 users = User.find(:all)
226 @prefix = params[:prefix] || ''
225 @prefix = params[:prefix] || ''
227 @non_admin_users = User.find_non_admin_with_prefix(@prefix)
226 @non_admin_users = User.find_non_admin_with_prefix(@prefix)
228 @changed = false
227 @changed = false
229 if request.request_method == 'POST'
228 if request.request_method == 'POST'
230 @non_admin_users.each do |user|
229 @non_admin_users.each do |user|
231 password = random_password
230 password = random_password
232 user.password = password
231 user.password = password
233 user.password_confirmation = password
232 user.password_confirmation = password
234 user.save
233 user.save
235 end
234 end
236 @changed = true
235 @changed = true
237 end
236 end
238 end
237 end
239
238
240 # contest management
239 # contest management
241
240
242 def contests
241 def contests
243 @contest, @users = find_contest_and_user_from_contest_id(params[:id])
242 @contest, @users = find_contest_and_user_from_contest_id(params[:id])
244 @contests = Contest.enabled
243 @contests = Contest.enabled
245 end
244 end
246
245
247 def assign_from_list
246 def assign_from_list
248 contest_id = params[:users_contest_id]
247 contest_id = params[:users_contest_id]
249 org_contest, users = find_contest_and_user_from_contest_id(contest_id)
248 org_contest, users = find_contest_and_user_from_contest_id(contest_id)
250 contest = Contest.find(params[:new_contest][:id])
249 contest = Contest.find(params[:new_contest][:id])
251 if !contest
250 if !contest
252 flash[:notice] = 'Error: no contest'
251 flash[:notice] = 'Error: no contest'
253 redirect_to :action => 'contests', :id =>contest_id
252 redirect_to :action => 'contests', :id =>contest_id
254 end
253 end
255
254
256 note = []
255 note = []
257 users.each do |u|
256 users.each do |u|
258 u.contests = [contest]
257 u.contests = [contest]
259 note << u.login
258 note << u.login
260 end
259 end
261 flash[:notice] = 'User(s) ' + note.join(', ') +
260 flash[:notice] = 'User(s) ' + note.join(', ') +
262 " were successfully reassigned to #{contest.title}."
261 " were successfully reassigned to #{contest.title}."
263 redirect_to :action => 'contests', :id =>contest.id
262 redirect_to :action => 'contests', :id =>contest.id
264 end
263 end
265
264
266 def add_to_contest
265 def add_to_contest
267 user = User.find(params[:id])
266 user = User.find(params[:id])
268 contest = Contest.find(params[:contest_id])
267 contest = Contest.find(params[:contest_id])
269 if user and contest
268 if user and contest
270 user.contests << contest
269 user.contests << contest
271 end
270 end
272 redirect_to :action => 'list'
271 redirect_to :action => 'list'
273 end
272 end
274
273
275 def remove_from_contest
274 def remove_from_contest
276 user = User.find(params[:id])
275 user = User.find(params[:id])
277 contest = Contest.find(params[:contest_id])
276 contest = Contest.find(params[:contest_id])
278 if user and contest
277 if user and contest
279 user.contests.delete(contest)
278 user.contests.delete(contest)
280 end
279 end
281 redirect_to :action => 'list'
280 redirect_to :action => 'list'
282 end
281 end
283
282
284 def contest_management
283 def contest_management
285 end
284 end
286
285
287 def manage_contest
286 def manage_contest
288 contest = Contest.find(params[:contest][:id])
287 contest = Contest.find(params[:contest][:id])
289 if !contest
288 if !contest
290 flash[:notice] = 'You did not choose the contest.'
289 flash[:notice] = 'You did not choose the contest.'
291 redirect_to :action => 'contest_management' and return
290 redirect_to :action => 'contest_management' and return
292 end
291 end
293
292
294 operation = params[:operation]
293 operation = params[:operation]
295
294
296 if not ['add','remove','assign'].include? operation
295 if not ['add','remove','assign'].include? operation
297 flash[:notice] = 'You did not choose the operation to perform.'
296 flash[:notice] = 'You did not choose the operation to perform.'
298 redirect_to :action => 'contest_management' and return
297 redirect_to :action => 'contest_management' and return
299 end
298 end
300
299
301 lines = params[:login_list]
300 lines = params[:login_list]
302 if !lines or lines.blank?
301 if !lines or lines.blank?
303 flash[:notice] = 'You entered an empty list.'
302 flash[:notice] = 'You entered an empty list.'
304 redirect_to :action => 'contest_management' and return
303 redirect_to :action => 'contest_management' and return
305 end
304 end
306
305
307 note = []
306 note = []
308 users = []
307 users = []
309 lines.split("\n").each do |line|
308 lines.split("\n").each do |line|
310 user = User.find_by_login(line.chomp)
309 user = User.find_by_login(line.chomp)
311 if user
310 if user
312 if operation=='add'
311 if operation=='add'
313 if ! user.contests.include? contest
312 if ! user.contests.include? contest
314 user.contests << contest
313 user.contests << contest
315 end
314 end
316 elsif operation=='remove'
315 elsif operation=='remove'
317 user.contests.delete(contest)
316 user.contests.delete(contest)
318 else
317 else
319 user.contests = [contest]
318 user.contests = [contest]
320 end
319 end
321
320
322 if params[:reset_timer]
321 if params[:reset_timer]
323 user.contest_stat.forced_logout = true
322 user.contest_stat.forced_logout = true
324 user.contest_stat.reset_timer_and_save
323 user.contest_stat.reset_timer_and_save
325 end
324 end
326
325
327 if params[:notification_emails]
326 if params[:notification_emails]
328 send_contest_update_notification_email(user, contest)
327 send_contest_update_notification_email(user, contest)
329 end
328 end
330
329
331 note << user.login
330 note << user.login
332 users << user
331 users << user
333 end
332 end
334 end
333 end
335
334
336 if params[:reset_timer]
335 if params[:reset_timer]
337 logout_users(users)
336 logout_users(users)
338 end
337 end
339
338
340 flash[:notice] = 'User(s) ' + note.join(', ') +
339 flash[:notice] = 'User(s) ' + note.join(', ') +
341 ' were successfully modified. '
340 ' were successfully modified. '
342 redirect_to :action => 'contest_management'
341 redirect_to :action => 'contest_management'
343 end
342 end
344
343
345 # admin management
344 # admin management
346
345
347 def admin
346 def admin
348 @admins = User.find(:all).find_all {|user| user.admin? }
347 @admins = User.find(:all).find_all {|user| user.admin? }
349 end
348 end
350
349
351 def grant_admin
350 def grant_admin
352 login = params[:login]
351 login = params[:login]
353 user = User.find_by_login(login)
352 user = User.find_by_login(login)
354 if user!=nil
353 if user!=nil
355 admin_role = Role.find_by_name('admin')
354 admin_role = Role.find_by_name('admin')
356 user.roles << admin_role
355 user.roles << admin_role
357 else
356 else
358 flash[:notice] = 'Unknown user'
357 flash[:notice] = 'Unknown user'
359 end
358 end
360 flash[:notice] = 'User added as admins'
359 flash[:notice] = 'User added as admins'
361 redirect_to :action => 'admin'
360 redirect_to :action => 'admin'
362 end
361 end
363
362
364 def revoke_admin
363 def revoke_admin
365 user = User.find(params[:id])
364 user = User.find(params[:id])
366 if user==nil
365 if user==nil
367 flash[:notice] = 'Unknown user'
366 flash[:notice] = 'Unknown user'
368 redirect_to :action => 'admin' and return
367 redirect_to :action => 'admin' and return
369 elsif user.login == 'root'
368 elsif user.login == 'root'
370 flash[:notice] = 'You cannot revoke admisnistrator permission from root.'
369 flash[:notice] = 'You cannot revoke admisnistrator permission from root.'
371 redirect_to :action => 'admin' and return
370 redirect_to :action => 'admin' and return
372 end
371 end
373
372
374 admin_role = Role.find_by_name('admin')
373 admin_role = Role.find_by_name('admin')
375 user.roles.delete(admin_role)
374 user.roles.delete(admin_role)
376 flash[:notice] = 'User permission revoked'
375 flash[:notice] = 'User permission revoked'
377 redirect_to :action => 'admin'
376 redirect_to :action => 'admin'
378 end
377 end
379
378
380 # mass mailing
379 # mass mailing
381
380
382 def mass_mailing
381 def mass_mailing
383 end
382 end
384
383
385 def bulk_mail
384 def bulk_mail
386 lines = params[:login_list]
385 lines = params[:login_list]
387 if !lines or lines.blank?
386 if !lines or lines.blank?
388 flash[:notice] = 'You entered an empty list.'
387 flash[:notice] = 'You entered an empty list.'
389 redirect_to :action => 'mass_mailing' and return
388 redirect_to :action => 'mass_mailing' and return
You need to be logged in to leave comments. Login now