diff --git a/app/controllers/main_controller.rb b/app/controllers/main_controller.rb --- a/app/controllers/main_controller.rb +++ b/app/controllers/main_controller.rb @@ -16,42 +16,26 @@ end def list - @problems = Problem.find_available_problems - @prob_submissions = Array.new - @user = User.find(session[:user_id]) - @problems.each do |p| - c, sub = Submission.find_by_user_and_problem(@user.id,p.id) - @prob_submissions << [c,sub] - end + prepare_list_information end def submit - submission = Submission.new(params[:submission]) - submission.user_id = session[:user_id] - submission.language_id = 0 - source = params['file'].read - if source.length > 100_000 - flash[:notice] = 'Error: file too long' - elsif (lang = Submission.find_language_in_source(source))==nil - flash[:notice] = 'Error: cannot determine language used' - elsif ((submission.problem_id==-1) and - !(problem=Submission.find_problem_in_source(source))) - flash[:notice] = 'Error: cannot determine problem submitted' - elsif ((submission.problem_id==-1) and - (problem.available == false)) - flash[:notice] = 'Error: problem is not available' - else - submission.problem_id = problem.id if submission.problem_id == -1 - submission.source = source - submission.language_id = lang.id - submission.submitted_at = Time.new - if submission.save == false + @submission = Submission.new(params[:submission]) + @submission.user_id = session[:user_id] + @submission.language_id = 0 + @submission.source = params['file'].read if params['file']!='' + @submission.submitted_at = Time.new + if @submission.valid? + if @submission.save == false flash[:notice] = 'Error saving your submission' - elsif Task.create(:submission_id => submission.id) == false + elsif Task.create(:submission_id => @submission.id, + :status => Task::STATUS_INQUEUE) == false flash[:notice] = 'Error adding your submission to task queue' end end - redirect_to :action => 'list' + + prepare_list_information + render :action => 'list' end def get_source @@ -65,4 +49,17 @@ flash[:notice] = 'Error viewing source' end end + + protected + def prepare_list_information + @problems = Problem.find_available_problems + @prob_submissions = Array.new + @user = User.find(session[:user_id]) + @problems.each do |p| + c, sub = Submission.find_by_user_and_problem(@user.id,p.id) + @prob_submissions << [c,sub] + end + end + end + diff --git a/app/models/submission.rb b/app/models/submission.rb --- a/app/models/submission.rb +++ b/app/models/submission.rb @@ -4,6 +4,12 @@ belongs_to :problem belongs_to :user + validates_presence_of :source + validates_length_of :source, :maximum => 100_000, :allow_blank => true, :message => 'too long' + validates_length_of :source, :minimum => 1, :allow_blank => true, :message => 'too short' + validate :must_specify_language + validate :must_have_valid_problem + def self.find_by_user_and_problem(user_id, problem_id) subcount = count(:conditions => "user_id = #{user_id} AND problem_id = #{problem_id}") if subcount != 0 @@ -28,6 +34,9 @@ end def self.find_option_in_source(option, source) + if source==nil + return nil + end i = 0 source.each_line do |s| if s =~ option @@ -62,4 +71,25 @@ end end + # validation codes + def must_specify_language + return if self.source==nil + self.language = Submission.find_language_in_source(self.source) + errors.add_to_base("must specify programming language") unless self.language!=nil + end + + def must_have_valid_problem + return if self.source==nil + if self.problem_id!=-1 + problem = Problem.find(self.problem_id) + else + problem = Submission.find_problem_in_source(self.source) + end + if problem==nil + errors.add_to_base("must specify problem") + elsif !problem.available + errors.add_to_base("must specify valid problem") + end + end + end diff --git a/app/views/main/list.rhtml b/app/views/main/list.rhtml --- a/app/views/main/list.rhtml +++ b/app/views/main/list.rhtml @@ -2,6 +2,9 @@ Current time is <%= format_short_time(Time.new) %>.