|
|
class GradersController < ApplicationController
|
|
|
|
|
|
before_filter :admin_authorization, except: [ :submission ]
|
|
|
before_filter(only: [:submission]) {
|
|
|
return false unless authenticate
|
|
|
|
|
|
if GraderConfiguration["right.user_view_submission"]
|
|
|
return true;
|
|
|
end
|
|
|
|
|
|
admin_authorization
|
|
|
}
|
|
|
|
|
|
verify :method => :post, :only => ['clear_all',
|
|
|
'start_exam',
|
|
|
'start_grading',
|
|
|
'stop_all',
|
|
|
'clear_terminated'],
|
|
|
:redirect_to => {:action => 'index'}
|
|
|
|
|
|
def index
|
|
|
redirect_to :action => 'list'
|
|
|
end
|
|
|
|
|
|
def list
|
|
|
@grader_processes = GraderProcess.find_running_graders
|
|
|
@stalled_processes = GraderProcess.find_stalled_process
|
|
|
|
|
|
@terminated_processes = GraderProcess.find_terminated_graders
|
|
|
|
|
|
@last_task = Task.find(:first,
|
|
|
:order => 'created_at DESC')
|
|
|
@last_test_request = TestRequest.find(:first,
|
|
|
:order => 'created_at DESC')
|
|
|
@submission = Submission.order("id desc").limit(20)
|
|
|
end
|
|
|
|
|
|
def clear
|
|
|
grader_proc = GraderProcess.find(params[:id])
|
|
|
grader_proc.destroy if grader_proc!=nil
|
|
|
redirect_to :action => 'list'
|
|
|
end
|
|
|
|
|
|
def clear_terminated
|
|
|
GraderProcess.find_terminated_graders.each do |p|
|
|
|
p.destroy
|
|
|
end
|
|
|
redirect_to :action => 'list'
|
|
|
end
|
|
|
|
|
|
def clear_all
|
|
|
GraderProcess.find(:all).each do |p|
|
|
|
p.destroy
|
|
|
end
|
|
|
redirect_to :action => 'list'
|
|
|
end
|
|
|
|
|
|
def view
|
|
|
if params[:type]=='Task'
|
|
|
redirect_to :action => 'task', :id => params[:id]
|
|
|
else
|
|
|
redirect_to :action => 'test_request', :id => params[:id]
|
|
|
end
|
|
|
end
|
|
|
|
|
|
def test_request
|
|
|
@test_request = TestRequest.find(params[:id])
|
|
|
end
|
|
|
|
|
|
def task
|
|
|
@task = Task.find(params[:id])
|
|
|
end
|
|
|
|
|
|
def submission
|
|
|
@submission = Submission.find(params[:id])
|
|
|
formatter = Rouge::Formatters::HTML.new(css_class: 'highlight', line_numbers: true )
|
|
|
lexer = case @submission.language.name
|
|
|
when "c" then Rouge::Lexers::C.new
|
|
|
when "cpp" then Rouge::Lexers::Cpp.new
|
|
|
when "pas" then Rouge::Lexers::Pas.new
|
|
|
when "ruby" then Rouge::Lexers::Ruby.new
|
|
|
when "python" then Rouge::Lexers::Python.new
|
|
|
when "java" then Rouge::Lexers::Java.new
|
|
|
when "php" then Rouge::Lexers::PHP.new
|
|
|
end
|
|
|
@formatted_code = formatter.format(lexer.lex(@submission.source))
|
|
|
@css_style = Rouge::Themes::ThankfulEyes.render(scope: '.highlight')
|
|
|
|
|
|
end
|
|
|
|
|
|
# various grader controls
|
|
|
|
|
|
def stop
|
|
|
grader_proc = GraderProcess.find(params[:id])
|
|
|
GraderScript.stop_grader(grader_proc.pid)
|
|
|
flash[:notice] = 'Grader stopped. It may not disappear now, but it should disappear shortly.'
|
|
|
redirect_to :action => 'list'
|
|
|
end
|
|
|
|
|
|
def stop_all
|
|
|
GraderScript.stop_graders(GraderProcess.find_running_graders +
|
|
|
GraderProcess.find_stalled_process)
|
|
|
flash[:notice] = 'Graders stopped. They may not disappear now, but they should disappear shortly.'
|
|
|
redirect_to :action => 'list'
|
|
|
end
|
|
|
|
|
|
def start_grading
|
|
|
GraderScript.start_grader('grading')
|
|
|
flash[:notice] = '2 graders in grading env started, one for grading queue tasks, another for grading test request'
|
|
|
redirect_to :action => 'list'
|
|
|
end
|
|
|
|
|
|
def start_exam
|
|
|
GraderScript.start_grader('exam')
|
|
|
flash[:notice] = '2 graders in grading env started, one for grading queue tasks, another for grading test request'
|
|
|
redirect_to :action => 'list'
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|