Show More
Commit Description:
fixed extra space in pre tag on problem discriptions
Commit Description:
fixed extra space in pre tag on problem discriptions
File last commit:
Show/Diff file:
Action:
app/controllers/main_controller.rb | 447 lines | 13.5 KiB | text/x-ruby | RubyLexer |
pramook
initial commit...
r0 class MainController < ApplicationController
before_filter :authenticate, :except => [:index, :login]
jittat
[web] site start/stop supports...
r123 before_filter :check_viewability, :except => [:index, :login]
pramook
initial commit...
r0
jittat
fixed user confirmation bug...
r160 # COMMENTED OUT: filter in each action instead
# before_filter :verify_time_limit, :only => [:submit]
jittat
[web] added site and time out basic functionality...
r85
Jittat Fakcharoenphol
added submission_status to store grading results, first page shows only unpassed problems.
r216 verify :method => :post, :only => [:submit, :download_input, :submit_solution],
pramook
initial commit...
r0 :redirect_to => { :action => :index }
jittat
fixed user confirmation bug...
r160 # COMMENT OUT: only need when having high load
# caches_action :index, :login
jittat
fix some layout problem: first time at main after login, using wrong layouts...
r15
jittat
fixed user confirmation bug...
r160 # NOTE: This method is not actually needed, 'config/routes.rb' has
# assigned action login as a default action.
pramook
initial commit...
r0 def index
jittat
change login page, always redirect index to login...
r6 redirect_to :action => 'login'
pramook
initial commit...
r0 end
def login
jittat
[web] added configurations...
r76 saved_notice = flash[:notice]
pramook
initial commit...
r0 reset_session
Jittat Fakcharoenphol
fixed login error message recurring problem
r229 flash.now[:notice] = saved_notice
jittat
[web] added configurations...
r76
jittat
fixed user confirmation bug...
r160 # EXPERIMENT:
# Hide login if in single user mode and the url does not
# explicitly specify /login
jittat
[web] site start/stop supports...
r123 #
jittat
fixed user confirmation bug...
r160 # logger.info "PATH: #{request.path}"
# if Configuration['system.single_user_mode'] and
# request.path!='/main/login'
# @hidelogin = true
# end
jittat
added announcement to frontpage...
r151 @announcements = Announcement.find_for_frontpage
jittat
fixed layout problem, for real, using render :layout => ......
r27 render :action => 'login', :layout => 'empty'
pramook
initial commit...
r0 end
def list
jittat
moved submission validation to model...
r31 prepare_list_information
pramook
initial commit...
r0 end
jittat
[web] added help page...
r107 def help
@user = User.find(session[:user_id])
end
pramook
initial commit...
r0 def submit
jittat
[web] added site and time out basic functionality...
r85 user = User.find(session[:user_id])
jittat
moved submission validation to model...
r31 @submission = Submission.new(params[:submission])
jittat
[web] added site and time out basic functionality...
r85 @submission.user = user
jittat
moved submission validation to model...
r31 @submission.language_id = 0
jittat
fixed error when submitted file is nil...
r169 if (params['file']) and (params['file']!='')
jittat
[web] added support for output only problems...
r99 @submission.source = params['file'].read
@submission.source_filename = params['file'].original_filename
end
jittat
[web] fix time.new, time.now to use gmtime...
r121 @submission.submitted_at = Time.new.gmtime
jittat
[web] added site and time out basic functionality...
r85
Jittat Fakcharoenphol
added individual contest mode
r217 if Configuration.time_limit_mode? and user.contest_finished?
jittat
[web] added site and time out basic functionality...
r85 @submission.errors.add_to_base "The contest is over."
prepare_list_information
render :action => 'list' and return
end
jittat
moved submission validation to model...
r31 if @submission.valid?
if @submission.save == false
pramook
initial commit...
r0 flash[:notice] = 'Error saving your submission'
jittat
moved submission validation to model...
r31 elsif Task.create(:submission_id => @submission.id,
:status => Task::STATUS_INQUEUE) == false
pramook
initial commit...
r0 flash[:notice] = 'Error adding your submission to task queue'
end
jittat
add grader list...
r32 else
prepare_list_information
render :action => 'list' and return
pramook
initial commit...
r0 end
jittat
add grader list...
r32 redirect_to :action => 'list'
pramook
initial commit...
r0 end
jittat
[web] added compiler message and submission links to main/list...
r70 def source
pramook
initial commit...
r0 submission = Submission.find(params[:id])
if submission.user_id == session[:user_id]
send_data(submission.source,
jittat
added timestamp to source download...
r168 {:filename => submission.download_filename,
pramook
initial commit...
r0 :type => 'text/plain'})
else
flash[:notice] = 'Error viewing source'
jittat
moved test interface functionality to test_controller...
r44 redirect_to :action => 'list'
jittat
test interface upload...
r36 end
end
jittat
[web] added compiler message and submission links to main/list...
r70 def compiler_msg
@submission = Submission.find(params[:id])
if @submission.user_id == session[:user_id]
render :action => 'compiler_msg', :layout => 'empty'
else
flash[:notice] = 'Error viewing source'
redirect_to :action => 'list'
end
end
jittat
update views -- styling...
r51 def submission
@user = User.find(session[:user_id])
@problems = Problem.find_available_problems
if params[:id]==nil
@problem = nil
@submissions = nil
else
@problem = Problem.find_by_name(params[:id])
jittat
fixed submission view bug, reported by chalet...
r153 if not @problem.available
redirect_to :action => 'list'
jittat
fixed msg grammar...
r154 flash[:notice] = 'Error: submissions for that problem are not viewable.'
jittat
fixed submission view bug, reported by chalet...
r153 return
end
jittat
update views -- styling...
r51 @submissions = Submission.find_all_by_user_problem(@user.id, @problem.id)
end
end
jittat
[web] analysis mode...
r134 def result
if !Configuration.show_grading_result
redirect_to :action => 'list' and return
end
@user = User.find(session[:user_id])
@submission = Submission.find(params[:id])
if @submission.user!=@user
flash[:notice] = 'You are not allowed to view result of other users.'
redirect_to :action => 'list' and return
end
prepare_grading_result(@submission)
end
def load_output
if !Configuration.show_grading_result or params[:num]==nil
redirect_to :action => 'list' and return
end
@user = User.find(session[:user_id])
@submission = Submission.find(params[:id])
if @submission.user!=@user
flash[:notice] = 'You are not allowed to view result of other users.'
redirect_to :action => 'list' and return
end
case_num = params[:num].to_i
out_filename = output_filename(@user.login,
@submission.problem.name,
@submission.id,
case_num)
if !FileTest.exists?(out_filename)
flash[:notice] = 'Output not found.'
redirect_to :action => 'list' and return
end
response.headers['Content-Type'] = "application/force-download"
response.headers['Content-Disposition'] = "attachment; filename=\"output-#{case_num}.txt\""
response.headers["X-Sendfile"] = out_filename
response.headers['Content-length'] = File.size(out_filename)
render :nothing => true
end
jittat
[web] added error page for uploading too large file...
r109 def error
@user = User.find(session[:user_id])
end
jittat
added announcement refresh, more styling, prep for announcement hiding...
r192 # announcement refreshing and hiding methods
def announcements
if params.has_key? 'recent'
prepare_announcements(params[:recent])
else
prepare_announcements
end
render(:partial => 'announcement',
:collection => @announcements,
:locals => {:announcement_effect => true})
end
Jittat Fakcharoenphol
added submission_status to store grading results, first page shows only unpassed problems.
r216 #
Jittat Fakcharoenphol
added test pair assignment, requests new input, downloads input
r213 # actions for Code Jom
Jittat Fakcharoenphol
added submission_status to store grading results, first page shows only unpassed problems.
r216 #
def download_input
Jittat Fakcharoenphol
added test pair assignment, requests new input, downloads input
r213 problem = Problem.find(params[:id])
user = User.find(session[:user_id])
if user.can_request_new_test_pair_for? problem
assignment = user.get_new_test_pair_assignment_for problem
assignment.save
send_data(assignment.test_pair.input,
{ :filename => "#{problem.name}-#{assignment.request_number}.in",
:type => 'text/plain' })
Jittat Fakcharoenphol
added submission_status to store grading results, first page shows only unpassed problems.
r216 else
recent_assignment = user.get_recent_test_pair_assignment_for problem
Jittat Fakcharoenphol
added test pair assignment, requests new input, downloads input
r213 send_data(recent_assignment.test_pair.input,
{ :filename => "#{problem.name}-#{recent_assignment.request_number}.in",
:type => 'text/plain' })
Jittat Fakcharoenphol
added solution submission with grading
r214 end
end
def submit_solution
problem = Problem.find(params[:id])
user = User.find(session[:user_id])
recent_assignment = user.get_recent_test_pair_assignment_for problem
Jittat Fakcharoenphol
shows recent problem after wrong submissions
r223
Jittat Fakcharoenphol
added submission_status to store grading results, first page shows only unpassed problems.
r216 if recent_assignment == nil
flash[:notice] = 'You have not requested for any input data for this problem. Please download an input first.'
Jittat Fakcharoenphol
shows recent problem after wrong submissions
r223 session[:current_problem_id] = problem.id
Jittat Fakcharoenphol
added submission_status to store grading results, first page shows only unpassed problems.
r216 redirect_to :action => 'list' and return
end
Jittat Fakcharoenphol
added test assignment time out
r222 if recent_assignment.expired?
flash[:notice] = 'The current input is expired. Please download a new input data.'
Jittat Fakcharoenphol
shows recent problem after wrong submissions
r223 session[:current_problem_id] = problem.id
Jittat Fakcharoenphol
added test assignment time out
r222 redirect_to :action => 'list' and return
end
Jittat Fakcharoenphol
added submission_status to store grading results, first page shows only unpassed problems.
r216 if recent_assignment.submitted
flash[:notice] = 'You have already submitted an incorrect solution for this input. Please download a new input data.'
Jittat Fakcharoenphol
shows recent problem after wrong submissions
r223 session[:current_problem_id] = problem.id
Jittat Fakcharoenphol
added submission_status to store grading results, first page shows only unpassed problems.
r216 redirect_to :action => 'list' and return
end
if params[:file] == nil
flash[:notice] = 'You have not submitted any output.'
Jittat Fakcharoenphol
shows recent problem after wrong submissions
r223 session[:current_problem_id] = problem.id
Jittat Fakcharoenphol
added submission_status to store grading results, first page shows only unpassed problems.
r216 redirect_to :action => 'list' and return
end
submitted_solution = params[:file].read
test_pair = recent_assignment.test_pair
passed = test_pair.grade(submitted_solution)
points = passed ? 100 : 0
submission = Submission.new(:user => user,
:problem => problem,
:source => submitted_solution,
:source_filename => params['file'].original_filename,
:language_id => 0,
:submitted_at => Time.new.gmtime,
:graded_at => Time.new.gmtime,
:points => points)
submission.save
recent_assignment.submitted = true
recent_assignment.save
status = user.get_submission_status_for(problem)
if status == nil
status = SubmissionStatus.new :user => user, :problem => problem, :submission_count => 0
end
status.submission_count += 1
status.passed = passed
status.save
if passed
flash[:notice] = 'Correct solution.'
Jittat Fakcharoenphol
added codejom_status model for computing level with basic user update
r219 user.update_codejom_status
Jittat Fakcharoenphol
added solution submission with grading
r214 else
Jittat Fakcharoenphol
shows recent problem after wrong submissions
r223 session[:current_problem_id] = problem.id
Jittat Fakcharoenphol
added submission_status to store grading results, first page shows only unpassed problems.
r216 flash[:notice] = 'Incorrect solution.'
Jittat Fakcharoenphol
added test pair assignment, requests new input, downloads input
r213 end
Jittat Fakcharoenphol
added submission_status to store grading results, first page shows only unpassed problems.
r216 redirect_to :action => 'list'
Jittat Fakcharoenphol
added test pair assignment, requests new input, downloads input
r213 end
jittat
moved submission validation to model...
r31 protected
jittat
added announcement refresh, more styling, prep for announcement hiding...
r192
def prepare_announcements(recent=nil)
if Configuration.show_tasks_to?(@user)
@announcements = Announcement.find_published(true)
else
@announcements = Announcement.find_published
end
if recent!=nil
recent_id = recent.to_i
@announcements = @announcements.find_all { |a| a.id > recent_id }
end
end
Jittat Fakcharoenphol
added timeout related javascripts
r228 def prepare_timeout_information(problems)
@submission_timeouts = {}
problems.each do |problem|
assignment = @user.get_recent_test_pair_assignment_for(problem)
if assignment == nil
timeout = nil
else
Jittat Fakcharoenphol
fixed timeout bug for wrong submission (thanks to @dtinth), and js bugs occurring in IE
r232 if (assignment.expired?) or (assignment.submitted)
Jittat Fakcharoenphol
added timeout related javascripts
r228 timeout = 0
else
timeout = assignment.created_at + TEST_ASSIGNMENT_EXPIRATION_DURATION - Time.new.gmtime
end
end
@submission_timeouts[problem.id] = timeout
end
@submission_timeouts.each_pair {|k,v| puts "#{k} => #{v}"}
end
jittat
moved submission validation to model...
r31 def prepare_list_information
Jittat Fakcharoenphol
added submission_status to store grading results, first page shows only unpassed problems.
r216 @user = User.find(session[:user_id])
all_problems = Problem.find_available_problems
passed = {}
sub_count = {}
@user.submission_statuses.each do |status|
if status.passed
passed[status.problem_id] = true
end
sub_count[status.problem_id] = status.submission_count
end
Jittat Fakcharoenphol
shows recent problem after wrong submissions
r223 if session.has_key? :current_problem_id
@current_problem_id = session[:current_problem_id]
session.delete(:current_problem_id)
else
@current_problem_id = nil
end
Jittat Fakcharoenphol
added submission_status to store grading results, first page shows only unpassed problems.
r216 @problems = all_problems.reject { |problem| passed.has_key? problem.id }
Jittat Fakcharoenphol
added timeout related javascripts
r228 prepare_timeout_information(@problems)
jittat
moved submission validation to model...
r31 @prob_submissions = Array.new
@problems.each do |p|
Jittat Fakcharoenphol
added submission_status to store grading results, first page shows only unpassed problems.
r216 if sub_count.has_key? p.id
@prob_submissions << { :count => sub_count[p.id] }
jittat
added number (auto generated when submitting) to submissions...
r35 else
Jittat Fakcharoenphol
added submission_status to store grading results, first page shows only unpassed problems.
r216 @prob_submissions << { :count => 0 }
jittat
added number (auto generated when submitting) to submissions...
r35 end
jittat
moved submission validation to model...
r31 end
jittat
added announcement refresh, more styling, prep for announcement hiding...
r192 prepare_announcements
jittat
moved submission validation to model...
r31 end
jittat
[web] added mode + access control, when sites started/finished...
r122 def check_viewability
jittat
[web] no site admin login box when not in contest mode...
r124 @user = User.find(session[:user_id])
if (!Configuration.show_tasks_to?(@user)) and
jittat
[web] added mode + access control, when sites started/finished...
r122 ((action_name=='submission') or (action_name=='submit'))
redirect_to :action => 'list' and return
end
end
jittat
[web] analysis mode...
r134 def prepare_grading_result(submission)
jittat
MERGED changeset 404:406 from ytopc branch...
r197 if Configuration.task_grading_info.has_key? submission.problem.name
grading_info = Configuration.task_grading_info[submission.problem.name]
else
# guess task info from problem.full_score
cases = submission.problem.full_score / 10
grading_info = {
'testruns' => cases,
'testcases' => cases
}
end
jittat
[web] analysis mode...
r134 @test_runs = []
if grading_info['testruns'].is_a? Integer
trun_count = grading_info['testruns']
trun_count.times do |i|
@test_runs << [ read_grading_result(@user.login,
submission.problem.name,
submission.id,
i+1) ]
end
else
grading_info['testruns'].keys.sort.each do |num|
run = []
testrun = grading_info['testruns'][num]
testrun.each do |c|
run << read_grading_result(@user.login,
submission.problem.name,
submission.id,
c)
end
@test_runs << run
end
end
end
def grading_result_dir(user_name, problem_name, submission_id, case_num)
return "#{GRADING_RESULT_DIR}/#{user_name}/#{problem_name}/#{submission_id}/test-result/#{case_num}"
end
def output_filename(user_name, problem_name, submission_id, case_num)
dir = grading_result_dir(user_name,problem_name, submission_id, case_num)
return "#{dir}/output.txt"
end
def read_grading_result(user_name, problem_name, submission_id, case_num)
dir = grading_result_dir(user_name,problem_name, submission_id, case_num)
result_file_name = "#{dir}/result"
if !FileTest.exists?(result_file_name)
return {:num => case_num, :msg => 'program did not run'}
else
results = File.open(result_file_name).readlines
run_stat = extract_running_stat(results)
output_filename = "#{dir}/output.txt"
if FileTest.exists?(output_filename)
output_file = true
output_size = File.size(output_filename)
else
output_file = false
output_size = 0
end
return {
:num => case_num,
:msg => results[0],
:run_stat => run_stat,
:output => output_file,
:output_size => output_size
}
end
end
# copied from grader/script/lib/test_request_helper.rb
def extract_running_stat(results)
running_stat_line = results[-1]
# extract exit status line
run_stat = ""
if !(/[Cc]orrect/.match(results[0]))
run_stat = results[0].chomp
else
run_stat = 'Program exited normally'
end
logger.info "Stat line: #{running_stat_line}"
# extract running time
if res = /r(.*)u(.*)s/.match(running_stat_line)
seconds = (res[1].to_f + res[2].to_f)
time_stat = "Time used: #{seconds} sec."
else
seconds = nil
time_stat = "Time used: n/a sec."
end
# extract memory usage
if res = /s(.*)m/.match(running_stat_line)
memory_used = res[1].to_i
else
memory_used = -1
end
return {
:msg => "#{run_stat}\n#{time_stat}",
:running_time => seconds,
:exit_status => run_stat,
:memory_usage => memory_used
}
end
pramook
initial commit...
r0 end
jittat
moved submission validation to model...
r31