Show More
Commit Description:
tag
Commit Description:
tag
References:
File last commit:
Show/Diff file:
Action:
app/models/problem.rb
| 144 lines
| 3.9 KiB
| text/x-ruby
| RubyLexer
|
|
r0 | class Problem < ActiveRecord::Base | ||
|
r92 | belongs_to :description | ||
|
r280 | has_and_belongs_to_many :contests, :uniq => true | ||
r678 | ||||
#has_and_belongs_to_many :groups | ||||
has_many :groups_problems, class_name: GroupProblem | ||||
has_many :groups, :through => :groups_problems | ||||
r681 | has_many :problems_tags, class_name: ProblemTag | |||
has_many :tags, through: :problems_tags | ||||
|
r210 | has_many :test_pairs, :dependent => :delete_all | ||
r607 | has_many :testcases, :dependent => :destroy | |||
|
r92 | |||
|
r171 | validates_presence_of :name | ||
r618 | validates_format_of :name, :with => /\A\w+\z/ | |||
|
r171 | validates_presence_of :full_name | ||
|
r208 | |||
r619 | scope :available, -> { where(available: true) } | |||
|
r278 | |||
|
r208 | DEFAULT_TIME_LIMIT = 1 | ||
DEFAULT_MEMORY_LIMIT = 32 | ||||
|
r271 | |||
r619 | def self.available_problems | |||
available.order(date_added: :desc).order(:name) | ||||
#Problem.available.all(:order => "date_added DESC, name ASC") | ||||
|
r0 | end | ||
|
r210 | def self.create_from_import_form_params(params, old_problem=nil) | ||
|
r310 | org_problem = old_problem || Problem.new | ||
import_params, problem = Problem.extract_params_and_check(params, | ||||
org_problem) | ||||
|
r204 | |||
|
r338 | if !problem.errors.empty? | ||
|
r210 | return problem, 'Error importing' | ||
|
r208 | end | ||
|
r204 | |||
|
r208 | problem.full_score = 100 | ||
problem.date_added = Time.new | ||||
problem.test_allowed = true | ||||
problem.output_only = false | ||||
problem.available = false | ||||
|
r210 | |||
if not problem.save | ||||
return problem, 'Error importing' | ||||
end | ||||
import_to_db = params.has_key? :import_to_db | ||||
importer = TestdataImporter.new(problem) | ||||
if not importer.import_from_file(import_params[:file], | ||||
import_params[:time_limit], | ||||
import_params[:memory_limit], | ||||
r402 | import_params[:checker_name], | |||
|
r210 | import_to_db) | ||
r347 | problem.errors.add(:base,'Import error.') | |||
|
r210 | end | ||
|
r208 | return problem, importer.log_msg | ||
end | ||||
|
r271 | def self.download_file_basedir | ||
|
r318 | return "#{Rails.root}/data/tasks" | ||
|
r271 | end | ||
r457 | ||||
def get_submission_stat | ||||
result = Hash.new | ||||
#total number of submission | ||||
result[:total_sub] = Submission.where(problem_id: self.id).count | ||||
r643 | result[:attempted_user] = Submission.where(problem_id: self.id).group(:user_id) | |||
result[:pass] = Submission.where(problem_id: self.id).where("points >= ?",self.full_score).count | ||||
return result | ||||
r457 | end | |||
r564 | ||||
def long_name | ||||
"[#{name}] #{full_name}" | ||||
end | ||||
|
r271 | |||
|
r208 | protected | ||
|
r204 | |||
|
r208 | def self.to_i_or_default(st, default) | ||
if st!='' | ||||
|
r310 | result = st.to_i | ||
|
r208 | end | ||
|
r310 | result ||= default | ||
end | ||||
def self.to_f_or_default(st, default) | ||||
if st!='' | ||||
result = st.to_f | ||||
end | ||||
result ||= default | ||||
|
r208 | end | ||
def self.extract_params_and_check(params, problem) | ||||
|
r310 | time_limit = Problem.to_f_or_default(params[:time_limit], | ||
|
r208 | DEFAULT_TIME_LIMIT) | ||
memory_limit = Problem.to_i_or_default(params[:memory_limit], | ||||
DEFAULT_MEMORY_LIMIT) | ||||
|
r204 | |||
|
r310 | if time_limit<=0 or time_limit >60 | ||
r347 | problem.errors.add(:base,'Time limit out of range.') | |||
|
r204 | end | ||
|
r310 | if memory_limit==0 and params[:memory_limit]!='0' | ||
r347 | problem.errors.add(:base,'Memory limit format errors.') | |||
|
r204 | elsif memory_limit<=0 or memory_limit >512 | ||
r347 | problem.errors.add(:base,'Memory limit out of range.') | |||
|
r204 | end | ||
if params[:file]==nil or params[:file]=='' | ||||
r347 | problem.errors.add(:base,'No testdata file.') | |||
|
r204 | end | ||
r402 | checker_name = 'text' | |||
if ['text','float'].include? params[:checker] | ||||
checker_name = params[:checker] | ||||
end | ||||
|
r204 | file = params[:file] | ||
|
r338 | if !problem.errors.empty? | ||
|
r310 | return nil, problem | ||
|
r204 | end | ||
problem.name = params[:name] | ||||
if params[:full_name]!='' | ||||
problem.full_name = params[:full_name] | ||||
else | ||||
problem.full_name = params[:name] | ||||
end | ||||
|
r310 | return [{ | ||
:time_limit => time_limit, | ||||
:memory_limit => memory_limit, | ||||
r402 | :file => file, | |||
:checker_name => checker_name | ||||
|
r310 | }, | ||
problem] | ||||
|
r204 | end | ||
|
r0 | end | ||