Description:
sends mails by mail gem
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r331:4917c2675f37 - - 4 files changed: 66 inserted, 47 deleted

@@ -1,50 +1,50
1 source 'https://rubygems.org'
1 source 'https://rubygems.org'
2
2
3 gem 'rails', '3.2.8'
3 gem 'rails', '3.2.8'
4
4
5 # Bundle edge Rails instead:
5 # Bundle edge Rails instead:
6 # gem 'rails', :git => 'git://github.com/rails/rails.git'
6 # gem 'rails', :git => 'git://github.com/rails/rails.git'
7
7
8 gem 'mysql2'
8 gem 'mysql2'
9
9
10 # Gems used only for assets and not required
10 # Gems used only for assets and not required
11 # in production environments by default.
11 # in production environments by default.
12 group :assets do
12 group :assets do
13 gem 'sass-rails', '~> 3.2.3'
13 gem 'sass-rails', '~> 3.2.3'
14 gem 'coffee-rails', '~> 3.2.1'
14 gem 'coffee-rails', '~> 3.2.1'
15
15
16 # See https://github.com/sstephenson/execjs#readme for more supported runtimes
16 # See https://github.com/sstephenson/execjs#readme for more supported runtimes
17 # gem 'therubyracer', :platforms => :ruby
17 # gem 'therubyracer', :platforms => :ruby
18
18
19 gem 'uglifier', '>= 1.0.3'
19 gem 'uglifier', '>= 1.0.3'
20 end
20 end
21
21
22 gem 'prototype-rails'
22 gem 'prototype-rails'
23
23
24 # To use ActiveModel has_secure_password
24 # To use ActiveModel has_secure_password
25 # gem 'bcrypt-ruby', '~> 3.0.0'
25 # gem 'bcrypt-ruby', '~> 3.0.0'
26
26
27 # To use Jbuilder templates for JSON
27 # To use Jbuilder templates for JSON
28 # gem 'jbuilder'
28 # gem 'jbuilder'
29
29
30 # Use unicorn as the app server
30 # Use unicorn as the app server
31 # gem 'unicorn'
31 # gem 'unicorn'
32
32
33 # Deploy with Capistrano
33 # Deploy with Capistrano
34 # gem 'capistrano'
34 # gem 'capistrano'
35
35
36 # To use debugger
36 # To use debugger
37 # gem 'debugger'
37 # gem 'debugger'
38
38
39 gem "haml"
39 gem "haml"
40 - gem "tmail"
40 + gem "mail"
41 gem "rdiscount"
41 gem "rdiscount"
42 gem "test-unit"
42 gem "test-unit"
43 gem 'will_paginate', '~> 3.0.0'
43 gem 'will_paginate', '~> 3.0.0'
44 gem 'dynamic_form'
44 gem 'dynamic_form'
45 gem 'in_place_editing'
45 gem 'in_place_editing'
46 gem 'verification', :git => 'git://github.com/sikachu/verification.git'
46 gem 'verification', :git => 'git://github.com/sikachu/verification.git'
47
47
48 group :test, :development do
48 group :test, :development do
49 gem "rspec-rails", "~> 2.0"
49 gem "rspec-rails", "~> 2.0"
50 end
50 end
@@ -24,125 +24,124
24 sprockets (~> 2.1.3)
24 sprockets (~> 2.1.3)
25 activemodel (3.2.8)
25 activemodel (3.2.8)
26 activesupport (= 3.2.8)
26 activesupport (= 3.2.8)
27 builder (~> 3.0.0)
27 builder (~> 3.0.0)
28 activerecord (3.2.8)
28 activerecord (3.2.8)
29 activemodel (= 3.2.8)
29 activemodel (= 3.2.8)
30 activesupport (= 3.2.8)
30 activesupport (= 3.2.8)
31 arel (~> 3.0.2)
31 arel (~> 3.0.2)
32 tzinfo (~> 0.3.29)
32 tzinfo (~> 0.3.29)
33 activeresource (3.2.8)
33 activeresource (3.2.8)
34 activemodel (= 3.2.8)
34 activemodel (= 3.2.8)
35 activesupport (= 3.2.8)
35 activesupport (= 3.2.8)
36 activesupport (3.2.8)
36 activesupport (3.2.8)
37 i18n (~> 0.6)
37 i18n (~> 0.6)
38 multi_json (~> 1.0)
38 multi_json (~> 1.0)
39 arel (3.0.2)
39 arel (3.0.2)
40 builder (3.0.3)
40 builder (3.0.3)
41 coffee-rails (3.2.2)
41 coffee-rails (3.2.2)
42 coffee-script (>= 2.2.0)
42 coffee-script (>= 2.2.0)
43 railties (~> 3.2.0)
43 railties (~> 3.2.0)
44 coffee-script (2.2.0)
44 coffee-script (2.2.0)
45 coffee-script-source
45 coffee-script-source
46 execjs
46 execjs
47 coffee-script-source (1.3.3)
47 coffee-script-source (1.3.3)
48 diff-lcs (1.1.3)
48 diff-lcs (1.1.3)
49 dynamic_form (1.1.4)
49 dynamic_form (1.1.4)
50 erubis (2.7.0)
50 erubis (2.7.0)
51 execjs (1.4.0)
51 execjs (1.4.0)
52 multi_json (~> 1.0)
52 multi_json (~> 1.0)
53 haml (3.1.7)
53 haml (3.1.7)
54 hike (1.2.1)
54 hike (1.2.1)
55 i18n (0.6.1)
55 i18n (0.6.1)
56 in_place_editing (1.2.0)
56 in_place_editing (1.2.0)
57 journey (1.0.4)
57 journey (1.0.4)
58 json (1.7.5)
58 json (1.7.5)
59 mail (2.4.4)
59 mail (2.4.4)
60 i18n (>= 0.4.0)
60 i18n (>= 0.4.0)
61 mime-types (~> 1.16)
61 mime-types (~> 1.16)
62 treetop (~> 1.4.8)
62 treetop (~> 1.4.8)
63 mime-types (1.19)
63 mime-types (1.19)
64 multi_json (1.3.6)
64 multi_json (1.3.6)
65 mysql2 (0.3.11)
65 mysql2 (0.3.11)
66 polyglot (0.3.3)
66 polyglot (0.3.3)
67 prototype-rails (3.2.1)
67 prototype-rails (3.2.1)
68 rails (~> 3.2)
68 rails (~> 3.2)
69 rack (1.4.1)
69 rack (1.4.1)
70 rack-cache (1.2)
70 rack-cache (1.2)
71 rack (>= 0.4)
71 rack (>= 0.4)
72 rack-ssl (1.3.2)
72 rack-ssl (1.3.2)
73 rack
73 rack
74 rack-test (0.6.2)
74 rack-test (0.6.2)
75 rack (>= 1.0)
75 rack (>= 1.0)
76 rails (3.2.8)
76 rails (3.2.8)
77 actionmailer (= 3.2.8)
77 actionmailer (= 3.2.8)
78 actionpack (= 3.2.8)
78 actionpack (= 3.2.8)
79 activerecord (= 3.2.8)
79 activerecord (= 3.2.8)
80 activeresource (= 3.2.8)
80 activeresource (= 3.2.8)
81 activesupport (= 3.2.8)
81 activesupport (= 3.2.8)
82 bundler (~> 1.0)
82 bundler (~> 1.0)
83 railties (= 3.2.8)
83 railties (= 3.2.8)
84 railties (3.2.8)
84 railties (3.2.8)
85 actionpack (= 3.2.8)
85 actionpack (= 3.2.8)
86 activesupport (= 3.2.8)
86 activesupport (= 3.2.8)
87 rack-ssl (~> 1.3.2)
87 rack-ssl (~> 1.3.2)
88 rake (>= 0.8.7)
88 rake (>= 0.8.7)
89 rdoc (~> 3.4)
89 rdoc (~> 3.4)
90 thor (>= 0.14.6, < 2.0)
90 thor (>= 0.14.6, < 2.0)
91 rake (0.9.2.2)
91 rake (0.9.2.2)
92 rdiscount (1.6.8)
92 rdiscount (1.6.8)
93 rdoc (3.12)
93 rdoc (3.12)
94 json (~> 1.4)
94 json (~> 1.4)
95 rspec (2.11.0)
95 rspec (2.11.0)
96 rspec-core (~> 2.11.0)
96 rspec-core (~> 2.11.0)
97 rspec-expectations (~> 2.11.0)
97 rspec-expectations (~> 2.11.0)
98 rspec-mocks (~> 2.11.0)
98 rspec-mocks (~> 2.11.0)
99 rspec-core (2.11.1)
99 rspec-core (2.11.1)
100 rspec-expectations (2.11.3)
100 rspec-expectations (2.11.3)
101 diff-lcs (~> 1.1.3)
101 diff-lcs (~> 1.1.3)
102 rspec-mocks (2.11.3)
102 rspec-mocks (2.11.3)
103 rspec-rails (2.11.0)
103 rspec-rails (2.11.0)
104 actionpack (>= 3.0)
104 actionpack (>= 3.0)
105 activesupport (>= 3.0)
105 activesupport (>= 3.0)
106 railties (>= 3.0)
106 railties (>= 3.0)
107 rspec (~> 2.11.0)
107 rspec (~> 2.11.0)
108 sass (3.2.1)
108 sass (3.2.1)
109 sass-rails (3.2.5)
109 sass-rails (3.2.5)
110 railties (~> 3.2.0)
110 railties (~> 3.2.0)
111 sass (>= 3.1.10)
111 sass (>= 3.1.10)
112 tilt (~> 1.3)
112 tilt (~> 1.3)
113 sprockets (2.1.3)
113 sprockets (2.1.3)
114 hike (~> 1.2)
114 hike (~> 1.2)
115 rack (~> 1.0)
115 rack (~> 1.0)
116 tilt (~> 1.1, != 1.3.0)
116 tilt (~> 1.1, != 1.3.0)
117 test-unit (2.5.2)
117 test-unit (2.5.2)
118 thor (0.16.0)
118 thor (0.16.0)
119 tilt (1.3.3)
119 tilt (1.3.3)
120 - tmail (1.2.7.1)
121 treetop (1.4.10)
120 treetop (1.4.10)
122 polyglot
121 polyglot
123 polyglot (>= 0.3.1)
122 polyglot (>= 0.3.1)
124 tzinfo (0.3.33)
123 tzinfo (0.3.33)
125 uglifier (1.3.0)
124 uglifier (1.3.0)
126 execjs (>= 0.3.0)
125 execjs (>= 0.3.0)
127 multi_json (~> 1.0, >= 1.0.2)
126 multi_json (~> 1.0, >= 1.0.2)
128 will_paginate (3.0.3)
127 will_paginate (3.0.3)
129
128
130 PLATFORMS
129 PLATFORMS
131 ruby
130 ruby
132
131
133 DEPENDENCIES
132 DEPENDENCIES
134 coffee-rails (~> 3.2.1)
133 coffee-rails (~> 3.2.1)
135 dynamic_form
134 dynamic_form
136 haml
135 haml
137 in_place_editing
136 in_place_editing
137 + mail
138 mysql2
138 mysql2
139 prototype-rails
139 prototype-rails
140 rails (= 3.2.8)
140 rails (= 3.2.8)
141 rdiscount
141 rdiscount
142 rspec-rails (~> 2.0)
142 rspec-rails (~> 2.0)
143 sass-rails (~> 3.2.3)
143 sass-rails (~> 3.2.3)
144 test-unit
144 test-unit
145 - tmail
146 uglifier (>= 1.0.3)
145 uglifier (>= 1.0.3)
147 verification!
146 verification!
148 will_paginate (~> 3.0.0)
147 will_paginate (~> 3.0.0)
@@ -1,100 +1,98
1 class UserAdminController < ApplicationController
1 class UserAdminController < ApplicationController
2
2
3 - #include MailHelperMethods
4 -
5 before_filter :admin_authorization
3 before_filter :admin_authorization
6
4
7 # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
5 # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
8 verify :method => :post, :only => [ :destroy,
6 verify :method => :post, :only => [ :destroy,
9 :create, :create_from_list,
7 :create, :create_from_list,
10 :update,
8 :update,
11 :manage_contest,
9 :manage_contest,
12 :bulk_mail
10 :bulk_mail
13 ],
11 ],
14 :redirect_to => { :action => :list }
12 :redirect_to => { :action => :list }
15
13
16 def index
14 def index
17 list
15 list
18 render :action => 'list'
16 render :action => 'list'
19 end
17 end
20
18
21 def list
19 def list
22 @user_count = User.count
20 @user_count = User.count
23 if params[:page] == 'all'
21 if params[:page] == 'all'
24 @users = User.all
22 @users = User.all
25 @paginated = false
23 @paginated = false
26 else
24 else
27 @users = User.paginate :page => params[:page]
25 @users = User.paginate :page => params[:page]
28 @paginated = true
26 @paginated = true
29 end
27 end
30 @hidden_columns = ['hashed_password', 'salt', 'created_at', 'updated_at']
28 @hidden_columns = ['hashed_password', 'salt', 'created_at', 'updated_at']
31 @contests = Contest.enabled
29 @contests = Contest.enabled
32 end
30 end
33
31
34 def active
32 def active
35 sessions = ActiveRecord::SessionStore::Session.find(:all, :conditions => ["updated_at >= ?", 60.minutes.ago])
33 sessions = ActiveRecord::SessionStore::Session.find(:all, :conditions => ["updated_at >= ?", 60.minutes.ago])
36 @users = []
34 @users = []
37 sessions.each do |session|
35 sessions.each do |session|
38 if session.data[:user_id]
36 if session.data[:user_id]
39 @users << User.find(session.data[:user_id])
37 @users << User.find(session.data[:user_id])
40 end
38 end
41 end
39 end
42 end
40 end
43
41
44 def show
42 def show
45 @user = User.find(params[:id])
43 @user = User.find(params[:id])
46 end
44 end
47
45
48 def new
46 def new
49 @user = User.new
47 @user = User.new
50 end
48 end
51
49
52 def create
50 def create
53 @user = User.new(params[:user])
51 @user = User.new(params[:user])
54 @user.activated = true
52 @user.activated = true
55 if @user.save
53 if @user.save
56 flash[:notice] = 'User was successfully created.'
54 flash[:notice] = 'User was successfully created.'
57 redirect_to :action => 'list'
55 redirect_to :action => 'list'
58 else
56 else
59 render :action => 'new'
57 render :action => 'new'
60 end
58 end
61 end
59 end
62
60
63 def create_from_list
61 def create_from_list
64 lines = params[:user_list]
62 lines = params[:user_list]
65
63
66 note = []
64 note = []
67
65
68 lines.split("\n").each do |line|
66 lines.split("\n").each do |line|
69 items = line.chomp.split(',')
67 items = line.chomp.split(',')
70 if items.length>=2
68 if items.length>=2
71 login = items[0]
69 login = items[0]
72 full_name = items[1]
70 full_name = items[1]
73
71
74 added_random_password = false
72 added_random_password = false
75 if items.length>=3
73 if items.length>=3
76 password = items[2].chomp(" ")
74 password = items[2].chomp(" ")
77 user_alias = (items.length>=4) ? items[3] : login
75 user_alias = (items.length>=4) ? items[3] : login
78 else
76 else
79 password = random_password
77 password = random_password
80 user_alias = (items.length>=4) ? items[3] : login
78 user_alias = (items.length>=4) ? items[3] : login
81 added_random_password = true
79 added_random_password = true
82 end
80 end
83
81
84 user = User.new({:login => login,
82 user = User.new({:login => login,
85 :full_name => full_name,
83 :full_name => full_name,
86 :password => password,
84 :password => password,
87 :password_confirmation => password,
85 :password_confirmation => password,
88 :alias => user_alias})
86 :alias => user_alias})
89 user.activated = true
87 user.activated = true
90 user.save
88 user.save
91
89
92 if added_random_password
90 if added_random_password
93 note << "'#{login}' (+)"
91 note << "'#{login}' (+)"
94 else
92 else
95 note << login
93 note << login
96 end
94 end
97 end
95 end
98 end
96 end
99 flash[:notice] = 'User(s) ' + note.join(', ') +
97 flash[:notice] = 'User(s) ' + note.join(', ') +
100 ' were successfully created. ' +
98 ' were successfully created. ' +
@@ -223,233 +221,247
223 if not ['add','remove','assign'].include? operation
221 if not ['add','remove','assign'].include? operation
224 flash[:notice] = 'You did not choose the operation to perform.'
222 flash[:notice] = 'You did not choose the operation to perform.'
225 redirect_to :action => 'contest_management' and return
223 redirect_to :action => 'contest_management' and return
226 end
224 end
227
225
228 lines = params[:login_list]
226 lines = params[:login_list]
229 if !lines or lines.blank?
227 if !lines or lines.blank?
230 flash[:notice] = 'You entered an empty list.'
228 flash[:notice] = 'You entered an empty list.'
231 redirect_to :action => 'contest_management' and return
229 redirect_to :action => 'contest_management' and return
232 end
230 end
233
231
234 note = []
232 note = []
235 users = []
233 users = []
236 lines.split("\n").each do |line|
234 lines.split("\n").each do |line|
237 user = User.find_by_login(line.chomp)
235 user = User.find_by_login(line.chomp)
238 if user
236 if user
239 if operation=='add'
237 if operation=='add'
240 if ! user.contests.include? contest
238 if ! user.contests.include? contest
241 user.contests << contest
239 user.contests << contest
242 end
240 end
243 elsif operation=='remove'
241 elsif operation=='remove'
244 user.contests.delete(contest)
242 user.contests.delete(contest)
245 else
243 else
246 user.contests = [contest]
244 user.contests = [contest]
247 end
245 end
248
246
249 if params[:reset_timer]
247 if params[:reset_timer]
250 user.contest_stat.forced_logout = true
248 user.contest_stat.forced_logout = true
251 user.contest_stat.reset_timer_and_save
249 user.contest_stat.reset_timer_and_save
252 end
250 end
253
251
254 if params[:notification_emails]
252 if params[:notification_emails]
255 send_contest_update_notification_email(user, contest)
253 send_contest_update_notification_email(user, contest)
256 end
254 end
257
255
258 note << user.login
256 note << user.login
259 users << user
257 users << user
260 end
258 end
261 end
259 end
262
260
263 if params[:reset_timer]
261 if params[:reset_timer]
264 logout_users(users)
262 logout_users(users)
265 end
263 end
266
264
267 flash[:notice] = 'User(s) ' + note.join(', ') +
265 flash[:notice] = 'User(s) ' + note.join(', ') +
268 ' were successfully modified. '
266 ' were successfully modified. '
269 redirect_to :action => 'contest_management'
267 redirect_to :action => 'contest_management'
270 end
268 end
271
269
272 # admin management
270 # admin management
273
271
274 def admin
272 def admin
275 @admins = User.find(:all).find_all {|user| user.admin? }
273 @admins = User.find(:all).find_all {|user| user.admin? }
276 end
274 end
277
275
278 def grant_admin
276 def grant_admin
279 login = params[:login]
277 login = params[:login]
280 user = User.find_by_login(login)
278 user = User.find_by_login(login)
281 if user!=nil
279 if user!=nil
282 admin_role = Role.find_by_name('admin')
280 admin_role = Role.find_by_name('admin')
283 user.roles << admin_role
281 user.roles << admin_role
284 else
282 else
285 flash[:notice] = 'Unknown user'
283 flash[:notice] = 'Unknown user'
286 end
284 end
287 flash[:notice] = 'User added as admins'
285 flash[:notice] = 'User added as admins'
288 redirect_to :action => 'admin'
286 redirect_to :action => 'admin'
289 end
287 end
290
288
291 def revoke_admin
289 def revoke_admin
292 user = User.find(params[:id])
290 user = User.find(params[:id])
293 if user==nil
291 if user==nil
294 flash[:notice] = 'Unknown user'
292 flash[:notice] = 'Unknown user'
295 redirect_to :action => 'admin' and return
293 redirect_to :action => 'admin' and return
296 elsif user.login == 'root'
294 elsif user.login == 'root'
297 flash[:notice] = 'You cannot revoke admisnistrator permission from root.'
295 flash[:notice] = 'You cannot revoke admisnistrator permission from root.'
298 redirect_to :action => 'admin' and return
296 redirect_to :action => 'admin' and return
299 end
297 end
300
298
301 admin_role = Role.find_by_name('admin')
299 admin_role = Role.find_by_name('admin')
302 user.roles.delete(admin_role)
300 user.roles.delete(admin_role)
303 flash[:notice] = 'User permission revoked'
301 flash[:notice] = 'User permission revoked'
304 redirect_to :action => 'admin'
302 redirect_to :action => 'admin'
305 end
303 end
306
304
307 # mass mailing
305 # mass mailing
308
306
309 def mass_mailing
307 def mass_mailing
310 end
308 end
311
309
312 def bulk_mail
310 def bulk_mail
313 lines = params[:login_list]
311 lines = params[:login_list]
314 if !lines or lines.blank?
312 if !lines or lines.blank?
315 flash[:notice] = 'You entered an empty list.'
313 flash[:notice] = 'You entered an empty list.'
316 redirect_to :action => 'mass_mailing' and return
314 redirect_to :action => 'mass_mailing' and return
317 end
315 end
318
316
319 - subject = params[:subject]
317 + mail_subject = params[:subject]
320 - if !subject or subject.blank?
318 + if !mail_subject or mail_subject.blank?
321 flash[:notice] = 'You entered an empty mail subject.'
319 flash[:notice] = 'You entered an empty mail subject.'
322 redirect_to :action => 'mass_mailing' and return
320 redirect_to :action => 'mass_mailing' and return
323 end
321 end
322 +
323 + mail_body = params[:email_body]
324 + if !mail_body or mail_body.blank?
325 + flash[:notice] = 'You entered an empty mail body.'
326 + redirect_to :action => 'mass_mailing' and return
327 + end
324
328
325 - body = params[:email_body]
329 + admin_email = GraderConfiguration['system.admin_email']
326 - if !body or body.blank?
327 - flash[:notice] = 'You entered an empty mail body.'
328 - redirect_to :action => 'mass_mailing' and return
329 - end
330
330
331 note = []
331 note = []
332 users = []
332 users = []
333 lines.split("\n").each do |line|
333 lines.split("\n").each do |line|
334 user = User.find_by_login(line.chomp)
334 user = User.find_by_login(line.chomp)
335 if user
335 if user
336 - send_mail(user.email, subject, body)
336 + Mail.deliver do
337 + from admin_email
338 + to user.email
339 + subject mail_subject
340 + body mail_body
341 + end
337 note << user.login
342 note << user.login
338 end
343 end
339 end
344 end
340
345
341 flash[:notice] = 'User(s) ' + note.join(', ') +
346 flash[:notice] = 'User(s) ' + note.join(', ') +
342 ' were successfully modified. '
347 ' were successfully modified. '
343 redirect_to :action => 'mass_mailing'
348 redirect_to :action => 'mass_mailing'
344 end
349 end
345
350
346 protected
351 protected
347
352
348 def random_password(length=5)
353 def random_password(length=5)
349 chars = 'abcdefghijkmnopqrstuvwxyz23456789'
354 chars = 'abcdefghijkmnopqrstuvwxyz23456789'
350 newpass = ""
355 newpass = ""
351 length.times { newpass << chars[rand(chars.size-1)] }
356 length.times { newpass << chars[rand(chars.size-1)] }
352 return newpass
357 return newpass
353 end
358 end
354
359
355 def import_from_file(f)
360 def import_from_file(f)
356 data_hash = YAML.load(f)
361 data_hash = YAML.load(f)
357 @import_log = ""
362 @import_log = ""
358
363
359 country_data = data_hash[:countries]
364 country_data = data_hash[:countries]
360 site_data = data_hash[:sites]
365 site_data = data_hash[:sites]
361 user_data = data_hash[:users]
366 user_data = data_hash[:users]
362
367
363 # import country
368 # import country
364 countries = {}
369 countries = {}
365 country_data.each_pair do |id,country|
370 country_data.each_pair do |id,country|
366 c = Country.find_by_name(country[:name])
371 c = Country.find_by_name(country[:name])
367 if c!=nil
372 if c!=nil
368 countries[id] = c
373 countries[id] = c
369 @import_log << "Found #{country[:name]}\n"
374 @import_log << "Found #{country[:name]}\n"
370 else
375 else
371 countries[id] = Country.new(:name => country[:name])
376 countries[id] = Country.new(:name => country[:name])
372 countries[id].save
377 countries[id].save
373 @import_log << "Created #{country[:name]}\n"
378 @import_log << "Created #{country[:name]}\n"
374 end
379 end
375 end
380 end
376
381
377 # import sites
382 # import sites
378 sites = {}
383 sites = {}
379 site_data.each_pair do |id,site|
384 site_data.each_pair do |id,site|
380 s = Site.find_by_name(site[:name])
385 s = Site.find_by_name(site[:name])
381 if s!=nil
386 if s!=nil
382 @import_log << "Found #{site[:name]}\n"
387 @import_log << "Found #{site[:name]}\n"
383 else
388 else
384 s = Site.new(:name => site[:name])
389 s = Site.new(:name => site[:name])
385 @import_log << "Created #{site[:name]}\n"
390 @import_log << "Created #{site[:name]}\n"
386 end
391 end
387 s.password = site[:password]
392 s.password = site[:password]
388 s.country = countries[site[:country_id]]
393 s.country = countries[site[:country_id]]
389 s.save
394 s.save
390 sites[id] = s
395 sites[id] = s
391 end
396 end
392
397
393 # import users
398 # import users
394 user_data.each_pair do |id,user|
399 user_data.each_pair do |id,user|
395 u = User.find_by_login(user[:login])
400 u = User.find_by_login(user[:login])
396 if u!=nil
401 if u!=nil
397 @import_log << "Found #{user[:login]}\n"
402 @import_log << "Found #{user[:login]}\n"
398 else
403 else
399 u = User.new(:login => user[:login])
404 u = User.new(:login => user[:login])
400 @import_log << "Created #{user[:login]}\n"
405 @import_log << "Created #{user[:login]}\n"
401 end
406 end
402 u.full_name = user[:name]
407 u.full_name = user[:name]
403 u.password = user[:password]
408 u.password = user[:password]
404 u.country = countries[user[:country_id]]
409 u.country = countries[user[:country_id]]
405 u.site = sites[user[:site_id]]
410 u.site = sites[user[:site_id]]
406 u.activated = true
411 u.activated = true
407 u.email = "empty-#{u.login}@none.com"
412 u.email = "empty-#{u.login}@none.com"
408 if not u.save
413 if not u.save
409 @import_log << "Errors\n"
414 @import_log << "Errors\n"
410 u.errors.each { |attr,msg| @import_log << "#{attr} - #{msg}\n" }
415 u.errors.each { |attr,msg| @import_log << "#{attr} - #{msg}\n" }
411 end
416 end
412 end
417 end
413
418
414 end
419 end
415
420
416 def logout_users(users)
421 def logout_users(users)
417 users.each do |user|
422 users.each do |user|
418 contest_stat = user.contest_stat(true)
423 contest_stat = user.contest_stat(true)
419 if contest_stat and !contest_stat.forced_logout
424 if contest_stat and !contest_stat.forced_logout
420 contest_stat.forced_logout = true
425 contest_stat.forced_logout = true
421 contest_stat.save
426 contest_stat.save
422 end
427 end
423 end
428 end
424 end
429 end
425
430
426 def send_contest_update_notification_email(user, contest)
431 def send_contest_update_notification_email(user, contest)
427 contest_title_name = GraderConfiguration['contest.name']
432 contest_title_name = GraderConfiguration['contest.name']
428 contest_name = contest.name
433 contest_name = contest.name
429 - subject = t('contest.notification.email_subject', {
434 + mail_subject = t('contest.notification.email_subject', {
430 - :contest_title_name => contest_title_name,
435 + :contest_title_name => contest_title_name,
431 - :contest_name => contest_name })
436 + :contest_name => contest_name })
432 - body = t('contest.notification.email_body', {
437 + mail_body = t('contest.notification.email_body', {
433 - :full_name => user.full_name,
438 + :full_name => user.full_name,
434 - :contest_title_name => contest_title_name,
439 + :contest_title_name => contest_title_name,
435 - :contest_name => contest.name,
440 + :contest_name => contest.name,
436 - })
441 + })
437
442
438 - logger.info body
443 + admin_email = GraderConfiguration['system.admin_email']
439 - send_mail(user.email, subject, body)
444 +
445 + logger.info mail_body
446 + Mail.deliver do
447 + from admin_email
448 + to user.email
449 + subject mail_subject
450 + body mail_body
451 + end
440 end
452 end
441
453
442 def find_contest_and_user_from_contest_id(id)
454 def find_contest_and_user_from_contest_id(id)
443 if id!='none'
455 if id!='none'
444 @contest = Contest.find(id)
456 @contest = Contest.find(id)
445 else
457 else
446 @contest = nil
458 @contest = nil
447 end
459 end
448 if @contest
460 if @contest
449 @users = @contest.users
461 @users = @contest.users
450 else
462 else
451 @users = User.find_users_with_no_contest
463 @users = User.find_users_with_no_contest
452 end
464 end
453 return [@contest, @users]
465 return [@contest, @users]
454 end
466 end
455 end
467 end
@@ -1,158 +1,166
1 - require 'tmail'
2 require 'net/smtp'
1 require 'net/smtp'
3
2
4 class UsersController < ApplicationController
3 class UsersController < ApplicationController
5
4
6 - #include MailHelperMethods
7 -
8 before_filter :authenticate, :except => [:new,
5 before_filter :authenticate, :except => [:new,
9 :register,
6 :register,
10 :confirm,
7 :confirm,
11 :forget,
8 :forget,
12 :retrieve_password]
9 :retrieve_password]
13
10
14 before_filter :verify_online_registration, :only => [:new,
11 before_filter :verify_online_registration, :only => [:new,
15 :register,
12 :register,
16 :forget,
13 :forget,
17 :retrieve_password]
14 :retrieve_password]
18
15
19 verify :method => :post, :only => [:chg_passwd],
16 verify :method => :post, :only => [:chg_passwd],
20 :redirect_to => { :action => :index }
17 :redirect_to => { :action => :index }
21
18
22 #in_place_edit_for :user, :alias_for_editing
19 #in_place_edit_for :user, :alias_for_editing
23 #in_place_edit_for :user, :email_for_editing
20 #in_place_edit_for :user, :email_for_editing
24
21
25 def index
22 def index
26 if !GraderConfiguration['system.user_setting_enabled']
23 if !GraderConfiguration['system.user_setting_enabled']
27 redirect_to :controller => 'main', :action => 'list'
24 redirect_to :controller => 'main', :action => 'list'
28 else
25 else
29 @user = User.find(session[:user_id])
26 @user = User.find(session[:user_id])
30 end
27 end
31 end
28 end
32
29
33 def chg_passwd
30 def chg_passwd
34 user = User.find(session[:user_id])
31 user = User.find(session[:user_id])
35 user.password = params[:passwd]
32 user.password = params[:passwd]
36 user.password_confirmation = params[:passwd_verify]
33 user.password_confirmation = params[:passwd_verify]
37 if user.save
34 if user.save
38 flash[:notice] = 'password changed'
35 flash[:notice] = 'password changed'
39 else
36 else
40 flash[:notice] = 'Error: password changing failed'
37 flash[:notice] = 'Error: password changing failed'
41 end
38 end
42 redirect_to :action => 'index'
39 redirect_to :action => 'index'
43 end
40 end
44
41
45 def new
42 def new
46 @user = User.new
43 @user = User.new
47 render :action => 'new', :layout => 'empty'
44 render :action => 'new', :layout => 'empty'
48 end
45 end
49
46
50 def register
47 def register
51 if(params[:cancel])
48 if(params[:cancel])
52 redirect_to :controller => 'main', :action => 'login'
49 redirect_to :controller => 'main', :action => 'login'
53 return
50 return
54 end
51 end
55 @user = User.new(params[:user])
52 @user = User.new(params[:user])
56 @user.password_confirmation = @user.password = User.random_password
53 @user.password_confirmation = @user.password = User.random_password
57 @user.activated = false
54 @user.activated = false
58 if (@user.valid?) and (@user.save)
55 if (@user.valid?) and (@user.save)
59 if send_confirmation_email(@user)
56 if send_confirmation_email(@user)
60 render :action => 'new_splash', :layout => 'empty'
57 render :action => 'new_splash', :layout => 'empty'
61 else
58 else
62 @admin_email = GraderConfiguration['system.admin_email']
59 @admin_email = GraderConfiguration['system.admin_email']
63 render :action => 'email_error', :layout => 'empty'
60 render :action => 'email_error', :layout => 'empty'
64 end
61 end
65 else
62 else
66 @user.errors.add_to_base("Email cannot be blank") if @user.email==''
63 @user.errors.add_to_base("Email cannot be blank") if @user.email==''
67 render :action => 'new', :layout => 'empty'
64 render :action => 'new', :layout => 'empty'
68 end
65 end
69 end
66 end
70
67
71 def confirm
68 def confirm
72 login = params[:login]
69 login = params[:login]
73 key = params[:activation]
70 key = params[:activation]
74 @user = User.find_by_login(login)
71 @user = User.find_by_login(login)
75 if (@user) and (@user.verify_activation_key(key))
72 if (@user) and (@user.verify_activation_key(key))
76 if @user.valid? # check uniquenss of email
73 if @user.valid? # check uniquenss of email
77 @user.activated = true
74 @user.activated = true
78 @user.save
75 @user.save
79 @result = :successful
76 @result = :successful
80 else
77 else
81 @result = :email_used
78 @result = :email_used
82 end
79 end
83 else
80 else
84 @result = :failed
81 @result = :failed
85 end
82 end
86 render :action => 'confirm', :layout => 'empty'
83 render :action => 'confirm', :layout => 'empty'
87 end
84 end
88
85
89 def forget
86 def forget
90 render :action => 'forget', :layout => 'empty'
87 render :action => 'forget', :layout => 'empty'
91 end
88 end
92
89
93 def retrieve_password
90 def retrieve_password
94 email = params[:email]
91 email = params[:email]
95 user = User.find_by_email(email)
92 user = User.find_by_email(email)
96 if user
93 if user
97 last_updated_time = user.updated_at || user.created_at || (Time.now.gmtime - 1.hour)
94 last_updated_time = user.updated_at || user.created_at || (Time.now.gmtime - 1.hour)
98 if last_updated_time > Time.now.gmtime - 5.minutes
95 if last_updated_time > Time.now.gmtime - 5.minutes
99 flash[:notice] = 'The account has recently created or new password has recently been requested. Please wait for 5 minutes'
96 flash[:notice] = 'The account has recently created or new password has recently been requested. Please wait for 5 minutes'
100 else
97 else
101 user.password = user.password_confirmation = User.random_password
98 user.password = user.password_confirmation = User.random_password
102 user.save
99 user.save
103 send_new_password_email(user)
100 send_new_password_email(user)
104 flash[:notice] = 'New password has been mailed to you.'
101 flash[:notice] = 'New password has been mailed to you.'
105 end
102 end
106 else
103 else
107 flash[:notice] = I18n.t 'registration.password_retrieval.no_email'
104 flash[:notice] = I18n.t 'registration.password_retrieval.no_email'
108 end
105 end
109 redirect_to :action => 'forget'
106 redirect_to :action => 'forget'
110 end
107 end
111
108
112 protected
109 protected
113
110
114 def verify_online_registration
111 def verify_online_registration
115 if !GraderConfiguration['system.online_registration']
112 if !GraderConfiguration['system.online_registration']
116 redirect_to :controller => 'main', :action => 'login'
113 redirect_to :controller => 'main', :action => 'login'
117 end
114 end
118 end
115 end
119
116
120 def send_confirmation_email(user)
117 def send_confirmation_email(user)
121 contest_name = GraderConfiguration['contest.name']
118 contest_name = GraderConfiguration['contest.name']
122 admin_email = GraderConfiguration['system.admin_email']
119 admin_email = GraderConfiguration['system.admin_email']
123 activation_url = url_for(:action => 'confirm',
120 activation_url = url_for(:action => 'confirm',
124 :login => user.login,
121 :login => user.login,
125 :activation => user.activation_key)
122 :activation => user.activation_key)
126 home_url = url_for(:controller => 'main', :action => 'index')
123 home_url = url_for(:controller => 'main', :action => 'index')
127 - subject = "[#{contest_name}] Confirmation"
124 + mail_subject = "[#{contest_name}] Confirmation"
128 - body = t('registration.email_body', {
125 + mail_body = t('registration.email_body', {
129 - :full_name => user.full_name,
126 + :full_name => user.full_name,
130 - :contest_name => contest_name,
127 + :contest_name => contest_name,
131 - :login => user.login,
128 + :login => user.login,
132 - :password => user.password,
129 + :password => user.password,
133 - :activation_url => activation_url,
130 + :activation_url => activation_url,
134 - :admin_email => admin_email
131 + :admin_email => admin_email
135 - })
132 + })
136
133
137 - logger.info body
134 + logger.info mail_body
138
135
139 - send_mail(user.email, subject, body)
136 + Mail.deliver do
137 + from admin_email
138 + to user.email
139 + subject mail_subject
140 + body mail_body
141 + end
140 end
142 end
141
143
142 def send_new_password_email(user)
144 def send_new_password_email(user)
143 contest_name = GraderConfiguration['contest.name']
145 contest_name = GraderConfiguration['contest.name']
144 admin_email = GraderConfiguration['system.admin_email']
146 admin_email = GraderConfiguration['system.admin_email']
145 - subject = "[#{contest_name}] Password recovery"
147 + mail_subject = "[#{contest_name}] Password recovery"
146 - body = t('registration.password_retrieval.email_body', {
148 + mail_body = t('registration.password_retrieval.email_body', {
147 - :full_name => user.full_name,
149 + :full_name => user.full_name,
148 - :contest_name => contest_name,
150 + :contest_name => contest_name,
149 - :login => user.login,
151 + :login => user.login,
150 - :password => user.password,
152 + :password => user.password,
151 - :admin_email => admin_email
153 + :admin_email => admin_email
152 - })
154 + })
153
155
154 - logger.info body
156 + logger.info mail_body
155 - send_mail(user.email, subject, body)
157 +
158 + Mail.deliver do
159 + from admin_email
160 + to user.email
161 + subject mail_subject
162 + body mail_body
163 + end
156 end
164 end
157
165
158 end
166 end
You need to be logged in to leave comments. Login now