Description:
add TA roles
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r799:584294790340 - - 6 files changed: 71 inserted, 42 deleted

@@ -1,112 +1,111
1 1 class SubmissionsController < ApplicationController
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 - if @current_user.admin?
98 - return true
99 - end
97 + return true if @current_user.admin?
98 + return true if @current_user.has_role?('TA') && (['show','download'].include? action_name)
100 99
101 100 sub = Submission.find(params[:id])
102 101 if @current_user.available_problems.include? sub.problem
103 102 return true if GraderConfiguration["right.user_view_submission"] or sub.user == @current_user
104 103 end
105 104
106 105 #default to NO
107 106 unauthorized_redirect
108 107 return false
109 108 end
110 109
111 110
112 111 end
@@ -269,222 +269,219
269 269 flash[:notice] = 'Error: no contest'
270 270 redirect_to :action => 'contests', :id =>contest_id
271 271 end
272 272
273 273 note = []
274 274 users.each do |u|
275 275 u.contests = [contest]
276 276 note << u.login
277 277 end
278 278 flash[:notice] = 'User(s) ' + note.join(', ') +
279 279 " were successfully reassigned to #{contest.title}."
280 280 redirect_to :action => 'contests', :id =>contest.id
281 281 end
282 282
283 283 def add_to_contest
284 284 user = User.find(params[:id])
285 285 contest = Contest.find(params[:contest_id])
286 286 if user and contest
287 287 user.contests << contest
288 288 end
289 289 redirect_to :action => 'index'
290 290 end
291 291
292 292 def remove_from_contest
293 293 user = User.find(params[:id])
294 294 contest = Contest.find(params[:contest_id])
295 295 if user and contest
296 296 user.contests.delete(contest)
297 297 end
298 298 redirect_to :action => 'index'
299 299 end
300 300
301 301 def contest_management
302 302 end
303 303
304 304 def manage_contest
305 305 contest = Contest.find(params[:contest][:id])
306 306 if !contest
307 307 flash[:notice] = 'You did not choose the contest.'
308 308 redirect_to :action => 'contest_management' and return
309 309 end
310 310
311 311 operation = params[:operation]
312 312
313 313 if not ['add','remove','assign'].include? operation
314 314 flash[:notice] = 'You did not choose the operation to perform.'
315 315 redirect_to :action => 'contest_management' and return
316 316 end
317 317
318 318 lines = params[:login_list]
319 319 if !lines or lines.blank?
320 320 flash[:notice] = 'You entered an empty list.'
321 321 redirect_to :action => 'contest_management' and return
322 322 end
323 323
324 324 note = []
325 325 users = []
326 326 lines.split("\n").each do |line|
327 327 user = User.find_by_login(line.chomp)
328 328 if user
329 329 if operation=='add'
330 330 if ! user.contests.include? contest
331 331 user.contests << contest
332 332 end
333 333 elsif operation=='remove'
334 334 user.contests.delete(contest)
335 335 else
336 336 user.contests = [contest]
337 337 end
338 338
339 339 if params[:reset_timer]
340 340 user.contest_stat.forced_logout = true
341 341 user.contest_stat.reset_timer_and_save
342 342 end
343 343
344 344 if params[:notification_emails]
345 345 send_contest_update_notification_email(user, contest)
346 346 end
347 347
348 348 note << user.login
349 349 users << user
350 350 end
351 351 end
352 352
353 353 if params[:reset_timer]
354 354 logout_users(users)
355 355 end
356 356
357 357 flash[:notice] = 'User(s) ' + note.join(', ') +
358 358 ' were successfully modified. '
359 359 redirect_to :action => 'contest_management'
360 360 end
361 361
362 362 # admin management
363 363
364 364 def admin
365 - @admins = User.all.find_all {|user| user.admin? }
365 + @admins = Role.where(name: 'admin').take.users
366 + @tas = Role.where(name: 'ta').take.users
366 367 end
367 368
368 - def grant_admin
369 - login = params[:login]
370 - user = User.find_by_login(login)
371 - if user!=nil
372 - admin_role = Role.find_by_name('admin')
373 - user.roles << admin_role
374 - else
375 - flash[:notice] = 'Unknown user'
376 - end
377 - flash[:notice] = 'User added as admins'
378 - redirect_to :action => 'admin'
369 + def modify_role
370 + user = User.find_by_login(params[:login])
371 + role = Role.find_by_name(params[:role])
372 + unless user && role
373 + flash[:error] = 'Unknown user or role'
374 + redirect_to admin_user_admin_index_path
375 + return
379 376 end
380 -
381 - def revoke_admin
382 - user = User.find(params[:id])
383 - if user==nil
384 - flash[:notice] = 'Unknown user'
385 - redirect_to :action => 'admin' and return
386 - elsif user.login == 'root'
387 - flash[:notice] = 'You cannot revoke admisnistrator permission from root.'
388 - redirect_to :action => 'admin' and return
377 + if params[:commit] == 'Grant'
378 + #grant role
379 + user.roles << role
380 + flash[:notice] = "User '#{user.login}' has been granted the role '#{role.name}'"
381 + else
382 + #revoke role
383 + if user.login == 'root' && role.name == 'admin'
384 + flash[:error] = 'You cannot revoke admisnistrator permission from root.'
385 + redirect_to admin_user_admin_index_path
386 + return
389 387 end
390 -
391 - admin_role = Role.find_by_name('admin')
392 - user.roles.delete(admin_role)
393 - flash[:notice] = 'User permission revoked'
394 - redirect_to :action => 'admin'
388 + user.roles.delete(role)
389 + flash[:notice] = "The role '#{role.name}' has been revoked from User '#{user.login}'"
390 + end
391 + redirect_to admin_user_admin_index_path
395 392 end
396 393
397 394 # mass mailing
398 395
399 396 def mass_mailing
400 397 end
401 398
402 399 def bulk_mail
403 400 lines = params[:login_list]
404 401 if !lines or lines.blank?
405 402 flash[:notice] = 'You entered an empty list.'
406 403 redirect_to :action => 'mass_mailing' and return
407 404 end
408 405
409 406 mail_subject = params[:subject]
410 407 if !mail_subject or mail_subject.blank?
411 408 flash[:notice] = 'You entered an empty mail subject.'
412 409 redirect_to :action => 'mass_mailing' and return
413 410 end
414 411
415 412 mail_body = params[:email_body]
416 413 if !mail_body or mail_body.blank?
417 414 flash[:notice] = 'You entered an empty mail body.'
418 415 redirect_to :action => 'mass_mailing' and return
419 416 end
420 417
421 418 note = []
422 419 users = []
423 420 lines.split("\n").each do |line|
424 421 user = User.find_by_login(line.chomp)
425 422 if user
426 423 send_mail(user.email, mail_subject, mail_body)
427 424 note << user.login
428 425 end
429 426 end
430 427
431 428 flash[:notice] = 'User(s) ' + note.join(', ') +
432 429 ' were successfully modified. '
433 430 redirect_to :action => 'mass_mailing'
434 431 end
435 432
436 433 #bulk manage
437 434 def bulk_manage
438 435
439 436 begin
440 437 @users = User.where('(login REGEXP ?) OR (remark REGEXP ?)',params[:regex],params[:regex]) if params[:regex]
441 438 @users.count if @users #i don't know why I have to call count, but if I won't exception is not raised
442 439 rescue Exception
443 440 flash[:error] = 'Regular Expression is malformed'
444 441 @users = nil
445 442 end
446 443
447 444 if params[:commit]
448 445 @action = {}
449 446 @action[:set_enable] = params[:enabled]
450 447 @action[:enabled] = params[:enable] == "1"
451 448 @action[:gen_password] = params[:gen_password]
452 449 @action[:add_group] = params[:add_group]
453 450 @action[:group_name] = params[:group_name]
454 451 end
455 452
456 453 if params[:commit] == "Perform"
457 454 if @action[:set_enable]
458 455 @users.update_all(enabled: @action[:enabled])
459 456 end
460 457 if @action[:gen_password]
461 458 @users.each do |u|
462 459 password = random_password
463 460 u.password = password
464 461 u.password_confirmation = password
465 462 u.save
466 463 end
467 464 end
468 465 if @action[:add_group] and @action[:group_name]
469 466 @group = Group.find(@action[:group_name])
470 467 ok = []
471 468 failed = []
472 469 @users.each do |user|
473 470 begin
474 471 @group.users << user
475 472 ok << user.login
476 473 rescue => e
477 474 failed << user.login
478 475 end
479 476 end
480 477 flash[:success] = "The following users are added to the 'group #{@group.name}': " + ok.join(', ') if ok.count > 0
481 478 flash[:alert] = "The following users are already in the 'group #{@group.name}': " + failed.join(', ') if failed.count > 0
482 479 end
483 480 end
484 481 end
485 482
486 483 protected
487 484
488 485 def random_password(length=5)
489 486 chars = 'abcdefghijkmnopqrstuvwxyz23456789'
490 487 newpass = ""
@@ -1,180 +1,184
1 1 require 'digest/sha1'
2 2 require 'net/pop'
3 3 require 'net/https'
4 4 require 'net/http'
5 5 require 'json'
6 6
7 7 class User < ActiveRecord::Base
8 8
9 9 has_and_belongs_to_many :roles
10 10
11 11 #has_and_belongs_to_many :groups
12 12 has_many :groups_users, class_name: 'GroupUser'
13 13 has_many :groups, :through => :groups_users
14 14
15 15 has_many :test_requests, -> {order(submitted_at: :desc)}
16 16
17 17 has_many :messages, -> { order(created_at: :desc) },
18 18 :class_name => "Message",
19 19 :foreign_key => "sender_id"
20 20
21 21 has_many :replied_messages, -> { order(created_at: :desc) },
22 22 :class_name => "Message",
23 23 :foreign_key => "receiver_id"
24 24
25 25 has_one :contest_stat, :class_name => "UserContestStat", :dependent => :destroy
26 26
27 27 belongs_to :site
28 28 belongs_to :country
29 29
30 30 has_and_belongs_to_many :contests, -> { order(:name)}
31 31
32 32 scope :activated_users, -> {where activated: true}
33 33
34 34 validates_presence_of :login
35 35 validates_uniqueness_of :login
36 36 validates_format_of :login, :with => /\A[\_A-Za-z0-9]+\z/
37 37 validates_length_of :login, :within => 3..30
38 38
39 39 validates_presence_of :full_name
40 40 validates_length_of :full_name, :minimum => 1
41 41
42 42 validates_presence_of :password, :if => :password_required?
43 43 validates_length_of :password, :within => 4..50, :if => :password_required?
44 44 validates_confirmation_of :password, :if => :password_required?
45 45
46 46 validates_format_of :email,
47 47 :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i,
48 48 :if => :email_validation?
49 49 validate :uniqueness_of_email_from_activated_users,
50 50 :if => :email_validation?
51 51 validate :enough_time_interval_between_same_email_registrations,
52 52 :if => :email_validation?
53 53
54 54 # these are for ytopc
55 55 # disable for now
56 56 #validates_presence_of :province
57 57
58 58 attr_accessor :password
59 59
60 60 before_save :encrypt_new_password
61 61 before_save :assign_default_site
62 62 before_save :assign_default_contest
63 63
64 64 # this is for will_paginate
65 65 cattr_reader :per_page
66 66 @@per_page = 50
67 67
68 68 def self.authenticate(login, password)
69 69 user = find_by_login(login)
70 70 if user
71 71 return user if user.authenticated?(password)
72 72 end
73 73 end
74 74
75 75 def authenticated?(password)
76 76 if self.activated
77 77 hashed_password == User.encrypt(password,self.salt)
78 78 else
79 79 false
80 80 end
81 81 end
82 82
83 83 def admin?
84 - self.roles.where(name: 'admin').count > 0
84 + has_role?('admin')
85 + end
86 +
87 + def has_role?(role)
88 + self.roles.where(name: role).count > 0
85 89 end
86 90
87 91 def email_for_editing
88 92 if self.email==nil
89 93 "(unknown)"
90 94 elsif self.email==''
91 95 "(blank)"
92 96 else
93 97 self.email
94 98 end
95 99 end
96 100
97 101 def email_for_editing=(e)
98 102 self.email=e
99 103 end
100 104
101 105 def alias_for_editing
102 106 if self.alias==nil
103 107 "(unknown)"
104 108 elsif self.alias==''
105 109 "(blank)"
106 110 else
107 111 self.alias
108 112 end
109 113 end
110 114
111 115 def alias_for_editing=(e)
112 116 self.alias=e
113 117 end
114 118
115 119 def activation_key
116 120 if self.hashed_password==nil
117 121 encrypt_new_password
118 122 end
119 123 Digest::SHA1.hexdigest(self.hashed_password)[0..7]
120 124 end
121 125
122 126 def verify_activation_key(key)
123 127 key == activation_key
124 128 end
125 129
126 130 def self.random_password(length=5)
127 131 chars = 'abcdefghjkmnopqrstuvwxyz'
128 132 password = ''
129 133 length.times { password << chars[rand(chars.length - 1)] }
130 134 password
131 135 end
132 136
133 137 def self.find_non_admin_with_prefix(prefix='')
134 138 users = User.all
135 139 return users.find_all { |u| !(u.admin?) and u.login.index(prefix)==0 }
136 140 end
137 141
138 142 # Contest information
139 143
140 144 def self.find_users_with_no_contest()
141 145 users = User.all
142 146 return users.find_all { |u| u.contests.length == 0 }
143 147 end
144 148
145 149
146 150 def contest_time_left
147 151 if GraderConfiguration.contest_mode?
148 152 return nil if site==nil
149 153 return site.time_left
150 154 elsif GraderConfiguration.indv_contest_mode?
151 155 time_limit = GraderConfiguration.contest_time_limit
152 156 if time_limit == nil
153 157 return nil
154 158 end
155 159 if contest_stat==nil or contest_stat.started_at==nil
156 160 return (Time.now.gmtime + time_limit) - Time.now.gmtime
157 161 else
158 162 finish_time = contest_stat.started_at + time_limit
159 163 current_time = Time.now.gmtime
160 164 if current_time > finish_time
161 165 return 0
162 166 else
163 167 return finish_time - current_time
164 168 end
165 169 end
166 170 else
167 171 return nil
168 172 end
169 173 end
170 174
171 175 def contest_finished?
172 176 if GraderConfiguration.contest_mode?
173 177 return false if site==nil
174 178 return site.finished?
175 179 elsif GraderConfiguration.indv_contest_mode?
176 180 return false if self.contest_stat==nil
177 181 return contest_time_left == 0
178 182 else
179 183 return false
180 184 end
@@ -1,25 +1,54
1 - %h1 Administrators
2 -
3 - %table{:class => 'info'}
4 - %tr{:class => 'info-head'}
1 + %h1 Modify Role
2 + .row
3 + .col-md-6
4 + %h4 Administrators
5 + = form_tag modify_role_user_admin_index_path, method: 'post', class: 'form-inline' do
6 + = hidden_field_tag :role, 'admin'
7 + .form-group
8 + = label_tag :login, 'Grant admin role to:'
9 + = text_field_tag 'login',nil, class: 'form-control'
10 + .form-group
11 + = submit_tag 'Grant', class: 'btn btn-primary'
12 + %br
13 + %table.table.table-condense.table-hover.table-striped.table-bordered
14 + %thead{:class => 'info-head'}
5 15 %th #
6 16 %th Login
7 17 %th Full name
8 18 %th
9 19 - @admins.each_with_index do |user, i|
10 20 %tr
11 21 %td= i+1
12 22 %td= user.login
13 23 %td= user.full_name
14 24 %td
15 25 - if user.login!='root'
16 - = link_to '[revoke]', :action => 'revoke_admin', :id => user.id
17 - %hr
26 + = link_to '[revoke]', modify_role_user_admin_index_path( login: user.login, role: 'admin', commit: 'revoke')
27 + .col-md-6
28 + %h4 Teacher Assistants (TA)
29 + = form_tag modify_role_user_admin_index_path, method: 'post', class: 'form-inline' do
30 + = hidden_field_tag :role, 'TA'
31 + .form-group
32 + = label_tag :login, 'Grant TA role to:'
33 + = text_field_tag 'login',nil, class: 'form-control'
34 + .form-group
35 + = submit_tag 'Grant', class: 'btn btn-primary'
36 + %br
37 + %table.table.table-condense.table-hover.table-striped.table-bordered
38 + %thead{:class => 'info-head'}
39 + %th #
40 + %th Login
41 + %th Full name
42 + %th
43 + - @tas.each_with_index do |user, i|
44 + %tr
45 + %td= i+1
46 + %td= user.login
47 + %td= user.full_name
48 + %td
49 + - if user.login!='root'
50 + = link_to '[revoke]', modify_role_user_admin_index_path( login: user.login, role: 'TA', commit: 'revoke')
18 51
19 - = form_tag :action => 'grant_admin' do
20 - = label_tag :login, 'Grant admin permission to:'
21 - = text_field_tag 'login',nil, class: 'input-field'
22 - = submit_tag 'Grant', class: 'btn btn-primary'
23 52
24 53 %hr/
25 54 = link_to '[go back to index]', :action => 'index'
@@ -20,185 +20,184
20 20 get 'console'
21 21 get 'list_all'
22 22 end
23 23 end
24 24
25 25 resources :announcements do
26 26 member do
27 27 get 'toggle','toggle_front'
28 28 end
29 29 end
30 30
31 31 resources :problems do
32 32 member do
33 33 get 'toggle'
34 34 get 'toggle_test'
35 35 get 'toggle_view_testcase'
36 36 get 'stat'
37 37 end
38 38 collection do
39 39 get 'turn_all_off'
40 40 get 'turn_all_on'
41 41 get 'import'
42 42 get 'manage'
43 43 get 'quick_create'
44 44 post 'do_manage'
45 45 post 'do_import'
46 46 end
47 47 end
48 48
49 49 resources :groups do
50 50 member do
51 51 post 'add_user', to: 'groups#add_user', as: 'add_user'
52 52 delete 'remove_user/:user_id', to: 'groups#remove_user', as: 'remove_user'
53 53 delete 'remove_all_user', to: 'groups#remove_all_user', as: 'remove_all_user'
54 54 post 'add_problem', to: 'groups#add_problem', as: 'add_problem'
55 55 delete 'remove_problem/:problem_id', to: 'groups#remove_problem', as: 'remove_problem'
56 56 delete 'remove_all_problem', to: 'groups#remove_all_problem', as: 'remove_all_problem'
57 57 get 'toggle'
58 58 end
59 59 collection do
60 60
61 61 end
62 62 end
63 63
64 64 resources :testcases, only: [] do
65 65 member do
66 66 get 'download_input'
67 67 get 'download_sol'
68 68 end
69 69 collection do
70 70 get 'show_problem/:problem_id(/:test_num)' => 'testcases#show_problem', as: 'show_problem'
71 71 end
72 72 end
73 73
74 74 resources :grader_configuration, controller: 'configurations' do
75 75 collection do
76 76 get 'set_exam_right(/:value)', action: 'set_exam_right', as: 'set_exam_right'
77 77 end
78 78 end
79 79
80 80 resources :users do
81 81 member do
82 82 get 'toggle_activate', 'toggle_enable'
83 83 get 'stat'
84 84 end
85 85 collection do
86 86 get 'profile'
87 87 post 'chg_passwd'
88 88 end
89 89 end
90 90
91 91 resources :submissions do
92 92 member do
93 93 get 'download'
94 94 get 'compiler_msg'
95 95 get 'rejudge'
96 96 end
97 97 collection do
98 98 get 'prob/:problem_id', to: 'submissions#index', as: 'problem'
99 99 get 'direct_edit_problem/:problem_id(/:user_id)', to: 'submissions#direct_edit_problem', as: 'direct_edit_problem'
100 100 get 'get_latest_submission_status/:uid/:pid', to: 'submissions#get_latest_submission_status', as: 'get_latest_submission_status'
101 101 end
102 102 end
103 103
104 104
105 105 #user admin
106 106 resources :user_admin do
107 107 collection do
108 108 match 'bulk_manage', via: [:get, :post]
109 109 get 'bulk_mail'
110 110 get 'user_stat'
111 111 get 'import'
112 112 get 'new_list'
113 113 get 'admin'
114 114 get 'active'
115 115 get 'mass_mailing'
116 - get 'revoke_admin'
117 - post 'grant_admin'
116 + match 'modify_role', via: [:get, :post]
118 117 match 'create_from_list', via: [:get, :post]
119 118 match 'random_all_passwords', via: [:get, :post]
120 119 end
121 120 member do
122 121 get 'clear_last_ip'
123 122 end
124 123 end
125 124
126 125 resources :contest_management, only: [:index] do
127 126 collection do
128 127 get 'user_stat'
129 128 get 'clear_stat'
130 129 get 'clear_all_stat'
131 130 get 'change_contest_mode'
132 131 end
133 132 end
134 133
135 134 #get 'user_admin', to: 'user_admin#index'
136 135 #get 'user_admin/bulk_manage', to: 'user_admin#bulk_manage', as: 'bulk_manage_user_admin'
137 136 #post 'user_admin', to: 'user_admin#create'
138 137 #delete 'user_admin/:id', to: 'user_admin#destroy', as: 'user_admin_destroy'
139 138
140 139 #singular resource
141 140 #---- BEWARE ---- singular resource maps to plural controller by default, we can override by provide controller name directly
142 141 #report
143 142 resource :report, only: [], controller: 'report' do
144 143 get 'login'
145 144 get 'multiple_login'
146 145 get 'problem_hof(/:id)', action: 'problem_hof', as: 'problem_hof'
147 146 get 'current_score(/:group_id)', action: 'current_score', as: 'current_score'
148 147 get 'max_score'
149 148 post 'show_max_score'
150 149 get 'stuck'
151 150 get 'cheat_report'
152 151 post 'cheat_report'
153 152 get 'cheat_scruntinize'
154 153 post 'cheat_scruntinize'
155 154 end
156 155 #get 'report/current_score', to: 'report#current_score', as: 'report_current_score'
157 156 #get 'report/problem_hof(/:id)', to: 'report#problem_hof', as: 'report_problem_hof'
158 157 #get "report/login"
159 158 #get 'report/max_score', to: 'report#max_score', as: 'report_max_score'
160 159 #post 'report/show_max_score', to: 'report#show_max_score', as: 'report_show_max_score'
161 160
162 161 resource :main, only: [], controller: 'main' do
163 162 get 'login'
164 163 get 'logout'
165 164 get 'list'
166 165 get 'submission(/:id)', action: 'submission', as: 'main_submission'
167 166 get 'announcements'
168 167 get 'help'
169 168 post 'submit'
170 169 end
171 170 #main
172 171 #get "main/list"
173 172 #get 'main/submission(/:id)', to: 'main#submission', as: 'main_submission'
174 173 #post 'main/submit', to: 'main#submit'
175 174 #get 'main/announcements', to: 'main#announcements'
176 175
177 176
178 177 #
179 178 get 'tasks/view/:file.:ext' => 'tasks#view'
180 179 get 'tasks/download/:id/:file.:ext' => 'tasks#download', as: 'download_task'
181 180 get 'heartbeat/:id/edit' => 'heartbeat#edit'
182 181
183 182 #grader
184 183 get 'graders/list', to: 'graders#list', as: 'grader_list'
185 184 namespace :graders do
186 185 get 'task/:id/:type', action: 'task', as: 'task'
187 186 get 'view/:id/:type', action: 'view', as: 'view'
188 187 get 'clear/:id', action: 'clear', as: 'clear'
189 188 get 'stop'
190 189 get 'stop_all'
191 190 get 'clear_all'
192 191 get 'clear_terminated'
193 192 get 'start_grading'
194 193 get 'start_exam'
195 194
196 195 end
197 196
198 197
199 198 # See how all your routes lay out with "rake routes"
200 199
201 200 # This is a legacy wild controller route that's not recommended for RESTful applications.
202 201 # Note: This route will make all actions in every controller accessible via GET requests.
203 202 # match ':controller(/:action(/:id))(.:format)', via: [:get, :post]
204 203 end
@@ -132,157 +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 229 return if Role.find_by_name('admin')
229 230
230 231 role = Role.create(:name => 'admin')
231 232 user_admin_right = Right.create(:name => 'user_admin',
232 233 :controller => 'user_admin',
233 234 :action => 'all')
234 235 problem_admin_right = Right.create(:name=> 'problem_admin',
235 236 :controller => 'problems',
236 237 :action => 'all')
237 238
238 239 graders_right = Right.create(:name => 'graders_admin',
239 240 :controller => 'graders',
240 241 :action => 'all')
241 242
242 243 role.rights << user_admin_right;
243 244 role.rights << problem_admin_right;
244 245 role.rights << graders_right;
245 246 role.save
246 247 end
247 248
248 249 def seed_root
249 250 return if User.find_by_login('root')
250 251
251 252 root = User.new(:login => 'root',
252 253 :full_name => 'Administrator',
253 254 :alias => 'root')
254 255 root.password = 'ioionrails';
255 256
256 257 class << root
257 258 public :encrypt_new_password
258 259 def valid?(context=nil)
259 260 true
260 261 end
261 262 end
262 263
263 264 root.encrypt_new_password
264 265
265 266 root.roles << Role.find_by_name('admin')
266 267
267 268 root.activated = true
268 269 root.save
269 270 end
270 271
271 272 def seed_users_and_roles
272 273 seed_roles
273 274 seed_root
274 275 end
275 276
276 277 def seed_more_languages
277 278 #Language.delete_all
278 279 Language.find_or_create_by( name: 'c', pretty_name: 'C', ext: 'c', common_ext: 'c' )
279 280 Language.find_or_create_by( name: 'cpp', pretty_name: 'C++', ext: 'cpp', common_ext: 'cpp,cc' )
280 281 Language.find_or_create_by( name: 'pas', pretty_name: 'Pascal', ext: 'pas', common_ext: 'pas' )
281 282 Language.find_or_create_by( name: 'ruby', pretty_name: 'Ruby', ext: 'rb', common_ext: 'rb' )
282 283 Language.find_or_create_by( name: 'python', pretty_name: 'Python', ext: 'py', common_ext: 'py' )
283 284 Language.find_or_create_by( name: 'java', pretty_name: 'Java', ext: 'java', common_ext: 'java' )
284 285 end
285 286
286 287 seed_config
287 288 seed_users_and_roles
288 289 seed_more_languages
You need to be logged in to leave comments. Login now