Show More
Commit Description:
added default grading mode, changed log message in grader...
Commit Description:
added default grading mode, changed log message in grader git-svn-id: http://theory.cpe.ku.ac.th/grader/web/trunk@393 6386c4cd-e34a-4fa8-8920-d93eb39b512e
File last commit:
Show/Diff file:
Action:
app/models/grader_message.rb | 90 lines | 2.8 KiB | text/x-ruby | RubyLexer |
class GraderMessage < ActiveRecord::Base
belongs_to :taken_grader_process, :class_name => :grader_process
GRADE_SUBMISSION = 1
GRADE_TEST_REQUEST = 2
STOP = 3
RECIPIENT_ANY = -1
def self.create_message(recipient, command, options=nil, target_id=nil)
recipient_id = recipient
if recipient == :any
recipient_id = GraderMessage::RECIPIENT_ANY
end
GraderMessage.create(:grader_process_id => recipient_id,
:command => command,
:options => options,
:target_id => target_id,
:taken => false)
end
def self.create_grade_submission(submission,
grading_environment="grading")
GraderMessage.create_message(:any,
GraderMessage::GRADE_SUBMISSION,
grading_environment,
submission.id)
end
def self.create_grade_test_request(test_request,
grading_environment="grading")
GraderMessage.create_message(:any,
GraderMessage::GRADE_TEST_REQUEST,
grading_environment,
test_request.id)
end
def self.create_stop(grader_process_id)
GraderMessage.create_message(grader_process_id,
GraderMessage::STOP)
end
def self.get_message_for(recipient_id, accepting_commands=:all)
command_conditions =
GraderMessage.build_command_conditions(accepting_commands)
recp_conditions= "((`grader_process_id` = #{recipient_id.to_i})" +
" OR (`grader_process_id` = #{GraderMessage::RECIPIENT_ANY}))"
message = nil # need this to bind message in do-block for transaction
begin
GraderMessage.transaction do
message = GraderMessage.find(:first,
:order => "created_at",
:conditions =>
"(`taken` = 0)" +
" AND (#{recp_conditions})" +
" AND (#{command_conditions})",
:lock => true)
if message!=nil
message.taken = true
message.taken_grader_process_id = recipient_id
message.save!
end
end
rescue
message = nil
end
message
end
protected
def self.build_command_conditions(accepting_commands)
if accepting_commands==:all
return '(1=1)'
else
conds = []
accepting_commands.each do |command|
conds << "(`command` = #{command.to_i})"
end
return "(" + conds.join(" OR ") + ")"
end
end
end