Show More
Commit Description:
* multiple ip login fix...
Commit Description:
* multiple ip login fix
* fix when points is nil in stat page and user page
References:
File last commit:
Show/Diff file:
Action:
app/controllers/problems_controller.rb
| 277 lines
| 7.4 KiB
| text/x-ruby
| RubyLexer
|
|
r0 | class ProblemsController < ApplicationController | ||
before_filter :authenticate, :authorization | ||||
|
r21 | in_place_edit_for :problem, :name | ||
in_place_edit_for :problem, :full_name | ||||
in_place_edit_for :problem, :full_score | ||||
|
r0 | def index | ||
list | ||||
render :action => 'list' | ||||
end | ||||
# GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html) | ||||
|
r201 | verify :method => :post, :only => [ :destroy, | ||
:create, :quick_create, | ||||
:do_manage, | ||||
|
r204 | :do_import, | ||
|
r201 | :update ], | ||
|
r0 | :redirect_to => { :action => :list } | ||
def list | ||||
|
r1 | @problems = Problem.find(:all, :order => 'date_added DESC') | ||
|
r0 | end | ||
def show | ||||
@problem = Problem.find(params[:id]) | ||||
end | ||||
def new | ||||
@problem = Problem.new | ||||
|
r92 | @description = nil | ||
|
r0 | end | ||
def create | ||||
@problem = Problem.new(params[:problem]) | ||||
|
r92 | @description = Description.new(params[:description]) | ||
if @description.body!='' | ||||
if !@description.save | ||||
render :action => new and return | ||||
end | ||||
else | ||||
@description = nil | ||||
end | ||||
@problem.description = @description | ||||
|
r0 | if @problem.save | ||
flash[:notice] = 'Problem was successfully created.' | ||||
redirect_to :action => 'list' | ||||
else | ||||
render :action => 'new' | ||||
end | ||||
end | ||||
|
r171 | def quick_create | ||
@problem = Problem.new(params[:problem]) | ||||
@problem.full_name = @problem.name if @problem.full_name == '' | ||||
@problem.full_score = 100 | ||||
@problem.available = false | ||||
@problem.test_allowed = true | ||||
@problem.output_only = false | ||||
@problem.date_added = Time.new | ||||
if @problem.save | ||||
flash[:notice] = 'Problem was successfully created.' | ||||
redirect_to :action => 'list' | ||||
else | ||||
flash[:notice] = 'Error saving problem' | ||||
redirect_to :action => 'list' | ||||
end | ||||
end | ||||
|
r0 | def edit | ||
@problem = Problem.find(params[:id]) | ||||
|
r92 | @description = @problem.description | ||
|
r0 | end | ||
def update | ||||
@problem = Problem.find(params[:id]) | ||||
|
r92 | @description = @problem.description | ||
if @description == nil and params[:description][:body]!='' | ||||
@description = Description.new(params[:description]) | ||||
if !@description.save | ||||
flash[:notice] = 'Error saving description' | ||||
render :action => 'edit' and return | ||||
end | ||||
@problem.description = @description | ||||
elsif @description!=nil | ||||
if !@description.update_attributes(params[:description]) | ||||
flash[:notice] = 'Error saving description' | ||||
render :action => 'edit' and return | ||||
end | ||||
end | ||||
r453 | if params[:file] and params[:file].content_type != 'application/pdf' | |||
flash[:notice] = 'Error: Uploaded file is not PDF' | ||||
render :action => 'edit' and return | ||||
end | ||||
|
r0 | if @problem.update_attributes(params[:problem]) | ||
flash[:notice] = 'Problem was successfully updated.' | ||||
r453 | unless params[:file] == nil or params[:file] == '' | |||
flash[:notice] = 'Problem was successfully updated and a new PDF file is uploaded.' | ||||
out_dirname = "#{Problem.download_file_basedir}/#{@problem.id}" | ||||
if not FileTest.exists? out_dirname | ||||
Dir.mkdir out_dirname | ||||
end | ||||
out_filename = "#{out_dirname}/#{@problem.name}.pdf" | ||||
if FileTest.exists? out_filename | ||||
File.delete out_filename | ||||
end | ||||
File.open(out_filename,"wb") do |file| | ||||
file.write(params[:file].read) | ||||
end | ||||
@problem.description_filename = "#{@problem.name}.pdf" | ||||
@problem.save | ||||
end | ||||
|
r0 | redirect_to :action => 'show', :id => @problem | ||
else | ||||
render :action => 'edit' | ||||
end | ||||
end | ||||
def destroy | ||||
Problem.find(params[:id]).destroy | ||||
redirect_to :action => 'list' | ||||
end | ||||
|
r147 | def toggle | ||
|
r149 | @problem = Problem.find(params[:id]) | ||
@problem.available = !(@problem.available) | ||||
@problem.save | ||||
|
r0 | end | ||
|
r56 | def turn_all_off | ||
Problem.find(:all, | ||||
:conditions => "available = 1").each do |problem| | ||||
problem.available = false | ||||
problem.save | ||||
end | ||||
redirect_to :action => 'list' | ||||
end | ||||
|
r101 | def turn_all_on | ||
Problem.find(:all, | ||||
:conditions => "available = 0").each do |problem| | ||||
problem.available = true | ||||
problem.save | ||||
end | ||||
redirect_to :action => 'list' | ||||
end | ||||
|
r0 | def stat | ||
@problem = Problem.find(params[:id]) | ||||
r457 | unless @problem.available or session[:admin] | |||
|
r100 | redirect_to :controller => 'main', :action => 'list' | ||
r457 | return | |||
|
r100 | end | ||
r457 | @submissions = Submission.includes(:user).where(problem_id: params[:id]).order(:user_id,:id) | |||
#stat summary | ||||
range =65 | ||||
@histogram = { data: Array.new(range,0), summary: {} } | ||||
user = Hash.new(0) | ||||
@submissions.find_each do |sub| | ||||
d = (DateTime.now.in_time_zone - sub.submitted_at) / 24 / 60 / 60 | ||||
@histogram[:data][d.to_i] += 1 if d < range | ||||
r531 | user[sub.user_id] = [user[sub.user_id], ((sub.try(:points) || 0) >= @problem.full_score) ? 1 : 0].max | |||
r457 | end | |||
@histogram[:summary][:max] = [@histogram[:data].max,1].max | ||||
@summary = { attempt: user.count, solve: 0 } | ||||
user.each_value { |v| @summary[:solve] += 1 if v == 1 } | ||||
|
r0 | end | ||
|
r201 | |||
def manage | ||||
@problems = Problem.find(:all, :order => 'date_added DESC') | ||||
end | ||||
def do_manage | ||||
if params.has_key? 'change_date_added' | ||||
change_date_added | ||||
r456 | elsif params.has_key? 'add_to_contest' | |||
|
r279 | add_to_contest | ||
r456 | elsif params.has_key? 'enable_problem' | |||
set_available(true) | ||||
elsif params.has_key? 'disable_problem' | ||||
set_available(false) | ||||
|
r201 | end | ||
redirect_to :action => 'manage' | ||||
end | ||||
|
r204 | def import | ||
|
r212 | @allow_test_pair_import = allow_test_pair_import? | ||
|
r204 | end | ||
def do_import | ||||
|
r210 | old_problem = Problem.find_by_name(params[:name]) | ||
|
r212 | if !allow_test_pair_import? and params.has_key? :import_to_db | ||
params.delete :import_to_db | ||||
end | ||||
|
r210 | @problem, import_log = Problem.create_from_import_form_params(params, | ||
old_problem) | ||||
|
r204 | |||
|
r338 | if !@problem.errors.empty? | ||
|
r204 | render :action => 'import' and return | ||
end | ||||
|
r205 | if old_problem!=nil | ||
flash[:notice] = "The test data has been replaced for problem #{@problem.name}" | ||||
end | ||||
|
r204 | @log = import_log | ||
end | ||||
|
r279 | def remove_contest | ||
problem = Problem.find(params[:id]) | ||||
contest = Contest.find(params[:contest_id]) | ||||
if problem!=nil and contest!=nil | ||||
problem.contests.delete(contest) | ||||
end | ||||
redirect_to :action => 'manage' | ||||
end | ||||
|
r201 | ################################## | ||
protected | ||||
|
r212 | def allow_test_pair_import? | ||
if defined? ALLOW_TEST_PAIR_IMPORT | ||||
return ALLOW_TEST_PAIR_IMPORT | ||||
else | ||||
return false | ||||
end | ||||
end | ||||
|
r201 | def change_date_added | ||
problems = get_problems_from_params | ||||
year = params[:date_added][:year].to_i | ||||
month = params[:date_added][:month].to_i | ||||
day = params[:date_added][:day].to_i | ||||
date = Date.new(year,month,day) | ||||
problems.each do |p| | ||||
p.date_added = date | ||||
p.save | ||||
end | ||||
end | ||||
|
r279 | def add_to_contest | ||
problems = get_problems_from_params | ||||
contest = Contest.find(params[:contest][:id]) | ||||
if contest!=nil and contest.enabled | ||||
problems.each do |p| | ||||
p.contests << contest | ||||
end | ||||
end | ||||
end | ||||
r456 | def set_available(avail) | |||
problems = get_problems_from_params | ||||
problems.each do |p| | ||||
p.available = avail | ||||
p.save | ||||
end | ||||
end | ||||
|
r201 | def get_problems_from_params | ||
problems = [] | ||||
params.keys.each do |k| | ||||
if k.index('prob-')==0 | ||||
r456 | name, id, order = k.split('-') | |||
|
r201 | problems << Problem.find(id) | ||
end | ||||
end | ||||
problems | ||||
end | ||||
r457 | def get_problems_stat | |||
end | ||||
|
r0 | end | ||