Show More
Commit Description:
update heartbeat...
Commit Description:
update heartbeat add try-to-login-from-other-ip loggin (by printing to stdout)
References:
File last commit:
Show/Diff file:
Action:
app/controllers/main_controller.rb | 385 lines | 11.6 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 Fakcharoenphol
shows contest start confirmation for indv contest
r302 append_before_filter :confirm_and_update_start_time,
:except => [:index,
:login,
:confirm_contest_start]
Jittat Fakcharoenphol
fixed indv contest timing bug (same as in codejom), added user contest stat reset
r247
Jittat Fakcharoenphol
fixed login box showing in announcement box after user logged out in other tabs
r249 # to prevent log in box to be shown when user logged out of the
# system only in some tab
Jittat Fakcharoenphol
shows contest start confirmation for indv contest
r302 prepend_before_filter :reject_announcement_refresh_when_logged_out,
:only => [:announcements]
Jittat Fakcharoenphol
fixed login box showing in announcement box after user logged out in other tabs
r249
add option to disable login from multiple ip
r525 before_filter :authenticate_by_ip_address, :only => [:list]
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
pramook
initial commit...
r0 verify :method => :post, :only => [:submit],
: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}"
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 # if GraderConfiguration['system.single_user_mode'] and
jittat
fixed user confirmation bug...
r160 # 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 Fakcharoenphol
fixed form_tag/form_for, disabled attributes whitelist
r321 @submission = Submission.new
@submission.problem_id = params[:submission][:problem_id]
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']!='')
fix utf8 for java
r462 @submission.source = File.open(params['file'].path,'r:UTF-8',&:read)
@submission.source.encode!('UTF-8','UTF-8',invalid: :replace, replace: '')
jittat
[web] added support for output only problems...
r99 @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
add ip to submission
r446 @submission.ip_address = request.remote_ip
jittat
[web] added site and time out basic functionality...
r85
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 if GraderConfiguration.time_limit_mode? and user.contest_finished?
update errors.add_to_base("x") to Rails 3 errors.add(:base,"x")
r347 @submission.errors.add(:base,"The contest is over.")
jittat
[web] added site and time out basic functionality...
r85 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])
Jittat Fakcharoenphol
prevents user from viewing own sources submitted to unavailable problems
r305 if ((submission.user_id == session[:user_id]) and
(submission.problem != nil) and
(submission.problem.available))
pramook
initial commit...
r0 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])
Jittat Fakcharoenphol
controllers get available problems from current user
r288 @problems = @user.available_problems
jittat
update views -- styling...
r51 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
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 if !GraderConfiguration.show_grading_result
jittat
[web] analysis mode...
r134 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
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 if !GraderConfiguration.show_grading_result or params[:num]==nil
jittat
[web] analysis mode...
r134 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
Jittat Fakcharoenphol
fixed X-Sendfile restriction on output download
r291 if defined?(USE_APACHE_XSENDFILE) and USE_APACHE_XSENDFILE
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
else
send_file out_filename, :stream => false, :filename => "output-#{case_num}.txt", :type => "text/plain"
end
jittat
[web] analysis mode...
r134 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
shows contest start confirmation for indv contest
r302 def confirm_contest_start
user = User.find(session[:user_id])
wytesk133
Fixed Individual Contest confirmation
r371 if request.method == 'POST'
Jittat Fakcharoenphol
shows contest start confirmation for indv contest
r302 user.update_start_time
redirect_to :action => 'list'
else
@contests = user.contests
@user = user
end
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)
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 if GraderConfiguration.show_tasks_to?(@user)
jittat
added announcement refresh, more styling, prep for announcement hiding...
r192 @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
moved submission validation to model...
r31 def prepare_list_information
@user = User.find(session[:user_id])
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 if not GraderConfiguration.multicontests?
Jittat Fakcharoenphol
fixed single contest bug, reported by K. Siththa
r292 @problems = @user.available_problems
Jittat Fakcharoenphol
shows problems availabe in contests
r278 else
Jittat Fakcharoenphol
controllers get available problems from current user
r288 @contest_problems = @user.available_problems_group_by_contests
@problems = @user.available_problems
Jittat Fakcharoenphol
shows problems availabe in contests
r278 end
@prob_submissions = {}
jittat
moved submission validation to model...
r31 @problems.each do |p|
jittat
added number (auto generated when submitting) to submissions...
r35 sub = Submission.find_last_by_user_and_problem(@user.id,p.id)
if sub!=nil
Jittat Fakcharoenphol
shows problems availabe in contests
r278 @prob_submissions[p.id] = { :count => sub.number, :submission => sub }
jittat
added number (auto generated when submitting) to submissions...
r35 else
Jittat Fakcharoenphol
shows problems availabe in contests
r278 @prob_submissions[p.id] = { :count => 0, :submission => nil }
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])
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 if (!GraderConfiguration.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 Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 if GraderConfiguration.task_grading_info.has_key? submission.problem.name
grading_info = GraderConfiguration.task_grading_info[submission.problem.name]
jittat
MERGED changeset 404:406 from ytopc branch...
r197 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
Jittat Fakcharoenphol
shows contest start confirmation for indv contest
r302 def confirm_and_update_start_time
Jittat Fakcharoenphol
fixed indv contest timing bug (same as in codejom), added user contest stat reset
r247 user = User.find(session[:user_id])
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 if (GraderConfiguration.indv_contest_mode? and
GraderConfiguration['contest.confirm_indv_contest_start'] and
Jittat Fakcharoenphol
shows contest start confirmation for indv contest
r302 !user.contest_started?)
redirect_to :action => 'confirm_contest_start' and return
end
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 if not GraderConfiguration.analysis_mode?
Jittat Fakcharoenphol
does not record login time in analysis mode
r317 user.update_start_time
end
Jittat Fakcharoenphol
fixed indv contest timing bug (same as in codejom), added user contest stat reset
r247 end
Jittat Fakcharoenphol
fixed login box showing in announcement box after user logged out in other tabs
r249 def reject_announcement_refresh_when_logged_out
if not session[:user_id]
render :text => 'Access forbidden', :status => 403
end
Jittat Fakcharoenphol
a cleaner, testable way to log out user after contest changed
r295
Jittat Fakcharoenphol
renamed model Configuration to GraderConfiguration, renamed rhtml views to erb, fixed other small errors
r320 if GraderConfiguration.multicontests?
Jittat Fakcharoenphol
a cleaner, testable way to log out user after contest changed
r295 user = User.find(session[:user_id])
if user.contest_stat.forced_logout
render :text => 'Access forbidden', :status => 403
end
end
Jittat Fakcharoenphol
fixed login box showing in announcement box after user logged out in other tabs
r249 end
pramook
initial commit...
r0 end
jittat
moved submission validation to model...
r31