diff --git a/app/controllers/graders_controller.rb b/app/controllers/graders_controller.rb --- a/app/controllers/graders_controller.rb +++ b/app/controllers/graders_controller.rb @@ -1,7 +1,13 @@ class GradersController < ApplicationController - - before_filter :authorization + before_filter :admin_authorization + + verify :method => :post, :only => ['clear_all'], + :redirect_to => {:action => 'index'} + + def index + redirect_to :action => 'list' + end def list @grader_processes = GraderProcess.find(:all, @@ -15,4 +21,31 @@ 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]) + end + end diff --git a/app/controllers/user_admin_controller.rb b/app/controllers/user_admin_controller.rb --- a/app/controllers/user_admin_controller.rb +++ b/app/controllers/user_admin_controller.rb @@ -1,6 +1,6 @@ class UserAdminController < ApplicationController - before_filter :authenticate, :authorization + before_filter :admin_authorization def index list diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -13,7 +13,7 @@ append_to menu_items, '[Problem admin]', 'problems', 'index' append_to menu_items, '[User admin]', 'user_admin', 'index' append_to menu_items, '[User stat]', 'user_admin', 'user_stat' - #append_to menu_items, '[Graders]', 'graders', 'list' + append_to menu_items, '[Graders]', 'graders', 'list' append_to menu_items, '[Site config]', 'configurations', 'index' menu_items << "
" end @@ -72,4 +72,12 @@ TITLEBAR end + def read_textfile(fname,max_size=2048) + begin + File.open(fname).read(max_size) + rescue + nil + end + end + end diff --git a/app/helpers/test_helper.rb b/app/helpers/test_helper.rb --- a/app/helpers/test_helper.rb +++ b/app/helpers/test_helper.rb @@ -1,11 +1,2 @@ module TestHelper - - def read_textfile(fname,max_size=2048) - begin - File.open(fname).read(max_size) - rescue - nil - end - end - end diff --git a/app/models/grader_process.rb b/app/models/grader_process.rb --- a/app/models/grader_process.rb +++ b/app/models/grader_process.rb @@ -1,7 +1,5 @@ class GraderProcess < ActiveRecord::Base - belongs_to :task - def self.find_by_host_and_pid(host,pid) return GraderProcess.find(:first, :conditions => { @@ -16,6 +14,7 @@ grader.mode = mode grader.active = nil grader.task_id = nil + grader.task_type = nil grader.save else grader = GraderProcess.create(:host => host, @@ -33,13 +32,15 @@ def report_active(task=nil) self.active = true - self.task = task + self.task_id = task.id + self.task_type = task.class.to_s self.save end def report_inactive() self.active = false - self.task = nil + self.task_id = nil + self.task_type = nil self.save end diff --git a/app/models/task.rb b/app/models/task.rb --- a/app/models/task.rb +++ b/app/models/task.rb @@ -1,5 +1,7 @@ class Task < ActiveRecord::Base + belongs_to :submission + STATUS_GRADING = 0 STATUS_INQUEUE = 1 STATUS_COMPLETE = 2 diff --git a/app/views/graders/_grader.html.haml b/app/views/graders/_grader.html.haml --- a/app/views/graders/_grader.html.haml +++ b/app/views/graders/_grader.html.haml @@ -1,9 +1,11 @@ %td= grader.host %td= grader.pid +%td= grader.mode %td= grader.updated_at.strftime("%H:%M:%S") if grader.updated_at!=nil +%td= grader.task_type %td - if grader.task_id==nil - \- + idle - else - = grader.task_id + = link_to "#{grader.task_id}", :action => 'view', :id => grader.task_id, :type => grader.task_type diff --git a/app/views/graders/_grader_list.html.haml b/app/views/graders/_grader_list.html.haml --- a/app/views/graders/_grader_list.html.haml +++ b/app/views/graders/_grader_list.html.haml @@ -3,7 +3,9 @@ %tr %th host %th pid + %th mode %th last updated + %th type %th task - grader_list.each do |grader| - if grader.active diff --git a/app/views/graders/list.html.haml b/app/views/graders/list.html.haml --- a/app/views/graders/list.html.haml +++ b/app/views/graders/list.html.haml @@ -3,6 +3,9 @@ %h2 (Under Experiments) +- form_for :clear, nil, :url => {:action => 'clear_all'} do |f| + = submit_tag 'Clear all data' + %h3 Current graders = render :partial => 'grader_list', :locals => {:grader_list => @grader_processes} diff --git a/app/views/graders/submission.html.haml b/app/views/graders/submission.html.haml new file mode 100644 --- /dev/null +++ b/app/views/graders/submission.html.haml @@ -0,0 +1,22 @@ +%h1= "Submission: #{@submission.id}" + +%p + User: + = "#{@submission.user.login}" + %br/ + Problem: + - if @submission.problem!=nil + = "#{@submission.problem.full_name}" + - else + = "(n/a)" + %br/ + = "Number: #{@submission.number}" + %br/ + = "Submitted at: #{format_short_time(@submission.submitted_at)}" + +%b Source code (first 10kb) +%div{:style => "border: 1px solid black; background: lightgrey"} + - if @submission.source + %pre + = truncate(@submission.source,10240) + diff --git a/app/views/graders/task.html.haml b/app/views/graders/task.html.haml new file mode 100644 --- /dev/null +++ b/app/views/graders/task.html.haml @@ -0,0 +1,15 @@ +%h1= "Task: #{@task.id}" + +%p + User: + = "#{@task.submission.user.login}" + %br/ + Status: + = "#{@task.status_str} (at #{format_short_time(@task.updated_at)})" + %br/ + = "Submission: #{@task.submission_id}" + - if @task.submission !=nil + = link_to '[view submission]', :action => 'submission', :id => @task.submission.id + %br/ + = "Submitted at: #{format_short_time(@task.created_at)}" + %br/ diff --git a/app/views/graders/test_request.html.haml b/app/views/graders/test_request.html.haml new file mode 100644 --- /dev/null +++ b/app/views/graders/test_request.html.haml @@ -0,0 +1,40 @@ +%h1= "Test Request: #{@test_request.id}" + +%p + User: + = "#{@test_request.user.login}" + %br/ + Problem: + - if @test_request.problem!=nil + = "#{@test_request.problem.full_name}" + - else + = "(n/a)" + %br/ + = "Submission: #{@test_request.submission.number}" + = link_to '[view submission]', :action => 'submission', :id => @test_request.submission.id + %br/ + = "Test submitted at: #{format_short_time(@test_request.submitted_at)}" + %br/ + = "Execution time: #{@test_request.running_time} s." + %br/ + = "Memory usage: #{@test_request.memory_usage}kb" + %br/ + %b= @test_request.exit_status + %br/ + +- if @test_request.compiler_message!=nil and @test_request.compiler_message!='' + %b Compiler Message + %div{:style => "border: 1px solid black; background: lightgrey"} + = simple_format(truncate((@test_request.compiler_message or ''),200)) + +%b Input (first 2kb) +%div{:style => "border: 1px solid black; background: lightgrey"} + - if @test_request.input_file_name!=nil + = simple_format(read_textfile(@test_request.input_file_name,2048)) + +%b Output (first 2kb) +%div{:style => "border: 1px solid black; background: lightgrey"} + - if @test_request.output_file_name!=nil + = simple_format(read_textfile(@test_request.output_file_name,2048)) + - else + (no output) diff --git a/db/migrate/033_add_task_type_to_grader_processes.rb b/db/migrate/033_add_task_type_to_grader_processes.rb new file mode 100644 --- /dev/null +++ b/db/migrate/033_add_task_type_to_grader_processes.rb @@ -0,0 +1,9 @@ +class AddTaskTypeToGraderProcesses < ActiveRecord::Migration + def self.up + add_column 'grader_processes', 'task_type', :string + end + + def self.down + remove_column 'grader_processes', 'task_type' + end +end diff --git a/db/schema.rb b/db/schema.rb --- a/db/schema.rb +++ b/db/schema.rb @@ -9,7 +9,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 32) do +ActiveRecord::Schema.define(:version => 33) do create_table "announcements", :force => true do |t| t.string "author" @@ -42,6 +42,7 @@ t.datetime "created_at" t.datetime "updated_at" t.integer "task_id" + t.string "task_type" end add_index "grader_processes", ["host", "pid"], :name => "index_grader_processes_on_ip_and_pid"