Description:
merge with algo-bm
Commit status:
[Not Reviewed]
References:
merge java
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r429:82e5ff05bd49 - - 18 files changed: 310 inserted, 30 deleted

@@ -0,0 +1,8
1 + %h2 Paid in Full
2 + User with highest number of problem solved
3 +
4 + %h2 Polymaths
5 + User with highest number of problems each solved by more than 1 languages.
6 +
7 + %h2 Icebreakers
8 + If you solve the problem before 95% of your friends, you are an icebreaker.
@@ -0,0 +1,62
1 + :css
2 + .hof_user { color: orangered; font-style: italic; }
3 + .hof_language { color: green; font-style: italic; }
4 + .hof_value { color: deeppink;font-style: italic; }
5 +
6 + %h2 Overall
7 +
8 + - if @best
9 + %b Best Runtime:
10 + by <span class="hof_user">#{@best[:runtime][:user]}</span> using <span class="hof_language">#{@best[:runtime][:lang]}</span> with <span class="hof_value">#{@best[:runtime][:value] * 1000} milliseconds</span> at submission
11 + = link_to("#" + @best[:runtime][:sub_id].to_s, controller: 'graders', action: 'submission', id:@best[:runtime][:sub_id])
12 + %br/
13 +
14 + %b Best Memory Usage:
15 + by <span class="hof_user">#{@best[:memory][:user]}</span> using <span class="hof_language">#{@best[:memory][:lang]}</span> with <span class="hof_value">#{@best[:memory][:value]} kbytes </span> at submission
16 + = link_to("#" + @best[:memory][:sub_id].to_s, controller: 'graders' , action: 'submission', id:@best[:memory][:sub_id])
17 + %br/
18 +
19 + %b Shortest Code:
20 + by <span class="hof_user">#{@best[:length][:user]}</span> using <span class="hof_language">#{@best[:length][:lang]}</span> with <span class="hof_value">#{@best[:length][:value]} bytes</span> at submission
21 + = link_to("#" + @best[:length][:sub_id].to_s, controller: 'graders' , action: 'submission', id: @best[:length][:sub_id])
22 + %br/
23 +
24 + %b First solver:
25 + <span class="hof_user">#{@best[:first][:user]}</span> is the first solver using <span class="hof_language">#{@best[:first][:lang]}</span> on <span class="hof_value">#{@best[:first][:value]}</span> at submission
26 + = link_to("#" + @best[:first][:sub_id].to_s, controller: 'graders' , action: 'submission', id: @best[:first][:sub_id])
27 + %br/
28 +
29 +
30 + %p
31 + This counts only for submission with 100% score <br/>
32 + Right now, java is excluded from memory usage competition. (Because it always uses 2GB memory...)
33 +
34 + %h2 By language
35 +
36 + %table.info
37 + %thead
38 + %tr.info-head
39 + %th Language
40 + %th Best runtime (ms)
41 + %th Best memory (kbytes)
42 + %th Shortest Code (bytes)
43 + %th First solver
44 + %tbody
45 + - @by_lang.each do |lang,value|
46 + %tr{class: cycle('info-even','info-odd')}
47 + %td= lang
48 + %td
49 + = "#{value[:runtime][:user]} (#{(value[:runtime][:value] * 1000).to_i} @"
50 + = "#{link_to("#" + value[:runtime][:sub_id].to_s, controller: 'graders' , action: 'submission', id: value[:runtime][:sub_id])} )".html_safe
51 + %td
52 + = "#{value[:memory][:user]} (#{value[:memory][:value]} @"
53 + = "#{link_to("#" + value[:memory][:sub_id].to_s, controller: 'graders' , action: 'submission', id: value[:memory][:sub_id])} )".html_safe
54 + %td
55 + = "#{value[:length][:user]} (#{value[:length][:value]} @"
56 + = "#{link_to("#" + value[:length][:sub_id].to_s, controller: 'graders' , action: 'submission', id: value[:length][:sub_id])} )".html_safe
57 + %td
58 + = "#{value[:first][:user]} (#{value[:first][:value]} @"
59 + = "#{link_to("#" + value[:first][:sub_id].to_s, controller: 'graders' , action: 'submission', id: value[:first][:sub_id])} )".html_safe
60 +
61 + - else
62 + %h3 No submissions
@@ -0,0 +1,22
1 +
2 + /- if params[:id]
3 + / %h1 Tasks Hall of Fame
4 + / = link_to('[back to All-Time Hall of Fame]', action: 'problem_hof', id: nil )
5 + /- else
6 + / %h1 All-Time Hall of Fame
7 +
8 +
9 + %h1 Tasks Hall of Fame
10 + .task-menu
11 + Tasks
12 + %br/
13 + - @problems.each do |prob|
14 + = link_to( "[#{prob.name}]", {id: prob.id})
15 +
16 + - unless params[:id]
17 + /=render partial: 'all_time_hof'
18 + Please select a problem.
19 + - else
20 + =render partial: 'task_hof'
21 +
22 +
@@ -0,0 +1,7
1 + class AddMoreDetailToSubmission < ActiveRecord::Migration
2 + def change
3 + add_column :submissions, :max_runtime, :float
4 + add_column :submissions, :peak_memory, :integer
5 + add_column :submissions, :effective_code_length, :integer
6 + end
7 + end
@@ -1,56 +1,58
1 source 'https://rubygems.org'
1 source 'https://rubygems.org'
2
2
3 gem 'rails', '3.2.19'
3 gem 'rails', '3.2.19'
4
4
5 # Bundle edge Rails instead:
5 # Bundle edge Rails instead:
6 # gem 'rails', :git => 'git://github.com/rails/rails.git'
6 # gem 'rails', :git => 'git://github.com/rails/rails.git'
7
7
8 gem 'mysql2'
8 gem 'mysql2'
9
9
10 # Gems used only for assets and not required
10 # Gems used only for assets and not required
11 # in production environments by default.
11 # in production environments by default.
12 group :assets do
12 group :assets do
13 gem 'sass-rails', '~> 3.2.3'
13 gem 'sass-rails', '~> 3.2.3'
14 gem 'coffee-rails', '~> 3.2.1'
14 gem 'coffee-rails', '~> 3.2.1'
15
15
16 # See https://github.com/sstephenson/execjs#readme for more supported runtimes
16 # See https://github.com/sstephenson/execjs#readme for more supported runtimes
17 # gem 'therubyracer', :platforms => :ruby
17 # gem 'therubyracer', :platforms => :ruby
18
18
19 gem 'uglifier', '>= 1.0.3'
19 gem 'uglifier', '>= 1.0.3'
20 end
20 end
21
21
22 gem 'prototype-rails'
22 gem 'prototype-rails'
23
23
24 # To use ActiveModel has_secure_password
24 # To use ActiveModel has_secure_password
25 # gem 'bcrypt-ruby', '~> 3.0.0'
25 # gem 'bcrypt-ruby', '~> 3.0.0'
26
26
27 # To use Jbuilder templates for JSON
27 # To use Jbuilder templates for JSON
28 # gem 'jbuilder'
28 # gem 'jbuilder'
29
29
30 # Use unicorn as the app server
30 # Use unicorn as the app server
31 # gem 'unicorn'
31 # gem 'unicorn'
32
32
33 # Deploy with Capistrano
33 # Deploy with Capistrano
34 # gem 'capistrano'
34 # gem 'capistrano'
35
35
36 # To use debugger
36 # To use debugger
37 # gem 'debugger'
37 # gem 'debugger'
38 #
38 #
39
39
40 gem 'jquery-rails'
40 gem 'jquery-rails'
41 gem 'jquery-ui-sass-rails'
41 gem 'jquery-ui-sass-rails'
42 gem 'jquery-timepicker-addon-rails'
42 gem 'jquery-timepicker-addon-rails'
43
43
44 + #syntax highlighter
45 + gem 'rouge'
44
46
45 gem "haml"
47 gem "haml"
46 gem "mail"
48 gem "mail"
47 gem "rdiscount"
49 gem "rdiscount"
48 gem "test-unit"
50 gem "test-unit"
49 gem 'will_paginate', '~> 3.0.0'
51 gem 'will_paginate', '~> 3.0.0'
50 gem 'dynamic_form'
52 gem 'dynamic_form'
51 gem 'in_place_editing'
53 gem 'in_place_editing'
52 gem 'verification', :git => 'git://github.com/sikachu/verification.git'
54 gem 'verification', :git => 'git://github.com/sikachu/verification.git'
53
55
54 group :test, :development do
56 group :test, :development do
55 gem "rspec-rails", "~> 2.0"
57 gem "rspec-rails", "~> 2.0"
56 end
58 end
@@ -1,166 +1,168
1 GIT
1 GIT
2 remote: git://github.com/sikachu/verification.git
2 remote: git://github.com/sikachu/verification.git
3 revision: 76eaf51b13276ecae54bd9cd115832595d2ff56d
3 revision: 76eaf51b13276ecae54bd9cd115832595d2ff56d
4 specs:
4 specs:
5 verification (1.0.3)
5 verification (1.0.3)
6 actionpack (>= 3.0.0, < 5.0)
6 actionpack (>= 3.0.0, < 5.0)
7 activesupport (>= 3.0.0, < 5.0)
7 activesupport (>= 3.0.0, < 5.0)
8
8
9 GEM
9 GEM
10 remote: https://rubygems.org/
10 remote: https://rubygems.org/
11 specs:
11 specs:
12 actionmailer (3.2.19)
12 actionmailer (3.2.19)
13 actionpack (= 3.2.19)
13 actionpack (= 3.2.19)
14 mail (~> 2.5.4)
14 mail (~> 2.5.4)
15 actionpack (3.2.19)
15 actionpack (3.2.19)
16 activemodel (= 3.2.19)
16 activemodel (= 3.2.19)
17 activesupport (= 3.2.19)
17 activesupport (= 3.2.19)
18 builder (~> 3.0.0)
18 builder (~> 3.0.0)
19 erubis (~> 2.7.0)
19 erubis (~> 2.7.0)
20 journey (~> 1.0.4)
20 journey (~> 1.0.4)
21 rack (~> 1.4.5)
21 rack (~> 1.4.5)
22 rack-cache (~> 1.2)
22 rack-cache (~> 1.2)
23 rack-test (~> 0.6.1)
23 rack-test (~> 0.6.1)
24 sprockets (~> 2.2.1)
24 sprockets (~> 2.2.1)
25 activemodel (3.2.19)
25 activemodel (3.2.19)
26 activesupport (= 3.2.19)
26 activesupport (= 3.2.19)
27 builder (~> 3.0.0)
27 builder (~> 3.0.0)
28 activerecord (3.2.19)
28 activerecord (3.2.19)
29 activemodel (= 3.2.19)
29 activemodel (= 3.2.19)
30 activesupport (= 3.2.19)
30 activesupport (= 3.2.19)
31 arel (~> 3.0.2)
31 arel (~> 3.0.2)
32 tzinfo (~> 0.3.29)
32 tzinfo (~> 0.3.29)
33 activeresource (3.2.19)
33 activeresource (3.2.19)
34 activemodel (= 3.2.19)
34 activemodel (= 3.2.19)
35 activesupport (= 3.2.19)
35 activesupport (= 3.2.19)
36 activesupport (3.2.19)
36 activesupport (3.2.19)
37 i18n (~> 0.6, >= 0.6.4)
37 i18n (~> 0.6, >= 0.6.4)
38 multi_json (~> 1.0)
38 multi_json (~> 1.0)
39 arel (3.0.3)
39 arel (3.0.3)
40 builder (3.0.4)
40 builder (3.0.4)
41 coffee-rails (3.2.2)
41 coffee-rails (3.2.2)
42 coffee-script (>= 2.2.0)
42 coffee-script (>= 2.2.0)
43 railties (~> 3.2.0)
43 railties (~> 3.2.0)
44 coffee-script (2.3.0)
44 coffee-script (2.3.0)
45 coffee-script-source
45 coffee-script-source
46 execjs
46 execjs
47 coffee-script-source (1.7.1)
47 coffee-script-source (1.7.1)
48 diff-lcs (1.2.5)
48 diff-lcs (1.2.5)
49 dynamic_form (1.1.4)
49 dynamic_form (1.1.4)
50 erubis (2.7.0)
50 erubis (2.7.0)
51 execjs (2.2.1)
51 execjs (2.2.1)
52 haml (4.0.5)
52 haml (4.0.5)
53 tilt
53 tilt
54 hike (1.2.3)
54 hike (1.2.3)
55 i18n (0.6.11)
55 i18n (0.6.11)
56 in_place_editing (1.2.0)
56 in_place_editing (1.2.0)
57 journey (1.0.4)
57 journey (1.0.4)
58 jquery-rails (3.1.1)
58 jquery-rails (3.1.1)
59 railties (>= 3.0, < 5.0)
59 railties (>= 3.0, < 5.0)
60 thor (>= 0.14, < 2.0)
60 thor (>= 0.14, < 2.0)
61 jquery-timepicker-addon-rails (1.4.1)
61 jquery-timepicker-addon-rails (1.4.1)
62 railties (>= 3.1)
62 railties (>= 3.1)
63 jquery-ui-rails (4.0.3)
63 jquery-ui-rails (4.0.3)
64 jquery-rails
64 jquery-rails
65 railties (>= 3.1.0)
65 railties (>= 3.1.0)
66 jquery-ui-sass-rails (4.0.3.0)
66 jquery-ui-sass-rails (4.0.3.0)
67 jquery-rails
67 jquery-rails
68 jquery-ui-rails (= 4.0.3)
68 jquery-ui-rails (= 4.0.3)
69 railties (>= 3.1.0)
69 railties (>= 3.1.0)
70 json (1.8.1)
70 json (1.8.1)
71 mail (2.5.4)
71 mail (2.5.4)
72 mime-types (~> 1.16)
72 mime-types (~> 1.16)
73 treetop (~> 1.4.8)
73 treetop (~> 1.4.8)
74 mime-types (1.25.1)
74 mime-types (1.25.1)
75 multi_json (1.10.1)
75 multi_json (1.10.1)
76 mysql2 (0.3.16)
76 mysql2 (0.3.16)
77 polyglot (0.3.5)
77 polyglot (0.3.5)
78 power_assert (0.1.3)
78 power_assert (0.1.3)
79 prototype-rails (3.2.1)
79 prototype-rails (3.2.1)
80 rails (~> 3.2)
80 rails (~> 3.2)
81 rack (1.4.5)
81 rack (1.4.5)
82 rack-cache (1.2)
82 rack-cache (1.2)
83 rack (>= 0.4)
83 rack (>= 0.4)
84 rack-ssl (1.3.4)
84 rack-ssl (1.3.4)
85 rack
85 rack
86 rack-test (0.6.2)
86 rack-test (0.6.2)
87 rack (>= 1.0)
87 rack (>= 1.0)
88 rails (3.2.19)
88 rails (3.2.19)
89 actionmailer (= 3.2.19)
89 actionmailer (= 3.2.19)
90 actionpack (= 3.2.19)
90 actionpack (= 3.2.19)
91 activerecord (= 3.2.19)
91 activerecord (= 3.2.19)
92 activeresource (= 3.2.19)
92 activeresource (= 3.2.19)
93 activesupport (= 3.2.19)
93 activesupport (= 3.2.19)
94 bundler (~> 1.0)
94 bundler (~> 1.0)
95 railties (= 3.2.19)
95 railties (= 3.2.19)
96 railties (3.2.19)
96 railties (3.2.19)
97 actionpack (= 3.2.19)
97 actionpack (= 3.2.19)
98 activesupport (= 3.2.19)
98 activesupport (= 3.2.19)
99 rack-ssl (~> 1.3.2)
99 rack-ssl (~> 1.3.2)
100 rake (>= 0.8.7)
100 rake (>= 0.8.7)
101 rdoc (~> 3.4)
101 rdoc (~> 3.4)
102 thor (>= 0.14.6, < 2.0)
102 thor (>= 0.14.6, < 2.0)
103 rake (10.3.2)
103 rake (10.3.2)
104 rdiscount (2.1.7.1)
104 rdiscount (2.1.7.1)
105 rdoc (3.12.2)
105 rdoc (3.12.2)
106 json (~> 1.4)
106 json (~> 1.4)
107 + rouge (1.6.2)
107 rspec-collection_matchers (1.0.0)
108 rspec-collection_matchers (1.0.0)
108 rspec-expectations (>= 2.99.0.beta1)
109 rspec-expectations (>= 2.99.0.beta1)
109 rspec-core (2.99.2)
110 rspec-core (2.99.2)
110 rspec-expectations (2.99.2)
111 rspec-expectations (2.99.2)
111 diff-lcs (>= 1.1.3, < 2.0)
112 diff-lcs (>= 1.1.3, < 2.0)
112 rspec-mocks (2.99.2)
113 rspec-mocks (2.99.2)
113 rspec-rails (2.99.0)
114 rspec-rails (2.99.0)
114 actionpack (>= 3.0)
115 actionpack (>= 3.0)
115 activemodel (>= 3.0)
116 activemodel (>= 3.0)
116 activesupport (>= 3.0)
117 activesupport (>= 3.0)
117 railties (>= 3.0)
118 railties (>= 3.0)
118 rspec-collection_matchers
119 rspec-collection_matchers
119 rspec-core (~> 2.99.0)
120 rspec-core (~> 2.99.0)
120 rspec-expectations (~> 2.99.0)
121 rspec-expectations (~> 2.99.0)
121 rspec-mocks (~> 2.99.0)
122 rspec-mocks (~> 2.99.0)
122 sass (3.4.1)
123 sass (3.4.1)
123 sass-rails (3.2.6)
124 sass-rails (3.2.6)
124 railties (~> 3.2.0)
125 railties (~> 3.2.0)
125 sass (>= 3.1.10)
126 sass (>= 3.1.10)
126 tilt (~> 1.3)
127 tilt (~> 1.3)
127 sprockets (2.2.2)
128 sprockets (2.2.2)
128 hike (~> 1.2)
129 hike (~> 1.2)
129 multi_json (~> 1.0)
130 multi_json (~> 1.0)
130 rack (~> 1.0)
131 rack (~> 1.0)
131 tilt (~> 1.1, != 1.3.0)
132 tilt (~> 1.1, != 1.3.0)
132 test-unit (3.0.1)
133 test-unit (3.0.1)
133 power_assert
134 power_assert
134 thor (0.19.1)
135 thor (0.19.1)
135 tilt (1.4.1)
136 tilt (1.4.1)
136 treetop (1.4.15)
137 treetop (1.4.15)
137 polyglot
138 polyglot
138 polyglot (>= 0.3.1)
139 polyglot (>= 0.3.1)
139 tzinfo (0.3.41)
140 tzinfo (0.3.41)
140 uglifier (2.5.3)
141 uglifier (2.5.3)
141 execjs (>= 0.3.0)
142 execjs (>= 0.3.0)
142 json (>= 1.8.0)
143 json (>= 1.8.0)
143 will_paginate (3.0.7)
144 will_paginate (3.0.7)
144
145
145 PLATFORMS
146 PLATFORMS
146 ruby
147 ruby
147
148
148 DEPENDENCIES
149 DEPENDENCIES
149 coffee-rails (~> 3.2.1)
150 coffee-rails (~> 3.2.1)
150 dynamic_form
151 dynamic_form
151 haml
152 haml
152 in_place_editing
153 in_place_editing
153 jquery-rails
154 jquery-rails
154 jquery-timepicker-addon-rails
155 jquery-timepicker-addon-rails
155 jquery-ui-sass-rails
156 jquery-ui-sass-rails
156 mail
157 mail
157 mysql2
158 mysql2
158 prototype-rails
159 prototype-rails
159 rails (= 3.2.19)
160 rails (= 3.2.19)
160 rdiscount
161 rdiscount
162 + rouge
161 rspec-rails (~> 2.0)
163 rspec-rails (~> 2.0)
162 sass-rails (~> 3.2.3)
164 sass-rails (~> 3.2.3)
163 test-unit
165 test-unit
164 uglifier (>= 1.0.3)
166 uglifier (>= 1.0.3)
165 verification!
167 verification!
166 will_paginate (~> 3.0.0)
168 will_paginate (~> 3.0.0)
@@ -1,83 +1,92
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 + unless user.admin?
10 + flash[:notice] = 'You are not authorized to view the page you requested'
11 + redirect_to :controller => 'main', :action => 'login' unless user.admin?
12 + return false
13 + end
14 + return true
10 end
15 end
11
16
12 def authorization_by_roles(allowed_roles)
17 def authorization_by_roles(allowed_roles)
13 return false unless authenticate
18 return false unless authenticate
14 user = User.find(session[:user_id])
19 user = User.find(session[:user_id])
15 unless user.roles.detect { |role| allowed_roles.member?(role.name) }
20 unless user.roles.detect { |role| allowed_roles.member?(role.name) }
16 flash[:notice] = 'You are not authorized to view the page you requested'
21 flash[:notice] = 'You are not authorized to view the page you requested'
17 redirect_to :controller => 'main', :action => 'login'
22 redirect_to :controller => 'main', :action => 'login'
18 return false
23 return false
19 end
24 end
20 end
25 end
21
26
22 protected
27 protected
23
28
24 def authenticate
29 def authenticate
25 unless session[:user_id]
30 unless session[:user_id]
31 + flash[:notice] = 'You need to login'
32 + if GraderConfiguration[SINGLE_USER_MODE_CONF_KEY]
33 + flash[:notice] = 'You need to login but you cannot log in at this time'
34 + end
26 redirect_to :controller => 'main', :action => 'login'
35 redirect_to :controller => 'main', :action => 'login'
27 return false
36 return false
28 end
37 end
29
38
30 # check if run in single user mode
39 # check if run in single user mode
31 if GraderConfiguration[SINGLE_USER_MODE_CONF_KEY]
40 if GraderConfiguration[SINGLE_USER_MODE_CONF_KEY]
32 user = User.find(session[:user_id])
41 user = User.find(session[:user_id])
33 if user==nil or (not user.admin?)
42 if user==nil or (not user.admin?)
34 flash[:notice] = 'You cannot log in at this time'
43 flash[:notice] = 'You cannot log in at this time'
35 redirect_to :controller => 'main', :action => 'login'
44 redirect_to :controller => 'main', :action => 'login'
36 return false
45 return false
37 end
46 end
38 return true
47 return true
39 end
48 end
40
49
41 if GraderConfiguration.multicontests?
50 if GraderConfiguration.multicontests?
42 user = User.find(session[:user_id])
51 user = User.find(session[:user_id])
43 return true if user.admin?
52 return true if user.admin?
44 begin
53 begin
45 if user.contest_stat(true).forced_logout
54 if user.contest_stat(true).forced_logout
46 flash[:notice] = 'You have been automatically logged out.'
55 flash[:notice] = 'You have been automatically logged out.'
47 redirect_to :controller => 'main', :action => 'index'
56 redirect_to :controller => 'main', :action => 'index'
48 end
57 end
49 rescue
58 rescue
50 end
59 end
51 end
60 end
52 return true
61 return true
53 end
62 end
54
63
55 def authorization
64 def authorization
56 return false unless authenticate
65 return false unless authenticate
57 user = User.find(session[:user_id])
66 user = User.find(session[:user_id])
58 unless user.roles.detect { |role|
67 unless user.roles.detect { |role|
59 role.rights.detect{ |right|
68 role.rights.detect{ |right|
60 right.controller == self.class.controller_name and
69 right.controller == self.class.controller_name and
61 (right.action == 'all' or right.action == action_name)
70 (right.action == 'all' or right.action == action_name)
62 }
71 }
63 }
72 }
64 flash[:notice] = 'You are not authorized to view the page you requested'
73 flash[:notice] = 'You are not authorized to view the page you requested'
65 #request.env['HTTP_REFERER'] ? (redirect_to :back) : (redirect_to :controller => 'login')
74 #request.env['HTTP_REFERER'] ? (redirect_to :back) : (redirect_to :controller => 'login')
66 redirect_to :controller => 'main', :action => 'login'
75 redirect_to :controller => 'main', :action => 'login'
67 return false
76 return false
68 end
77 end
69 end
78 end
70
79
71 def verify_time_limit
80 def verify_time_limit
72 return true if session[:user_id]==nil
81 return true if session[:user_id]==nil
73 user = User.find(session[:user_id], :include => :site)
82 user = User.find(session[:user_id], :include => :site)
74 return true if user==nil or user.site == nil
83 return true if user==nil or user.site == nil
75 if user.contest_finished?
84 if user.contest_finished?
76 flash[:notice] = 'Error: the contest you are participating is over.'
85 flash[:notice] = 'Error: the contest you are participating is over.'
77 redirect_to :back
86 redirect_to :back
78 return false
87 return false
79 end
88 end
80 return true
89 return true
81 end
90 end
82
91
83 end
92 end
@@ -1,96 +1,117
1 class GradersController < ApplicationController
1 class GradersController < ApplicationController
2
2
3 - before_filter :admin_authorization
3 + before_filter :admin_authorization, except: [ :submission ]
4 + before_filter(only: [:submission]) {
5 + return false unless authenticate
6 +
7 + if GraderConfiguration["right.user_view_submission"]
8 + return true;
9 + end
10 +
11 + admin_authorization
12 + }
4
13
5 verify :method => :post, :only => ['clear_all',
14 verify :method => :post, :only => ['clear_all',
6 'start_exam',
15 'start_exam',
7 'start_grading',
16 'start_grading',
8 'stop_all',
17 'stop_all',
9 'clear_terminated'],
18 'clear_terminated'],
10 :redirect_to => {:action => 'index'}
19 :redirect_to => {:action => 'index'}
11
20
12 def index
21 def index
13 redirect_to :action => 'list'
22 redirect_to :action => 'list'
14 end
23 end
15
24
16 def list
25 def list
17 @grader_processes = GraderProcess.find_running_graders
26 @grader_processes = GraderProcess.find_running_graders
18 @stalled_processes = GraderProcess.find_stalled_process
27 @stalled_processes = GraderProcess.find_stalled_process
19
28
20 @terminated_processes = GraderProcess.find_terminated_graders
29 @terminated_processes = GraderProcess.find_terminated_graders
21
30
22 @last_task = Task.find(:first,
31 @last_task = Task.find(:first,
23 :order => 'created_at DESC')
32 :order => 'created_at DESC')
24 @last_test_request = TestRequest.find(:first,
33 @last_test_request = TestRequest.find(:first,
25 :order => 'created_at DESC')
34 :order => 'created_at DESC')
26 end
35 end
27
36
28 def clear
37 def clear
29 grader_proc = GraderProcess.find(params[:id])
38 grader_proc = GraderProcess.find(params[:id])
30 grader_proc.destroy if grader_proc!=nil
39 grader_proc.destroy if grader_proc!=nil
31 redirect_to :action => 'list'
40 redirect_to :action => 'list'
32 end
41 end
33
42
34 def clear_terminated
43 def clear_terminated
35 GraderProcess.find_terminated_graders.each do |p|
44 GraderProcess.find_terminated_graders.each do |p|
36 p.destroy
45 p.destroy
37 end
46 end
38 redirect_to :action => 'list'
47 redirect_to :action => 'list'
39 end
48 end
40
49
41 def clear_all
50 def clear_all
42 GraderProcess.find(:all).each do |p|
51 GraderProcess.find(:all).each do |p|
43 p.destroy
52 p.destroy
44 end
53 end
45 redirect_to :action => 'list'
54 redirect_to :action => 'list'
46 end
55 end
47
56
48 def view
57 def view
49 if params[:type]=='Task'
58 if params[:type]=='Task'
50 redirect_to :action => 'task', :id => params[:id]
59 redirect_to :action => 'task', :id => params[:id]
51 else
60 else
52 redirect_to :action => 'test_request', :id => params[:id]
61 redirect_to :action => 'test_request', :id => params[:id]
53 end
62 end
54 end
63 end
55
64
56 def test_request
65 def test_request
57 @test_request = TestRequest.find(params[:id])
66 @test_request = TestRequest.find(params[:id])
58 end
67 end
59
68
60 def task
69 def task
61 @task = Task.find(params[:id])
70 @task = Task.find(params[:id])
62 end
71 end
63
72
64 def submission
73 def submission
65 @submission = Submission.find(params[:id])
74 @submission = Submission.find(params[:id])
75 + formatter = Rouge::Formatters::HTML.new(css_class: 'highlight', line_numbers: true )
76 + lexer = case @submission.language.name
77 + when "c" then Rouge::Lexers::C.new
78 + when "cpp" then Rouge::Lexers::Cpp.new
79 + when "pas" then Rouge::Lexers::Pas.new
80 + when "ruby" then Rouge::Lexers::Ruby.new
81 + when "python" then Rouge::Lexers::Python.new
82 + when "java" then Rouge::Lexers::Java.new
83 + end
84 + @formatted_code = formatter.format(lexer.lex(@submission.source))
85 + @css_style = Rouge::Themes::ThankfulEyes.render(scope: '.highlight')
86 +
66 end
87 end
67
88
68 # various grader controls
89 # various grader controls
69
90
70 def stop
91 def stop
71 grader_proc = GraderProcess.find(params[:id])
92 grader_proc = GraderProcess.find(params[:id])
72 GraderScript.stop_grader(grader_proc.pid)
93 GraderScript.stop_grader(grader_proc.pid)
73 flash[:notice] = 'Grader stopped. It may not disappear now, but it should disappear shortly.'
94 flash[:notice] = 'Grader stopped. It may not disappear now, but it should disappear shortly.'
74 redirect_to :action => 'list'
95 redirect_to :action => 'list'
75 end
96 end
76
97
77 def stop_all
98 def stop_all
78 GraderScript.stop_graders(GraderProcess.find_running_graders +
99 GraderScript.stop_graders(GraderProcess.find_running_graders +
79 GraderProcess.find_stalled_process)
100 GraderProcess.find_stalled_process)
80 flash[:notice] = 'Graders stopped. They may not disappear now, but they should disappear shortly.'
101 flash[:notice] = 'Graders stopped. They may not disappear now, but they should disappear shortly.'
81 redirect_to :action => 'list'
102 redirect_to :action => 'list'
82 end
103 end
83
104
84 def start_grading
105 def start_grading
85 GraderScript.start_grader('grading')
106 GraderScript.start_grader('grading')
86 flash[:notice] = '2 graders in grading env started, one for grading queue tasks, another for grading test request'
107 flash[:notice] = '2 graders in grading env started, one for grading queue tasks, another for grading test request'
87 redirect_to :action => 'list'
108 redirect_to :action => 'list'
88 end
109 end
89
110
90 def start_exam
111 def start_exam
91 GraderScript.start_grader('exam')
112 GraderScript.start_grader('exam')
92 flash[:notice] = '2 graders in grading env started, one for grading queue tasks, another for grading test request'
113 flash[:notice] = '2 graders in grading env started, one for grading queue tasks, another for grading test request'
93 redirect_to :action => 'list'
114 redirect_to :action => 'list'
94 end
115 end
95
116
96 end
117 end
@@ -1,72 +1,188
1 class ReportController < ApplicationController
1 class ReportController < ApplicationController
2 +
3 + before_filter :admin_authorization, only: [:login_stat,:submission_stat]
4 + before_filter(only: [:problem_hof]) { |c|
5 + return false unless authenticate
6 +
7 + if GraderConfiguration["right.user_view_submission"]
8 + return true;
9 + end
10 +
11 + admin_authorization
12 + }
13 +
2 def login_stat
14 def login_stat
3 @logins = Array.new
15 @logins = Array.new
4
16
5 date_and_time = '%Y-%m-%d %H:%M'
17 date_and_time = '%Y-%m-%d %H:%M'
6 begin
18 begin
7 @since_time = DateTime.strptime(params[:since_datetime],date_and_time)
19 @since_time = DateTime.strptime(params[:since_datetime],date_and_time)
8 rescue
20 rescue
9 @since_time = DateTime.new(1000,1,1)
21 @since_time = DateTime.new(1000,1,1)
10 end
22 end
11 begin
23 begin
12 @until_time = DateTime.strptime(params[:until_datetime],date_and_time)
24 @until_time = DateTime.strptime(params[:until_datetime],date_and_time)
13 rescue
25 rescue
14 @until_time = DateTime.new(3000,1,1)
26 @until_time = DateTime.new(3000,1,1)
15 end
27 end
16
28
17 User.all.each do |user|
29 User.all.each do |user|
18 @logins << { login: user.login,
30 @logins << { login: user.login,
19 full_name: user.full_name,
31 full_name: user.full_name,
20 count: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
32 count: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
21 user.id,@since_time,@until_time)
33 user.id,@since_time,@until_time)
22 .count(:id),
34 .count(:id),
23 min: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
35 min: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
24 user.id,@since_time,@until_time)
36 user.id,@since_time,@until_time)
25 .minimum(:created_at),
37 .minimum(:created_at),
26 max: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
38 max: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
27 user.id,@since_time,@until_time)
39 user.id,@since_time,@until_time)
28 .maximum(:created_at)
40 .maximum(:created_at)
29 }
41 }
30 end
42 end
31 end
43 end
32
44
33 def submission_stat
45 def submission_stat
34
46
35 date_and_time = '%Y-%m-%d %H:%M'
47 date_and_time = '%Y-%m-%d %H:%M'
36 begin
48 begin
37 @since_time = DateTime.strptime(params[:since_datetime],date_and_time)
49 @since_time = DateTime.strptime(params[:since_datetime],date_and_time)
38 rescue
50 rescue
39 @since_time = DateTime.new(1000,1,1)
51 @since_time = DateTime.new(1000,1,1)
40 end
52 end
41 begin
53 begin
42 @until_time = DateTime.strptime(params[:until_datetime],date_and_time)
54 @until_time = DateTime.strptime(params[:until_datetime],date_and_time)
43 rescue
55 rescue
44 @until_time = DateTime.new(3000,1,1)
56 @until_time = DateTime.new(3000,1,1)
45 end
57 end
46
58
47 @submissions = {}
59 @submissions = {}
48
60
49 User.find_each do |user|
61 User.find_each do |user|
50 @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: { } }
51 end
63 end
52
64
53 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|
54 if @submissions[s.user_id]
66 if @submissions[s.user_id]
55 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)
56 a = nil
68 a = nil
57 begin
69 begin
58 a = Problem.find(s.problem_id)
70 a = Problem.find(s.problem_id)
59 rescue
71 rescue
60 a = nil
72 a = nil
61 end
73 end
62 @submissions[s.user_id][:sub][s.problem_id] =
74 @submissions[s.user_id][:sub][s.problem_id] =
63 { prob_name: (a ? a.full_name : '(NULL)'),
75 { prob_name: (a ? a.full_name : '(NULL)'),
64 sub_ids: [s.id] }
76 sub_ids: [s.id] }
65 else
77 else
66 @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
67 end
79 end
68 @submissions[s.user_id][:count] += 1
80 @submissions[s.user_id][:count] += 1
69 end
81 end
70 end
82 end
71 end
83 end
84 +
85 + def problem_hof
86 + # gen problem list
87 + @user = User.find(session[:user_id])
88 + @problems = @user.available_problems
89 +
90 + # get selected problems or the default
91 + if params[:id]
92 + begin
93 + @problem = Problem.available.find(params[:id])
94 + rescue
95 + redirect_to action: :problem_hof
96 + flash[:notice] = 'Error: submissions for that problem are not viewable.'
97 + return
98 + end
99 + end
100 +
101 + if @problem
102 + #aggregrate by language
103 + @by_lang = {}
104 + Submission.where(problem_id: @problem.id).find_each do |sub|
105 + lang = Language.find_by_id(sub.language_id)
106 + next unless lang
107 + next unless sub.points >= @problem.full_score
108 +
109 + #initialize
110 + unless @by_lang.has_key?(lang.pretty_name)
111 + @by_lang[lang.pretty_name] = {
112 + runtime: { avail: false, value: 2**30-1 },
113 + memory: { avail: false, value: 2**30-1 },
114 + length: { avail: false, value: 2**30-1 },
115 + first: { avail: false, value: DateTime.new(3000,1,1) }
116 + }
117 + end
118 +
119 + if sub.max_runtime and sub.max_runtime < @by_lang[lang.pretty_name][:runtime][:value]
120 + @by_lang[lang.pretty_name][:runtime] = {
121 + avail: true,
122 + user_id: sub.user_id,
123 + value: sub.max_runtime,
124 + sub_id: sub.id
125 + }
126 + end
127 +
128 + if sub.peak_memory and sub.peak_memory < @by_lang[lang.pretty_name][:memory][:value]
129 + @by_lang[lang.pretty_name][:memory] = {
130 + avail: true,
131 + user_id: sub.user_id,
132 + value: sub.peak_memory,
133 + sub_id: sub.id
134 + }
135 + end
136 +
137 + if sub.submitted_at and sub.submitted_at < @by_lang[lang.pretty_name][:first][:value] and
138 + !sub.user.admin?
139 + @by_lang[lang.pretty_name][:first] = {
140 + avail: true,
141 + user_id: sub.user_id,
142 + value: sub.submitted_at,
143 + sub_id: sub.id
144 + }
145 + end
146 +
147 + if @by_lang[lang.pretty_name][:length][:value] > sub.effective_code_length
148 + @by_lang[lang.pretty_name][:length] = {
149 + avail: true,
150 + user_id: sub.user_id,
151 + value: sub.effective_code_length,
152 + sub_id: sub.id
153 + }
154 + end
155 + end
156 +
157 + #process user_id
158 + @by_lang.each do |lang,prop|
159 + prop.each do |k,v|
160 + v[:user] = User.exists?(v[:user_id]) ? User.find(v[:user_id]).full_name : "(NULL)"
161 + end
162 + end
163 +
164 + #sum into best
165 + if @by_lang and @by_lang.first
166 + @best = @by_lang.first[1]
167 + @by_lang.each do |lang,prop|
168 + if @best[:runtime][:value] >= prop[:runtime][:value]
169 + @best[:runtime] = prop[:runtime]
170 + @best[:runtime][:lang] = lang
171 + end
172 + if @best[:memory][:value] >= prop[:memory][:value]
173 + @best[:memory] = prop[:memory]
174 + @best[:memory][:lang] = lang
175 + end
176 + if @best[:length][:value] >= prop[:length][:value]
177 + @best[:length] = prop[:length]
178 + @best[:length][:lang] = lang
179 + end
180 + if @best[:first][:value] >= prop[:first][:value]
181 + @best[:first] = prop[:first]
182 + @best[:first][:lang] = lang
183 + end
184 + end
185 + end
186 + end
187 + end
72 end
188 end
@@ -1,134 +1,138
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['right.user_hall_of_fame']
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 = "&nbsp;&nbsp;" + (t 'title_bar.contest_not_started')
93 time_left = "&nbsp;&nbsp;" + (t 'title_bar.contest_not_started')
90 else
94 else
91 time_left = "&nbsp;&nbsp;" + (t 'title_bar.remaining_time') +
95 time_left = "&nbsp;&nbsp;" + (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
129 def markdown(text)
133 def markdown(text)
130 markdown = RDiscount.new(text)
134 markdown = RDiscount.new(text)
131 markdown.to_html.html_safe
135 markdown.to_html.html_safe
132 end
136 end
133
137
134 end
138 end
@@ -1,22 +1,27
1 + %style{type: "text/css"}
2 + = @css_style
3 +
1 %h1= "Submission: #{@submission.id}"
4 %h1= "Submission: #{@submission.id}"
2
5
3 %p
6 %p
4 User:
7 User:
5 - = "#{@submission.user.login}"
8 + = "(#{@submission.user.login}) #{@submission.user.full_name}"
6 %br/
9 %br/
7 Problem:
10 Problem:
8 - if @submission.problem!=nil
11 - if @submission.problem!=nil
9 = "#{@submission.problem.full_name}"
12 = "#{@submission.problem.full_name}"
10 - else
13 - else
11 = "(n/a)"
14 = "(n/a)"
12 %br/
15 %br/
13 = "Number: #{@submission.number}"
16 = "Number: #{@submission.number}"
14 %br/
17 %br/
15 = "Submitted at: #{format_short_time(@submission.submitted_at)}"
18 = "Submitted at: #{format_short_time(@submission.submitted_at)}"
19 + %br/
20 + = "Points : #{@submission.points}/#{@submission.problem.full_score}"
21 + %br/
22 + = "Comment : #{@submission.grader_comment}"
16
23
17 %b Source code (first 10kb)
24 %b Source code (first 10kb)
18 - %div{:style => "border: 1px solid black; background: lightgrey"}
25 + //%div.highlight{:style => "border: 1px solid black;"}
19 - - if @submission.source
26 + =@formatted_code.html_safe
20 - %pre
21 - =h truncate @submission.source, :length => 10240
22
27
@@ -1,6 +1,7
1
1
2 .task-menu
2 .task-menu
3 Reports
3 Reports
4 %br/
4 %br/
5 + = link_to '[Hall of Fame]', :action => 'problem_hof'
5 = link_to '[Submission]', :action => 'submission_stat'
6 = link_to '[Submission]', :action => 'submission_stat'
6 = link_to '[Login]', :action => 'login_stat'
7 = link_to '[Login]', :action => 'login_stat'
@@ -1,33 +1,31
1 - content_for :header do
1 - content_for :header do
2 = javascript_include_tag 'new'
2 = javascript_include_tag 'new'
3
3
4 %script{:type=>"text/javascript"}
4 %script{:type=>"text/javascript"}
5 $(function () {
5 $(function () {
6 $('#since_datetime').datetimepicker({ showButtonPanel: true, dateFormat: "yy-mm-dd", controlType: "slider"} );
6 $('#since_datetime').datetimepicker({ showButtonPanel: true, dateFormat: "yy-mm-dd", controlType: "slider"} );
7 $('#until_datetime').datetimepicker({ showButtonPanel: true, dateFormat: "yy-mm-dd", controlType: "slider"} );
7 $('#until_datetime').datetimepicker({ showButtonPanel: true, dateFormat: "yy-mm-dd", controlType: "slider"} );
8 });
8 });
9
9
10 -
11 %h1 Login status
10 %h1 Login status
12
11
13 -
14 =render partial: 'report_menu'
12 =render partial: 'report_menu'
15 =render partial: 'date_range', locals: {param_text: 'Login date range:', title: 'Query login stat in the range' }
13 =render partial: 'date_range', locals: {param_text: 'Login date range:', title: 'Query login stat in the range' }
16
14
17 %table.info
15 %table.info
18 %thead
16 %thead
19 %tr.info-head
17 %tr.info-head
20 %th login
18 %th login
21 %th full name
19 %th full name
22 %th login count
20 %th login count
23 %th earliest
21 %th earliest
24 %th latest
22 %th latest
25 %tbody
23 %tbody
26 - @logins.each do |l|
24 - @logins.each do |l|
27 %tr{class: cycle('info-even','info-odd')}
25 %tr{class: cycle('info-even','info-odd')}
28 %td= l[:login]
26 %td= l[:login]
29 %td= l[:full_name]
27 %td= l[:full_name]
30 %td= l[:count]
28 %td= l[:count]
31 %td= l[:min] ? l[:min].in_time_zone.strftime('%Y-%m-%d %H:%M') : ''
29 %td= l[:min] ? l[:min].in_time_zone.strftime('%Y-%m-%d %H:%M') : ''
32 %td= l[:max] ? l[:max].in_time_zone.strftime('%Y-%m-%d %H:%M') : ''
30 %td= l[:max] ? l[:max].in_time_zone.strftime('%Y-%m-%d %H:%M') : ''
33
31
@@ -1,41 +1,37
1 - content_for :header do
1 - content_for :header do
2 = javascript_include_tag 'new'
2 = javascript_include_tag 'new'
3
3
4 %script{:type=>"text/javascript"}
4 %script{:type=>"text/javascript"}
5 $(function () {
5 $(function () {
6 $('#since_datetime').datetimepicker({ showButtonPanel: true, dateFormat: "yy-mm-dd", controlType: "slider"} );
6 $('#since_datetime').datetimepicker({ showButtonPanel: true, dateFormat: "yy-mm-dd", controlType: "slider"} );
7 $('#until_datetime').datetimepicker({ showButtonPanel: true, dateFormat: "yy-mm-dd", controlType: "slider"} );
7 $('#until_datetime').datetimepicker({ showButtonPanel: true, dateFormat: "yy-mm-dd", controlType: "slider"} );
8 });
8 });
9
9
10 -
11 %h1 Login status
10 %h1 Login status
12
11
13 -
14 -
15 -
16 =render partial: 'report_menu'
12 =render partial: 'report_menu'
17 =render partial: 'date_range', locals: {param_text: 'Submission date range:', title: 'Query submission stat in the range' }
13 =render partial: 'date_range', locals: {param_text: 'Submission date range:', title: 'Query submission stat in the range' }
18
14
19 %table.info
15 %table.info
20 %thead
16 %thead
21 %tr.info-head
17 %tr.info-head
22 %th login
18 %th login
23 %th full name
19 %th full name
24 %th total submissions
20 %th total submissions
25 %th submissions
21 %th submissions
26 %tbody
22 %tbody
27 - @submissions.each do |user_id,data|
23 - @submissions.each do |user_id,data|
28 %tr{class: cycle('info-even','info-odd')}
24 %tr{class: cycle('info-even','info-odd')}
29 %td= data[:login]
25 %td= data[:login]
30 %td= data[:full_name]
26 %td= data[:full_name]
31 %td= data[:count]
27 %td= data[:count]
32 %td
28 %td
33 - data[:sub].each do |prob_id,sub_data|
29 - data[:sub].each do |prob_id,sub_data|
34 = "#{sub_data[:prob_name]}: ["
30 = "#{sub_data[:prob_name]}: ["
35 - st = []
31 - st = []
36 - sub_data[:sub_ids].each do |id|
32 - sub_data[:sub_ids].each do |id|
37 - st << link_to(id, controller: 'graders' , action: 'submission', id: id)
33 - st << link_to(id, controller: 'graders' , action: 'submission', id: id)
38 = raw st.join ', '
34 = raw st.join ', '
39 = ']'
35 = ']'
40 %br/
36 %br/
41
37
@@ -1,64 +1,64
1 require File.expand_path('../boot', __FILE__)
1 require File.expand_path('../boot', __FILE__)
2
2
3 require 'rails/all'
3 require 'rails/all'
4
4
5 if defined?(Bundler)
5 if defined?(Bundler)
6 # If you precompile assets before deploying to production, use this line
6 # If you precompile assets before deploying to production, use this line
7 Bundler.require(*Rails.groups(:assets => %w(development test)))
7 Bundler.require(*Rails.groups(:assets => %w(development test)))
8 # If you want your assets lazily compiled in production, use this line
8 # If you want your assets lazily compiled in production, use this line
9 # Bundler.require(:default, :assets, Rails.env)
9 # Bundler.require(:default, :assets, Rails.env)
10 end
10 end
11
11
12 module CafeGrader
12 module CafeGrader
13 class Application < Rails::Application
13 class Application < Rails::Application
14 # Settings in config/environments/* take precedence over those specified here.
14 # Settings in config/environments/* take precedence over those specified here.
15 # Application configuration should go into files in config/initializers
15 # Application configuration should go into files in config/initializers
16 # -- all .rb files in that directory are automatically loaded.
16 # -- all .rb files in that directory are automatically loaded.
17
17
18 # Custom directories with classes and modules you want to be autoloadable.
18 # Custom directories with classes and modules you want to be autoloadable.
19 config.autoload_paths += %W(#{config.root}/lib)
19 config.autoload_paths += %W(#{config.root}/lib)
20
20
21 # Only load the plugins named here, in the order given (default is alphabetical).
21 # Only load the plugins named here, in the order given (default is alphabetical).
22 # :all can be used as a placeholder for all plugins not explicitly named.
22 # :all can be used as a placeholder for all plugins not explicitly named.
23 # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
23 # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
24
24
25 # Activate observers that should always be running.
25 # Activate observers that should always be running.
26 # config.active_record.observers = :cacher, :garbage_collector, :forum_observer
26 # config.active_record.observers = :cacher, :garbage_collector, :forum_observer
27
27
28 # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
28 # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
29 # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
29 # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
30 config.time_zone = 'UTC'
30 config.time_zone = 'UTC'
31
31
32 # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
32 # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
33 # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
33 # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
34 config.i18n.default_locale = :en
34 config.i18n.default_locale = :en
35
35
36 # Configure the default encoding used in templates for Ruby 1.9.
36 # Configure the default encoding used in templates for Ruby 1.9.
37 config.encoding = "utf-8"
37 config.encoding = "utf-8"
38
38
39 # Configure sensitive parameters which will be filtered from the log file.
39 # Configure sensitive parameters which will be filtered from the log file.
40 config.filter_parameters += [:password]
40 config.filter_parameters += [:password]
41
41
42 # Enable escaping HTML in JSON.
42 # Enable escaping HTML in JSON.
43 config.active_support.escape_html_entities_in_json = true
43 config.active_support.escape_html_entities_in_json = true
44
44
45 # Use SQL instead of Active Record's schema dumper when creating the database.
45 # Use SQL instead of Active Record's schema dumper when creating the database.
46 # This is necessary if your schema can't be completely dumped by the schema dumper,
46 # This is necessary if your schema can't be completely dumped by the schema dumper,
47 # like if you have constraints or database-specific column types
47 # like if you have constraints or database-specific column types
48 # config.active_record.schema_format = :sql
48 # config.active_record.schema_format = :sql
49
49
50 # Enforce whitelist mode for mass assignment.
50 # Enforce whitelist mode for mass assignment.
51 # This will create an empty whitelist of attributes available for mass-assignment for all models
51 # This will create an empty whitelist of attributes available for mass-assignment for all models
52 # in your app. As such, your models will need to explicitly whitelist or blacklist accessible
52 # in your app. As such, your models will need to explicitly whitelist or blacklist accessible
53 # parameters by using an attr_accessible or attr_protected declaration.
53 # parameters by using an attr_accessible or attr_protected declaration.
54 config.active_record.whitelist_attributes = false
54 config.active_record.whitelist_attributes = false
55
55
56 # Enable the asset pipeline
56 # Enable the asset pipeline
57 config.assets.enabled = true
57 config.assets.enabled = true
58
58
59 # Version of your assets, change this if you want to expire all your assets
59 # Version of your assets, change this if you want to expire all your assets
60 config.assets.version = '1.0'
60 config.assets.version = '1.0'
61
61
62 - config.assets.precompile += ['announcement_refresh.js','effects.js','site_update.js','graders.css','problems.css']
62 + config.assets.precompile += ['announcement_refresh.js','effects.js','site_update.js','graders.css','problems.css','new.js']
63 end
63 end
64 end
64 end
@@ -1,158 +1,159
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
119 You have requested for new password for %{contest_name}. We have generated it for you:
120 You have requested for new password for %{contest_name}. We have generated it for you:
120
121
121 user name: %{login}
122 user name: %{login}
122 password: %{password}
123 password: %{password}
123
124
124 If you didn't ask for new password or you're not the person who registered,
125 If you didn't ask for new password or you're not the person who registered,
125 please ignore this e-mail and inform %{admin_email} of this mistake.
126 please ignore this e-mail and inform %{admin_email} of this mistake.
126
127
127 Thanks!"
128 Thanks!"
128
129
129 contest:
130 contest:
130 notification:
131 notification:
131 email_subject: "[%{contest_title_name}] You have been upgraded to %{contest_name}"
132 email_subject: "[%{contest_title_name}] You have been upgraded to %{contest_name}"
132 email_body: "Congratulations %{full_name},
133 email_body: "Congratulations %{full_name},
133
134
134 You have advanced to contest %{contest_name} in %{contest_title_name}.
135 You have advanced to contest %{contest_name} in %{contest_title_name}.
135
136
136 You can now log-in and start participating in that contest.
137 You can now log-in and start participating in that contest.
137
138
138 Cheers!
139 Cheers!
139 -%{contest_title_name} Admin"
140 -%{contest_title_name} Admin"
140
141
141 help:
142 help:
142 how_to_submit: "How to submit"
143 how_to_submit: "How to submit"
143 must_specify_language: "You <b>must</b> specify the language you are using in your program header. You can optionally specify the task you are submitting to."
144 must_specify_language: "You <b>must</b> specify the language you are using in your program header. You can optionally specify the task you are submitting to."
144 list_available_language: "The possible language options are <tt>C</tt>, <tt>C++</tt>, and <tt>Pascal</tt>. The follow are examples."
145 list_available_language: "The possible language options are <tt>C</tt>, <tt>C++</tt>, and <tt>Pascal</tt>. The follow are examples."
145 accept_only_language_specified: "The server <b>will not</b> accept your submission, if you do not specify the language."
146 accept_only_language_specified: "The server <b>will not</b> accept your submission, if you do not specify the language."
146 specifying_task: "Optionally, you can also specify the task with <tt>TASK:</tt> <i>taskname</i>. On the first page, the taskname for each task is shown in parentheses."
147 specifying_task: "Optionally, you can also specify the task with <tt>TASK:</tt> <i>taskname</i>. On the first page, the taskname for each task is shown in parentheses."
147 example_cpp: "For example, suppose you are using <tt>C++</tt> to write task <b>mobiles</b>, you put the following on top of your source code."
148 example_cpp: "For example, suppose you are using <tt>C++</tt> to write task <b>mobiles</b>, you put the following on top of your source code."
148 example_pas: "If you are using <tt>Pascal</tt> to write the same task, you'll use"
149 example_pas: "If you are using <tt>Pascal</tt> to write the same task, you'll use"
149 ask_questions_at_messages: "If you have any problems, you can ask at [<a href=\"%{url}\">%{message_link_name}</a>]."
150 ask_questions_at_messages: "If you have any problems, you can ask at [<a href=\"%{url}\">%{message_link_name}</a>]."
150
151
151 activerecord:
152 activerecord:
152 attributes:
153 attributes:
153 user:
154 user:
154 login: "login"
155 login: "login"
155 full_name: "full name"
156 full_name: "full name"
156 email: "e-mail"
157 email: "e-mail"
157 province: "province"
158 province: "province"
158
159
@@ -1,157 +1,158
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} ซึ่งเราได้สร้างให้คุณแล้ว ดังนี้
119
120
120 บัญชีเข้าใช้ของคุณคือ: %{login}
121 บัญชีเข้าใช้ของคุณคือ: %{login}
121 รหัสผ่านคือ: %{password}
122 รหัสผ่านคือ: %{password}
122
123
123 ถ้าคุณไม่ได้ขอรหัสผ่านใหม่ หรือไม่ใช่คนที่ลงทะเบียน กรุณาละทิ้ง e-mail ฉบับนี้
124 ถ้าคุณไม่ได้ขอรหัสผ่านใหม่ หรือไม่ใช่คนที่ลงทะเบียน กรุณาละทิ้ง e-mail ฉบับนี้
124 และแจ้งความผิดพลาดนี้กับ %{admin_email} ด้วย
125 และแจ้งความผิดพลาดนี้กับ %{admin_email} ด้วย
125
126
126 ขอบคุณมาก!"
127 ขอบคุณมาก!"
127
128
128 contest:
129 contest:
129 notification:
130 notification:
130 email_subject: "[%{contest_title_name}] คุณได้รับการเลื่อนขั้นสู่ระดับ %{contest_name}"
131 email_subject: "[%{contest_title_name}] คุณได้รับการเลื่อนขั้นสู่ระดับ %{contest_name}"
131 email_body: "ขอแสดงความยินดีด้วย คุณ%{full_name}
132 email_body: "ขอแสดงความยินดีด้วย คุณ%{full_name}
132
133
133 คุณได้รับการเลื่อนขั้นให้สามารถแข่งขันในการแข่งขันระดับ %{contest_name} ของ %{contest_title_name} แล้ว
134 คุณได้รับการเลื่อนขั้นให้สามารถแข่งขันในการแข่งขันระดับ %{contest_name} ของ %{contest_title_name} แล้ว
134
135
135 คุณสามารถเข้าสู่ระบบเพื่อทำโจทย์ได้ทันที คุณสามารถแข่งในระดับ %{contest_name} ได้จนกระทั่งการแข่งขันรอบนี้สิ้นสุดลง
136 คุณสามารถเข้าสู่ระบบเพื่อทำโจทย์ได้ทันที คุณสามารถแข่งในระดับ %{contest_name} ได้จนกระทั่งการแข่งขันรอบนี้สิ้นสุดลง
136
137
137 -ทีมงาน %{contest_title_name}"
138 -ทีมงาน %{contest_title_name}"
138
139
139
140
140 help:
141 help:
141 how_to_submit: "วิธีการส่งโปรแกรม"
142 how_to_submit: "วิธีการส่งโปรแกรม"
142 must_specify_language: "คุณ<b>ต้อง</b>ระบุภาษาโปรแกรมที่ใช้ที่ตอนต้นของรหัสโปรแกรม (source code) นอกจากนี้คุณอาจจะระบุโจทย์ที่ต้องการส่งได้ด้วย"
143 must_specify_language: "คุณ<b>ต้อง</b>ระบุภาษาโปรแกรมที่ใช้ที่ตอนต้นของรหัสโปรแกรม (source code) นอกจากนี้คุณอาจจะระบุโจทย์ที่ต้องการส่งได้ด้วย"
143 list_available_language: "ภาษาโปรแกรมที่สามารถระบุได้คือ <tt>C</tt>, <tt>C++</tt>, และ <tt>Pascal</tt> ด้านล่างแสดงตัวอย่างของการระบุสำหรับภาษาต่าง ๆ"
144 list_available_language: "ภาษาโปรแกรมที่สามารถระบุได้คือ <tt>C</tt>, <tt>C++</tt>, และ <tt>Pascal</tt> ด้านล่างแสดงตัวอย่างของการระบุสำหรับภาษาต่าง ๆ"
144 accept_only_language_specified: "ระบบจะ<b>ไม่รับ</b>โปรแกรมที่ส่งถ้าคุณไม่ได้ระบุภาษาที่ใช้"
145 accept_only_language_specified: "ระบบจะ<b>ไม่รับ</b>โปรแกรมที่ส่งถ้าคุณไม่ได้ระบุภาษาที่ใช้"
145 specifying_task: "นอกจากนี้ คุณยังสามารถระบุชื่อของโจทย์ที่ต้องการส่งเพิ่มเติมได้ ในการระบุให้ใส่ <tt>TASK:</tt> <i>taskname</i> คุณสามารถตรวจสอบชื่อของโจทย์ได้ โดยจะแสดงในวงเล็บหลังชื่อภาษาไทยของโจทย์"
146 specifying_task: "นอกจากนี้ คุณยังสามารถระบุชื่อของโจทย์ที่ต้องการส่งเพิ่มเติมได้ ในการระบุให้ใส่ <tt>TASK:</tt> <i>taskname</i> คุณสามารถตรวจสอบชื่อของโจทย์ได้ โดยจะแสดงในวงเล็บหลังชื่อภาษาไทยของโจทย์"
146 example_cpp: "ยกตัวอย่างเช่น ถ้าคุณใช้ภาษา <tt>C++</tt> สำหรับเขียนโจทย์ <tt>mobiles</tt> ตอนต้นโปรแกรมคุณจะใส่ดังนี้"
147 example_cpp: "ยกตัวอย่างเช่น ถ้าคุณใช้ภาษา <tt>C++</tt> สำหรับเขียนโจทย์ <tt>mobiles</tt> ตอนต้นโปรแกรมคุณจะใส่ดังนี้"
147 example_pas: "ถ้าคุณใช้ภาษา <tt>Pascal</tt> เพื่อเขียนโจทย์ข้อเดียวกัน คุณจะระบุ"
148 example_pas: "ถ้าคุณใช้ภาษา <tt>Pascal</tt> เพื่อเขียนโจทย์ข้อเดียวกัน คุณจะระบุ"
148 ask_questions_at_messages: "ถ้ามีปัญหาในการใช้งานสามารถสอบถามได้ที่หน้า<a href=\"%{url}\">%{message_link_name}</a>"
149 ask_questions_at_messages: "ถ้ามีปัญหาในการใช้งานสามารถสอบถามได้ที่หน้า<a href=\"%{url}\">%{message_link_name}</a>"
149
150
150 activerecord:
151 activerecord:
151 attributes:
152 attributes:
152 user:
153 user:
153 login: "ชื่อเข้าใช้ระบบ"
154 login: "ชื่อเข้าใช้ระบบ"
154 full_name: "ชื่อเต็ม"
155 full_name: "ชื่อเต็ม"
155 email: "e-mail"
156 email: "e-mail"
156 province: "จังหวัด"
157 province: "จังหวัด"
157
158
@@ -1,198 +1,223
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.online_registration',
57 + :key => 'right.user_hall_of_fame',
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 + {
64 + :key => 'right.user_view_submission',
65 + :value_type => 'boolean',
66 + :default_value => 'false',
67 + :description => 'If true, any user can view submissions of every one.'
68 + },
69 +
63 # If Configuration['system.online_registration'] is true, the
70 # If Configuration['system.online_registration'] is true, the
64 # system allows online registration, and will use these
71 # system allows online registration, and will use these
65 # information for sending confirmation emails.
72 # information for sending confirmation emails.
66 {
73 {
67 :key => 'system.online_registration.smtp',
74 :key => 'system.online_registration.smtp',
68 :value_type => 'string',
75 :value_type => 'string',
69 :default_value => 'smtp.somehost.com'
76 :default_value => 'smtp.somehost.com'
70 },
77 },
71 -
78 +
72 {
79 {
73 :key => 'system.online_registration.from',
80 :key => 'system.online_registration.from',
74 :value_type => 'string',
81 :value_type => 'string',
75 :default_value => 'your.email@address'
82 :default_value => 'your.email@address'
76 },
83 },
77 -
84 +
78 {
85 {
79 :key => 'system.admin_email',
86 :key => 'system.admin_email',
80 :value_type => 'string',
87 :value_type => 'string',
81 :default_value => 'admin@admin.email'
88 :default_value => 'admin@admin.email'
82 },
89 },
83 -
90 +
84 {
91 {
85 :key => 'system.user_setting_enabled',
92 :key => 'system.user_setting_enabled',
86 :value_type => 'boolean',
93 :value_type => 'boolean',
87 :default_value => 'true',
94 :default_value => 'true',
88 :description => 'If this option is true, users can change their settings'
95 :description => 'If this option is true, users can change their settings'
89 },
96 },
90 -
97 +
98 + {
99 + :key => 'system.user_setting_enabled',
100 + :value_type => 'boolean',
101 + :default_value => 'true',
102 + :description => 'If this option is true, users can change their settings'
103 + }
104 +
91 # If Configuration['contest.test_request.early_timeout'] is true
105 # If Configuration['contest.test_request.early_timeout'] is true
92 # the user will not be able to use test request at 30 minutes
106 # the user will not be able to use test request at 30 minutes
93 # before the contest ends.
107 # before the contest ends.
94 {
108 {
95 :key => 'contest.test_request.early_timeout',
109 :key => 'contest.test_request.early_timeout',
96 :value_type => 'boolean',
110 :value_type => 'boolean',
97 :default_value => 'false'
111 :default_value => 'false'
98 },
112 },
99
113
100 {
114 {
101 :key => 'system.multicontests',
115 :key => 'system.multicontests',
102 :value_type => 'boolean',
116 :value_type => 'boolean',
103 :default_value => 'false'
117 :default_value => 'false'
104 },
118 },
105
119
106 {
120 {
107 :key => 'contest.confirm_indv_contest_start',
121 :key => 'contest.confirm_indv_contest_start',
108 :value_type => 'boolean',
122 :value_type => 'boolean',
109 :default_value => 'false'
123 :default_value => 'false'
110 },
124 },
111
125
112 {
126 {
113 :key => 'contest.default_contest_name',
127 :key => 'contest.default_contest_name',
114 :value_type => 'string',
128 :value_type => 'string',
115 :default_value => 'none',
129 :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."
130 :description => "New user will be assigned to this contest automatically, if it exists. Set to 'none' if there is no default contest."
117 }
131 }
118 -
132 +
119 ]
133 ]
120
134
121
135
122 def create_configuration_key(key,
136 def create_configuration_key(key,
123 value_type,
137 value_type,
124 default_value,
138 default_value,
125 description='')
139 description='')
126 conf = (GraderConfiguration.find_by_key(key) ||
140 conf = (GraderConfiguration.find_by_key(key) ||
127 GraderConfiguration.new(:key => key,
141 GraderConfiguration.new(:key => key,
128 :value_type => value_type,
142 :value_type => value_type,
129 :value => default_value))
143 :value => default_value))
130 conf.description = description
144 conf.description = description
131 conf.save
145 conf.save
132 end
146 end
133
147
134 def seed_config
148 def seed_config
135 CONFIGURATIONS.each do |conf|
149 CONFIGURATIONS.each do |conf|
136 if conf.has_key? :description
150 if conf.has_key? :description
137 desc = conf[:description]
151 desc = conf[:description]
138 else
152 else
139 desc = ''
153 desc = ''
140 end
154 end
141 create_configuration_key(conf[:key],
155 create_configuration_key(conf[:key],
142 conf[:value_type],
156 conf[:value_type],
143 conf[:default_value],
157 conf[:default_value],
144 desc)
158 desc)
145 end
159 end
146 end
160 end
147
161
148 def seed_roles
162 def seed_roles
149 return if Role.find_by_name('admin')
163 return if Role.find_by_name('admin')
150
164
151 role = Role.create(:name => 'admin')
165 role = Role.create(:name => 'admin')
152 user_admin_right = Right.create(:name => 'user_admin',
166 user_admin_right = Right.create(:name => 'user_admin',
153 :controller => 'user_admin',
167 :controller => 'user_admin',
154 :action => 'all')
168 :action => 'all')
155 problem_admin_right = Right.create(:name=> 'problem_admin',
169 problem_admin_right = Right.create(:name=> 'problem_admin',
156 :controller => 'problems',
170 :controller => 'problems',
157 :action => 'all')
171 :action => 'all')
158
172
159 graders_right = Right.create(:name => 'graders_admin',
173 graders_right = Right.create(:name => 'graders_admin',
160 :controller => 'graders',
174 :controller => 'graders',
161 :action => 'all')
175 :action => 'all')
162
176
163 role.rights << user_admin_right;
177 role.rights << user_admin_right;
164 role.rights << problem_admin_right;
178 role.rights << problem_admin_right;
165 role.rights << graders_right;
179 role.rights << graders_right;
166 role.save
180 role.save
167 end
181 end
168
182
169 def seed_root
183 def seed_root
170 return if User.find_by_login('root')
184 return if User.find_by_login('root')
171
185
172 root = User.new(:login => 'root',
186 root = User.new(:login => 'root',
173 :full_name => 'Administrator',
187 :full_name => 'Administrator',
174 :alias => 'root')
188 :alias => 'root')
175 root.password = 'ioionrails';
189 root.password = 'ioionrails';
176
190
177 class << root
191 class << root
178 public :encrypt_new_password
192 public :encrypt_new_password
179 def valid?(context=nil)
193 def valid?(context=nil)
180 true
194 true
181 end
195 end
182 end
196 end
183
197
184 root.encrypt_new_password
198 root.encrypt_new_password
185
199
186 root.roles << Role.find_by_name('admin')
200 root.roles << Role.find_by_name('admin')
187
201
188 root.activated = true
202 root.activated = true
189 root.save
203 root.save
190 end
204 end
191
205
192 def seed_users_and_roles
206 def seed_users_and_roles
193 seed_roles
207 seed_roles
194 seed_root
208 seed_root
195 end
209 end
196
210
211 + def seed_more_languages
212 + Language.delete_all
213 + Language.create( name: 'c', pretty_name: 'C', ext: 'c', common_ext: 'c' )
214 + Language.create( name: 'cpp', pretty_name: 'C++', ext: 'cpp', common_ext: 'cpp,cc' )
215 + Language.create( name: 'pas', pretty_name: 'Pascal', ext: 'pas', common_ext: 'pas' )
216 + Language.create( name: 'ruby', pretty_name: 'Ruby', ext: 'rb', common_ext: 'rb' )
217 + Language.create( name: 'python', pretty_name: 'Python', ext: 'py', common_ext: 'py' )
218 + Language.create( name: 'java', pretty_name: 'Java', ext: 'java', common_ext: 'java' )
219 + end
220 +
197 seed_config
221 seed_config
198 seed_users_and_roles
222 seed_users_and_roles
223 + seed_more_languages
You need to be logged in to leave comments. Login now