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 +
@@ -32,24 +32,25
32 32 # check if run in single user mode
33 33 if Configuration[SINGLE_USER_MODE_CONF_KEY]
34 34 user = User.find(session[:user_id])
35 35 if user==nil or (not user.admin?)
36 36 redirect_to :controller => 'main', :action => 'login'
37 37 return false
38 38 end
39 39 return true
40 40 end
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.'
47 48 redirect_to :controller => 'main', :action => 'index'
48 49 end
49 50 rescue
50 51 end
51 52 end
52 53 return true
53 54 end
54 55
55 56 def authorization
@@ -1,14 +1,16
1 1 class UserAdminController < ApplicationController
2 2
3 + include MailHelperMethods
4 +
3 5 before_filter :admin_authorization
4 6
5 7 def index
6 8 list
7 9 render :action => 'list'
8 10 end
9 11
10 12 # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
11 13 verify :method => :post, :only => [ :destroy,
12 14 :create, :create_from_list,
13 15 :update ],
14 16 :redirect_to => { :action => :list }
@@ -206,24 +208,28
206 208 end
207 209 elsif operation=='remove'
208 210 user.contests.delete(contest)
209 211 else
210 212 user.contests = [contest]
211 213 end
212 214
213 215 if params[:reset_timer]
214 216 user.contest_stat.forced_logout = true
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
221 227 end
222 228
223 229 if params[:reset_timer]
224 230 logout_users(users)
225 231 end
226 232
227 233 flash[:notice] = 'User(s) ' + note.join(', ') +
228 234 ' were successfully modified. '
229 235 redirect_to :action => 'contest_management'
@@ -335,13 +341,28
335 341 end
336 342
337 343 def logout_users(users)
338 344 users.each do |user|
339 345 contest_stat = user.contest_stat(true)
340 346 if contest_stat and !contest_stat.forced_logout
341 347 contest_stat.forced_logout = true
342 348 contest_stat.save
343 349 end
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
@@ -1,17 +1,19
1 1 require 'tmail'
2 2 require 'net/smtp'
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,
9 11 :forget,
10 12 :retrieve_password]
11 13
12 14 before_filter :verify_online_registration, :only => [:new,
13 15 :register,
14 16 :forget,
15 17 :retrieve_password]
16 18
17 19 verify :method => :post, :only => [:chg_passwd],
@@ -113,73 +115,44
113 115 if !Configuration['system.online_registration']
114 116 redirect_to :controller => 'main', :action => 'login'
115 117 end
116 118 end
117 119
118 120 def send_confirmation_email(user)
119 121 contest_name = Configuration['contest.name']
120 122 admin_email = Configuration['system.admin_email']
121 123 activation_url = url_for(:action => 'confirm',
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
@@ -1,19 +1,26
1 1 %h1 Bulk edit users in contests
2 2
3 3 - form_tag :action => 'manage_contest' do
4 4 List users' login below; one per line.
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
18 25 %hr/
19 26 = link_to '[go back to index]', :action => 'index'
@@ -110,24 +110,36
110 110 email_body: "Hello {{full_name}},
111 111
112 112 You have requested for new password for {{contest_name}}. We have generated it for you:
113 113
114 114 user name: {{login}}
115 115 password: {{password}}
116 116
117 117 If you didn't ask for new password or you're not the person who registered,
118 118 please ignore this e-mail and inform {{admin_email}} of this mistake.
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."
125 137 list_available_language: "The possible language options are <tt>C</tt>, <tt>C++</tt>, and <tt>Pascal</tt>. The follow are examples."
126 138 accept_only_language_specified: "The server <b>will not</b> accept your submission, if you do not specify the language."
127 139 specifying_task: "Optionally, you can also specify the task with <tt>TASK:</tt> <i>taskname</i>. On the first page, the taskname for each task is shown in parentheses."
128 140 example_cpp: "For example, suppose you are using <tt>C++</tt> to write task <b>mobiles</b>, you put the following on top of your source code."
129 141 example_pas: "If you are using <tt>Pascal</tt> to write the same task, you'll use"
130 142 ask_questions_at_messages: "If you have any problems, you can ask at [<a href=\"{{url}}\">{{message_link_name}}</a>]."
131 143
132 144 activerecord:
133 145 attributes:
@@ -69,26 +69,26
69 69 ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ”ΰΉ‰ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΈ£ΰΉˆΰΈ§ΰΈ‘ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ {{contest_name}}
70 70
71 71 ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉƒΰΈŠΰΉ‰ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“ΰΈ„ΰΈ·ΰΈ­: {{login}}
72 72
73 73 ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΈ„ΰΈ·ΰΈ­: {{password}}
74 74
75 75 กรุณาเข้าΰΈ₯ΰΈ΄ΰΈ‡ΰΈΰΉŒΰΈ•ΰΉˆΰΈ­ΰΉ„ΰΈ›ΰΈ™ΰΈ΅ΰΉ‰:
76 76
77 77 {{activation_url}}
78 78
79 79 ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ›ΰΈ΄ΰΈ”ΰΉƒΰΈŠΰΉ‰ΰΈ‡ΰΈ²ΰΈ™ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“
80 80
81 - ΰΈ–ΰΉ‰ΰΈ²ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ‘ΰΉˆΰΉƒΰΈŠΰΉ‰ΰΈ„ΰΈ™ΰΈ—ΰΈ΅ΰΉˆΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ กรุณาΰΈ₯ΰΈ°ΰΈ—ΰΈ΄ΰΉ‰ΰΈ‡ e-mail ΰΈ‰ΰΈšΰΈ±ΰΈšΰΈ™ΰΈ΅ΰΉ‰
82 - แΰΈ₯ΰΈ°ΰΉΰΈˆΰΉ‰ΰΈ‡ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”ΰΈ™ΰΈ΅ΰΉ‰ΰΈΰΈ±ΰΈš {{admin_email}}
81 + ΰΈ–ΰΉ‰ΰΈ²ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ‘ΰΉˆΰΉƒΰΈŠΰΉˆΰΈ„ΰΈ™ΰΈ—ΰΈ΅ΰΉˆΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ กรุณาΰΈ₯ΰΈ°ΰΈ—ΰΈ΄ΰΉ‰ΰΈ‡ e-mail ΰΈ‰ΰΈšΰΈ±ΰΈšΰΈ™ΰΈ΅ΰΉ‰
82 + แΰΈ₯ΰΈ°ΰΉΰΈˆΰΉ‰ΰΈ‡ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”ΰΈ™ΰΈ΅ΰΉ‰ΰΈΰΈ±ΰΈš {{admin_email}} ΰΈ”ΰΉ‰ΰΈ§ΰΈ’
83 83
84 84 ΰΈ‚ΰΈ­ΰΈšΰΈ„ΰΈΈΰΈ“ΰΈ‘ΰΈ²ΰΈ!"
85 85
86 86 email_sent: "ΰΉ€ΰΈ£ΰΈ²ΰΉ„ΰΈ”ΰΉ‰ΰΈͺΰΉˆΰΈ‡ΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΈͺΰΈ³ΰΈ«ΰΈ£ΰΈ±ΰΈšΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΉ„ΰΈ›ΰΉƒΰΈ«ΰΉ‰ΰΈ„ΰΈΈΰΈ“ΰΉΰΈ₯ΰΉ‰ΰΈ§ (ΰΉ‚ΰΈ›ΰΈ£ΰΈ”ΰΈ­ΰΈ’ΰΉˆΰΈ²ΰΈ₯ΰΈ·ΰΈ‘ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈ”ΰΈΉΰΉƒΰΈ™ΰΈͺΰΉˆΰΈ§ΰΈ™ Junk mail ΰΈ”ΰΉ‰ΰΈ§ΰΈ’)"
87 87 email_verify_at: "ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈͺΰΈ­ΰΈšΰΈ—ΰΈ΅ΰΉˆ {{email}} ΰΈžΰΈ£ΰΉ‰ΰΈ­ΰΈ‘ΰΈ—ΰΈ±ΰΉ‰ΰΈ‡ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™"
88 88
89 89 activation_sucessful_title: "ΰΈšΰΈ±ΰΈ“ΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΉ„ΰΈ”ΰΉ‰ΰΈ£ΰΈ±ΰΈšΰΈΰΈ²ΰΈ£ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΉΰΈ₯ΰΉ‰ΰΈ§"
90 90 account_activated: "ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“ΰΈžΰΈ£ΰΉ‰ΰΈ­ΰΈ‘ΰΉƒΰΈŠΰΉ‰ΰΈ‡ΰΈ²ΰΈ™ΰΉΰΈ₯ΰΉ‰ΰΈ§"
91 91
92 92 activation_failed_title: "การฒืนฒันΰΈ₯ΰΉ‰ΰΈ‘ΰΉ€ΰΈ«ΰΈ₯ΰΈ§"
93 93
94 94 errors:
@@ -105,27 +105,39
105 105 header: "การขอรหัΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΉƒΰΈ«ΰΈ‘ΰΉˆ"
106 106 instructions: "กรุณากรอก e-mail ΰΈ—ΰΈ΅ΰΉˆΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™"
107 107 button_label: "ΰΈ‚ΰΈ­ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΉƒΰΈ«ΰΈ‘ΰΉˆ"
108 108 no_email: "ΰΉ„ΰΈ‘ΰΉˆΰΈ‘ΰΈ΅ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΈ—ΰΈ΅ΰΉˆΰΉƒΰΈŠΰΉ‰ e-mail ดังกΰΈ₯่าว"
109 109 email_body: "ΰΈͺΰΈ§ΰΈ±ΰΈͺΰΈ”ΰΈ΅ΰΈ„ΰΈ£ΰΈ±ΰΈš {{full_name}},
110 110
111 111 ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ”ΰΉ‰ΰΈ£ΰΉ‰ΰΈ­ΰΈ‡ΰΈ‚ΰΈ­ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΉƒΰΈ«ΰΈ‘ΰΉˆ ΰΈͺΰΈ³ΰΈ«ΰΈ£ΰΈ±ΰΈšΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ {{contest_name}} ΰΈ‹ΰΈΆΰΉˆΰΈ‡ΰΉ€ΰΈ£ΰΈ²ΰΉ„ΰΈ”ΰΉ‰ΰΈͺร้างให้คุณแΰΈ₯ΰΉ‰ΰΈ§ ΰΈ”ΰΈ±ΰΈ‡ΰΈ™ΰΈ΅ΰΉ‰
112 112
113 113 ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉƒΰΈŠΰΉ‰ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“ΰΈ„ΰΈ·ΰΈ­: {{login}}
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: "วิธมการΰΈͺΰΉˆΰΈ‡ΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘"
123 135 must_specify_language: "ΰΈ„ΰΈΈΰΈ“<b>ΰΈ•ΰΉ‰ΰΈ­ΰΈ‡</b>ΰΈ£ΰΈ°ΰΈšΰΈΈΰΈ ΰΈ²ΰΈ©ΰΈ²ΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΈ—ΰΈ΅ΰΉˆΰΉƒΰΈŠΰΉ‰ΰΈ—ΰΈ΅ΰΉˆΰΈ•ΰΈ­ΰΈ™ΰΈ•ΰΉ‰ΰΈ™ΰΈ‚ΰΈ­ΰΈ‡ΰΈ£ΰΈ«ΰΈ±ΰΈͺโปรแกรฑ (source code) ΰΈ™ΰΈ­ΰΈΰΈˆΰΈ²ΰΈΰΈ™ΰΈ΅ΰΉ‰ΰΈ„ΰΈΈΰΈ“ΰΈ­ΰΈ²ΰΈˆΰΈˆΰΈ°ΰΈ£ΰΈ°ΰΈšΰΈΈΰΉ‚ΰΈˆΰΈ—ΰΈ’ΰΉŒΰΈ—ΰΈ΅ΰΉˆΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΈͺΰΉˆΰΈ‡ΰΉ„ΰΈ”ΰΉ‰ΰΈ”ΰΉ‰ΰΈ§ΰΈ’"
124 136 list_available_language: "ΰΈ ΰΈ²ΰΈ©ΰΈ²ΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΈ—ΰΈ΅ΰΉˆΰΈͺΰΈ²ΰΈ‘ΰΈ²ΰΈ£ΰΈ–ΰΈ£ΰΈ°ΰΈšΰΈΈΰΉ„ΰΈ”ΰΉ‰ΰΈ„ΰΈ·ΰΈ­ <tt>C</tt>, <tt>C++</tt>, แΰΈ₯ΰΈ° <tt>Pascal</tt> ΰΈ”ΰΉ‰ΰΈ²ΰΈ™ΰΈ₯ΰΉˆΰΈ²ΰΈ‡ΰΉΰΈͺΰΈ”ΰΈ‡ΰΈ•ΰΈ±ΰΈ§ΰΈ­ΰΈ’ΰΉˆΰΈ²ΰΈ‡ΰΈ‚ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΈ£ΰΈ°ΰΈšΰΈΈΰΈͺΰΈ³ΰΈ«ΰΈ£ΰΈ±ΰΈšΰΈ ΰΈ²ΰΈ©ΰΈ²ΰΈ•ΰΉˆΰΈ²ΰΈ‡ ΰΉ†"
125 137 accept_only_language_specified: "ระบบจะ<b>ΰΉ„ΰΈ‘ΰΉˆΰΈ£ΰΈ±ΰΈš</b>ΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΈ—ΰΈ΅ΰΉˆΰΈͺΰΉˆΰΈ‡ΰΈ–ΰΉ‰ΰΈ²ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ‘ΰΉˆΰΉ„ΰΈ”ΰΉ‰ΰΈ£ΰΈ°ΰΈšΰΈΈΰΈ ΰΈ²ΰΈ©ΰΈ²ΰΈ—ΰΈ΅ΰΉˆΰΉƒΰΈŠΰΉ‰"
126 138 specifying_task: "ΰΈ™ΰΈ­ΰΈΰΈˆΰΈ²ΰΈΰΈ™ΰΈ΅ΰΉ‰ ΰΈ„ΰΈΈΰΈ“ΰΈ’ΰΈ±ΰΈ‡ΰΈͺΰΈ²ΰΈ‘ΰΈ²ΰΈ£ΰΈ–ΰΈ£ΰΈ°ΰΈšΰΈΈΰΈŠΰΈ·ΰΉˆΰΈ­ΰΈ‚ΰΈ­ΰΈ‡ΰΉ‚ΰΈˆΰΈ—ΰΈ’ΰΉŒΰΈ—ΰΈ΅ΰΉˆΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΈͺΰΉˆΰΈ‡ΰΉ€ΰΈžΰΈ΄ΰΉˆΰΈ‘ΰΉ€ΰΈ•ΰΈ΄ΰΈ‘ΰΉ„ΰΈ”ΰΉ‰ ΰΉƒΰΈ™ΰΈΰΈ²ΰΈ£ΰΈ£ΰΈ°ΰΈšΰΈΈΰΉƒΰΈ«ΰΉ‰ΰΉƒΰΈͺ่ <tt>TASK:</tt> <i>taskname</i> ΰΈ„ΰΈΈΰΈ“ΰΈͺΰΈ²ΰΈ‘ΰΈ²ΰΈ£ΰΈ–ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈͺΰΈ­ΰΈšΰΈŠΰΈ·ΰΉˆΰΈ­ΰΈ‚ΰΈ­ΰΈ‡ΰΉ‚ΰΈˆΰΈ—ΰΈ’ΰΉŒΰΉ„ΰΈ”ΰΉ‰ ΰΉ‚ΰΈ”ΰΈ’ΰΈˆΰΈ°ΰΉΰΈͺΰΈ”ΰΈ‡ΰΉƒΰΈ™ΰΈ§ΰΈ‡ΰΉ€ΰΈ₯ΰΉ‡ΰΈšΰΈ«ΰΈ₯ΰΈ±ΰΈ‡ΰΈŠΰΈ·ΰΉˆΰΈ­ΰΈ ΰΈ²ΰΈ©ΰΈ²ΰΉ„ΰΈ—ΰΈ’ΰΈ‚ΰΈ­ΰΈ‡ΰΉ‚ΰΈˆΰΈ—ΰΈ’ΰΉŒ"
127 139 example_cpp: "ΰΈ’ΰΈΰΈ•ΰΈ±ΰΈ§ΰΈ­ΰΈ’ΰΉˆΰΈ²ΰΈ‡ΰΉ€ΰΈŠΰΉˆΰΈ™ ΰΈ–ΰΉ‰ΰΈ²ΰΈ„ΰΈΈΰΈ“ΰΉƒΰΈŠΰΉ‰ΰΈ ΰΈ²ΰΈ©ΰΈ² <tt>C++</tt> ΰΈͺΰΈ³ΰΈ«ΰΈ£ΰΈ±ΰΈšΰΉ€ΰΈ‚ΰΈ΅ΰΈ’ΰΈ™ΰΉ‚ΰΈˆΰΈ—ΰΈ’ΰΉŒ <tt>mobiles</tt> ΰΈ•ΰΈ­ΰΈ™ΰΈ•ΰΉ‰ΰΈ™ΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΈ„ΰΈΈΰΈ“ΰΈˆΰΈ°ΰΉƒΰΈͺΰΉˆΰΈ”ΰΈ±ΰΈ‡ΰΈ™ΰΈ΅ΰΉ‰"
128 140 example_pas: "ΰΈ–ΰΉ‰ΰΈ²ΰΈ„ΰΈΈΰΈ“ΰΉƒΰΈŠΰΉ‰ΰΈ ΰΈ²ΰΈ©ΰΈ² <tt>Pascal</tt> ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ‚ΰΈ΅ΰΈ’ΰΈ™ΰΉ‚ΰΈˆΰΈ—ΰΈ’ΰΉŒΰΈ‚ΰΉ‰ΰΈ­ΰΉ€ΰΈ”ΰΈ΅ΰΈ’ΰΈ§ΰΈΰΈ±ΰΈ™ ΰΈ„ΰΈΈΰΈ“ΰΈˆΰΈ°ΰΈ£ΰΈ°ΰΈšΰΈΈ"
129 141 ask_questions_at_messages: "ΰΈ–ΰΉ‰ΰΈ²ΰΈ‘ΰΈ΅ΰΈ›ΰΈ±ΰΈΰΈ«ΰΈ²ΰΉƒΰΈ™ΰΈΰΈ²ΰΈ£ΰΉƒΰΈŠΰΉ‰ΰΈ‡ΰΈ²ΰΈ™ΰΈͺΰΈ²ΰΈ‘ΰΈ²ΰΈ£ΰΈ–ΰΈͺΰΈ­ΰΈšΰΈ–ΰΈ²ΰΈ‘ΰΉ„ΰΈ”ΰΉ‰ΰΈ—ΰΈ΅ΰΉˆΰΈ«ΰΈ™ΰΉ‰ΰΈ²<a href=\"{{url}}\">{{message_link_name}}</a>"
130 142
131 143 activerecord:
@@ -13,69 +13,88
13 13 before(:each) do
14 14 @admin_user = users(:mary)
15 15 @contest_b = contests(:contest_b)
16 16 @james = users(:james)
17 17 @jack = users(:jack)
18 18
19 19 set_contest_time_limit('3:00')
20 20 set_indv_contest_mode
21 21 enable_multicontest
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
73 92 def login(login_name, password)
74 93 post '/login/login', :login => login_name, :password => password
75 94 assert_redirected_to '/main/list'
76 95 end
77 96
78 97 def get_main_list
79 98 get '/main/list'
80 99 assert_template 'main/list'
81 100 end
You need to be logged in to leave comments. Login now