Description:
sends notification emails to users after contest upgrade.
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r296:3e5af2413b70 - - 8 files changed: 163 inserted, 82 deleted

@@ -0,0 +1,36
1 + module MailHelperMethods
2 +
3 + def send_mail(to, subject, body)
4 + mail = TMail::Mail.new
5 + mail.to = to
6 + mail.from = Configuration['system.online_registration.from']
7 + mail.subject = subject
8 + mail.body = body
9 +
10 + smtp_server = Configuration['system.online_registration.smtp']
11 +
12 + if ['fake', 'debug'].include? smtp_server
13 + puts "-------------------------
14 + To: #{mail.to}
15 + From: #{mail.from}
16 + Subject: #{mail.subject}
17 + #{mail.body}
18 + --------------------------
19 + "
20 + return true
21 + end
22 +
23 + begin
24 + Net::SMTP.start(smtp_server) do |smtp|
25 + smtp.send_message(mail.to_s, mail.from, mail.to)
26 + end
27 + result = true
28 + rescue
29 + result = false
30 + end
31 +
32 + result
33 + end
34 +
35 + end
36 +
@@ -41,6 +41,7
41
41
42 if Configuration.multicontests?
42 if Configuration.multicontests?
43 user = User.find(session[:user_id])
43 user = User.find(session[:user_id])
44 + return true if user.admin?
44 begin
45 begin
45 if user.contest_stat(true).forced_logout
46 if user.contest_stat(true).forced_logout
46 flash[:notice] = 'You have been automatically logged out.'
47 flash[:notice] = 'You have been automatically logged out.'
@@ -1,5 +1,7
1 class UserAdminController < ApplicationController
1 class UserAdminController < ApplicationController
2
2
3 + include MailHelperMethods
4 +
3 before_filter :admin_authorization
5 before_filter :admin_authorization
4
6
5 def index
7 def index
@@ -215,6 +217,10
215 user.contest_stat.reset_timer_and_save
217 user.contest_stat.reset_timer_and_save
216 end
218 end
217
219
220 + if params[:notification_emails]
221 + send_contest_update_notification_email(user, contest)
222 + end
223 +
218 note << user.login
224 note << user.login
219 users << user
225 users << user
220 end
226 end
@@ -344,4 +350,19
344 end
350 end
345 end
351 end
346
352
353 + def send_contest_update_notification_email(user, contest)
354 + contest_title_name = Configuration['contest.name']
355 + contest_name = contest.name
356 + subject = t('contest.notification.email_subject', {
357 + :contest_title_name => contest_title_name,
358 + :contest_name => contest_name })
359 + body = t('contest.notification.email_body', {
360 + :full_name => user.full_name,
361 + :contest_title_name => contest_title_name,
362 + :contest_name => contest.name,
363 + })
364 +
365 + logger.info body
366 + send_mail(user.email, subject, body)
367 + end
347 end
368 end
@@ -3,6 +3,8
3
3
4 class UsersController < ApplicationController
4 class UsersController < ApplicationController
5
5
6 + include MailHelperMethods
7 +
6 before_filter :authenticate, :except => [:new,
8 before_filter :authenticate, :except => [:new,
7 :register,
9 :register,
8 :confirm,
10 :confirm,
@@ -122,64 +124,35
122 :login => user.login,
124 :login => user.login,
123 :activation => user.activation_key)
125 :activation => user.activation_key)
124 home_url = url_for(:controller => 'main', :action => 'index')
126 home_url = url_for(:controller => 'main', :action => 'index')
125 - mail = TMail::Mail.new
127 + subject = "[#{contest_name}] Confirmation"
126 - mail.to = user.email
128 + body = t('registration.email_body', {
127 - mail.from = Configuration['system.online_registration.from']
129 + :full_name => user.full_name,
128 - mail.subject = "[#{contest_name}] Confirmation"
130 + :contest_name => contest_name,
129 - mail.body = t('registration.email_body', {
131 + :login => user.login,
130 - :full_name => user.full_name,
132 + :password => user.password,
131 - :contest_name => contest_name,
133 + :activation_url => activation_url,
132 - :login => user.login,
134 + :admin_email => admin_email
133 - :password => user.password,
135 + })
134 - :activation_url => activation_url,
135 - :admin_email => admin_email
136 - })
137
136
138 - logger.info mail.body
137 + logger.info body
139 -
140 - smtp_server = Configuration['system.online_registration.smtp']
141
138
142 - begin
139 + send_mail(user.email, subject, body)
143 - Net::SMTP.start(smtp_server) do |smtp|
144 - smtp.send_message(mail.to_s, mail.from, mail.to)
145 - end
146 - result = true
147 - rescue
148 - result = false
149 - end
150 -
151 - return result
152 end
140 end
153
141
154 def send_new_password_email(user)
142 def send_new_password_email(user)
155 contest_name = Configuration['contest.name']
143 contest_name = Configuration['contest.name']
156 admin_email = Configuration['system.admin_email']
144 admin_email = Configuration['system.admin_email']
157 - mail = TMail::Mail.new
145 + subject = "[#{contest_name}] Password recovery"
158 - mail.to = user.email
146 + body = t('registration.password_retrieval.email_body', {
159 - mail.from = Configuration['system.online_registration.from']
147 + :full_name => user.full_name,
160 - mail.subject = "[#{contest_name}] Password recovery"
148 + :contest_name => contest_name,
161 - mail.body = t('registration.password_retrieval.email_body', {
149 + :login => user.login,
162 - :full_name => user.full_name,
150 + :password => user.password,
163 - :contest_name => contest_name,
151 + :admin_email => admin_email
164 - :login => user.login,
152 + })
165 - :password => user.password,
166 - :admin_email => admin_email
167 - })
168
153
169 - logger.info mail.body
154 + logger.info body
170 -
155 + send_mail(user.email, subject, body)
171 - smtp_server = Configuration['system.online_registration.smtp']
172 -
173 - begin
174 - Net::SMTP.start(smtp_server) do |smtp|
175 - smtp.send_message(mail.to_s, mail.from, mail.to)
176 - end
177 - result = true
178 - rescue
179 - result = false
180 - end
181 -
182 - return result
183 end
156 end
184
157
185 end
158 end
@@ -5,13 +5,20
5 %br/
5 %br/
6 = text_area_tag 'login_list', nil, :rows => 23, :cols => 80
6 = text_area_tag 'login_list', nil, :rows => 23, :cols => 80
7 %br/
7 %br/
8 - You want to
8 + %table
9 - = select(nil,"operation",[['assign users to','assign'],['add users to','add'],['remove users from','remove']])
9 + %tr
10 - contest
10 + %td{:valign => 'top'}
11 - = select("contest","id",Contest.all.collect {|c| [c.title, c.id]})
11 + You want to
12 - = check_box_tag 'reset_timer'
12 + = select(nil,"operation",[['assign users to','assign'],['add users to','add'],['remove users from','remove']])
13 - Auto-reset current contest timer.
13 + contest
14 - %br/
14 + = select("contest","id",Contest.all.collect {|c| [c.title, c.id]})
15 + and also
16 + %td
17 + = check_box_tag 'reset_timer'
18 + Auto-reset current contest timer.
19 + %br/
20 + = check_box_tag 'notification_emails'
21 + Send notification email(s).
15
22
16 = submit_tag "Perform action!", :confirm => 'Are you sure?'
23 = submit_tag "Perform action!", :confirm => 'Are you sure?'
17
24
@@ -119,6 +119,18
119
119
120 Thanks!"
120 Thanks!"
121
121
122 + contest:
123 + notification:
124 + email_subject: "[{{contest_title_name}}] You have been upgraded to {{contest_name}}"
125 + email_body: "Congratulations {{full_name}},
126 +
127 + You have advanced to contest {{contest_name}} in {{contest_title_name}}.
128 +
129 + You can now log-in and start participating in that contest.
130 +
131 + Cheers!
132 + -{{contest_title_name}} Admin"
133 +
122 help:
134 help:
123 how_to_submit: "How to submit"
135 how_to_submit: "How to submit"
124 must_specify_language: "You <b>must</b> specify the language you are using in your program header. You can optionally specify the task you are submitting to."
136 must_specify_language: "You <b>must</b> specify the language you are using in your program header. You can optionally specify the task you are submitting to."
@@ -78,8 +78,8
78
78
79 ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ›ΰΈ΄ΰΈ”ΰΉƒΰΈŠΰΉ‰ΰΈ‡ΰΈ²ΰΈ™ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“
79 ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ›ΰΈ΄ΰΈ”ΰΉƒΰΈŠΰΉ‰ΰΈ‡ΰΈ²ΰΈ™ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“
80
80
81 - ΰΈ–ΰΉ‰ΰΈ²ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ‘ΰΉˆΰΉƒΰΈŠΰΉ‰ΰΈ„ΰΈ™ΰΈ—ΰΈ΅ΰΉˆΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ กรุณาΰΈ₯ΰΈ°ΰΈ—ΰΈ΄ΰΉ‰ΰΈ‡ e-mail ΰΈ‰ΰΈšΰΈ±ΰΈšΰΈ™ΰΈ΅ΰΉ‰
81 + ΰΈ–ΰΉ‰ΰΈ²ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ‘ΰΉˆΰΉƒΰΈŠΰΉˆΰΈ„ΰΈ™ΰΈ—ΰΈ΅ΰΉˆΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ กรุณาΰΈ₯ΰΈ°ΰΈ—ΰΈ΄ΰΉ‰ΰΈ‡ e-mail ΰΈ‰ΰΈšΰΈ±ΰΈšΰΈ™ΰΈ΅ΰΉ‰
82 - แΰΈ₯ΰΈ°ΰΉΰΈˆΰΉ‰ΰΈ‡ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”ΰΈ™ΰΈ΅ΰΉ‰ΰΈΰΈ±ΰΈš {{admin_email}}
82 + แΰΈ₯ΰΈ°ΰΉΰΈˆΰΉ‰ΰΈ‡ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”ΰΈ™ΰΈ΅ΰΉ‰ΰΈΰΈ±ΰΈš {{admin_email}} ΰΈ”ΰΉ‰ΰΈ§ΰΈ’
83
83
84 ΰΈ‚ΰΈ­ΰΈšΰΈ„ΰΈΈΰΈ“ΰΈ‘ΰΈ²ΰΈ!"
84 ΰΈ‚ΰΈ­ΰΈšΰΈ„ΰΈΈΰΈ“ΰΈ‘ΰΈ²ΰΈ!"
85
85
@@ -114,9 +114,21
114 ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΈ„ΰΈ·ΰΈ­: {{password}}
114 ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΈ„ΰΈ·ΰΈ­: {{password}}
115
115
116 ΰΈ–ΰΉ‰ΰΈ²ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ‘ΰΉˆΰΉ„ΰΈ”ΰΉ‰ΰΈ‚ΰΈ­ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΉƒΰΈ«ΰΈ‘ΰΉˆ ΰΈ«ΰΈ£ΰΈ·ΰΈ­ΰΉ„ΰΈ‘ΰΉˆΰΉƒΰΈŠΰΉˆΰΈ„ΰΈ™ΰΈ—ΰΈ΅ΰΉˆΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ กรุณาΰΈ₯ΰΈ°ΰΈ—ΰΈ΄ΰΉ‰ΰΈ‡ e-mail ΰΈ‰ΰΈšΰΈ±ΰΈšΰΈ™ΰΈ΅ΰΉ‰
116 ΰΈ–ΰΉ‰ΰΈ²ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ‘ΰΉˆΰΉ„ΰΈ”ΰΉ‰ΰΈ‚ΰΈ­ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΉƒΰΈ«ΰΈ‘ΰΉˆ ΰΈ«ΰΈ£ΰΈ·ΰΈ­ΰΉ„ΰΈ‘ΰΉˆΰΉƒΰΈŠΰΉˆΰΈ„ΰΈ™ΰΈ—ΰΈ΅ΰΉˆΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ กรุณาΰΈ₯ΰΈ°ΰΈ—ΰΈ΄ΰΉ‰ΰΈ‡ e-mail ΰΈ‰ΰΈšΰΈ±ΰΈšΰΈ™ΰΈ΅ΰΉ‰
117 - แΰΈ₯ΰΈ°ΰΉΰΈˆΰΉ‰ΰΈ‡ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”ΰΈ™ΰΈ΅ΰΉ‰ΰΈΰΈ±ΰΈš {{admin_email}}
117 + แΰΈ₯ΰΈ°ΰΉΰΈˆΰΉ‰ΰΈ‡ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”ΰΈ™ΰΈ΅ΰΉ‰ΰΈΰΈ±ΰΈš {{admin_email}} ΰΈ”ΰΉ‰ΰΈ§ΰΈ’
118
118
119 ΰΈ‚ΰΈ­ΰΈšΰΈ„ΰΈΈΰΈ“ΰΈ‘ΰΈ²ΰΈ!"
119 ΰΈ‚ΰΈ­ΰΈšΰΈ„ΰΈΈΰΈ“ΰΈ‘ΰΈ²ΰΈ!"
120 +
121 + contest:
122 + notification:
123 + email_subject: "[{{contest_title_name}}] ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ”ΰΉ‰ΰΈ£ΰΈ±ΰΈšΰΈΰΈ²ΰΈ£ΰΉ€ΰΈ₯ΰΈ·ΰΉˆΰΈ­ΰΈ™ΰΈ‚ΰΈ±ΰΉ‰ΰΈ™ΰΈͺΰΈΉΰΉˆΰΈ£ΰΈ°ΰΈ”ΰΈ±ΰΈš {{contest_name}}"
124 + email_body: "ขอแΰΈͺΰΈ”ΰΈ‡ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈ’ΰΈ΄ΰΈ™ΰΈ”ΰΈ΅ΰΈ”ΰΉ‰ΰΈ§ΰΈ’ ΰΈ„ΰΈΈΰΈ“{{full_name}}
125 +
126 + ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ”ΰΉ‰ΰΈ£ΰΈ±ΰΈšΰΈΰΈ²ΰΈ£ΰΉ€ΰΈ₯ΰΈ·ΰΉˆΰΈ­ΰΈ™ΰΈ‚ΰΈ±ΰΉ‰ΰΈ™ΰΉƒΰΈ«ΰΉ‰ΰΈͺΰΈ²ΰΈ‘ΰΈ²ΰΈ£ΰΈ–ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ΰΉƒΰΈ™ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ΰΈ£ΰΈ°ΰΈ”ΰΈ±ΰΈš {{contest_name}} ΰΈ‚ΰΈ­ΰΈ‡ {{contest_title_name}} แΰΈ₯ΰΉ‰ΰΈ§
127 +
128 + ΰΈ„ΰΈΈΰΈ“ΰΈͺΰΈ²ΰΈ‘ΰΈ²ΰΈ£ΰΈ–ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΈͺΰΈΉΰΉˆΰΈ£ΰΈ°ΰΈšΰΈšΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΈ—ΰΈ³ΰΉ‚ΰΈˆΰΈ—ΰΈ’ΰΉŒΰΉ„ΰΈ”ΰΉ‰ΰΈ—ΰΈ±ΰΈ™ΰΈ—ΰΈ΅ ΰΈ„ΰΈΈΰΈ“ΰΈͺΰΈ²ΰΈ‘ΰΈ²ΰΈ£ΰΈ–ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΉƒΰΈ™ΰΈ£ΰΈ°ΰΈ”ΰΈ±ΰΈš {{contest_name}} ΰΉ„ΰΈ”ΰΉ‰ΰΈˆΰΈ™ΰΈΰΈ£ΰΈ°ΰΈ—ΰΈ±ΰΉˆΰΈ‡ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ΰΈ£ΰΈ­ΰΈšΰΈ™ΰΈ΅ΰΉ‰ΰΈͺΰΈ΄ΰΉ‰ΰΈ™ΰΈͺΰΈΈΰΈ”ΰΈ₯ΰΈ‡
129 +
130 + -ΰΈ—ΰΈ΅ΰΈ‘ΰΈ‡ΰΈ²ΰΈ™ {{contest_title_name}}"
131 +
120
132
121 help:
133 help:
122 how_to_submit: "วิธมการΰΈͺΰΉˆΰΈ‡ΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘"
134 how_to_submit: "วิธมการΰΈͺΰΉˆΰΈ‡ΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘"
@@ -22,51 +22,70
22 end
22 end
23
23
24 it "should reset users' timer when their contests change" do
24 it "should reset users' timer when their contests change" do
25 - james_session = open_session
25 + session = open_session
26 - james_session.extend(MainSessionMethods)
26 + session.extend(MainSessionMethods)
27
27
28 - james_login_and_get_main_list(james_session)
28 + james_login_and_get_main_list(session)
29 - james_session.response.should_not have_text(/OVER/)
29 + session.response.should_not have_text(/OVER/)
30
30
31 Delorean.time_travel_to(190.minutes.since) do
31 Delorean.time_travel_to(190.minutes.since) do
32 - james_session.get_main_list
32 + session.get_main_list
33 - james_session.response.should have_text(/OVER/)
33 + session.response.should have_text(/OVER/)
34
34
35 - james_session.get '/' # logout
35 + session.get '/' # logout
36 - james_session.get '/main/list' # clearly log out
36 + session.get '/main/list' # clearly log out
37 - james_session.response.should_not render_template 'main/list'
37 + session.response.should_not render_template 'main/list'
38
38
39 admin_change_users_contest_to("james", @contest_b, true)
39 admin_change_users_contest_to("james", @contest_b, true)
40
40
41 - james_login_and_get_main_list(james_session)
41 + james_login_and_get_main_list(session)
42 - james_session.response.should_not have_text(/OVER/)
42 + session.response.should_not have_text(/OVER/)
43 end
43 end
44 end
44 end
45
45
46 it "should force users to log out when their contests change" do
46 it "should force users to log out when their contests change" do
47 - james_session = open_session
47 + session = open_session
48 - james_session.extend(MainSessionMethods)
48 + session.extend(MainSessionMethods)
49
49
50 - james_login_and_get_main_list(james_session)
50 + james_login_and_get_main_list(session)
51 - james_session.response.should_not have_text(/OVER/)
51 + session.response.should_not have_text(/OVER/)
52
52
53 Delorean.time_travel_to(190.minutes.since) do
53 Delorean.time_travel_to(190.minutes.since) do
54 - james_session.get_main_list
54 + session.get_main_list
55 - james_session.response.should have_text(/OVER/)
55 + session.response.should have_text(/OVER/)
56
56
57 admin_change_users_contest_to("james", @contest_b, true)
57 admin_change_users_contest_to("james", @contest_b, true)
58
58
59 - james_session.get '/main/list'
59 + session.get '/main/list'
60 - james_session.response.should_not render_template 'main/list'
60 + session.response.should_not render_template 'main/list'
61 - james_session.should be_redirect
61 + session.should be_redirect
62
62
63 Delorean.time_travel_to(200.minutes.since) do
63 Delorean.time_travel_to(200.minutes.since) do
64 - james_login_and_get_main_list(james_session)
64 + james_login_and_get_main_list(session)
65 - james_session.response.should_not have_text(/OVER/)
65 + session.response.should_not have_text(/OVER/)
66 end
66 end
67 end
67 end
68 end
68 end
69
69
70 + it "should maintain admin logged-in sessions even when their contests change" do
71 + session = open_session
72 + session.extend(MainSessionMethods)
73 +
74 + session.login('mary', 'goodbye')
75 + session.get_main_list
76 + session.response.should_not have_text(/OVER/)
77 +
78 + Delorean.time_travel_to(190.minutes.since) do
79 + session.get_main_list
80 + session.response.should have_text(/OVER/)
81 +
82 + admin_change_users_contest_to("mary", @contest_b, true)
83 +
84 + session.get '/main/list'
85 + session.response.should render_template 'main/list'
86 + end
87 + end
88 +
70 private
89 private
71
90
72 module MainSessionMethods
91 module MainSessionMethods
You need to be logged in to leave comments. Login now