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 | 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 |
|
|
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 = " " + (t 'title_bar.contest_not_started') |
|
90 | 94 | else |
|
91 | 95 | time_left = " " + (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. |
|
|
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