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 42 if Configuration.multicontests?
43 43 user = User.find(session[:user_id])
44 + return true if user.admin?
44 45 begin
45 46 if user.contest_stat(true).forced_logout
46 47 flash[:notice] = 'You have been automatically logged out.'
@@ -1,5 +1,7
1 1 class UserAdminController < ApplicationController
2 2
3 + include MailHelperMethods
4 +
3 5 before_filter :admin_authorization
4 6
5 7 def index
@@ -215,6 +217,10
215 217 user.contest_stat.reset_timer_and_save
216 218 end
217 219
220 + if params[:notification_emails]
221 + send_contest_update_notification_email(user, contest)
222 + end
223 +
218 224 note << user.login
219 225 users << user
220 226 end
@@ -344,4 +350,19
344 350 end
345 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 368 end
@@ -3,6 +3,8
3 3
4 4 class UsersController < ApplicationController
5 5
6 + include MailHelperMethods
7 +
6 8 before_filter :authenticate, :except => [:new,
7 9 :register,
8 10 :confirm,
@@ -122,64 +124,35
122 124 :login => user.login,
123 125 :activation => user.activation_key)
124 126 home_url = url_for(:controller => 'main', :action => 'index')
125 - mail = TMail::Mail.new
126 - mail.to = user.email
127 - mail.from = Configuration['system.online_registration.from']
128 - mail.subject = "[#{contest_name}] Confirmation"
129 - mail.body = t('registration.email_body', {
130 - :full_name => user.full_name,
131 - :contest_name => contest_name,
132 - :login => user.login,
133 - :password => user.password,
134 - :activation_url => activation_url,
135 - :admin_email => admin_email
136 - })
127 + subject = "[#{contest_name}] Confirmation"
128 + body = t('registration.email_body', {
129 + :full_name => user.full_name,
130 + :contest_name => contest_name,
131 + :login => user.login,
132 + :password => user.password,
133 + :activation_url => activation_url,
134 + :admin_email => admin_email
135 + })
137 136
138 - logger.info mail.body
139 -
140 - smtp_server = Configuration['system.online_registration.smtp']
137 + logger.info body
141 138
142 - begin
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
139 + send_mail(user.email, subject, body)
152 140 end
153 141
154 142 def send_new_password_email(user)
155 143 contest_name = Configuration['contest.name']
156 144 admin_email = Configuration['system.admin_email']
157 - mail = TMail::Mail.new
158 - mail.to = user.email
159 - mail.from = Configuration['system.online_registration.from']
160 - mail.subject = "[#{contest_name}] Password recovery"
161 - mail.body = t('registration.password_retrieval.email_body', {
162 - :full_name => user.full_name,
163 - :contest_name => contest_name,
164 - :login => user.login,
165 - :password => user.password,
166 - :admin_email => admin_email
167 - })
145 + subject = "[#{contest_name}] Password recovery"
146 + body = t('registration.password_retrieval.email_body', {
147 + :full_name => user.full_name,
148 + :contest_name => contest_name,
149 + :login => user.login,
150 + :password => user.password,
151 + :admin_email => admin_email
152 + })
168 153
169 - logger.info mail.body
170 -
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
154 + logger.info body
155 + send_mail(user.email, subject, body)
183 156 end
184 157
185 158 end
@@ -5,13 +5,20
5 5 %br/
6 6 = text_area_tag 'login_list', nil, :rows => 23, :cols => 80
7 7 %br/
8 - You want to
9 - = select(nil,"operation",[['assign users to','assign'],['add users to','add'],['remove users from','remove']])
10 - contest
11 - = select("contest","id",Contest.all.collect {|c| [c.title, c.id]})
12 - = check_box_tag 'reset_timer'
13 - Auto-reset current contest timer.
14 - %br/
8 + %table
9 + %tr
10 + %td{:valign => 'top'}
11 + You want to
12 + = select(nil,"operation",[['assign users to','assign'],['add users to','add'],['remove users from','remove']])
13 + contest
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 23 = submit_tag "Perform action!", :confirm => 'Are you sure?'
17 24
@@ -119,6 +119,18
119 119
120 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 134 help:
123 135 how_to_submit: "How to submit"
124 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 ΰΈ‰ΰΈšΰΈ±ΰΈšΰΈ™ΰΈ΅ΰΉ‰
82 - แΰΈ₯ΰΈ°ΰΉΰΈˆΰΉ‰ΰΈ‡ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”ΰΈ™ΰΈ΅ΰΉ‰ΰΈΰΈ±ΰΈš {{admin_email}}
81 + ΰΈ–ΰΉ‰ΰΈ²ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ‘ΰΉˆΰΉƒΰΈŠΰΉˆΰΈ„ΰΈ™ΰΈ—ΰΈ΅ΰΉˆΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ กรุณาΰΈ₯ΰΈ°ΰΈ—ΰΈ΄ΰΉ‰ΰΈ‡ e-mail ΰΈ‰ΰΈšΰΈ±ΰΈšΰΈ™ΰΈ΅ΰΉ‰
82 + แΰΈ₯ΰΈ°ΰΉΰΈˆΰΉ‰ΰΈ‡ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”ΰΈ™ΰΈ΅ΰΉ‰ΰΈΰΈ±ΰΈš {{admin_email}} ΰΈ”ΰΉ‰ΰΈ§ΰΈ’
83 83
84 84 ΰΈ‚ΰΈ­ΰΈšΰΈ„ΰΈΈΰΈ“ΰΈ‘ΰΈ²ΰΈ!"
85 85
@@ -114,9 +114,21
114 114 ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΈ„ΰΈ·ΰΈ­: {{password}}
115 115
116 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 133 help:
122 134 how_to_submit: "วิธมการΰΈͺΰΉˆΰΈ‡ΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘"
@@ -22,51 +22,70
22 22 end
23 23
24 24 it "should reset users' timer when their contests change" do
25 - james_session = open_session
26 - james_session.extend(MainSessionMethods)
25 + session = open_session
26 + session.extend(MainSessionMethods)
27 27
28 - james_login_and_get_main_list(james_session)
29 - james_session.response.should_not have_text(/OVER/)
28 + james_login_and_get_main_list(session)
29 + session.response.should_not have_text(/OVER/)
30 30
31 31 Delorean.time_travel_to(190.minutes.since) do
32 - james_session.get_main_list
33 - james_session.response.should have_text(/OVER/)
32 + session.get_main_list
33 + session.response.should have_text(/OVER/)
34 34
35 - james_session.get '/' # logout
36 - james_session.get '/main/list' # clearly log out
37 - james_session.response.should_not render_template 'main/list'
35 + session.get '/' # logout
36 + session.get '/main/list' # clearly log out
37 + session.response.should_not render_template 'main/list'
38 38
39 39 admin_change_users_contest_to("james", @contest_b, true)
40 40
41 - james_login_and_get_main_list(james_session)
42 - james_session.response.should_not have_text(/OVER/)
41 + james_login_and_get_main_list(session)
42 + session.response.should_not have_text(/OVER/)
43 43 end
44 44 end
45 45
46 46 it "should force users to log out when their contests change" do
47 - james_session = open_session
48 - james_session.extend(MainSessionMethods)
47 + session = open_session
48 + session.extend(MainSessionMethods)
49 49
50 - james_login_and_get_main_list(james_session)
51 - james_session.response.should_not have_text(/OVER/)
50 + james_login_and_get_main_list(session)
51 + session.response.should_not have_text(/OVER/)
52 52
53 53 Delorean.time_travel_to(190.minutes.since) do
54 - james_session.get_main_list
55 - james_session.response.should have_text(/OVER/)
54 + session.get_main_list
55 + session.response.should have_text(/OVER/)
56 56
57 57 admin_change_users_contest_to("james", @contest_b, true)
58 58
59 - james_session.get '/main/list'
60 - james_session.response.should_not render_template 'main/list'
61 - james_session.should be_redirect
59 + session.get '/main/list'
60 + session.response.should_not render_template 'main/list'
61 + session.should be_redirect
62 62
63 63 Delorean.time_travel_to(200.minutes.since) do
64 - james_login_and_get_main_list(james_session)
65 - james_session.response.should_not have_text(/OVER/)
64 + james_login_and_get_main_list(session)
65 + session.response.should_not have_text(/OVER/)
66 66 end
67 67 end
68 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 89 private
71 90
72 91 module MainSessionMethods
You need to be logged in to leave comments. Login now