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: 143 inserted, 62 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 +
@@ -20,48 +20,49
20 20 return false
21 21 end
22 22 end
23 23
24 24 protected
25 25
26 26 def authenticate
27 27 unless session[:user_id]
28 28 redirect_to :controller => 'main', :action => 'login'
29 29 return false
30 30 end
31 31
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
56 57 return false unless authenticate
57 58 user = User.find(session[:user_id])
58 59 unless user.roles.detect { |role|
59 60 role.rights.detect{ |right|
60 61 right.controller == self.class.controller_name and
61 62 (right.action == 'all' or right.action == action_name)
62 63 }
63 64 }
64 65 flash[:notice] = 'You are not authorized to view the page you requested'
65 66 #request.env['HTTP_REFERER'] ? (redirect_to :back) : (redirect_to :controller => 'login')
66 67 redirect_to :controller => 'main', :action => 'login'
67 68 return false
@@ -1,26 +1,28
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 }
15 17
16 18 def list
17 19 @users = User.find(:all)
18 20 @hidden_columns = ['hashed_password', 'salt', 'created_at', 'updated_at']
19 21 @contests = Contest.all(:conditions => {:enabled => true})
20 22 end
21 23
22 24 def active
23 25 sessions = ActiveRecord::SessionStore::Session.find(:all, :conditions => ["updated_at >= ?", 60.minutes.ago])
24 26 @users = []
25 27 sessions.each do |session|
26 28 if session.data[:user_id]
@@ -194,48 +196,52
194 196 flash[:notice] = 'You entered an empty list.'
195 197 redirect_to :action => 'contest_management' and return
196 198 end
197 199
198 200 note = []
199 201 users = []
200 202 lines.split("\n").each do |line|
201 203 user = User.find_by_login(line.chomp)
202 204 if user
203 205 if operation=='add'
204 206 if ! user.contests.include? contest
205 207 user.contests << contest
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'
230 236 end
231 237
232 238 # admin management
233 239
234 240 def admin
235 241 @admins = User.find(:all).find_all {|user| user.admin? }
236 242 end
237 243
238 244 def grant_admin
239 245 login = params[:login]
240 246 user = User.find_by_login(login)
241 247 if user!=nil
@@ -323,25 +329,40
323 329 u.full_name = user[:name]
324 330 u.password = user[:password]
325 331 u.country = countries[user[:country_id]]
326 332 u.site = sites[user[:site_id]]
327 333 u.activated = true
328 334 u.email = "empty-#{u.login}@none.com"
329 335 if not u.save
330 336 @import_log << "Errors\n"
331 337 u.errors.each { |attr,msg| @import_log << "#{attr} - #{msg}\n" }
332 338 end
333 339 end
334 340
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)
347 367 end
368 + end
@@ -1,29 +1,31
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],
18 20 :redirect_to => { :action => :index }
19 21
20 22 #in_place_edit_for :user, :alias_for_editing
21 23 #in_place_edit_for :user, :email_for_editing
22 24
23 25 def index
24 26 if !Configuration['system.user_setting_enabled']
25 27 redirect_to :controller => 'main', :action => 'list'
26 28 else
27 29 @user = User.find(session[:user_id])
28 30 end
29 31 end
@@ -101,85 +103,56
101 103 send_new_password_email(user)
102 104 flash[:notice] = 'New password has been mailed to you.'
103 105 end
104 106 else
105 107 flash[:notice] = I18n.t 'registration.password_retrieval.no_email'
106 108 end
107 109 redirect_to :action => 'forget'
108 110 end
109 111
110 112 protected
111 113
112 114 def verify_online_registration
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', {
127 + subject = "[#{contest_name}] Confirmation"
128 + body = t('registration.email_body', {
130 129 :full_name => user.full_name,
131 130 :contest_name => contest_name,
132 131 :login => user.login,
133 132 :password => user.password,
134 133 :activation_url => activation_url,
135 134 :admin_email => admin_email
136 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', {
145 + subject = "[#{contest_name}] Password recovery"
146 + body = t('registration.password_retrieval.email_body', {
162 147 :full_name => user.full_name,
163 148 :contest_name => contest_name,
164 149 :login => user.login,
165 150 :password => user.password,
166 151 :admin_email => admin_email
167 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 + %table
9 + %tr
10 + %td{:valign => 'top'}
8 11 You want to
9 12 = select(nil,"operation",[['assign users to','assign'],['add users to','add'],['remove users from','remove']])
10 13 contest
11 14 = select("contest","id",Contest.all.collect {|c| [c.title, c.id]})
15 + and also
16 + %td
12 17 = check_box_tag 'reset_timer'
13 18 Auto-reset current contest timer.
14 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'
@@ -98,42 +98,54
98 98 title: "Errors in sending registration confirmation"
99 99 expl: "<h2>Your user account has been created, but the system cannot send you the confirmation e-mail.</h2>
100 100 Maybe there's a problem in the configuration. Please report the admin at {{email}}.<br/>Thank you!"
101 101 activation:
102 102 email_exists: "A user with this E-mail exists."
103 103 invalid: "Your activation code is invalid. Please check again."
104 104
105 105 password_retrieval:
106 106 header: "Password retrieval"
107 107 instructions: "Please enter the e-mail address that you used to register."
108 108 button_label: "Request new password"
109 109 no_email: "No user with that e-mail address."
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:
134 146 user:
135 147 login: "login"
136 148 full_name: "full name"
137 149 email: "e-mail"
138 150 province: "province"
139 151
@@ -57,82 +57,94
57 57 registration:
58 58 title: "ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΉƒΰΈ«ΰΈ‘ΰΉˆ"
59 59 description: "ในการΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ ΰΉƒΰΈ«ΰΉ‰ΰΈœΰΈΉΰΉ‰ΰΈͺΰΈ™ΰΉƒΰΈˆΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΈ£ΰΉˆΰΈ§ΰΈ‘ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ΰΈΰΈ£ΰΈ­ΰΈΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΈ”ΰΉ‰ΰΈ²ΰΈ™ΰΈ₯ΰΉˆΰΈ²ΰΈ‡ ΰΈˆΰΈ²ΰΈΰΈ™ΰΈ±ΰΉ‰ΰΈ™ΰΈ£ΰΈ°ΰΈšΰΈšΰΈˆΰΈ°ΰΈͺΰΉˆΰΈ‡ e-mail ΰΉ„ΰΈ›ΰΈ’ΰΈ±ΰΈ‡ e-mail ΰΈ—ΰΈ΅ΰΉˆΰΈ£ΰΈ°ΰΈšΰΈΈΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΉƒΰΈ«ΰΉ‰ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈ•ΰΈ±ΰΈ§ΰΈ•ΰΈ™ΰΉΰΈ₯ΰΈ°ΰΉ€ΰΈ›ΰΈ΄ΰΈ”ΰΉƒΰΈŠΰΉ‰ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰<br/>ΰΉƒΰΈ™ΰΈΰΈ£ΰΈ“ΰΈ΅ΰΈ—ΰΈ΅ΰΉˆΰΈœΰΈΉΰΉ‰ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ΰΉ€ΰΈ›ΰΉ‡ΰΈ™ΰΈ™ΰΈ±ΰΈΰΉ€ΰΈ£ΰΈ΅ΰΈ’ΰΈ™ ΰΈ£ΰΈšΰΈΰΈ§ΰΈ™ΰΈŠΰΉˆΰΈ§ΰΈ’ΰΉƒΰΈ«ΰΉ‰ΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΉ€ΰΈΰΈ΅ΰΉˆΰΈ’ΰΈ§ΰΈΰΈ±ΰΈšΰΉ‚ΰΈ£ΰΈ‡ΰΉ€ΰΈ£ΰΈ΅ΰΈ’ΰΈ™ΰΉΰΈ₯ΰΈ°ΰΈˆΰΈ±ΰΈ‡ΰΈ«ΰΈ§ΰΈ±ΰΈ”ΰΈ”ΰΉ‰ΰΈ§ΰΈ’"
60 60
61 61 successful_title: "การΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΉ€ΰΈͺΰΈ£ΰΉ‡ΰΈˆΰΉ€ΰΈ£ΰΈ΅ΰΈ’ΰΈšΰΈ£ΰΉ‰ΰΈ­ΰΈ’"
62 62
63 63 login_guide: "ΰΉƒΰΈŠΰΉ‰ΰΉ„ΰΈ”ΰΉ‰ΰΉ€ΰΈ‰ΰΈžΰΈ²ΰΈ° a-z, A-Z, 0-9 แΰΈ₯ΰΈ° _ ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈ’ΰΈ²ΰΈ§ΰΉ„ΰΈ‘ΰΉˆΰΉ€ΰΈΰΈ΄ΰΈ™ 20 ตัวอักษร"
64 64 email_guide: "ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈͺอบ e-mail ΰΈ—ΰΈ΅ΰΉˆΰΉƒΰΈͺΰΉˆΰΉƒΰΈ«ΰΉ‰ΰΈ–ΰΈΉΰΈΰΈ•ΰΉ‰ΰΈ­ΰΈ‡<br/>ΰΈ„ΰΈΈΰΈ“ΰΈˆΰΈ°ΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈΰΈ²ΰΈ£ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΈœΰΉˆΰΈ²ΰΈ™ΰΈ—ΰΈ²ΰΈ‡ΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΈ—ΰΈ΅ΰΉˆΰΈˆΰΈ°ΰΈͺΰΉˆΰΈ‡ΰΉƒΰΈ«ΰΉ‰ΰΈ—ΰΈ²ΰΈ‡ e-mail"
65 65 register: "ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™"
66 66
67 67 email_body: "ΰΈͺΰΈ§ΰΈ±ΰΈͺΰΈ”ΰΈ΅ΰΈ„ΰΈ£ΰΈ±ΰΈš {{full_name}},
68 68
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:
95 95 header: 'การΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΈ‘ΰΈ΅ΰΈ‚ΰΉ‰ΰΈ­ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”'
96 96 email:
97 97 title: "ΰΉ€ΰΈΰΈ΄ΰΈ”ΰΈ›ΰΈ±ΰΈΰΈ«ΰΈ²ΰΈ£ΰΈ°ΰΈ«ΰΈ§ΰΉˆΰΈ²ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΈͺΰΉˆΰΈ‡ e-mail ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈΰΈ²ΰΈ£ΰΈͺΰΈ‘ΰΈ±ΰΈ„ΰΈ£"
98 98 expl: "<h2>ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“ΰΈ–ΰΈΉΰΈΰΈͺร้างขย้นแΰΈ₯ΰΉ‰ΰΈ§ ΰΉΰΈ•ΰΉˆΰΈ£ΰΈ°ΰΈšΰΈšΰΉ„ΰΈ‘ΰΉˆΰΈͺΰΈ²ΰΈ‘ΰΈ²ΰΈ£ΰΈ–ΰΈͺΰΉˆΰΈ‡ e-mail ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈΰΈ²ΰΈ£ΰΈͺΰΈ‘ΰΈ±ΰΈ„ΰΈ£ΰΉ„ΰΈ”ΰΉ‰</h2>
99 99 ΰΈ­ΰΈ²ΰΈˆΰΉ€ΰΈΰΈ΄ΰΈ”ΰΈ›ΰΈ±ΰΈΰΈ«ΰΈ²ΰΉƒΰΈ™ΰΈΰΈ²ΰΈ£ΰΈ•ΰΈ±ΰΉ‰ΰΈ‡ΰΈ„ΰΉˆΰΈ²ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΈ•ΰΉ‰ΰΈ™ΰΈ‚ΰΈ­ΰΈ‡ΰΈ£ΰΈ°ΰΈšΰΈš ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈŠΰΉˆΰΈ§ΰΈ’ΰΈ•ΰΈ΄ΰΈ”ΰΈ•ΰΉˆΰΈ­ΰΈœΰΈΉΰΉ‰ΰΈ”ΰΈΉΰΉΰΈ₯ΰΈ£ΰΈ°ΰΈšΰΈšΰΈ”ΰΉ‰ΰΈ§ΰΈ’ΰΈ—ΰΈ΅ΰΉˆ {{email}}<br/>ΰΈ‚ΰΈ­ΰΈ‚ΰΈ­ΰΈšΰΈ„ΰΈΈΰΈ“ΰΈˆΰΈ²ΰΈΰΈ—ΰΈ΅ΰΈ‘ΰΈ‡ΰΈ²ΰΈ™"
100 100 activation:
101 101 email_exists: "ΰΈ‘ΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΈ—ΰΈ΅ΰΉˆΰΉƒΰΈŠΰΉ‰ e-mail นม้แΰΈ₯ΰΉ‰ΰΈ§"
102 102 invalid: "ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈͺΰΈ³ΰΈ«ΰΈ£ΰΈ±ΰΈšΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ” ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈͺΰΈ­ΰΈšΰΈ­ΰΈ΅ΰΈΰΈ„ΰΈ£ΰΈ±ΰΉ‰ΰΈ‡"
103 103
104 104 password_retrieval:
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 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 +
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:
132 144 attributes:
133 145 user:
134 146 login: "ΰΈŠΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉƒΰΈŠΰΉ‰ΰΈ£ΰΈ°ΰΈšΰΈš"
135 147 full_name: "ΰΈŠΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ•ΰΉ‡ΰΈ‘"
136 148 email: "e-mail"
137 149 province: "ΰΈˆΰΈ±ΰΈ‡ΰΈ«ΰΈ§ΰΈ±ΰΈ”"
138 150
@@ -1,90 +1,109
1 1 require 'spec_helper'
2 2 require 'config_spec_helper'
3 3 require 'delorean'
4 4
5 5 describe "ContestManagements" do
6 6 include ConfigSpecHelperMethods
7 7
8 8 fixtures :users
9 9 fixtures :problems
10 10 fixtures :contests
11 11 fixtures :roles
12 12
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 + end
67 + end
66 68 end
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'
67 86 end
68 87 end
69 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
82 101
83 102 def get_main_list_and_assert_logout
84 103 get '/main/list'
85 104 assert_redirected_to '/main'
86 105 end
87 106 end
88 107
89 108 module ContestManagementSessionMethods
90 109 def change_users_contest_to(user_login_list, contest, reset_timer=false)
You need to be logged in to leave comments. Login now