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