Description:
update max_score / current_score to property use group filter
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r802:d7e158996222 - - 8 files changed: 88 inserted, 79 deleted

@@ -33,282 +33,279
33 33 globalid (>= 0.3.6)
34 34 activemodel (5.2.4.2)
35 35 activesupport (= 5.2.4.2)
36 36 activerecord (5.2.4.2)
37 37 activemodel (= 5.2.4.2)
38 38 activesupport (= 5.2.4.2)
39 39 arel (>= 9.0)
40 40 activerecord-session_store (1.1.3)
41 41 actionpack (>= 4.0)
42 42 activerecord (>= 4.0)
43 43 multi_json (~> 1.11, >= 1.11.2)
44 44 rack (>= 1.5.2, < 3)
45 45 railties (>= 4.0)
46 46 activestorage (5.2.4.2)
47 47 actionpack (= 5.2.4.2)
48 48 activerecord (= 5.2.4.2)
49 49 marcel (~> 0.3.1)
50 50 activesupport (5.2.4.2)
51 51 concurrent-ruby (~> 1.0, >= 1.0.2)
52 52 i18n (>= 0.7, < 2)
53 53 minitest (~> 5.1)
54 54 tzinfo (~> 1.1)
55 55 addressable (2.7.0)
56 56 public_suffix (>= 2.0.2, < 5.0)
57 57 ansi (1.5.0)
58 58 arel (9.0.0)
59 59 autoprefixer-rails (9.5.1)
60 60 execjs
61 61 best_in_place (3.0.3)
62 62 actionpack (>= 3.2)
63 63 railties (>= 3.2)
64 64 bindex (0.8.1)
65 65 bootsnap (1.4.6)
66 66 msgpack (~> 1.0)
67 67 bootstrap-sass (3.4.1)
68 68 autoprefixer-rails (>= 5.2.1)
69 69 sassc (>= 2.0.0)
70 70 bootstrap-switch-rails (3.3.4)
71 71 bootstrap-toggle-rails (2.2.1.0)
72 72 bootstrap3-datetimepicker-rails (4.17.47)
73 73 momentjs-rails (>= 2.8.1)
74 74 builder (3.2.4)
75 75 byebug (11.0.1)
76 76 capybara (3.15.1)
77 77 addressable
78 78 mini_mime (>= 0.1.3)
79 79 nokogiri (~> 1.8)
80 80 rack (>= 1.6.0)
81 81 rack-test (>= 0.6.3)
82 82 regexp_parser (~> 1.2)
83 83 xpath (~> 3.2)
84 84 childprocess (3.0.0)
85 85 coffee-rails (4.2.2)
86 86 coffee-script (>= 2.2.0)
87 87 railties (>= 4.0.0)
88 88 coffee-script (2.4.1)
89 89 coffee-script-source
90 90 execjs
91 91 coffee-script-source (1.12.2)
92 92 concurrent-ruby (1.1.6)
93 93 crass (1.0.6)
94 94 dynamic_form (1.1.4)
95 95 erubi (1.9.0)
96 96 erubis (2.7.0)
97 97 execjs (2.7.0)
98 98 ffi (1.10.0)
99 99 fuzzy-string-match (1.0.1)
100 100 RubyInline (>= 3.8.6)
101 101 globalid (0.4.2)
102 102 activesupport (>= 4.2.0)
103 103 haml (5.0.4)
104 104 temple (>= 0.8.0)
105 105 tilt
106 106 haml-rails (1.0.0)
107 107 actionpack (>= 4.0.1)
108 108 activesupport (>= 4.0.1)
109 109 haml (>= 4.0.6, < 6.0)
110 110 html2haml (>= 1.0.1)
111 111 railties (>= 4.0.1)
112 112 html2haml (2.2.0)
113 113 erubis (~> 2.7.0)
114 114 haml (>= 4.0, < 6)
115 115 nokogiri (>= 1.6.0)
116 116 ruby_parser (~> 3.5)
117 117 i18n (1.8.2)
118 118 concurrent-ruby (~> 1.0)
119 119 in_place_editing (1.2.0)
120 120 jbuilder (2.10.0)
121 121 activesupport (>= 5.0.0)
122 122 jquery-countdown-rails (2.0.2)
123 123 jquery-rails (4.3.3)
124 124 rails-dom-testing (>= 1, < 3)
125 125 railties (>= 4.2.0)
126 126 thor (>= 0.14, < 2.0)
127 127 jquery-tablesorter (1.26.1)
128 128 railties (>= 3.2, < 6)
129 - jquery-timepicker-addon-rails (1.4.1)
130 - railties (>= 3.1)
131 129 jquery-ui-rails (6.0.1)
132 130 railties (>= 3.2.16)
133 131 listen (3.1.5)
134 132 rb-fsevent (~> 0.9, >= 0.9.4)
135 133 rb-inotify (~> 0.9, >= 0.9.7)
136 134 ruby_dep (~> 1.2)
137 135 loofah (2.4.0)
138 136 crass (~> 1.0.2)
139 137 nokogiri (>= 1.5.9)
140 138 mail (2.7.1)
141 139 mini_mime (>= 0.1.1)
142 140 marcel (0.3.3)
143 141 mimemagic (~> 0.3.2)
144 142 method_source (1.0.0)
145 143 mimemagic (0.3.4)
146 144 mini_mime (1.0.2)
147 145 mini_portile2 (2.4.0)
148 146 minitest (5.14.0)
149 147 minitest-reporters (1.3.6)
150 148 ansi
151 149 builder
152 150 minitest (>= 5.0)
153 151 ruby-progressbar
154 152 momentjs-rails (2.20.1)
155 153 railties (>= 3.1)
156 154 msgpack (1.3.3)
157 155 multi_json (1.13.1)
158 156 mysql2 (0.5.2)
159 157 nio4r (2.5.2)
160 158 nokogiri (1.10.9)
161 159 mini_portile2 (~> 2.4.0)
162 160 public_suffix (4.0.3)
163 161 puma (4.3.3)
164 162 nio4r (~> 2.0)
165 163 rack (2.2.2)
166 164 rack-test (1.1.0)
167 165 rack (>= 1.0, < 3)
168 166 rails (5.2.4.2)
169 167 actioncable (= 5.2.4.2)
170 168 actionmailer (= 5.2.4.2)
171 169 actionpack (= 5.2.4.2)
172 170 actionview (= 5.2.4.2)
173 171 activejob (= 5.2.4.2)
174 172 activemodel (= 5.2.4.2)
175 173 activerecord (= 5.2.4.2)
176 174 activestorage (= 5.2.4.2)
177 175 activesupport (= 5.2.4.2)
178 176 bundler (>= 1.3.0)
179 177 railties (= 5.2.4.2)
180 178 sprockets-rails (>= 2.0.0)
181 179 rails-controller-testing (1.0.4)
182 180 actionpack (>= 5.0.1.x)
183 181 actionview (>= 5.0.1.x)
184 182 activesupport (>= 5.0.1.x)
185 183 rails-dom-testing (2.0.3)
186 184 activesupport (>= 4.2.0)
187 185 nokogiri (>= 1.6)
188 186 rails-html-sanitizer (1.3.0)
189 187 loofah (~> 2.3)
190 188 rails_bootstrap_sortable (2.0.6)
191 189 momentjs-rails (>= 2.8.3)
192 190 railties (5.2.4.2)
193 191 actionpack (= 5.2.4.2)
194 192 activesupport (= 5.2.4.2)
195 193 method_source
196 194 rake (>= 0.8.7)
197 195 thor (>= 0.19.0, < 2.0)
198 196 rake (13.0.1)
199 197 rb-fsevent (0.10.3)
200 198 rb-inotify (0.10.0)
201 199 ffi (~> 1.0)
202 200 rdiscount (2.2.0.1)
203 201 regexp_parser (1.7.0)
204 202 rouge (3.3.0)
205 203 ruby-progressbar (1.10.0)
206 204 ruby_dep (1.5.0)
207 205 ruby_parser (3.13.1)
208 206 sexp_processor (~> 4.9)
209 207 rubyzip (1.3.0)
210 208 sassc (2.2.1)
211 209 ffi (~> 1.9)
212 210 sassc-rails (2.1.2)
213 211 railties (>= 4.0.0)
214 212 sassc (>= 2.0)
215 213 sprockets (> 3.0)
216 214 sprockets-rails
217 215 tilt
218 216 select2-rails (4.0.3)
219 217 thor (~> 0.14)
220 218 selenium-webdriver (3.142.7)
221 219 childprocess (>= 0.5, < 4.0)
222 220 rubyzip (>= 1.2.2)
223 221 sexp_processor (4.12.0)
224 222 simple_form (5.0.2)
225 223 actionpack (>= 5.0)
226 224 activemodel (>= 5.0)
227 225 spring (2.0.2)
228 226 activesupport (>= 4.2)
229 227 spring-watcher-listen (2.0.1)
230 228 listen (>= 2.7, < 4.0)
231 229 spring (>= 1.2, < 3.0)
232 230 sprockets (3.7.2)
233 231 concurrent-ruby (~> 1.0)
234 232 rack (> 1, < 3)
235 233 sprockets-rails (3.2.1)
236 234 actionpack (>= 4.0)
237 235 activesupport (>= 4.0)
238 236 sprockets (>= 3.0.0)
239 237 sqlite3 (1.4.1)
240 238 temple (0.8.1)
241 239 thor (0.20.3)
242 240 thread_safe (0.3.6)
243 241 tilt (2.0.9)
244 242 tzinfo (1.2.7)
245 243 thread_safe (~> 0.1)
246 244 uglifier (4.1.20)
247 245 execjs (>= 0.3.0, < 3)
248 246 web-console (3.7.0)
249 247 actionview (>= 5.0)
250 248 activemodel (>= 5.0)
251 249 bindex (>= 0.4.0)
252 250 railties (>= 5.0)
253 251 webdriver (0.5.0)
254 252 websocket-driver (0.7.1)
255 253 websocket-extensions (>= 0.1.0)
256 254 websocket-extensions (0.1.4)
257 255 xpath (3.2.0)
258 256 nokogiri (~> 1.8)
259 257 yaml_db (0.7.0)
260 258 rails (>= 3.0)
261 259 rake (>= 0.8.7)
262 260
263 261 PLATFORMS
264 262 ruby
265 263
266 264 DEPENDENCIES
267 265 ace-rails-ap
268 266 activerecord-session_store
269 267 autoprefixer-rails
270 268 best_in_place (~> 3.0.1)
271 269 bootsnap (>= 1.1.0)
272 270 bootstrap-sass (~> 3.4.1)
273 271 bootstrap-switch-rails
274 272 bootstrap-toggle-rails
275 273 bootstrap3-datetimepicker-rails (~> 4.17.47)
276 274 byebug
277 275 capybara (>= 2.15)
278 276 coffee-rails
279 277 dynamic_form
280 278 fuzzy-string-match
281 279 haml
282 280 haml-rails
283 281 in_place_editing
284 282 jbuilder (~> 2.5)
285 283 jquery-countdown-rails
286 284 jquery-rails
287 285 jquery-tablesorter
288 - jquery-timepicker-addon-rails
289 286 jquery-ui-rails
290 287 listen (>= 3.0.5, < 3.2)
291 288 mail
292 289 minitest-reporters
293 290 momentjs-rails (>= 2.9.0)
294 291 mysql2
295 292 puma
296 293 rails (~> 5.2)
297 294 rails-controller-testing
298 295 rails_bootstrap_sortable
299 296 rdiscount
300 297 rouge
301 298 sassc-rails
302 299 select2-rails
303 300 selenium-webdriver
304 301 simple_form
305 302 spring
306 303 spring-watcher-listen (~> 2.0.0)
307 304 sqlite3
308 305 uglifier
309 306 web-console (>= 3.3.0)
310 307 webdriver
311 308 yaml_db
312 309
313 310 BUNDLED WITH
314 311 1.17.2
@@ -1,172 +1,172
1 1 class MainController < ApplicationController
2 2
3 3 before_action :check_valid_login, :except => [:login]
4 4 before_action :check_viewability, :except => [:index, :login]
5 5
6 6 append_before_action :confirm_and_update_start_time,
7 7 :except => [:index,
8 8 :login,
9 9 :confirm_contest_start]
10 10
11 11 # to prevent log in box to be shown when user logged out of the
12 12 # system only in some tab
13 13 prepend_before_action :reject_announcement_refresh_when_logged_out,
14 14 :only => [:announcements]
15 15
16 16 before_action :authenticate_by_ip_address, :only => [:list]
17 17
18 18 #reset login, clear session
19 19 #front page
20 20 def login
21 21 saved_notice = flash[:notice]
22 22 reset_session
23 23 flash.now[:notice] = saved_notice
24 24 @remote_ip = request.remote_ip
25 25
26 26 # EXPERIMENT:
27 27 # Hide login if in single user mode and the url does not
28 28 # explicitly specify /login
29 29 #
30 30 # logger.info "PATH: #{request.path}"
31 31 # if GraderConfiguration['system.single_user_mode'] and
32 32 # request.path!='/main/login'
33 33 # @hidelogin = true
34 34 # end
35 35
36 36 @announcements = Announcement.frontpage
37 37 render :action => 'login', :layout => 'empty'
38 38 end
39 39
40 40 def logout
41 41 reset_session
42 42 redirect_to root_path
43 43 end
44 44
45 45 def list
46 46 prepare_list_information
47 47 end
48 48
49 49 def help
50 50 @user = User.find(session[:user_id])
51 51 end
52 52
53 53 def submit
54 54 user = User.find(session[:user_id])
55 55
56 56 @submission = Submission.new
57 57 @submission.problem_id = params[:submission][:problem_id]
58 58 @submission.user = user
59 59 @submission.language_id = 0
60 60 if (params['file']) and (params['file']!='')
61 61 @submission.source = File.open(params['file'].path,'r:UTF-8',&:read)
62 62 @submission.source.encode!('UTF-8','UTF-8',invalid: :replace, replace: '')
63 63 @submission.source_filename = params['file'].original_filename
64 64 end
65 65
66 66 if (params[:editor_text])
67 67 language = Language.find_by_id(params[:language_id])
68 68 @submission.source = params[:editor_text]
69 69 @submission.source_filename = "live_edit.#{language.ext}"
70 70 @submission.language = language
71 71 end
72 72
73 73 @submission.submitted_at = Time.new.gmtime
74 74 @submission.ip_address = request.remote_ip
75 75
76 - if GraderConfiguration.time_limit_mode? and user.contest_finished?
76 + if @current_user.admin? == false && GraderConfiguration.time_limit_mode? && @current_user.contest_finished?
77 77 @submission.errors.add(:base,"The contest is over.")
78 78 prepare_list_information
79 79 render :action => 'list' and return
80 80 end
81 81
82 82 if @submission.valid?(@current_user)
83 83 if @submission.save == false
84 84 flash[:notice] = 'Error saving your submission'
85 85 elsif Task.create(:submission_id => @submission.id,
86 86 :status => Task::STATUS_INQUEUE) == false
87 87 flash[:notice] = 'Error adding your submission to task queue'
88 88 end
89 89 else
90 90 prepare_list_information
91 91 render :action => 'list' and return
92 92 end
93 93 redirect_to edit_submission_path(@submission)
94 94 end
95 95
96 96 def source
97 97 submission = Submission.find(params[:id])
98 98 if ((submission.user_id == session[:user_id]) and
99 99 (submission.problem != nil) and
100 100 (submission.problem.available))
101 101 send_data(submission.source,
102 102 {:filename => submission.download_filename,
103 103 :type => 'text/plain'})
104 104 else
105 105 flash[:notice] = 'Error viewing source'
106 106 redirect_to :action => 'list'
107 107 end
108 108 end
109 109
110 110 def compiler_msg
111 111 @submission = Submission.find(params[:id])
112 112 if @submission.user_id == session[:user_id]
113 113 render :action => 'compiler_msg', :layout => 'empty'
114 114 else
115 115 flash[:notice] = 'Error viewing source'
116 116 redirect_to :action => 'list'
117 117 end
118 118 end
119 119
120 120 def result
121 121 if !GraderConfiguration.show_grading_result
122 122 redirect_to :action => 'list' and return
123 123 end
124 124 @user = User.find(session[:user_id])
125 125 @submission = Submission.find(params[:id])
126 126 if @submission.user!=@user
127 127 flash[:notice] = 'You are not allowed to view result of other users.'
128 128 redirect_to :action => 'list' and return
129 129 end
130 130 prepare_grading_result(@submission)
131 131 end
132 132
133 133 def load_output
134 134 if !GraderConfiguration.show_grading_result or params[:num]==nil
135 135 redirect_to :action => 'list' and return
136 136 end
137 137 @user = User.find(session[:user_id])
138 138 @submission = Submission.find(params[:id])
139 139 if @submission.user!=@user
140 140 flash[:notice] = 'You are not allowed to view result of other users.'
141 141 redirect_to :action => 'list' and return
142 142 end
143 143 case_num = params[:num].to_i
144 144 out_filename = output_filename(@user.login,
145 145 @submission.problem.name,
146 146 @submission.id,
147 147 case_num)
148 148 if !FileTest.exists?(out_filename)
149 149 flash[:notice] = 'Output not found.'
150 150 redirect_to :action => 'list' and return
151 151 end
152 152
153 153 if defined?(USE_APACHE_XSENDFILE) and USE_APACHE_XSENDFILE
154 154 response.headers['Content-Type'] = "application/force-download"
155 155 response.headers['Content-Disposition'] = "attachment; filename=\"output-#{case_num}.txt\""
156 156 response.headers["X-Sendfile"] = out_filename
157 157 response.headers['Content-length'] = File.size(out_filename)
158 158 render :nothing => true
159 159 else
160 160 send_file out_filename, :stream => false, :filename => "output-#{case_num}.txt", :type => "text/plain"
161 161 end
162 162 end
163 163
164 164 def error
165 165 @user = User.find(session[:user_id])
166 166 end
167 167
168 168 # announcement refreshing and hiding methods
169 169
170 170 def announcements
171 171 if params.has_key? 'recent'
172 172 prepare_announcements(params[:recent])
@@ -1,152 +1,154
1 1 require 'csv'
2 2
3 3 class ReportController < ApplicationController
4 4
5 5 before_action :check_valid_login
6 6
7 7 before_action :admin_authorization, only: [:login_stat,:submission, :submission_query,
8 8 :login, :login_detail_query, :login_summary_query,
9 9 :stuck, :cheat_report, :cheat_scrutinize, :show_max_score, :current_score]
10 10
11 11 before_action(only: [:problem_hof]) { |c|
12 12 return false unless check_valid_login
13 13
14 14 admin_authorization unless GraderConfiguration["right.user_view_submission"]
15 15 }
16 16
17 17 def max_score
18 18 end
19 19
20 20 def current_score
21 21 @problems = Problem.available_problems
22 - if params[:group_id]
22 + if params[:group_id] && params[:users] == 'group'
23 23 @group = Group.find(params[:group_id])
24 24 @users = @group.users.where(enabled: true)
25 25 else
26 26 @users = User.includes(:contests).includes(:contest_stat).where(enabled: true)
27 27 end
28 28 @scorearray = calculate_max_score(@problems, @users,0,0,true)
29 29
30 30 #rencer accordingly
31 31 if params[:button] == 'download' then
32 32 csv = gen_csv_from_scorearray(@scorearray,@problems)
33 33 send_data csv, filename: 'max_score.csv'
34 34 else
35 35 #render template: 'user_admin/user_stat'
36 36 render 'current_score'
37 37 end
38 38 end
39 39
40 40 def show_max_score
41 41 #process parameters
42 42 #problems
43 43 @problems = []
44 44 if params[:problem_id]
45 45 params[:problem_id].each do |id|
46 46 next unless id.strip != ""
47 47 pid = Problem.find_by_id(id.to_i)
48 48 @problems << pid if pid
49 49 end
50 50 end
51 51
52 52 #users
53 - @users = if params[:users] == "all" then
53 + @users = if params[:users] == "group" then
54 + Group.find(params[:group_id]).users.all
55 + elsif params[:users] == 'enabled'
56 + User.includes(:contests).includes(:contest_stat).where(enabled: true)
57 + else
54 58 User.includes(:contests).includes(:contest_stat)
55 - else
56 - User.includes(:contests).includes(:contest_stat).where(enabled: true)
57 59 end
58 60
59 61 #set up range from param
60 62 @since_id = params.fetch(:from_id, 0).to_i
61 63 @until_id = params.fetch(:to_id, 0).to_i
62 64 @since_id = nil if @since_id == 0
63 65 @until_id = nil if @until_id == 0
64 66
65 67 #calculate the routine
66 68 @scorearray = calculate_max_score(@problems, @users, @since_id, @until_id)
67 69
68 70 #rencer accordingly
69 71 if params[:button] == 'download' then
70 72 csv = gen_csv_from_scorearray(@scorearray,@problems)
71 73 send_data csv, filename: 'max_score.csv'
72 74 else
73 75 #render template: 'user_admin/user_stat'
74 76 render 'max_score'
75 77 end
76 78
77 79 end
78 80
79 81 def score
80 82 if params[:commit] == 'download csv'
81 83 @problems = Problem.all
82 84 else
83 85 @problems = Problem.available_problems
84 86 end
85 87 @users = User.includes(:contests, :contest_stat).where(enabled: true)
86 88 @scorearray = Array.new
87 89 @users.each do |u|
88 90 ustat = Array.new
89 91 ustat[0] = u
90 92 @problems.each do |p|
91 93 sub = Submission.find_last_by_user_and_problem(u.id,p.id)
92 94 if (sub!=nil) and (sub.points!=nil) and p and p.full_score
93 95 ustat << [(sub.points.to_f*100/p.full_score).round, (sub.points>=p.full_score)]
94 96 else
95 97 ustat << [0,false]
96 98 end
97 99 end
98 100 @scorearray << ustat
99 101 end
100 102 if params[:commit] == 'download csv' then
101 103 csv = gen_csv_from_scorearray(@scorearray,@problems)
102 104 send_data csv, filename: 'last_score.csv'
103 105 else
104 106 render template: 'user_admin/user_stat'
105 107 end
106 108
107 109 end
108 110
109 111 def login
110 112 end
111 113
112 114 def login_summary_query
113 115 @users = Array.new
114 116
115 117 date_and_time = '%Y-%m-%d %H:%M'
116 118 begin
117 119 md = params[:since_datetime].match(/(\d+)-(\d+)-(\d+) (\d+):(\d+)/)
118 120 @since_time = Time.zone.local(md[1].to_i,md[2].to_i,md[3].to_i,md[4].to_i,md[5].to_i)
119 121 rescue
120 122 @since_time = DateTime.new(1000,1,1)
121 123 end
122 124 begin
123 125 md = params[:until_datetime].match(/(\d+)-(\d+)-(\d+) (\d+):(\d+)/)
124 126 @until_time = Time.zone.local(md[1].to_i,md[2].to_i,md[3].to_i,md[4].to_i,md[5].to_i)
125 127 rescue
126 128 @until_time = DateTime.new(3000,1,1)
127 129 end
128 130
129 131 record = User
130 132 .left_outer_joins(:logins).group('users.id')
131 133 .where("logins.created_at >= ? AND logins.created_at <= ?",@since_time, @until_time)
132 134 case params[:users]
133 135 when 'enabled'
134 136 record = record.where(enabled: true)
135 137 when 'group'
136 138 record = record.joins(:groups).where(groups: {id: params[:groups]}) if params[:groups]
137 139 end
138 140
139 141 record = record.pluck("users.id,users.login,users.full_name,count(logins.created_at),min(logins.created_at),max(logins.created_at)")
140 142 record.each do |user|
141 143 x = Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
142 144 user[0],@since_time,@until_time)
143 145 .pluck(:ip_address).uniq
144 146 @users << { id: user[0],
145 147 login: user[1],
146 148 full_name: user[2],
147 149 count: user[3],
148 150 min: user[4],
149 151 max: user[5],
150 152 ip: x
151 153 }
152 154 end
@@ -2,110 +2,110
2 2 before_action :check_valid_login
3 3 before_action :submission_authorization, only: [:show, :download, :edit]
4 4 before_action :admin_authorization, only: [:rejudge]
5 5
6 6 # GET /submissions
7 7 # GET /submissions.json
8 8 # Show problem selection and user's submission of that problem
9 9 def index
10 10 @user = @current_user
11 11 @problems = @user.available_problems
12 12
13 13 if params[:problem_id]==nil
14 14 @problem = nil
15 15 @submissions = nil
16 16 else
17 17 @problem = Problem.find_by_id(params[:problem_id])
18 18 if (@problem == nil) or (not @problem.available)
19 19 redirect_to list_main_path
20 20 flash[:error] = 'Authorization error: You have no right to view submissions for this problem'
21 21 return
22 22 end
23 23 @submissions = Submission.find_all_by_user_problem(@user.id, @problem.id).order(id: :desc)
24 24 end
25 25 end
26 26
27 27 # GET /submissions/1
28 28 # GET /submissions/1.json
29 29 def show
30 30 @submission = Submission.find(params[:id])
31 31
32 32 #log the viewing
33 33 user = User.find(session[:user_id])
34 34 SubmissionViewLog.create(user_id: session[:user_id],submission_id: @submission.id) unless user.admin?
35 35
36 36 @task = @submission.task
37 37 end
38 38
39 39 def download
40 40 @submission = Submission.find(params[:id])
41 41 send_data(@submission.source, {:filename => @submission.download_filename, :type => 'text/plain'})
42 42 end
43 43
44 44 def compiler_msg
45 45 @submission = Submission.find(params[:id])
46 46 respond_to do |format|
47 47 format.js
48 48 end
49 49 end
50 50
51 51 #on-site new submission on specific problem
52 52 def direct_edit_problem
53 53 @problem = Problem.find(params[:problem_id])
54 54 unless @current_user.can_view_problem?(@problem)
55 55 unauthorized_redirect
56 56 return
57 57 end
58 58 @source = ''
59 59 if (params[:view_latest])
60 60 sub = Submission.find_last_by_user_and_problem(@current_user.id,@problem.id)
61 61 @source = @submission.source.to_s if @submission and @submission.source
62 62 end
63 63 render 'edit'
64 64 end
65 65
66 66 # GET /submissions/1/edit
67 67 def edit
68 68 @submission = Submission.find(params[:id])
69 69 @source = @submission.source.to_s
70 70 @problem = @submission.problem
71 71 @lang_id = @submission.language.id
72 72 end
73 73
74 74
75 75 def get_latest_submission_status
76 76 @problem = Problem.find(params[:pid])
77 77 @submission = Submission.find_last_by_user_and_problem(params[:uid],params[:pid])
78 78 respond_to do |format|
79 79 format.js
80 80 end
81 81 end
82 82
83 83 # GET /submissions/:id/rejudge
84 84 def rejudge
85 85 @submission = Submission.find(params[:id])
86 86 @task = @submission.task
87 87 @task.status_inqueue! if @task
88 88 respond_to do |format|
89 89 format.js
90 90 end
91 91 end
92 92
93 93 protected
94 94
95 95 def submission_authorization
96 96 #admin always has privileged
97 97 return true if @current_user.admin?
98 - return true if @current_user.has_role?('TA') && (['show','download'].include? action_name)
98 + return true if @current_user.has_role?('ta') && (['show','download'].include? action_name)
99 99
100 100 sub = Submission.find(params[:id])
101 101 if @current_user.available_problems.include? sub.problem
102 102 return true if GraderConfiguration["right.user_view_submission"] or sub.user == @current_user
103 103 end
104 104
105 105 #default to NO
106 106 unauthorized_redirect
107 107 return false
108 108 end
109 109
110 110
111 111 end
@@ -1,11 +1,15
1 1 .container-fluid
2 2 %h1 Current Score
3 3 = form_tag current_score_report_path, method: 'get' do
4 - Show only users from this group
4 + .radio-inline
5 + = radio_button_tag 'users', 'all', (params[:users] == 'all')
6 + = label_tag(:users_all,'Show all users')
7 + %br
8 + .radio-inline
9 + = radio_button_tag 'users', 'group', (params[:users] == 'group')
10 + = label_tag(:users_group, 'Show only users from this group')
5 11 = select_tag "group_id", options_from_collection_for_select( Group.all, 'id','name',params[:group_id]), id: 'group_name',class: 'select2', style: 'width: 20em';
6 12 = submit_tag 'Apply',class: 'btn btn-default'
7 13
8 14 %br
9 -
10 -
11 15 = render "score_table"
@@ -1,49 +1,54
1 1 %h1 Maximum score
2 2
3 3 = form_tag show_max_score_report_path
4 4 .row
5 5 .col-md-4
6 6 .panel.panel-primary
7 7 .panel-heading
8 8 Problems
9 9 .panel-body
10 10 %p
11 11 Select problem(s) that we wish to know the score.
12 12 = label_tag :problem_id, "Problems"
13 13 = select_tag 'problem_id[]',
14 14 options_for_select(Problem.all.collect {|p| ["[#{p.name}] #{p.full_name}", p.id]},params[:problem_id]),
15 15 { class: 'select2 form-control', multiple: "true" }
16 16 .col-md-4
17 17 .panel.panel-primary
18 18 .panel-heading
19 19 Submission range
20 20 .panel-body
21 21 %p
22 22 Input minimum and maximum range of submission ID that should be included. A blank value for min and max means -1 and infinity, respectively.
23 23 .form-group
24 24 = label_tag :from, "Min"
25 25 = text_field_tag 'from_id', @since_id, class: "form-control"
26 26 .form-group
27 27 = label_tag :from, "Max"
28 28 = text_field_tag 'to_id', @until_id, class: "form-control"
29 29 .col-md-4
30 30 .panel.panel-primary
31 31 .panel-heading
32 32 Users
33 33 .panel-body
34 34 .radio
35 35 %label
36 36 = radio_button_tag 'users', 'all', (params[:users] == "all")
37 37 All users
38 38 .radio
39 39 %label
40 40 = radio_button_tag 'users', 'enabled', (params[:users] == "enabled")
41 41 Only enabled users
42 + .radio
43 + %label
44 + = radio_button_tag 'users', 'group', (params[:users] == "group")
45 + Only users from this group
46 + = select_tag "group_id", options_from_collection_for_select( Group.all, 'id','name',params[:group_id]), id: 'group_name',class: 'select2', style: 'width: 20em';
42 47 .row
43 48 .col-md-12
44 49 = button_tag 'Show', class: "btn btn-primary btn-large", value: "show"
45 50 = button_tag 'Download CSV', class: "btn btn-primary btn-large", value: "download"
46 51
47 52 - if @scorearray
48 53 %h2 Result
49 54 =render "score_table"
@@ -1,309 +1,310
1 1 # This file is auto-generated from the current state of the database. Instead
2 2 # of editing this file, please use the migrations feature of Active Record to
3 3 # incrementally modify your database, and then regenerate this schema definition.
4 4 #
5 5 # Note that this schema.rb definition is the authoritative source for your
6 6 # database schema. If you need to create the application database on another
7 7 # system, you should be using db:schema:load, not running all the migrations
8 8 # from scratch. The latter is a flawed and unsustainable approach (the more migrations
9 9 # you'll amass, the slower it'll run and the greater likelihood for issues).
10 10 #
11 11 # It's strongly recommended that you check this file into your version control system.
12 12
13 - ActiveRecord::Schema.define(version: 2020_04_05_112919) do
13 + ActiveRecord::Schema.define(version: 2020_08_13_083020) do
14 14
15 - create_table "announcements", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
15 + create_table "announcements", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
16 16 t.string "author"
17 - t.text "body", limit: 16777215
17 + t.text "body"
18 18 t.boolean "published"
19 - t.datetime "created_at", null: false
20 - t.datetime "updated_at", null: false
19 + t.datetime "created_at"
20 + t.datetime "updated_at"
21 21 t.boolean "frontpage", default: false
22 22 t.boolean "contest_only", default: false
23 23 t.string "title"
24 24 t.string "notes"
25 25 end
26 26
27 - create_table "contests", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
27 + create_table "contests", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
28 28 t.string "title"
29 29 t.boolean "enabled"
30 - t.datetime "created_at", null: false
31 - t.datetime "updated_at", null: false
30 + t.datetime "created_at"
31 + t.datetime "updated_at"
32 32 t.string "name"
33 33 end
34 34
35 - create_table "contests_problems", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
35 + create_table "contests_problems", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
36 36 t.integer "contest_id"
37 37 t.integer "problem_id"
38 38 end
39 39
40 - create_table "contests_users", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
40 + create_table "contests_users", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
41 41 t.integer "contest_id"
42 42 t.integer "user_id"
43 43 end
44 44
45 - create_table "countries", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
45 + create_table "countries", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
46 46 t.string "name"
47 - t.datetime "created_at", null: false
48 - t.datetime "updated_at", null: false
47 + t.datetime "created_at"
48 + t.datetime "updated_at"
49 49 end
50 50
51 - create_table "descriptions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
52 - t.text "body", limit: 16777215
51 + create_table "descriptions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
52 + t.text "body"
53 53 t.boolean "markdowned"
54 - t.datetime "created_at", null: false
55 - t.datetime "updated_at", null: false
54 + t.datetime "created_at"
55 + t.datetime "updated_at"
56 56 end
57 57
58 - create_table "grader_configurations", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
58 + create_table "grader_configurations", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
59 59 t.string "key"
60 60 t.string "value_type"
61 61 t.string "value"
62 - t.datetime "created_at", null: false
63 - t.datetime "updated_at", null: false
64 - t.text "description", limit: 16777215
62 + t.datetime "created_at"
63 + t.datetime "updated_at"
64 + t.text "description"
65 65 end
66 66
67 - create_table "grader_processes", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
67 + create_table "grader_processes", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
68 68 t.string "host"
69 69 t.integer "pid"
70 70 t.string "mode"
71 71 t.boolean "active"
72 - t.datetime "created_at", null: false
73 - t.datetime "updated_at", null: false
72 + t.datetime "created_at"
73 + t.datetime "updated_at"
74 74 t.integer "task_id"
75 75 t.string "task_type"
76 76 t.boolean "terminated"
77 - t.index ["host", "pid"], name: "index_grader_processes_on_ip_and_pid"
77 + t.index ["host", "pid"], name: "index_grader_processes_on_host_and_pid"
78 78 end
79 79
80 80 create_table "groups", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
81 81 t.string "name"
82 82 t.string "description"
83 + t.boolean "enabled", default: true
83 84 end
84 85
85 86 create_table "groups_problems", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
86 87 t.integer "problem_id", null: false
87 88 t.integer "group_id", null: false
88 89 t.index ["group_id", "problem_id"], name: "index_groups_problems_on_group_id_and_problem_id"
89 90 end
90 91
91 92 create_table "groups_users", options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
92 93 t.integer "group_id", null: false
93 94 t.integer "user_id", null: false
94 95 t.index ["user_id", "group_id"], name: "index_groups_users_on_user_id_and_group_id"
95 96 end
96 97
97 98 create_table "heart_beats", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
98 99 t.integer "user_id"
99 100 t.string "ip_address"
100 - t.datetime "created_at", null: false
101 - t.datetime "updated_at", null: false
101 + t.datetime "created_at"
102 + t.datetime "updated_at"
102 103 t.string "status"
103 104 t.index ["updated_at"], name: "index_heart_beats_on_updated_at"
104 105 end
105 106
106 - create_table "languages", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
107 + create_table "languages", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
107 108 t.string "name", limit: 10
108 109 t.string "pretty_name"
109 110 t.string "ext", limit: 10
110 111 t.string "common_ext"
111 112 end
112 113
113 114 create_table "logins", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
114 115 t.integer "user_id"
115 116 t.string "ip_address"
116 - t.datetime "created_at", null: false
117 - t.datetime "updated_at", null: false
117 + t.datetime "created_at"
118 + t.datetime "updated_at"
118 119 t.index ["user_id"], name: "index_logins_on_user_id"
119 120 end
120 121
121 - create_table "messages", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
122 + create_table "messages", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
122 123 t.integer "sender_id"
123 124 t.integer "receiver_id"
124 125 t.integer "replying_message_id"
125 - t.text "body", limit: 16777215
126 + t.text "body"
126 127 t.boolean "replied"
127 - t.datetime "created_at", null: false
128 - t.datetime "updated_at", null: false
128 + t.datetime "created_at"
129 + t.datetime "updated_at"
129 130 end
130 131
131 - create_table "problems", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
132 - t.string "name", limit: 100
132 + create_table "problems", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
133 + t.string "name", limit: 30
133 134 t.string "full_name"
134 135 t.integer "full_score"
135 136 t.date "date_added"
136 137 t.boolean "available"
137 138 t.string "url"
138 139 t.integer "description_id"
139 140 t.boolean "test_allowed"
140 141 t.boolean "output_only"
141 142 t.string "description_filename"
142 143 t.boolean "view_testcase"
143 144 end
144 145
145 146 create_table "problems_tags", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
146 147 t.integer "problem_id"
147 148 t.integer "tag_id"
148 149 t.index ["problem_id", "tag_id"], name: "index_problems_tags_on_problem_id_and_tag_id", unique: true
149 150 t.index ["problem_id"], name: "index_problems_tags_on_problem_id"
150 151 t.index ["tag_id"], name: "index_problems_tags_on_tag_id"
151 152 end
152 153
153 - create_table "rights", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
154 + create_table "rights", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
154 155 t.string "name"
155 156 t.string "controller"
156 157 t.string "action"
157 158 end
158 159
159 - create_table "rights_roles", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
160 + create_table "rights_roles", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
160 161 t.integer "right_id"
161 162 t.integer "role_id"
162 163 t.index ["role_id"], name: "index_rights_roles_on_role_id"
163 164 end
164 165
165 - create_table "roles", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
166 + create_table "roles", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
166 167 t.string "name"
167 168 end
168 169
169 - create_table "roles_users", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
170 + create_table "roles_users", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
170 171 t.integer "role_id"
171 172 t.integer "user_id"
172 173 t.index ["user_id"], name: "index_roles_users_on_user_id"
173 174 end
174 175
175 - create_table "sessions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
176 + create_table "sessions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
176 177 t.string "session_id"
177 - t.text "data", limit: 16777215
178 + t.text "data"
178 179 t.datetime "updated_at"
179 180 t.index ["session_id"], name: "index_sessions_on_session_id"
180 181 t.index ["updated_at"], name: "index_sessions_on_updated_at"
181 182 end
182 183
183 - create_table "sites", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
184 + create_table "sites", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
184 185 t.string "name"
185 186 t.boolean "started"
186 187 t.datetime "start_time"
187 - t.datetime "created_at", null: false
188 - t.datetime "updated_at", null: false
188 + t.datetime "created_at"
189 + t.datetime "updated_at"
189 190 t.integer "country_id"
190 191 t.string "password"
191 192 end
192 193
193 194 create_table "submission_view_logs", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
194 195 t.integer "user_id"
195 196 t.integer "submission_id"
196 - t.datetime "created_at", null: false
197 - t.datetime "updated_at", null: false
197 + t.datetime "created_at"
198 + t.datetime "updated_at"
198 199 end
199 200
200 - create_table "submissions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
201 + create_table "submissions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
201 202 t.integer "user_id"
202 203 t.integer "problem_id"
203 204 t.integer "language_id"
204 205 t.text "source", limit: 16777215
205 206 t.binary "binary"
206 207 t.datetime "submitted_at"
207 208 t.datetime "compiled_at"
208 - t.text "compiler_message", limit: 16777215
209 + t.text "compiler_message"
209 210 t.datetime "graded_at"
210 211 t.integer "points"
211 - t.text "grader_comment", limit: 16777215
212 + t.text "grader_comment"
212 213 t.integer "number"
213 214 t.string "source_filename"
214 215 t.float "max_runtime"
215 216 t.integer "peak_memory"
216 217 t.integer "effective_code_length"
217 218 t.string "ip_address"
218 219 t.index ["submitted_at"], name: "index_submissions_on_submitted_at"
219 220 t.index ["user_id", "problem_id", "number"], name: "index_submissions_on_user_id_and_problem_id_and_number", unique: true
220 221 t.index ["user_id", "problem_id"], name: "index_submissions_on_user_id_and_problem_id"
221 222 end
222 223
223 224 create_table "tags", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
224 225 t.string "name", null: false
225 226 t.text "description"
226 227 t.boolean "public"
227 228 t.datetime "created_at", null: false
228 229 t.datetime "updated_at", null: false
229 230 end
230 231
231 - create_table "tasks", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
232 + create_table "tasks", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
232 233 t.integer "submission_id"
233 234 t.datetime "created_at"
234 235 t.integer "status"
235 236 t.datetime "updated_at"
236 237 t.index ["submission_id"], name: "index_tasks_on_submission_id"
237 238 end
238 239
239 - create_table "test_pairs", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
240 + create_table "test_pairs", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
240 241 t.integer "problem_id"
241 - t.text "input", limit: 4294967295
242 - t.text "solution", limit: 4294967295
243 - t.datetime "created_at", null: false
244 - t.datetime "updated_at", null: false
242 + t.text "input", limit: 16777215
243 + t.text "solution", limit: 16777215
244 + t.datetime "created_at"
245 + t.datetime "updated_at"
245 246 end
246 247
247 - create_table "test_requests", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
248 + create_table "test_requests", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
248 249 t.integer "user_id"
249 250 t.integer "problem_id"
250 251 t.integer "submission_id"
251 252 t.string "input_file_name"
252 253 t.string "output_file_name"
253 254 t.string "running_stat"
254 255 t.integer "status"
255 - t.datetime "updated_at", null: false
256 + t.datetime "updated_at"
256 257 t.datetime "submitted_at"
257 258 t.datetime "compiled_at"
258 - t.text "compiler_message", limit: 16777215
259 + t.text "compiler_message"
259 260 t.datetime "graded_at"
260 261 t.string "grader_comment"
261 - t.datetime "created_at", null: false
262 + t.datetime "created_at"
262 263 t.float "running_time"
263 264 t.string "exit_status"
264 265 t.integer "memory_usage"
265 266 t.index ["user_id", "problem_id"], name: "index_test_requests_on_user_id_and_problem_id"
266 267 end
267 268
268 269 create_table "testcases", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
269 270 t.integer "problem_id"
270 271 t.integer "num"
271 272 t.integer "group"
272 273 t.integer "score"
273 274 t.text "input", limit: 4294967295
274 275 t.text "sol", limit: 4294967295
275 - t.datetime "created_at", null: false
276 - t.datetime "updated_at", null: false
276 + t.datetime "created_at"
277 + t.datetime "updated_at"
277 278 t.index ["problem_id"], name: "index_testcases_on_problem_id"
278 279 end
279 280
280 - create_table "user_contest_stats", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
281 + create_table "user_contest_stats", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
281 282 t.integer "user_id"
282 283 t.datetime "started_at"
283 - t.datetime "created_at", null: false
284 - t.datetime "updated_at", null: false
284 + t.datetime "created_at"
285 + t.datetime "updated_at"
285 286 t.boolean "forced_logout"
286 287 end
287 288
288 - create_table "users", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
289 + create_table "users", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1", force: :cascade do |t|
289 290 t.string "login", limit: 50
290 291 t.string "full_name"
291 292 t.string "hashed_password"
292 293 t.string "salt", limit: 5
293 294 t.string "alias"
294 295 t.string "email"
295 296 t.integer "site_id"
296 297 t.integer "country_id"
297 298 t.boolean "activated", default: false
298 299 t.datetime "created_at"
299 300 t.datetime "updated_at"
300 301 t.string "section"
301 302 t.boolean "enabled", default: true
302 303 t.string "remark"
303 304 t.string "last_ip"
304 305 t.index ["login"], name: "index_users_on_login", unique: true
305 306 end
306 307
307 308 add_foreign_key "problems_tags", "problems"
308 309 add_foreign_key "problems_tags", "tags"
309 310 end
@@ -132,158 +132,158
132 132 },
133 133
134 134 {
135 135 :key => 'system.user_setting_enabled',
136 136 :value_type => 'boolean',
137 137 :default_value => 'true',
138 138 :description => 'If this option is true, users can change their settings'
139 139 },
140 140
141 141 {
142 142 :key => 'system.user_setting_enabled',
143 143 :value_type => 'boolean',
144 144 :default_value => 'true',
145 145 :description => 'If this option is true, users can change their settings'
146 146 },
147 147
148 148 # If Configuration['contest.test_request.early_timeout'] is true
149 149 # the user will not be able to use test request at 30 minutes
150 150 # before the contest ends.
151 151 {
152 152 :key => 'contest.test_request.early_timeout',
153 153 :value_type => 'boolean',
154 154 :default_value => 'false'
155 155 },
156 156
157 157 {
158 158 :key => 'system.multicontests',
159 159 :value_type => 'boolean',
160 160 :default_value => 'false'
161 161 },
162 162
163 163 {
164 164 :key => 'contest.confirm_indv_contest_start',
165 165 :value_type => 'boolean',
166 166 :default_value => 'false'
167 167 },
168 168
169 169 {
170 170 :key => 'contest.default_contest_name',
171 171 :value_type => 'string',
172 172 :default_value => 'none',
173 173 :description => "New user will be assigned to this contest automatically, if it exists. Set to 'none' if there is no default contest."
174 174 },
175 175
176 176 {
177 177 :key => 'system.use_problem_group',
178 178 :value_type => 'boolean',
179 179 :default_value => 'false',
180 180 :description => "If true, available problem to the user will be only ones associated with the group of the user."
181 181 },
182 182
183 183
184 184 {
185 185 :key => 'right.whitelist_ignore',
186 186 :value_type => 'boolean',
187 187 :default_value => 'true',
188 188 :description => "If true, no IP check against whitelist_ip is perform. However, when false, non-admin user must have their ip in 'whitelist_ip' to be able to login."
189 189 },
190 190
191 191 {
192 192 :key => 'right.whitelist_ip',
193 193 :value_type => 'string',
194 194 :default_value => '0.0.0.0/0',
195 195 :description => "list of whitelist ip, given in comma separated CIDR notation. For example '192.168.90.0/23, 192.168.1.23/32'"
196 196 },
197 197
198 198 ]
199 199
200 200
201 201 def create_configuration_key(key,
202 202 value_type,
203 203 default_value,
204 204 description='')
205 205 conf = (GraderConfiguration.find_by_key(key) ||
206 206 GraderConfiguration.new(:key => key,
207 207 :value_type => value_type,
208 208 :value => default_value))
209 209 conf.description = description
210 210 conf.save
211 211 end
212 212
213 213 def seed_config
214 214 CONFIGURATIONS.each do |conf|
215 215 if conf.has_key? :description
216 216 desc = conf[:description]
217 217 else
218 218 desc = ''
219 219 end
220 220 create_configuration_key(conf[:key],
221 221 conf[:value_type],
222 222 conf[:default_value],
223 223 desc)
224 224 end
225 225 end
226 226
227 227 def seed_roles
228 - Role.find_or_create_by(name: 'TA')
228 + Role.find_or_create_by(name: 'ta')
229 229 return if Role.find_by_name('admin')
230 230
231 231 role = Role.create(:name => 'admin')
232 232 user_admin_right = Right.create(:name => 'user_admin',
233 233 :controller => 'user_admin',
234 234 :action => 'all')
235 235 problem_admin_right = Right.create(:name=> 'problem_admin',
236 236 :controller => 'problems',
237 237 :action => 'all')
238 238
239 239 graders_right = Right.create(:name => 'graders_admin',
240 240 :controller => 'graders',
241 241 :action => 'all')
242 242
243 243 role.rights << user_admin_right;
244 244 role.rights << problem_admin_right;
245 245 role.rights << graders_right;
246 246 role.save
247 247 end
248 248
249 249 def seed_root
250 250 return if User.find_by_login('root')
251 251
252 252 root = User.new(:login => 'root',
253 253 :full_name => 'Administrator',
254 254 :alias => 'root')
255 255 root.password = 'ioionrails';
256 256
257 257 class << root
258 258 public :encrypt_new_password
259 259 def valid?(context=nil)
260 260 true
261 261 end
262 262 end
263 263
264 264 root.encrypt_new_password
265 265
266 266 root.roles << Role.find_by_name('admin')
267 267
268 268 root.activated = true
269 269 root.save
270 270 end
271 271
272 272 def seed_users_and_roles
273 273 seed_roles
274 274 seed_root
275 275 end
276 276
277 277 def seed_more_languages
278 278 #Language.delete_all
279 279 Language.find_or_create_by( name: 'c', pretty_name: 'C', ext: 'c', common_ext: 'c' )
280 280 Language.find_or_create_by( name: 'cpp', pretty_name: 'C++', ext: 'cpp', common_ext: 'cpp,cc' )
281 281 Language.find_or_create_by( name: 'pas', pretty_name: 'Pascal', ext: 'pas', common_ext: 'pas' )
282 282 Language.find_or_create_by( name: 'ruby', pretty_name: 'Ruby', ext: 'rb', common_ext: 'rb' )
283 283 Language.find_or_create_by( name: 'python', pretty_name: 'Python', ext: 'py', common_ext: 'py' )
284 284 Language.find_or_create_by( name: 'java', pretty_name: 'Java', ext: 'java', common_ext: 'java' )
285 285 end
286 286
287 287 seed_config
288 288 seed_users_and_roles
289 289 seed_more_languages
You need to be logged in to leave comments. Login now