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,2 +1,18 @@ class GradersController < ApplicationController + + + before_filter :authenticate + + def list + @grader_processes = GraderProcess.find(:all, + :order => 'updated_at desc') + @stalled_processes = GraderProcess.find_stalled_process + end + + def clear + grader_proc = GraderProcess.find(params[:id]) + grader_proc.destroy if grader_proc!=nil + redirect_to :action => 'list' + end + end diff --git a/app/controllers/main_controller.rb b/app/controllers/main_controller.rb --- a/app/controllers/main_controller.rb +++ b/app/controllers/main_controller.rb @@ -32,10 +32,11 @@ :status => Task::STATUS_INQUEUE) == false flash[:notice] = 'Error adding your submission to task queue' end + else + prepare_list_information + render :action => 'list' and return end - - prepare_list_information - render :action => 'list' + redirect_to :action => 'list' end def get_source 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,5 +1,7 @@ class GraderProcess < ActiveRecord::Base + belongs_to :task + def self.find_by_ip_and_pid(ip,pid) return GraderProcess.find(:first, :conditions => { @@ -8,10 +10,43 @@ }) end - def self.report_active(ip,pid,mode) + def self.register(ip,pid,mode) + grader = GraderProcess.find_by_ip_and_pid(ip,pid) + if grader + grader.mode = mode + grader.active = nil + grader.task_id = nil + grader.save + else + grader = GraderProcess.create(:ip => ip, + :pid => pid, + :mode => mode) + end + grader + end + + def self.find_stalled_process() + GraderProcess.find(:all, + :conditions => ["active AND updated_at < ?", + Time.now.gmtime - GraderProcess.stalled_time]) + end + + def report_active(task=nil) + self.active = true + self.task = task + self.save end - def self.report_inactive(ip,pid,mode) + def report_inactive() + self.active = false + self.task = nil + self.save end + protected + + def self.stalled_time() + return 1.minute + end + end diff --git a/app/views/graders/_grader.html.haml b/app/views/graders/_grader.html.haml new file mode 100644 --- /dev/null +++ b/app/views/graders/_grader.html.haml @@ -0,0 +1,9 @@ + +%td= grader.ip +%td= grader.pid +%td= grader.updated_at.strftime("%H:%M:%S") if grader.updated_at!=nil +%td + - if grader.task_id==nil + \- + - else + = grader.task_id diff --git a/app/views/graders/_grader_list.html.haml b/app/views/graders/_grader_list.html.haml new file mode 100644 --- /dev/null +++ b/app/views/graders/_grader_list.html.haml @@ -0,0 +1,16 @@ + +%table.graders + %tr + %th ip + %th pid + %th last updated + %th task + - grader_list.each do |grader| + - if grader.active + - c = 'active' + - else + - c = 'inactive' + %tr{:class => c} + = render :partial => 'grader', :locals => {:grader => grader} + %td= link_to 'clear', {:action => 'clear', :id => grader} + diff --git a/app/views/graders/list.html.haml b/app/views/graders/list.html.haml new file mode 100644 --- /dev/null +++ b/app/views/graders/list.html.haml @@ -0,0 +1,10 @@ +- content_for :head do + = stylesheet_link_tag 'graders' + +%h3 Current graders + += render :partial => 'grader_list', :locals => {:grader_list => @grader_processes} + +%h3 Stalled graders + += render :partial => 'grader_list', :locals => {:grader_list => @stalled_processes} diff --git a/db/migrate/016_add_task_to_grader_process.rb b/db/migrate/016_add_task_to_grader_process.rb new file mode 100644 --- /dev/null +++ b/db/migrate/016_add_task_to_grader_process.rb @@ -0,0 +1,9 @@ +class AddTaskToGraderProcess < ActiveRecord::Migration + def self.up + add_column :grader_processes, :task_id, :integer + end + + def self.down + remove_column :grader_processes, :task_id, :integer + 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 => 15) do +ActiveRecord::Schema.define(:version => 16) do create_table "grader_processes", :force => true do |t| t.string "ip", :limit => 20 @@ -18,6 +18,7 @@ t.boolean "active" t.datetime "created_at" t.datetime "updated_at" + t.integer "task_id" end add_index "grader_processes", ["ip", "pid"], :name => "index_grader_processes_on_ip_and_pid" diff --git a/public/stylesheets/graders.css b/public/stylesheets/graders.css new file mode 100644 --- /dev/null +++ b/public/stylesheets/graders.css @@ -0,0 +1,12 @@ + +table.graders tr.active { + border: 1px solid black; + background: lightgreen; + text-align: center; +} + +table.graders tr.inactive { + border: 1px solid black; + background: #ffcccc; + text-align: center; +} \ No newline at end of file