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
@@ -59,108 +59,110
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,73 +1,82
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)
@@ -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,80 +1,84
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?
@@ -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
@@ -14,51 +14,51
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,70 +1,71
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
@@ -1,70 +1,71
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 ตัวอักษร"
@@ -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