Show More
Commit Description:
prob manage
Commit Description:
prob manage
References:
File last commit:
Show/Diff file:
Action:
app/controllers/problems_controller.rb
| 285 lines
| 7.3 KiB
| text/x-ruby
| RubyLexer
|
|
r0 | class ProblemsController < ApplicationController | ||
r876 | include ActiveStorage::SetCurrent | |||
r803 | before_action :admin_authorization, except: [:stat] | |||
r876 | before_action :set_problem, only: [:show, :edit, :update, :destroy, :get_statement, :toggle, :toggle_test, :toggle_view_testcase, :stat] | |||
r803 | before_action only: [:stat] do | |||
authorization_by_roles(['admin','ta']) | ||||
end | ||||
r756 | ||||
r876 | ||||
|
r0 | def index | ||
r619 | @problems = Problem.order(date_added: :desc) | |||
|
r0 | end | ||
def show | ||||
r876 | end | |||
#get statement download link | ||||
def get_statement | ||||
unless @current_user.can_view_problem? @problem | ||||
redirect_to list_main_path, error: 'You are not authorized to access this file' | ||||
return | ||||
end | ||||
if params[:ext]=='pdf' | ||||
content_type = 'application/pdf' | ||||
else | ||||
content_type = 'application/octet-stream' | ||||
end | ||||
filename = @problem.statement.filename.to_s | ||||
data =@problem.statement.download | ||||
send_data data, stream: false, disposition: 'inline', filename: filename, type: content_type | ||||
|
r0 | end | ||
def new | ||||
@problem = Problem.new | ||||
end | ||||
def create | ||||
r637 | @problem = Problem.new(problem_params) | |||
|
r0 | if @problem.save | ||
r876 | redirect_to action: :index, notice: 'Problem was successfully created.' | |||
|
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 | ||
|
r92 | @description = @problem.description | ||
|
r0 | end | ||
def update | ||||
r876 | if problem_params[:statement] && problem_params[:statement].content_type != 'application/pdf' | |||
flash[:error] = 'Error: Uploaded file is not PDF' | ||||
render :action => 'edit' | ||||
return | ||||
r453 | end | |||
r869 | if @problem.update(problem_params) | |||
r876 | flash[:notice] = 'Problem was successfully updated. ' | |||
flash[:notice] += 'A new statement PDF is uploaded' if problem_params[:statement] | ||||
@problem.save | ||||
redirect_to edit_problem_path(@problem) | ||||
|
r0 | else | ||
render :action => 'edit' | ||||
end | ||||
end | ||||
def destroy | ||||
r876 | @problem.destroy | |||
r605 | redirect_to action: :index | |||
|
r0 | end | ||
|
r147 | def toggle | ||
r869 | @problem.update(available: !(@problem.available) ) | |||
r558 | respond_to do |format| | |||
r562 | format.js { } | |||
r558 | end | |||
|
r0 | end | ||
r569 | def toggle_test | |||
r869 | @problem.update(test_allowed: !(@problem.test_allowed?) ) | |||
r569 | respond_to do |format| | |||
format.js { } | ||||
end | ||||
end | ||||
r632 | def toggle_view_testcase | |||
r869 | @problem.update(view_testcase: !(@problem.view_testcase?) ) | |||
r632 | 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 | ||
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 } | ||||
r880 | ||||
#for new graph | ||||
@chart_dataset = @problem.get_jschart_history.to_json.html_safe | ||||
|
r0 | end | ||
|
r201 | |||
def manage | ||||
r882 | @problems = Problem.order(date_added: :desc).includes(:tags) | |||
|
r201 | end | ||
def do_manage | ||||
r882 | change_date_added if params[:change_date_added] == '1' && params[:date_added].strip.empty? == false | |||
add_to_contest if params.has_key? 'add_to_contest' | ||||
set_available(params[:enable] == 'yes') if params[:change_enable] == '1' | ||||
if params[:add_group] == '1' | ||||
r672 | 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 | ||||
r882 | end | |||
if params[:add_tags] == '1' | ||||
get_problems_from_params.each { |p| p.tag_ids += params[:tag_ids] } | ||||
|
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 | |||
r876 | def set_problem | |||
@problem = Problem.find(params[:id]) | ||||
end | ||||
r634 | def problem_params | |||
r876 | params.require(:problem).permit(:name, :full_name, :full_score, :change_date_added, :date_added, :available, | |||
:test_allowed, :output_only, :url, :description, :statement, :description, tag_ids:[]) | ||||
r634 | end | |||
r753 | def description_params | |||
r778 | params.require(:description).permit(:body, :markdowned) | |||
r753 | end | |||
|
r0 | end | ||