Description:
moved submission validation to model
git-svn-id: http://theory.cpe.ku.ac.th/grader/web/trunk@56 6386c4cd-e34a-4fa8-8920-d93eb39b512e
Commit status:
[Not Reviewed]
References:
Diff options:
Comments:
0 Commit comments
0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
r31:07d90e75a295 - - 3 files changed: 59 inserted, 29 deleted
@@ -16,42 +16,26 | |||
|
16 | 16 | end |
|
17 | 17 | |
|
18 | 18 | def list |
|
19 | - @problems = Problem.find_available_problems | |
|
20 | - @prob_submissions = Array.new | |
|
21 | - @user = User.find(session[:user_id]) | |
|
22 | - @problems.each do |p| | |
|
23 | - c, sub = Submission.find_by_user_and_problem(@user.id,p.id) | |
|
24 | - @prob_submissions << [c,sub] | |
|
25 | - end | |
|
19 | + prepare_list_information | |
|
26 | 20 | end |
|
27 | 21 | |
|
28 | 22 | def submit |
|
29 | - submission = Submission.new(params[:submission]) | |
|
30 | - submission.user_id = session[:user_id] | |
|
31 | - submission.language_id = 0 | |
|
32 | - source = params['file'].read | |
|
33 | - if source.length > 100_000 | |
|
34 | - flash[:notice] = 'Error: file too long' | |
|
35 | - elsif (lang = Submission.find_language_in_source(source))==nil | |
|
36 | - flash[:notice] = 'Error: cannot determine language used' | |
|
37 | - elsif ((submission.problem_id==-1) and | |
|
38 | - !(problem=Submission.find_problem_in_source(source))) | |
|
39 | - flash[:notice] = 'Error: cannot determine problem submitted' | |
|
40 | - elsif ((submission.problem_id==-1) and | |
|
41 | - (problem.available == false)) | |
|
42 | - flash[:notice] = 'Error: problem is not available' | |
|
43 | - else | |
|
44 | - submission.problem_id = problem.id if submission.problem_id == -1 | |
|
45 | - submission.source = source | |
|
46 | - submission.language_id = lang.id | |
|
47 | - submission.submitted_at = Time.new | |
|
48 | - if submission.save == false | |
|
23 | + @submission = Submission.new(params[:submission]) | |
|
24 | + @submission.user_id = session[:user_id] | |
|
25 | + @submission.language_id = 0 | |
|
26 | + @submission.source = params['file'].read if params['file']!='' | |
|
27 | + @submission.submitted_at = Time.new | |
|
28 | + if @submission.valid? | |
|
29 | + if @submission.save == false | |
|
49 | 30 | flash[:notice] = 'Error saving your submission' |
|
50 |
- elsif Task.create(:submission_id => submission.id |
|
|
31 | + elsif Task.create(:submission_id => @submission.id, | |
|
32 | + :status => Task::STATUS_INQUEUE) == false | |
|
51 | 33 | flash[:notice] = 'Error adding your submission to task queue' |
|
52 | 34 | end |
|
53 | 35 | end |
|
54 | - redirect_to :action => 'list' | |
|
36 | + | |
|
37 | + prepare_list_information | |
|
38 | + render :action => 'list' | |
|
55 | 39 | end |
|
56 | 40 | |
|
57 | 41 | def get_source |
@@ -65,4 +49,17 | |||
|
65 | 49 | flash[:notice] = 'Error viewing source' |
|
66 | 50 | end |
|
67 | 51 | end |
|
52 | + | |
|
53 | + protected | |
|
54 | + def prepare_list_information | |
|
55 | + @problems = Problem.find_available_problems | |
|
56 | + @prob_submissions = Array.new | |
|
57 | + @user = User.find(session[:user_id]) | |
|
58 | + @problems.each do |p| | |
|
59 | + c, sub = Submission.find_by_user_and_problem(@user.id,p.id) | |
|
60 | + @prob_submissions << [c,sub] | |
|
61 | + end | |
|
62 | + end | |
|
63 | + | |
|
68 | 64 | end |
|
65 | + |
@@ -4,6 +4,12 | |||
|
4 | 4 | belongs_to :problem |
|
5 | 5 | belongs_to :user |
|
6 | 6 | |
|
7 | + validates_presence_of :source | |
|
8 | + validates_length_of :source, :maximum => 100_000, :allow_blank => true, :message => 'too long' | |
|
9 | + validates_length_of :source, :minimum => 1, :allow_blank => true, :message => 'too short' | |
|
10 | + validate :must_specify_language | |
|
11 | + validate :must_have_valid_problem | |
|
12 | + | |
|
7 | 13 | def self.find_by_user_and_problem(user_id, problem_id) |
|
8 | 14 | subcount = count(:conditions => "user_id = #{user_id} AND problem_id = #{problem_id}") |
|
9 | 15 | if subcount != 0 |
@@ -28,6 +34,9 | |||
|
28 | 34 | end |
|
29 | 35 | |
|
30 | 36 | def self.find_option_in_source(option, source) |
|
37 | + if source==nil | |
|
38 | + return nil | |
|
39 | + end | |
|
31 | 40 | i = 0 |
|
32 | 41 | source.each_line do |s| |
|
33 | 42 | if s =~ option |
@@ -62,4 +71,25 | |||
|
62 | 71 | end |
|
63 | 72 | end |
|
64 | 73 | |
|
74 | + # validation codes | |
|
75 | + def must_specify_language | |
|
76 | + return if self.source==nil | |
|
77 | + self.language = Submission.find_language_in_source(self.source) | |
|
78 | + errors.add_to_base("must specify programming language") unless self.language!=nil | |
|
79 | + end | |
|
80 | + | |
|
81 | + def must_have_valid_problem | |
|
82 | + return if self.source==nil | |
|
83 | + if self.problem_id!=-1 | |
|
84 | + problem = Problem.find(self.problem_id) | |
|
85 | + else | |
|
86 | + problem = Submission.find_problem_in_source(self.source) | |
|
87 | + end | |
|
88 | + if problem==nil | |
|
89 | + errors.add_to_base("must specify problem") | |
|
90 | + elsif !problem.available | |
|
91 | + errors.add_to_base("must specify valid problem") | |
|
92 | + end | |
|
93 | + end | |
|
94 | + | |
|
65 | 95 | end |
@@ -2,6 +2,9 | |||
|
2 | 2 | Current time is <%= format_short_time(Time.new) %>. |
|
3 | 3 | |
|
4 | 4 | <div class="submitbox"> |
|
5 | + | |
|
6 | + <%= error_messages_for 'submission' %> | |
|
7 | + | |
|
5 | 8 | <% form_tag({:action => 'submit'}, :multipart => true) do %> |
|
6 | 9 | Problem: <%= select 'submission', 'problem_id', |
|
7 | 10 | [['Specified in header','-1']] + |
You need to be logged in to leave comments.
Login now