Description:
[web] added support for output only problems git-svn-id: http://theory.cpe.ku.ac.th/grader/web/trunk@188 6386c4cd-e34a-4fa8-8920-d93eb39b512e
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r99:ab383e0b489e - - 5 files changed: 64 inserted, 21 deleted

@@ -0,0 +1,11
1 + class AddSupportsForOutputOnlyProblems < ActiveRecord::Migration
2 + def self.up
3 + add_column :submissions, :source_filename, :string
4 + add_column :problems, :output_only, :boolean
5 + end
6 +
7 + def self.down
8 + remove_column :submissions, :source_filename
9 + add_column :problems, :output_only, :boolean
10 + end
11 + end
@@ -30,13 +30,16
30 def submit
30 def submit
31 user = User.find(session[:user_id])
31 user = User.find(session[:user_id])
32
32
33 @submission = Submission.new(params[:submission])
33 @submission = Submission.new(params[:submission])
34 @submission.user = user
34 @submission.user = user
35 @submission.language_id = 0
35 @submission.language_id = 0
36 - @submission.source = params['file'].read if params['file']!=''
36 + if params['file']!=''
37 + @submission.source = params['file'].read
38 + @submission.source_filename = params['file'].original_filename
39 + end
37 @submission.submitted_at = Time.new
40 @submission.submitted_at = Time.new
38
41
39 if user.site!=nil and user.site.finished?
42 if user.site!=nil and user.site.finished?
40 @submission.errors.add_to_base "The contest is over."
43 @submission.errors.add_to_base "The contest is over."
41 prepare_list_information
44 prepare_list_information
42 render :action => 'list' and return
45 render :action => 'list' and return
@@ -1,17 +1,20
1 class Submission < ActiveRecord::Base
1 class Submission < ActiveRecord::Base
2
2
3 belongs_to :language
3 belongs_to :language
4 belongs_to :problem
4 belongs_to :problem
5 belongs_to :user
5 belongs_to :user
6
6
7 + before_validation :assign_problem
8 + before_validation :assign_language
9 +
7 validates_presence_of :source
10 validates_presence_of :source
8 validates_length_of :source, :maximum => 100_000, :allow_blank => true, :message => 'too long'
11 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'
12 validates_length_of :source, :minimum => 1, :allow_blank => true, :message => 'too short'
13 + validate :must_have_valid_problem
10 validate :must_specify_language
14 validate :must_specify_language
11 - validate :must_have_valid_problem
12
15
13 before_save :assign_latest_number_if_new_recond
16 before_save :assign_latest_number_if_new_recond
14
17
15 def self.find_last_by_user_and_problem(user_id, problem_id)
18 def self.find_last_by_user_and_problem(user_id, problem_id)
16 last_sub = find(:first,
19 last_sub = find(:first,
17 :conditions => {:user_id => user_id,
20 :conditions => {:user_id => user_id,
@@ -94,36 +97,46
94 return problem
97 return problem
95 else
98 else
96 return nil
99 return nil
97 end
100 end
98 end
101 end
99
102
103 + def assign_problem
104 + if self.problem_id!=-1
105 + begin
106 + self.problem = Problem.find(self.problem_id)
107 + rescue ActiveRecord::RecordNotFound
108 + self.problem = nil
109 + end
110 + else
111 + self.problem = Submission.find_problem_in_source(self.source)
112 + end
113 + end
114 +
115 + def assign_language
116 + self.language = Submission.find_language_in_source(self.source)
117 + end
118 +
100 # validation codes
119 # validation codes
101 def must_specify_language
120 def must_specify_language
102 return if self.source==nil
121 return if self.source==nil
103 - self.language = Submission.find_language_in_source(self.source)
122 +
123 + # for output_only tasks
124 + return if self.problem!=nil and self.problem.output_only
125 +
126 + if self.language==nil
104 errors.add('source',"must specify programming language") unless self.language!=nil
127 errors.add('source',"must specify programming language") unless self.language!=nil
105 end
128 end
129 + end
106
130
107 def must_have_valid_problem
131 def must_have_valid_problem
108 return if self.source==nil
132 return if self.source==nil
109 - if self.problem_id!=-1
133 + if self.problem==nil
110 - begin
111 - problem = Problem.find(self.problem_id)
112 - rescue ActiveRecord::RecordNotFound
113 - problem = nil
114 - end
115 - else
116 - problem = Submission.find_problem_in_source(self.source)
117 - end
118 - if problem==nil
119 errors.add('problem',"must be specified.")
134 errors.add('problem',"must be specified.")
120 - elsif (!problem.available) and (self.new_record?)
135 + elsif (!self.problem.available) and (self.new_record?)
121 errors.add('problem',"must be valid.")
136 errors.add('problem',"must be valid.")
122 - else
123 - self.problem = problem
124 end
137 end
125 end
138 end
126
139
127 # callbacks
140 # callbacks
128 def assign_latest_number_if_new_recond
141 def assign_latest_number_if_new_recond
129 return if !self.new_record?
142 return if !self.new_record?
@@ -10,17 +10,31
10 <p><label for="problem_full_score">Full score</label><br/>
10 <p><label for="problem_full_score">Full score</label><br/>
11 <%= text_field 'problem', 'full_score' %></p>
11 <%= text_field 'problem', 'full_score' %></p>
12
12
13 <p><label for="problem_date_added">Date added</label><br/>
13 <p><label for="problem_date_added">Date added</label><br/>
14 <%= date_select 'problem', 'date_added' %></p>
14 <%= date_select 'problem', 'date_added' %></p>
15
15
16 - <p><label for="problem_available">Available?</label>
16 + <%
17 - <%= select("problem","available",[['True',true],['False',false]]) %></p>
17 + # TODO: these should be put in model Problem, but I can't think of
18 + # nice default values for them. These values look fine only
19 + # in this case (of lazily adding new problems).
20 + @problem.available = true if @problem!=nil and @problem.available==nil
21 + @problem.test_allowed = true if @problem!=nil and @problem.test_allowed==nil
22 + @problem.output_only = false if @problem!=nil and @problem.output_only==nil
23 + %>
18
24
19 - <p><label for="problem_test_allowed">Test allowed?</label>
25 + <p>
20 - <%= select("problem","test_allowed",[['True',true],['False',false]]) %></p>
26 + <label for="problem_available">Available?</label>
27 + <%= check_box :problem, :available %>
28 +
29 + <label for="problem_test_allowed">Test allowed?</label>
30 + <%= check_box :problem, :test_allowed %>
31 +
32 + <label for="problem_output_only">Output only?</label>
33 + <%= check_box :problem, :output_only %>
34 + </p>
21
35
22 <%= error_messages_for 'description' %>
36 <%= error_messages_for 'description' %>
23
37
24 <p><label for="description_body">Description</label><br/>
38 <p><label for="description_body">Description</label><br/>
25 <%= text_area :description, :body, :rows => 10, :cols => 80 %></p>
39 <%= text_area :description, :body, :rows => 10, :cols => 80 %></p>
26
40
@@ -6,13 +6,13
6 # to create the application database on another system, you should be using db:schema:load, not running
6 # to create the application database on another system, you should be using db:schema:load, not running
7 # all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
7 # all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
8 # you'll amass, the slower it'll run and the greater likelihood for issues).
8 # you'll amass, the slower it'll run and the greater likelihood for issues).
9 #
9 #
10 # It's strongly recommended to check this file into your version control system.
10 # It's strongly recommended to check this file into your version control system.
11
11
12 - ActiveRecord::Schema.define(:version => 30) do
12 + ActiveRecord::Schema.define(:version => 31) do
13
13
14 create_table "announcements", :force => true do |t|
14 create_table "announcements", :force => true do |t|
15 t.string "author"
15 t.string "author"
16 t.text "body"
16 t.text "body"
17 t.boolean "published"
17 t.boolean "published"
18 t.datetime "created_at"
18 t.datetime "created_at"
@@ -58,12 +58,13
58 t.integer "full_score"
58 t.integer "full_score"
59 t.date "date_added"
59 t.date "date_added"
60 t.boolean "available"
60 t.boolean "available"
61 t.string "url"
61 t.string "url"
62 t.integer "description_id"
62 t.integer "description_id"
63 t.boolean "test_allowed"
63 t.boolean "test_allowed"
64 + t.boolean "output_only"
64 end
65 end
65
66
66 create_table "rights", :force => true do |t|
67 create_table "rights", :force => true do |t|
67 t.string "name"
68 t.string "name"
68 t.string "controller"
69 t.string "controller"
69 t.string "action"
70 t.string "action"
@@ -114,12 +115,13
114 t.datetime "compiled_at"
115 t.datetime "compiled_at"
115 t.text "compiler_message"
116 t.text "compiler_message"
116 t.datetime "graded_at"
117 t.datetime "graded_at"
117 t.integer "points"
118 t.integer "points"
118 t.text "grader_comment"
119 t.text "grader_comment"
119 t.integer "number"
120 t.integer "number"
121 + t.string "source_filename"
120 end
122 end
121
123
122 add_index "submissions", ["user_id", "problem_id", "number"], :name => "index_submissions_on_user_id_and_problem_id_and_number", :unique => true
124 add_index "submissions", ["user_id", "problem_id", "number"], :name => "index_submissions_on_user_id_and_problem_id_and_number", :unique => true
123 add_index "submissions", ["user_id", "problem_id"], :name => "index_submissions_on_user_id_and_problem_id"
125 add_index "submissions", ["user_id", "problem_id"], :name => "index_submissions_on_user_id_and_problem_id"
124
126
125 create_table "tasks", :force => true do |t|
127 create_table "tasks", :force => true do |t|
You need to be logged in to leave comments. Login now