Description:
add options to allow hall of fame viewing by any user add menu item for normal user
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r424:217b94aa4f76 - - 6 files changed: 40 inserted, 27 deleted

@@ -1,83 +1,87
1 1 class ApplicationController < ActionController::Base
2 2 protect_from_forgery
3 3
4 4 SINGLE_USER_MODE_CONF_KEY = 'system.single_user_mode'
5 5
6 6 def admin_authorization
7 7 return false unless authenticate
8 8 user = User.find(session[:user_id], :include => ['roles'])
9 9 redirect_to :controller => 'main', :action => 'login' unless user.admin?
10 10 end
11 11
12 12 def authorization_by_roles(allowed_roles)
13 13 return false unless authenticate
14 14 user = User.find(session[:user_id])
15 15 unless user.roles.detect { |role| allowed_roles.member?(role.name) }
16 16 flash[:notice] = 'You are not authorized to view the page you requested'
17 17 redirect_to :controller => 'main', :action => 'login'
18 18 return false
19 19 end
20 20 end
21 21
22 22 protected
23 23
24 24 def authenticate
25 25 unless session[:user_id]
26 + flash[:notice] = 'You need to login'
27 + if GraderConfiguration[SINGLE_USER_MODE_CONF_KEY]
28 + flash[:notice] = 'You need to login but you cannot log in at this time'
29 + end
26 30 redirect_to :controller => 'main', :action => 'login'
27 31 return false
28 32 end
29 33
30 34 # check if run in single user mode
31 35 if GraderConfiguration[SINGLE_USER_MODE_CONF_KEY]
32 36 user = User.find(session[:user_id])
33 37 if user==nil or (not user.admin?)
34 38 flash[:notice] = 'You cannot log in at this time'
35 39 redirect_to :controller => 'main', :action => 'login'
36 40 return false
37 41 end
38 42 return true
39 43 end
40 44
41 45 if GraderConfiguration.multicontests?
42 46 user = User.find(session[:user_id])
43 47 return true if user.admin?
44 48 begin
45 49 if user.contest_stat(true).forced_logout
46 50 flash[:notice] = 'You have been automatically logged out.'
47 51 redirect_to :controller => 'main', :action => 'index'
48 52 end
49 53 rescue
50 54 end
51 55 end
52 56 return true
53 57 end
54 58
55 59 def authorization
56 60 return false unless authenticate
57 61 user = User.find(session[:user_id])
58 62 unless user.roles.detect { |role|
59 63 role.rights.detect{ |right|
60 64 right.controller == self.class.controller_name and
61 65 (right.action == 'all' or right.action == action_name)
62 66 }
63 67 }
64 68 flash[:notice] = 'You are not authorized to view the page you requested'
65 69 #request.env['HTTP_REFERER'] ? (redirect_to :back) : (redirect_to :controller => 'login')
66 70 redirect_to :controller => 'main', :action => 'login'
67 71 return false
68 72 end
69 73 end
70 74
71 75 def verify_time_limit
72 76 return true if session[:user_id]==nil
73 77 user = User.find(session[:user_id], :include => :site)
74 78 return true if user==nil or user.site == nil
75 79 if user.contest_finished?
76 80 flash[:notice] = 'Error: the contest you are participating is over.'
77 81 redirect_to :back
78 82 return false
79 83 end
80 84 return true
81 85 end
82 86
83 87 end
@@ -1,111 +1,107
1 1 class ReportController < ApplicationController
2 2
3 3 before_filter :admin_authorization, only: [:login_stat,:submission_stat]
4 - before_filter(only: :problem_hof) { |c|
5 - user = User.find(session[:user_id]) if session[:user_id]
6 - if user==nil
7 - flash[:notice] = 'You have to login first'
8 - redirect_to :controller => 'main', :action => 'login'
9 - return false
4 + before_filter { |c|
5 + return false unless authenticate
6 +
7 + if GraderConfiguration["system.hall_of_fame_available"]
8 + return true;
10 9 end
11 -
12 - unless GraderConfiguration["hall_of_fame_available"]
13 - flash[:notice] = 'You are not authorized to view the page you requested'
14 - redirect_to :controller => 'main', :action => 'login' unless GraderConfiguration[ "hall_of_fame_available" ]
15 - end
10 +
11 + admin_authorization
16 12 }
17 13
18 14 def login_stat
19 15 @logins = Array.new
20 16
21 17 date_and_time = '%Y-%m-%d %H:%M'
22 18 begin
23 19 @since_time = DateTime.strptime(params[:since_datetime],date_and_time)
24 20 rescue
25 21 @since_time = DateTime.new(1000,1,1)
26 22 end
27 23 begin
28 24 @until_time = DateTime.strptime(params[:until_datetime],date_and_time)
29 25 rescue
30 26 @until_time = DateTime.new(3000,1,1)
31 27 end
32 28
33 29 User.all.each do |user|
34 30 @logins << { login: user.login,
35 31 full_name: user.full_name,
36 32 count: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
37 33 user.id,@since_time,@until_time)
38 34 .count(:id),
39 35 min: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
40 36 user.id,@since_time,@until_time)
41 37 .minimum(:created_at),
42 38 max: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
43 39 user.id,@since_time,@until_time)
44 40 .maximum(:created_at)
45 41 }
46 42 end
47 43 end
48 44
49 45 def submission_stat
50 46
51 47 date_and_time = '%Y-%m-%d %H:%M'
52 48 begin
53 49 @since_time = DateTime.strptime(params[:since_datetime],date_and_time)
54 50 rescue
55 51 @since_time = DateTime.new(1000,1,1)
56 52 end
57 53 begin
58 54 @until_time = DateTime.strptime(params[:until_datetime],date_and_time)
59 55 rescue
60 56 @until_time = DateTime.new(3000,1,1)
61 57 end
62 58
63 59 @submissions = {}
64 60
65 61 User.find_each do |user|
66 62 @submissions[user.id] = { login: user.login, full_name: user.full_name, count: 0, sub: { } }
67 63 end
68 64
69 65 Submission.where("submitted_at >= ? AND submitted_at <= ?",@since_time,@until_time).find_each do |s|
70 66 if @submissions[s.user_id]
71 67 if not @submissions[s.user_id][:sub].has_key?(s.problem_id)
72 68 a = nil
73 69 begin
74 70 a = Problem.find(s.problem_id)
75 71 rescue
76 72 a = nil
77 73 end
78 74 @submissions[s.user_id][:sub][s.problem_id] =
79 75 { prob_name: (a ? a.full_name : '(NULL)'),
80 76 sub_ids: [s.id] }
81 77 else
82 78 @submissions[s.user_id][:sub][s.problem_id][:sub_ids] << s.id
83 79 end
84 80 @submissions[s.user_id][:count] += 1
85 81 end
86 82 end
87 83 end
88 84
89 85 def problem_hof
90 86 # gen problem list
91 87 @user = User.find(session[:user_id])
92 88 @problems = @user.available_problems
93 89
94 90 # get selected problems or the default
95 91 if params[:id]
96 92 begin
97 93 @problem = Problem.available.find(params[:id])
98 94 rescue
99 95 redirect_to action: :problem_hof
100 96 flash[:notice] = 'Error: submissions for that problem are not viewable.'
101 97 return
102 98 end
103 99 end
104 100
105 101 if @problem
106 102 #aggregrate by language
107 103 @by_lang = {}
108 104 Submission.where(problem_id: @problem.id).find_each do |sub|
109 105 lang = Language.find_by_id(sub.language_id)
110 106 next unless lang
111 107 next unless sub.points >= @problem.full_score
@@ -1,128 +1,132
1 1 # Methods added to this helper will be available to all templates in the application.
2 2 module ApplicationHelper
3 3
4 4 def user_header
5 5 menu_items = ''
6 6 user = User.find(session[:user_id])
7 7
8 8 if (user!=nil) and (session[:admin])
9 9 # admin menu
10 10 menu_items << "<b>Administrative task:</b> "
11 11 append_to menu_items, '[Announcements]', 'announcements', 'index'
12 12 append_to menu_items, '[Msg console]', 'messages', 'console'
13 13 append_to menu_items, '[Problems]', 'problems', 'index'
14 14 append_to menu_items, '[Users]', 'user_admin', 'index'
15 15 append_to menu_items, '[Results]', 'user_admin', 'user_stat'
16 16 append_to menu_items, '[Report]', 'report', 'login_stat'
17 17 append_to menu_items, '[Graders]', 'graders', 'list'
18 18 append_to menu_items, '[Contests]', 'contest_management', 'index'
19 19 append_to menu_items, '[Sites]', 'sites', 'index'
20 20 append_to menu_items, '[System config]', 'configurations', 'index'
21 21 menu_items << "<br/>"
22 22 end
23 23
24 24 # main page
25 25 append_to menu_items, "[#{I18n.t 'menu.main'}]", 'main', 'list'
26 26 append_to menu_items, "[#{I18n.t 'menu.messages'}]", 'messages', 'list'
27 27
28 28 if (user!=nil) and (GraderConfiguration.show_tasks_to?(user))
29 29 append_to menu_items, "[#{I18n.t 'menu.tasks'}]", 'tasks', 'list'
30 30 append_to menu_items, "[#{I18n.t 'menu.submissions'}]", 'main', 'submission'
31 31 append_to menu_items, "[#{I18n.t 'menu.test'}]", 'test', 'index'
32 32 end
33 +
34 + if GraderConfiguration['system.hall_of_fame_available']
35 + append_to menu_items, "[#{I18n.t 'menu.hall_of_fame'}]", 'report', 'problem_hof'
36 + end
33 37 append_to menu_items, "[#{I18n.t 'menu.help'}]", 'main', 'help'
34 38
35 39 if GraderConfiguration['system.user_setting_enabled']
36 40 append_to menu_items, "[#{I18n.t 'menu.settings'}]", 'users', 'index'
37 41 end
38 42 append_to menu_items, "[#{I18n.t 'menu.log_out'}]", 'main', 'login'
39 43
40 44 menu_items.html_safe
41 45 end
42 46
43 47 def append_to(option,label, controller, action)
44 48 option << ' ' if option!=''
45 49 option << link_to_unless_current(label,
46 50 :controller => controller,
47 51 :action => action)
48 52 end
49 53
50 54 def format_short_time(time)
51 55 now = Time.now.gmtime
52 56 st = ''
53 57 if (time.yday != now.yday) or
54 58 (time.year != now.year)
55 59 st = time.strftime("%x ")
56 60 end
57 61 st + time.strftime("%X")
58 62 end
59 63
60 64 def format_short_duration(duration)
61 65 return '' if duration==nil
62 66 d = duration.to_f
63 67 return Time.at(d).gmtime.strftime("%X")
64 68 end
65 69
66 70 def read_textfile(fname,max_size=2048)
67 71 begin
68 72 File.open(fname).read(max_size)
69 73 rescue
70 74 nil
71 75 end
72 76 end
73 77
74 78 def user_title_bar(user)
75 79 header = ''
76 80 time_left = ''
77 81
78 82 #
79 83 # if the contest is over
80 84 if GraderConfiguration.time_limit_mode?
81 85 if user.contest_finished?
82 86 header = <<CONTEST_OVER
83 87 <tr><td colspan="2" align="center">
84 88 <span class="contest-over-msg">THE CONTEST IS OVER</span>
85 89 </td></tr>
86 90 CONTEST_OVER
87 91 end
88 92 if !user.contest_started?
89 93 time_left = "&nbsp;&nbsp;" + (t 'title_bar.contest_not_started')
90 94 else
91 95 time_left = "&nbsp;&nbsp;" + (t 'title_bar.remaining_time') +
92 96 " #{format_short_duration(user.contest_time_left)}"
93 97 end
94 98 end
95 99
96 100 #
97 101 # if the contest is in the anaysis mode
98 102 if GraderConfiguration.analysis_mode?
99 103 header = <<ANALYSISMODE
100 104 <tr><td colspan="2" align="center">
101 105 <span class="contest-over-msg">ANALYSIS MODE</span>
102 106 </td></tr>
103 107 ANALYSISMODE
104 108 end
105 109
106 110 contest_name = GraderConfiguration['contest.name']
107 111
108 112 #
109 113 # build real title bar
110 114 result = <<TITLEBAR
111 115 <div class="title">
112 116 <table>
113 117 #{header}
114 118 <tr>
115 119 <td class="left-col">
116 120 #{user.full_name}<br/>
117 121 #{t 'title_bar.current_time'} #{format_short_time(Time.new)}
118 122 #{time_left}
119 123 <br/>
120 124 </td>
121 125 <td class="right-col">#{contest_name}</td>
122 126 </tr>
123 127 </table>
124 128 </div>
125 129 TITLEBAR
126 130 result.html_safe
127 131 end
128 132
@@ -1,118 +1,119
1 1 # Sample localization file for English. Add more files in this directory for other locales.
2 2 # See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3 3
4 4 en:
5 5 cancel: 'Cancel'
6 6
7 7 login_label: 'Login'
8 8 full_name_label: 'Full name'
9 9 email_label: 'E-mail'
10 10 password_label: 'Password'
11 11
12 12 go_ahead_to: "Go ahead to"
13 13 go_back_to: "Go back to"
14 14 login_page: "login page"
15 15 home_page: "home page"
16 16
17 17 menu:
18 18 main: 'Main'
19 19 messages: 'Messages'
20 20 tasks: 'Tasks'
21 21 submissions: 'Submissions'
22 22 test: 'Test Interface'
23 + hall_of_fame: 'Hall of Fame'
23 24 help: 'Help'
24 25 settings: 'Settings'
25 26 log_out: 'Log out'
26 27
27 28 title_bar:
28 29 current_time: "Current time is"
29 30 remaining_time: "Time left: "
30 31 contest_not_started: "The contest has not started."
31 32
32 33 login:
33 34 message: 'Please login to see the problem list'
34 35 login_submit: 'Login'
35 36 participation: 'Want to participate?'
36 37 please: 'Please'
37 38 register: 'register'
38 39 forget_password: 'Forget password?'
39 40
40 41 main:
41 42 start_soon: "The contest at your site will start soon. Please wait."
42 43 specified_in_header: "Specified in header"
43 44
44 45 problem_desc: "desc"
45 46 submitted_at: "Submitted at"
46 47 graded_at: "Graded at"
47 48 score: "score: "
48 49 cmp_msg: "compiler msg"
49 50 src_link: "src"
50 51 submissions_link: "submissions"
51 52
52 53 confirm_contest_start:
53 54 box_title: "Contest confirmation"
54 55 contest_list: "You will participate in contest:"
55 56 timer_starts_after_click: "The timer will start after you click the start button."
56 57 start_button: "Start!"
57 58 start_button_confirm: "Are you sure?"
58 59
59 60 test:
60 61 title: "Test Interface"
61 62 intro: "You can test your submission with your own test data on the grading environment using this test interface."
62 63 disabled_at_end_announcement: "<b>Note:</b> Test interface will be disabled in the last 30 minutes of the contest time on your site."
63 64
64 65 registration:
65 66 title: "New user registration"
66 67
67 68 description: "Please enter your information below. Please make sure your e-mail is correct, because you will have to confirm the registration through an e-mail we send to that e-mail address."
68 69
69 70 successful_title: "Registration successful"
70 71
71 72 login_guide: "Only a-z, A-Z, 0-9 and _. Can be at most 20 characters long"
72 73 email_guide: "Please make sure that your e-mail is correct.<br/>You'll need to verify your account by email."
73 74 register: "Register"
74 75
75 76 email_body: "Hello %{full_name},
76 77
77 78 You have registered for %{contest_name}
78 79
79 80 Your login is: %{login}
80 81
81 82 Your password is: %{password}
82 83
83 84 Please follow the link:
84 85
85 86 %{activation_url}
86 87
87 88 to activate your user account.
88 89
89 90 If you did not register, please ignore this e-mail
90 91 and report this event to %{admin_email}.
91 92
92 93 Thanks!"
93 94
94 95 email_sent: "We have sent a confimation message to your e-mail. (Please also check the Junk mail box."
95 96 email_verify_at: "Please check at %{email} and confirm."
96 97
97 98 activation_sucessful_title: "User activated"
98 99 account_activated: "Your account has been activated."
99 100
100 101 activation_failed_title: "Activation failed"
101 102
102 103 errors:
103 104 header: "Errors occured during registration"
104 105 email:
105 106 title: "Errors in sending registration confirmation"
106 107 expl: "<h2>Your user account has been created, but the system cannot send you the confirmation e-mail.</h2>
107 108 Maybe there's a problem in the configuration. Please report the admin at %{email}.<br/>Thank you!"
108 109 activation:
109 110 email_exists: "A user with this E-mail exists."
110 111 invalid: "Your activation code is invalid. Please check again."
111 112
112 113 password_retrieval:
113 114 header: "Password retrieval"
114 115 instructions: "Please enter the e-mail address that you used to register."
115 116 button_label: "Request new password"
116 117 no_email: "No user with that e-mail address."
117 118 email_body: "Hello %{full_name},
118 119
@@ -1,118 +1,119
1 1 # Sample localization file for English. Add more files in this directory for other locales.
2 2 # See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3 3
4 4 th:
5 5 cancel: 'ฒกเΰΈ₯ิก'
6 6
7 7 login_label: 'ΰΈŠΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉƒΰΈŠΰΉ‰ΰΈ£ΰΈ°ΰΈšΰΈš (login)'
8 8 full_name_label: 'ΰΈŠΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ•ΰΉ‡ΰΈ‘'
9 9 email_label: 'E-mail'
10 10 password_label: 'ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™'
11 11
12 12 go_ahead_to: "ΰΉ„ΰΈ›ΰΈ’ΰΈ±ΰΈ‡"
13 13 go_back_to: "กΰΈ₯ΰΈ±ΰΈšΰΉ„ΰΈ›ΰΈ’ΰΈ±ΰΈ‡"
14 14 login_page: "ΰΈ«ΰΈ™ΰΉ‰ΰΈ²ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉƒΰΈŠΰΉ‰ΰΈ£ΰΈ°ΰΈšΰΈš"
15 15 home_page: "หน้าแรก"
16 16
17 17 menu:
18 18 main: 'ΰΈ«ΰΈ™ΰΉ‰ΰΈ²ΰΈ«ΰΈ₯ัก'
19 19 messages: 'ΰΈ‚ΰΉ‰ΰΈ­ΰΈ„ΰΈ§ΰΈ²ΰΈ‘'
20 20 tasks: 'ΰΉ‚ΰΈˆΰΈ—ΰΈ’ΰΉŒ'
21 21 submissions: 'ΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΈ—ΰΈ΅ΰΉˆΰΈͺΰΉˆΰΈ‡'
22 22 test: 'ΰΈ—ΰΈ”ΰΈͺΰΈ­ΰΈšΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘'
23 + hall_of_fame: 'หอเกมฒรติฒศ'
23 24 help: 'ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈŠΰΉˆΰΈ§ΰΈ’ΰΉ€ΰΈ«ΰΈ₯ΰΈ·ΰΈ­'
24 25 settings: 'ΰΉ€ΰΈ›ΰΈ₯ΰΈ΅ΰΉˆΰΈ’ΰΈ™ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™'
25 26 log_out: 'ออกจากระบบ'
26 27
27 28 title_bar:
28 29 current_time: "ΰΉ€ΰΈ§ΰΈ₯ΰΈ²ΰΈ›ΰΈ±ΰΈˆΰΈˆΰΈΈΰΈšΰΈ±ΰΈ™ΰΈ„ΰΈ·ΰΈ­"
29 30 remaining_time: "ΰΉ€ΰΈ«ΰΈ₯ΰΈ·ΰΈ­ΰΉ€ΰΈ§ΰΈ₯าอมก"
30 31 contest_not_started: "ΰΈ’ΰΈ±ΰΈ‡ΰΉ„ΰΈ‘ΰΉˆΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™"
31 32
32 33 login:
33 34 message: 'กรุณา login ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΈͺู่ระบบ'
34 35 login_submit: 'ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉƒΰΈŠΰΉ‰ΰΈ£ΰΈ°ΰΈšΰΈš'
35 36 participation: 'ΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΈ£ΰΉˆΰΈ§ΰΈ‘?'
36 37 please: 'กรุณา'
37 38 register: 'ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™'
38 39 forget_password: 'ΰΈ₯ΰΈ·ΰΈ‘ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™?'
39 40
40 41 main:
41 42 start_soon: "ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ΰΈΰΈ³ΰΈ₯ΰΈ±ΰΈ‡ΰΈˆΰΈ°ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈ£ΰΈ­ΰΈΰΉˆΰΈ­ΰΈ™"
42 43 specified_in_header: "ΰΈ£ΰΈ°ΰΈšΰΈΈΰΈ—ΰΈ΅ΰΉˆΰΈ«ΰΈ±ΰΈ§ΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΉΰΈ₯ΰΉ‰ΰΈ§"
43 44
44 45 problem_desc: "ΰΈ­ΰΉˆΰΈ²ΰΈ™"
45 46 submitted_at: "ΰΈͺΰΉˆΰΈ‡ΰΉ€ΰΈ‘ΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ§ΰΈ₯ΰΈ²"
46 47 graded_at: "ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΉ€ΰΈ‘ΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ§ΰΈ₯ΰΈ²"
47 48 score: "คะแนน: "
48 49 cmp_msg: "ผΰΈ₯ΰΈ„ΰΈ­ΰΈ‘ΰΉ„ΰΈžΰΈ₯์"
49 50 src_link: "ΰΈ•ΰΉ‰ΰΈ™ΰΈ‰ΰΈšΰΈ±ΰΈš"
50 51 submissions_link: "การΰΈͺΰΉˆΰΈ‡ΰΈ„ΰΈ£ΰΈ±ΰΉ‰ΰΈ‡ΰΈ­ΰΈ·ΰΉˆΰΈ™ ΰΉ†"
51 52
52 53 confirm_contest_start:
53 54 box_title: "ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈΰΈ²ΰΈ£ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™"
54 55 contest_list: "ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ΰΈ—ΰΈ΅ΰΉˆΰΈ„ΰΈΈΰΈ“ΰΈˆΰΈ°ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΈ£ΰΉˆΰΈ§ΰΈ‘ΰΈ„ΰΈ·ΰΈ­ "
55 56 timer_starts_after_click: "ΰΈΰΈ²ΰΈ£ΰΈˆΰΈ±ΰΈšΰΉ€ΰΈ§ΰΈ₯ΰΈ²ΰΈˆΰΈ°ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΈ‚ΰΈΆΰΉ‰ΰΈ™ΰΉ€ΰΈ‘ΰΈ·ΰΉˆΰΈ­ΰΈ„ΰΈΈΰΈ“ΰΈΰΈ”ΰΈ›ΰΈΈΰΉˆΰΈ‘ΰΈ”ΰΉ‰ΰΈ²ΰΈ™ΰΈ₯ΰΉˆΰΈ²ΰΈ‡"
56 57 start_button: "ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΉΰΈ‚ΰΉˆΰΈ‡!"
57 58 start_button_confirm: "ΰΉΰΈ™ΰΉˆΰΉƒΰΈˆΰΈ—ΰΈ΅ΰΉˆΰΈˆΰΈ°ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ«ΰΈ£ΰΈ·ΰΈ­ΰΉ„ΰΈ‘ΰΉˆ?"
58 59
59 60 test:
60 61 title: "ΰΈ—ΰΈ”ΰΈͺΰΈ­ΰΈšΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΈšΰΈ™ΰΈͺΰΈ ΰΈ²ΰΈžΰΉΰΈ§ΰΈ”ΰΈ₯ΰΉ‰ΰΈ­ΰΈ‘ΰΈ‚ΰΈ­ΰΈ‡ΰΉ€ΰΈ„ΰΈ£ΰΈ·ΰΉˆΰΈ­ΰΈ‡ΰΈ•ΰΈ£ΰΈ§ΰΈˆ"
61 62 intro: "ΰΈ„ΰΈΈΰΈ“ΰΈͺΰΈ²ΰΈ‘ΰΈ²ΰΈ£ΰΈ–ΰΈ—ΰΈ”ΰΈ₯ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΈ—ΰΈ³ΰΈ‡ΰΈ²ΰΈ™ΰΈ‚ΰΈ­ΰΈ‡ΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΈ—ΰΈ΅ΰΉˆΰΉ€ΰΈ‚ΰΈ΅ΰΈ’ΰΈ™ΰΈΰΈ±ΰΈšΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΈŠΰΈΈΰΈ”ΰΈ—ΰΈ”ΰΈͺΰΈ­ΰΈšΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“ΰΉ€ΰΈ­ΰΈ‡ΰΉƒΰΈ™ΰΈͺΰΈ ΰΈ²ΰΈžΰΉΰΈ§ΰΈ”ΰΈ₯ΰΉ‰ΰΈ­ΰΈ‘ΰΈˆΰΈ£ΰΈ΄ΰΈ‡ΰΈ‚ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΉ„ΰΈ”ΰΉ‰ ΰΉ‚ΰΈ”ΰΈ’ΰΉ€ΰΈ₯ือกโปรแกรฑΰΈͺΰΉˆΰΈ‡ΰΉΰΈ₯ΰΉ‰ΰΈ§ΰΈ—ΰΈ΅ΰΉˆΰΈ”ΰΉ‰ΰΈ²ΰΈ™ΰΈ₯ΰΉˆΰΈ²ΰΈ‡ΰΈžΰΈ£ΰΉ‰ΰΈ­ΰΈ‘ΰΈ—ΰΈ±ΰΉ‰ΰΈ‡ΰΈͺΰΉˆΰΈ‡ΰΉΰΈŸΰΉ‰ΰΈ‘ΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΈŠΰΈΈΰΈ”ΰΈ—ΰΈ”ΰΈͺΰΈ­ΰΈšΰΈ—ΰΈ΅ΰΉˆΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΉƒΰΈ«ΰΉ‰ΰΈ—ΰΈ³ΰΈ‡ΰΈ²ΰΈ™ΰΈ”ΰΉ‰ΰΈ§ΰΈ’"
62 63 disabled_at_end_announcement: "<b>ΰΈ«ΰΈ‘ΰΈ²ΰΈ’ΰΉ€ΰΈ«ΰΈ•ΰΈΈ:</b> ΰΈ£ΰΈ°ΰΈšΰΈšΰΈ—ΰΈ”ΰΈͺΰΈ­ΰΈšΰΉ‚ΰΈ›ΰΈ£ΰΉΰΈΰΈ£ΰΈ‘ΰΈˆΰΈ°ΰΈ«ΰΈ’ΰΈΈΰΈ”ΰΈ—ΰΈ³ΰΈ‡ΰΈ²ΰΈ™ΰΉƒΰΈ™ΰΈŠΰΉˆΰΈ§ΰΈ‡ΰΉ€ΰΈ§ΰΈ₯ΰΈ² 30 ΰΈ™ΰΈ²ΰΈ—ΰΈ΅ΰΈͺΰΈΈΰΈ”ΰΈ—ΰΉ‰ΰΈ²ΰΈ’ΰΈ‚ΰΈ­ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™"
63 64
64 65 registration:
65 66 title: "ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΉƒΰΈ«ΰΈ‘ΰΉˆ"
66 67 description: "ในการΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ ΰΉƒΰΈ«ΰΉ‰ΰΈœΰΈΉΰΉ‰ΰΈͺΰΈ™ΰΉƒΰΈˆΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΈ£ΰΉˆΰΈ§ΰΈ‘ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ΰΈΰΈ£ΰΈ­ΰΈΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΈ”ΰΉ‰ΰΈ²ΰΈ™ΰΈ₯ΰΉˆΰΈ²ΰΈ‡ ΰΈˆΰΈ²ΰΈΰΈ™ΰΈ±ΰΉ‰ΰΈ™ΰΈ£ΰΈ°ΰΈšΰΈšΰΈˆΰΈ°ΰΈͺΰΉˆΰΈ‡ e-mail ΰΉ„ΰΈ›ΰΈ’ΰΈ±ΰΈ‡ e-mail ΰΈ—ΰΈ΅ΰΉˆΰΈ£ΰΈ°ΰΈšΰΈΈΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΉƒΰΈ«ΰΉ‰ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈ•ΰΈ±ΰΈ§ΰΈ•ΰΈ™ΰΉΰΈ₯ΰΈ°ΰΉ€ΰΈ›ΰΈ΄ΰΈ”ΰΉƒΰΈŠΰΉ‰ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰<br/>ΰΉƒΰΈ™ΰΈΰΈ£ΰΈ“ΰΈ΅ΰΈ—ΰΈ΅ΰΉˆΰΈœΰΈΉΰΉ‰ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ΰΉ€ΰΈ›ΰΉ‡ΰΈ™ΰΈ™ΰΈ±ΰΈΰΉ€ΰΈ£ΰΈ΅ΰΈ’ΰΈ™ ΰΈ£ΰΈšΰΈΰΈ§ΰΈ™ΰΈŠΰΉˆΰΈ§ΰΈ’ΰΉƒΰΈ«ΰΉ‰ΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΉ€ΰΈΰΈ΅ΰΉˆΰΈ’ΰΈ§ΰΈΰΈ±ΰΈšΰΉ‚ΰΈ£ΰΈ‡ΰΉ€ΰΈ£ΰΈ΅ΰΈ’ΰΈ™ΰΉΰΈ₯ΰΈ°ΰΈˆΰΈ±ΰΈ‡ΰΈ«ΰΈ§ΰΈ±ΰΈ”ΰΈ”ΰΉ‰ΰΈ§ΰΈ’"
67 68
68 69 successful_title: "การΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΉ€ΰΈͺΰΈ£ΰΉ‡ΰΈˆΰΉ€ΰΈ£ΰΈ΅ΰΈ’ΰΈšΰΈ£ΰΉ‰ΰΈ­ΰΈ’"
69 70
70 71 login_guide: "ΰΉƒΰΈŠΰΉ‰ΰΉ„ΰΈ”ΰΉ‰ΰΉ€ΰΈ‰ΰΈžΰΈ²ΰΈ° a-z, A-Z, 0-9 แΰΈ₯ΰΈ° _ ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈ’ΰΈ²ΰΈ§ΰΉ„ΰΈ‘ΰΉˆΰΉ€ΰΈΰΈ΄ΰΈ™ 20 ตัวอักษร"
71 72 email_guide: "ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈͺอบ e-mail ΰΈ—ΰΈ΅ΰΉˆΰΉƒΰΈͺΰΉˆΰΉƒΰΈ«ΰΉ‰ΰΈ–ΰΈΉΰΈΰΈ•ΰΉ‰ΰΈ­ΰΈ‡<br/>ΰΈ„ΰΈΈΰΈ“ΰΈˆΰΈ°ΰΈ•ΰΉ‰ΰΈ­ΰΈ‡ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈΰΈ²ΰΈ£ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΈœΰΉˆΰΈ²ΰΈ™ΰΈ—ΰΈ²ΰΈ‡ΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΈ—ΰΈ΅ΰΉˆΰΈˆΰΈ°ΰΈͺΰΉˆΰΈ‡ΰΉƒΰΈ«ΰΉ‰ΰΈ—ΰΈ²ΰΈ‡ e-mail"
72 73 register: "ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™"
73 74
74 75 email_body: "ΰΈͺΰΈ§ΰΈ±ΰΈͺΰΈ”ΰΈ΅ΰΈ„ΰΈ£ΰΈ±ΰΈš %{full_name},
75 76
76 77 ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ”ΰΉ‰ΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΈ£ΰΉˆΰΈ§ΰΈ‘ΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ %{contest_name}
77 78
78 79 ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΉ€ΰΈ‚ΰΉ‰ΰΈ²ΰΉƒΰΈŠΰΉ‰ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“ΰΈ„ΰΈ·ΰΈ­: %{login}
79 80
80 81 ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΈ„ΰΈ·ΰΈ­: %{password}
81 82
82 83 กรุณาเข้าΰΈ₯ΰΈ΄ΰΈ‡ΰΈΰΉŒΰΈ•ΰΉˆΰΈ­ΰΉ„ΰΈ›ΰΈ™ΰΈ΅ΰΉ‰:
83 84
84 85 %{activation_url}
85 86
86 87 ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΉ€ΰΈ›ΰΈ΄ΰΈ”ΰΉƒΰΈŠΰΉ‰ΰΈ‡ΰΈ²ΰΈ™ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“
87 88
88 89 ΰΈ–ΰΉ‰ΰΈ²ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ‘ΰΉˆΰΉƒΰΈŠΰΉˆΰΈ„ΰΈ™ΰΈ—ΰΈ΅ΰΉˆΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ กรุณาΰΈ₯ΰΈ°ΰΈ—ΰΈ΄ΰΉ‰ΰΈ‡ e-mail ΰΈ‰ΰΈšΰΈ±ΰΈšΰΈ™ΰΈ΅ΰΉ‰
89 90 แΰΈ₯ΰΈ°ΰΉΰΈˆΰΉ‰ΰΈ‡ΰΈ„ΰΈ§ΰΈ²ΰΈ‘ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”ΰΈ™ΰΈ΅ΰΉ‰ΰΈΰΈ±ΰΈš %{admin_email} ΰΈ”ΰΉ‰ΰΈ§ΰΈ’
90 91
91 92 ΰΈ‚ΰΈ­ΰΈšΰΈ„ΰΈΈΰΈ“ΰΈ‘ΰΈ²ΰΈ!"
92 93
93 94 email_sent: "ΰΉ€ΰΈ£ΰΈ²ΰΉ„ΰΈ”ΰΉ‰ΰΈͺΰΉˆΰΈ‡ΰΈ‚ΰΉ‰ΰΈ­ΰΈ‘ΰΈΉΰΈ₯ΰΈͺΰΈ³ΰΈ«ΰΈ£ΰΈ±ΰΈšΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΉ„ΰΈ›ΰΉƒΰΈ«ΰΉ‰ΰΈ„ΰΈΈΰΈ“ΰΉΰΈ₯ΰΉ‰ΰΈ§ (ΰΉ‚ΰΈ›ΰΈ£ΰΈ”ΰΈ­ΰΈ’ΰΉˆΰΈ²ΰΈ₯ΰΈ·ΰΈ‘ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈ”ΰΈΉΰΉƒΰΈ™ΰΈͺΰΉˆΰΈ§ΰΈ™ Junk mail ΰΈ”ΰΉ‰ΰΈ§ΰΈ’)"
94 95 email_verify_at: "ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈͺΰΈ­ΰΈšΰΈ—ΰΈ΅ΰΉˆ %{email} ΰΈžΰΈ£ΰΉ‰ΰΈ­ΰΈ‘ΰΈ—ΰΈ±ΰΉ‰ΰΈ‡ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™"
95 96
96 97 activation_sucessful_title: "ΰΈšΰΈ±ΰΈ“ΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΉ„ΰΈ”ΰΉ‰ΰΈ£ΰΈ±ΰΈšΰΈΰΈ²ΰΈ£ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΉΰΈ₯ΰΉ‰ΰΈ§"
97 98 account_activated: "ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“ΰΈžΰΈ£ΰΉ‰ΰΈ­ΰΈ‘ΰΉƒΰΈŠΰΉ‰ΰΈ‡ΰΈ²ΰΈ™ΰΉΰΈ₯ΰΉ‰ΰΈ§"
98 99
99 100 activation_failed_title: "การฒืนฒันΰΈ₯ΰΉ‰ΰΈ‘ΰΉ€ΰΈ«ΰΈ₯ΰΈ§"
100 101
101 102 errors:
102 103 header: 'การΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™ΰΈ‘ΰΈ΅ΰΈ‚ΰΉ‰ΰΈ­ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ”'
103 104 email:
104 105 title: "ΰΉ€ΰΈΰΈ΄ΰΈ”ΰΈ›ΰΈ±ΰΈΰΈ«ΰΈ²ΰΈ£ΰΈ°ΰΈ«ΰΈ§ΰΉˆΰΈ²ΰΈ‡ΰΈΰΈ²ΰΈ£ΰΈͺΰΉˆΰΈ‡ e-mail ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈΰΈ²ΰΈ£ΰΈͺΰΈ‘ΰΈ±ΰΈ„ΰΈ£"
105 106 expl: "<h2>ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΈ‚ΰΈ­ΰΈ‡ΰΈ„ΰΈΈΰΈ“ΰΈ–ΰΈΉΰΈΰΈͺร้างขย้นแΰΈ₯ΰΉ‰ΰΈ§ ΰΉΰΈ•ΰΉˆΰΈ£ΰΈ°ΰΈšΰΈšΰΉ„ΰΈ‘ΰΉˆΰΈͺΰΈ²ΰΈ‘ΰΈ²ΰΈ£ΰΈ–ΰΈͺΰΉˆΰΈ‡ e-mail ΰΉ€ΰΈžΰΈ·ΰΉˆΰΈ­ΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈΰΈ²ΰΈ£ΰΈͺΰΈ‘ΰΈ±ΰΈ„ΰΈ£ΰΉ„ΰΈ”ΰΉ‰</h2>
106 107 ΰΈ­ΰΈ²ΰΈˆΰΉ€ΰΈΰΈ΄ΰΈ”ΰΈ›ΰΈ±ΰΈΰΈ«ΰΈ²ΰΉƒΰΈ™ΰΈΰΈ²ΰΈ£ΰΈ•ΰΈ±ΰΉ‰ΰΈ‡ΰΈ„ΰΉˆΰΈ²ΰΉ€ΰΈ£ΰΈ΄ΰΉˆΰΈ‘ΰΈ•ΰΉ‰ΰΈ™ΰΈ‚ΰΈ­ΰΈ‡ΰΈ£ΰΈ°ΰΈšΰΈš ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈŠΰΉˆΰΈ§ΰΈ’ΰΈ•ΰΈ΄ΰΈ”ΰΈ•ΰΉˆΰΈ­ΰΈœΰΈΉΰΉ‰ΰΈ”ΰΈΉΰΉΰΈ₯ΰΈ£ΰΈ°ΰΈšΰΈšΰΈ”ΰΉ‰ΰΈ§ΰΈ’ΰΈ—ΰΈ΅ΰΉˆ %{email}<br/>ΰΈ‚ΰΈ­ΰΈ‚ΰΈ­ΰΈšΰΈ„ΰΈΈΰΈ“ΰΈˆΰΈ²ΰΈΰΈ—ΰΈ΅ΰΈ‘ΰΈ‡ΰΈ²ΰΈ™"
107 108 activation:
108 109 email_exists: "ΰΈ‘ΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΈ—ΰΈ΅ΰΉˆΰΉƒΰΈŠΰΉ‰ e-mail นม้แΰΈ₯ΰΉ‰ΰΈ§"
109 110 invalid: "ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈͺΰΈ³ΰΈ«ΰΈ£ΰΈ±ΰΈšΰΈ’ΰΈ·ΰΈ™ΰΈ’ΰΈ±ΰΈ™ΰΈœΰΈ΄ΰΈ”ΰΈžΰΈ₯ΰΈ²ΰΈ” ΰΈΰΈ£ΰΈΈΰΈ“ΰΈ²ΰΈ•ΰΈ£ΰΈ§ΰΈˆΰΈͺΰΈ­ΰΈšΰΈ­ΰΈ΅ΰΈΰΈ„ΰΈ£ΰΈ±ΰΉ‰ΰΈ‡"
110 111
111 112 password_retrieval:
112 113 header: "การขอรหัΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΉƒΰΈ«ΰΈ‘ΰΉˆ"
113 114 instructions: "กรุณากรอก e-mail ΰΈ—ΰΈ΅ΰΉˆΰΈ₯ΰΈ‡ΰΈ—ΰΈ°ΰΉ€ΰΈšΰΈ΅ΰΈ’ΰΈ™"
114 115 button_label: "ΰΈ‚ΰΈ­ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΉƒΰΈ«ΰΈ‘ΰΉˆ"
115 116 no_email: "ΰΉ„ΰΈ‘ΰΉˆΰΈ‘ΰΈ΅ΰΈšΰΈ±ΰΈΰΈŠΰΈ΅ΰΈœΰΈΉΰΉ‰ΰΉƒΰΈŠΰΉ‰ΰΈ—ΰΈ΅ΰΉˆΰΉƒΰΈŠΰΉ‰ e-mail ดังกΰΈ₯่าว"
116 117 email_body: "ΰΈͺΰΈ§ΰΈ±ΰΈͺΰΈ”ΰΈ΅ΰΈ„ΰΈ£ΰΈ±ΰΈš %{full_name},
117 118
118 119 ΰΈ„ΰΈΈΰΈ“ΰΉ„ΰΈ”ΰΉ‰ΰΈ£ΰΉ‰ΰΈ­ΰΈ‡ΰΈ‚ΰΈ­ΰΈ£ΰΈ«ΰΈ±ΰΈͺΰΈœΰΉˆΰΈ²ΰΈ™ΰΉƒΰΈ«ΰΈ‘ΰΉˆ ΰΈͺΰΈ³ΰΈ«ΰΈ£ΰΈ±ΰΈšΰΈΰΈ²ΰΈ£ΰΉΰΈ‚ΰΉˆΰΈ‡ΰΈ‚ΰΈ±ΰΈ™ %{contest_name} ΰΈ‹ΰΈΆΰΉˆΰΈ‡ΰΉ€ΰΈ£ΰΈ²ΰΉ„ΰΈ”ΰΉ‰ΰΈͺร้างให้คุณแΰΈ₯ΰΉ‰ΰΈ§ ΰΈ”ΰΈ±ΰΈ‡ΰΈ™ΰΈ΅ΰΉ‰
@@ -1,209 +1,216
1 1 CONFIGURATIONS =
2 2 [
3 3 {
4 4 :key => 'system.single_user_mode',
5 5 :value_type => 'boolean',
6 6 :default_value => 'false',
7 7 :description => 'Only admins can log in to the system when running under single user mode.'
8 8 },
9 -
9 +
10 10 {
11 11 :key => 'ui.front.title',
12 12 :value_type => 'string',
13 13 :default_value => 'Grader'
14 14 },
15 -
15 +
16 16 {
17 17 :key => 'ui.front.welcome_message',
18 18 :value_type => 'string',
19 19 :default_value => 'Welcome!'
20 20 },
21 -
21 +
22 22 {
23 23 :key => 'ui.show_score',
24 24 :value_type => 'boolean',
25 25 :default_value => 'true'
26 26 },
27 -
27 +
28 28 {
29 29 :key => 'contest.time_limit',
30 30 :value_type => 'string',
31 31 :default_value => 'unlimited',
32 32 :description => 'Time limit in format hh:mm, or "unlimited" for contests with no time limits. This config is CACHED. Restart the server before the change can take effect.'
33 33 },
34 -
34 +
35 35 {
36 36 :key => 'system.mode',
37 37 :value_type => 'string',
38 38 :default_value => 'standard',
39 39 :description => 'Current modes are "standard", "contest", "indv-contest", and "analysis".'
40 40 },
41 -
41 +
42 42 {
43 43 :key => 'contest.name',
44 44 :value_type => 'string',
45 45 :default_value => 'Grader',
46 46 :description => 'This name will be shown on the user header bar.'
47 47 },
48 -
48 +
49 49 {
50 50 :key => 'contest.multisites',
51 51 :value_type => 'boolean',
52 52 :default_value => 'false',
53 53 :description => 'If the server is in contest mode and this option is true, on the log in of the admin a menu for site selections is shown.'
54 54 },
55 -
55 +
56 56 {
57 - :key => 'system.online_registration',
57 + :key => 'system.hall_of_fame_available',
58 58 :value_type => 'boolean',
59 59 :default_value => 'false',
60 - :description => 'This option enables online registration.'
60 + :description => 'If true, any user can access hall of fame page.'
61 61 },
62 -
62 +
63 63 # If Configuration['system.online_registration'] is true, the
64 64 # system allows online registration, and will use these
65 65 # information for sending confirmation emails.
66 66 {
67 67 :key => 'system.online_registration.smtp',
68 68 :value_type => 'string',
69 69 :default_value => 'smtp.somehost.com'
70 70 },
71 -
71 +
72 72 {
73 73 :key => 'system.online_registration.from',
74 74 :value_type => 'string',
75 75 :default_value => 'your.email@address'
76 76 },
77 -
77 +
78 78 {
79 79 :key => 'system.admin_email',
80 80 :value_type => 'string',
81 81 :default_value => 'admin@admin.email'
82 82 },
83 -
83 +
84 84 {
85 85 :key => 'system.user_setting_enabled',
86 86 :value_type => 'boolean',
87 87 :default_value => 'true',
88 88 :description => 'If this option is true, users can change their settings'
89 89 },
90 -
90 +
91 + {
92 + :key => 'system.user_setting_enabled',
93 + :value_type => 'boolean',
94 + :default_value => 'true',
95 + :description => 'If this option is true, users can change their settings'
96 + }
97 +
91 98 # If Configuration['contest.test_request.early_timeout'] is true
92 99 # the user will not be able to use test request at 30 minutes
93 100 # before the contest ends.
94 101 {
95 102 :key => 'contest.test_request.early_timeout',
96 103 :value_type => 'boolean',
97 104 :default_value => 'false'
98 105 },
99 106
100 107 {
101 108 :key => 'system.multicontests',
102 109 :value_type => 'boolean',
103 110 :default_value => 'false'
104 111 },
105 112
106 113 {
107 114 :key => 'contest.confirm_indv_contest_start',
108 115 :value_type => 'boolean',
109 116 :default_value => 'false'
110 117 },
111 118
112 119 {
113 120 :key => 'contest.default_contest_name',
114 121 :value_type => 'string',
115 122 :default_value => 'none',
116 123 :description => "New user will be assigned to this contest automatically, if it exists. Set to 'none' if there is no default contest."
117 124 }
118 -
125 +
119 126 ]
120 127
121 128
122 129 def create_configuration_key(key,
123 130 value_type,
124 131 default_value,
125 132 description='')
126 133 conf = (GraderConfiguration.find_by_key(key) ||
127 134 GraderConfiguration.new(:key => key,
128 135 :value_type => value_type,
129 136 :value => default_value))
130 137 conf.description = description
131 138 conf.save
132 139 end
133 140
134 141 def seed_config
135 142 CONFIGURATIONS.each do |conf|
136 143 if conf.has_key? :description
137 144 desc = conf[:description]
138 145 else
139 146 desc = ''
140 147 end
141 148 create_configuration_key(conf[:key],
142 149 conf[:value_type],
143 150 conf[:default_value],
144 151 desc)
145 152 end
146 153 end
147 154
148 155 def seed_roles
149 156 return if Role.find_by_name('admin')
150 157
151 158 role = Role.create(:name => 'admin')
152 159 user_admin_right = Right.create(:name => 'user_admin',
153 160 :controller => 'user_admin',
154 161 :action => 'all')
155 162 problem_admin_right = Right.create(:name=> 'problem_admin',
156 163 :controller => 'problems',
157 164 :action => 'all')
158 165
159 166 graders_right = Right.create(:name => 'graders_admin',
160 167 :controller => 'graders',
161 168 :action => 'all')
162 169
163 170 role.rights << user_admin_right;
164 171 role.rights << problem_admin_right;
165 172 role.rights << graders_right;
166 173 role.save
167 174 end
168 175
169 176 def seed_root
170 177 return if User.find_by_login('root')
171 178
172 179 root = User.new(:login => 'root',
173 180 :full_name => 'Administrator',
174 181 :alias => 'root')
175 182 root.password = 'ioionrails';
176 183
177 184 class << root
178 185 public :encrypt_new_password
179 186 def valid?(context=nil)
180 187 true
181 188 end
182 189 end
183 190
184 191 root.encrypt_new_password
185 192
186 193 root.roles << Role.find_by_name('admin')
187 194
188 195 root.activated = true
189 196 root.save
190 197 end
191 198
192 199 def seed_users_and_roles
193 200 seed_roles
194 201 seed_root
195 202 end
196 203
197 204 def seed_more_languages
198 205 Language.delete_all
199 206 Language.create( name: 'c', pretty_name: 'C', ext: 'c', common_ext: 'c' )
200 207 Language.create( name: 'cpp', pretty_name: 'C++', ext: 'cpp', common_ext: 'cpp,cc' )
201 208 Language.create( name: 'pas', pretty_name: 'Pascal', ext: 'pas', common_ext: 'pas' )
202 209 Language.create( name: 'ruby', pretty_name: 'Ruby', ext: 'rb', common_ext: 'rb' )
203 210 Language.create( name: 'python', pretty_name: 'Python', ext: 'py', common_ext: 'py' )
204 211 Language.create( name: 'java', pretty_name: 'Java', ext: 'java', common_ext: 'java' )
205 212 end
206 213
207 214 seed_config
208 215 seed_users_and_roles
209 216 seed_more_languages
You need to be logged in to leave comments. Login now