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
References:
File last commit:
Show/Diff file:
Action:
app/models/grader_message.rb
| 90 lines
| 2.8 KiB
| text/x-ruby
| RubyLexer
|
|
r182 | class GraderMessage < ActiveRecord::Base | ||
|
r184 | belongs_to :taken_grader_process, :class_name => :grader_process | ||
|
r182 | GRADE_SUBMISSION = 1 | ||
GRADE_TEST_REQUEST = 2 | ||||
STOP = 3 | ||||
|
r184 | RECIPIENT_ANY = -1 | ||
|
r182 | def self.create_message(recipient, command, options=nil, target_id=nil) | ||
recipient_id = recipient | ||||
|
r184 | if recipient == :any | ||
recipient_id = GraderMessage::RECIPIENT_ANY | ||||
|
r182 | end | ||
GraderMessage.create(:grader_process_id => recipient_id, | ||||
:command => command, | ||||
:options => options, | ||||
:target_id => target_id, | ||||
:taken => false) | ||||
end | ||||
|
r187 | def self.create_grade_submission(submission, | ||
grading_environment="grading") | ||||
|
r182 | GraderMessage.create_message(:any, | ||
GraderMessage::GRADE_SUBMISSION, | ||||
|
r187 | grading_environment, | ||
|
r182 | submission.id) | ||
end | ||||
|
r187 | def self.create_grade_test_request(test_request, | ||
grading_environment="grading") | ||||
|
r182 | GraderMessage.create_message(:any, | ||
GraderMessage::GRADE_TEST_REQUEST, | ||||
|
r187 | grading_environment, | ||
|
r182 | 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})" + | ||||
|
r184 | " OR (`grader_process_id` = #{GraderMessage::RECIPIENT_ANY}))" | ||
|
r182 | |||
message = nil # need this to bind message in do-block for transaction | ||||
begin | ||||
GraderMessage.transaction do | ||||
message = GraderMessage.find(:first, | ||||
:order => "created_at", | ||||
:conditions => | ||||
|
r184 | "(`taken` = 0)" + | ||
" AND (#{recp_conditions})" + | ||||
|
r182 | " AND (#{command_conditions})", | ||
:lock => true) | ||||
if message!=nil | ||||
message.taken = true | ||||
|
r184 | message.taken_grader_process_id = recipient_id | ||
|
r182 | 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 | ||||