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,73 +1,77 | |||
|
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) |
@@ -1,63 +1,59 | |||
|
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 = {} |
@@ -1,80 +1,84 | |||
|
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? |
@@ -1,70 +1,71 | |||
|
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 |
@@ -1,70 +1,71 | |||
|
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 ΰΈΰΈ±ΰΈ§ΰΈΰΈ±ΰΈΰΈ©ΰΈ£" |
@@ -1,166 +1,173 | |||
|
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 |
You need to be logged in to leave comments.
Login now