Show More
Commit Description:
more test on user_admin
Commit Description:
more test on user_admin
References:
File last commit:
Show/Diff file:
Action:
app/controllers/problems_controller.rb
| 304 lines
| 8.1 KiB
| text/x-ruby
| RubyLexer
|
|
r0 | class ProblemsController < ApplicationController | ||
r625 | before_action :authenticate, :authorization | |||
before_action :testcase_authorization, only: [:show_testcase] | ||||
|
r0 | |||
|
r21 | in_place_edit_for :problem, :name | ||
in_place_edit_for :problem, :full_name | ||||
in_place_edit_for :problem, :full_score | ||||
|
r0 | def index | ||
r619 | @problems = Problem.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 | ||||
r637 | @problem = Problem.new(problem_params) | |||
r751 | @description = Description.new(problem_params[:description]) | |||
|
r92 | 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.' | ||||
r558 | redirect_to action: :index | |||
|
r0 | else | ||
render :action => 'new' | ||||
end | ||||
end | ||||
|
r171 | def quick_create | ||
r637 | @problem = Problem.new(problem_params) | |||
|
r171 | @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.' | ||||
r558 | redirect_to action: :index | |||
|
r171 | else | ||
flash[:notice] = 'Error saving problem' | ||||
r558 | redirect_to action: :index | |||
|
r171 | 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 | ||
r590 | if @description.nil? and params[:description][:body]!='' | |||
|
r92 | @description = Description.new(params[:description]) | ||
if !@description.save | ||||
flash[:notice] = 'Error saving description' | ||||
render :action => 'edit' and return | ||||
end | ||||
@problem.description = @description | ||||
r590 | elsif @description | |||
|
r92 | 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 | ||||
r634 | if @problem.update_attributes(problem_params) | |||
|
r0 | 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 | ||||
r605 | p = Problem.find(params[:id]).destroy | |||
redirect_to action: :index | ||||
|
r0 | end | ||
|
r147 | def toggle | ||
|
r149 | @problem = Problem.find(params[:id]) | ||
r558 | @problem.update_attributes(available: !(@problem.available) ) | |||
respond_to do |format| | ||||
r562 | format.js { } | |||
r558 | end | |||
|
r0 | end | ||
r569 | def toggle_test | |||
@problem = Problem.find(params[:id]) | ||||
@problem.update_attributes(test_allowed: !(@problem.test_allowed?) ) | ||||
respond_to do |format| | ||||
format.js { } | ||||
end | ||||
end | ||||
r632 | def toggle_view_testcase | |||
@problem = Problem.find(params[:id]) | ||||
@problem.update_attributes(view_testcase: !(@problem.view_testcase?) ) | ||||
respond_to do |format| | ||||
format.js { } | ||||
end | ||||
end | ||||
|
r56 | def turn_all_off | ||
r619 | Problem.available.all.each do |problem| | |||
|
r56 | problem.available = false | ||
problem.save | ||||
end | ||||
r558 | redirect_to action: :index | |||
|
r56 | end | ||
|
r101 | def turn_all_on | ||
r619 | Problem.where.not(available: true).each do |problem| | |||
|
r101 | problem.available = true | ||
problem.save | ||||
end | ||||
r558 | redirect_to action: :index | |||
|
r101 | 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 | ||
r697 | @submissions = Submission.includes(:user).includes(:language).where(problem_id: params[:id]).order(:user_id,:id) | |||
r457 | ||||
#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 | ||||
r619 | @problems = Problem.order(date_added: :desc) | |||
|
r201 | end | ||
def do_manage | ||||
r730 | if params.has_key? 'change_date_added' and params[:date_added].strip.empty? == false | |||
|
r201 | 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) | ||||
r672 | elsif params.has_key? 'add_group' | |||
group = Group.find(params[:group_id]) | ||||
r678 | ok = [] | |||
failed = [] | ||||
r672 | get_problems_from_params.each do |p| | |||
r678 | begin | |||
group.problems << p | ||||
ok << p.full_name | ||||
rescue => e | ||||
failed << p.full_name | ||||
end | ||||
r672 | end | |||
r678 | flash[:success] = "The following problems are added to the group #{group.name}: " + ok.join(', ') if ok.count > 0 | |||
flash[:alert] = "The following problems are already in the group #{group.name}: " + failed.join(', ') if failed.count > 0 | ||||
r700 | elsif params.has_key? 'add_tags' | |||
get_problems_from_params.each do |p| | ||||
p.tag_ids += params[:tag_ids] | ||||
end | ||||
|
r201 | end | ||
r678 | ||||
|
r201 | 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 | ||||
r692 | date = Date.parse(params[:date_added]) | |||
|
r201 | 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 | ||||
r634 | private | |||
def problem_params | ||||
r739 | params.require(:problem).permit(:name, :full_name, :full_score, :change_date_added, :date_added, :available, :test_allowed,:output_only, :url, :description, tag_ids:[]) | |||
r634 | end | |||
|
r0 | end | ||