Description:
add option to update PDF file of a problem in /problem/edit/:id (grafted from 15b2554bf365f8639b5e94db4f1d9a277007808a)
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r364:9bd14bb6e95d - - 3 files changed: 25 inserted, 1 deleted

@@ -1,226 +1,248
1 1 class ProblemsController < ApplicationController
2 2
3 3 before_filter :authenticate, :authorization
4 4
5 5 in_place_edit_for :problem, :name
6 6 in_place_edit_for :problem, :full_name
7 7 in_place_edit_for :problem, :full_score
8 8
9 9 def index
10 10 list
11 11 render :action => 'list'
12 12 end
13 13
14 14 # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
15 15 verify :method => :post, :only => [ :destroy,
16 16 :create, :quick_create,
17 17 :do_manage,
18 18 :do_import,
19 19 :update ],
20 20 :redirect_to => { :action => :list }
21 21
22 22 def list
23 23 @problems = Problem.find(:all, :order => 'date_added DESC')
24 24 end
25 25
26 26 def show
27 27 @problem = Problem.find(params[:id])
28 28 end
29 29
30 30 def new
31 31 @problem = Problem.new
32 32 @description = nil
33 33 end
34 34
35 35 def create
36 36 @problem = Problem.new(params[:problem])
37 37 @description = Description.new(params[:description])
38 38 if @description.body!=''
39 39 if !@description.save
40 40 render :action => new and return
41 41 end
42 42 else
43 43 @description = nil
44 44 end
45 45 @problem.description = @description
46 46 if @problem.save
47 47 flash[:notice] = 'Problem was successfully created.'
48 48 redirect_to :action => 'list'
49 49 else
50 50 render :action => 'new'
51 51 end
52 52 end
53 53
54 54 def quick_create
55 55 @problem = Problem.new(params[:problem])
56 56 @problem.full_name = @problem.name if @problem.full_name == ''
57 57 @problem.full_score = 100
58 58 @problem.available = false
59 59 @problem.test_allowed = true
60 60 @problem.output_only = false
61 61 @problem.date_added = Time.new
62 62 if @problem.save
63 63 flash[:notice] = 'Problem was successfully created.'
64 64 redirect_to :action => 'list'
65 65 else
66 66 flash[:notice] = 'Error saving problem'
67 67 redirect_to :action => 'list'
68 68 end
69 69 end
70 70
71 71 def edit
72 72 @problem = Problem.find(params[:id])
73 73 @description = @problem.description
74 74 end
75 75
76 76 def update
77 77 @problem = Problem.find(params[:id])
78 78 @description = @problem.description
79 79 if @description == nil and params[:description][:body]!=''
80 80 @description = Description.new(params[:description])
81 81 if !@description.save
82 82 flash[:notice] = 'Error saving description'
83 83 render :action => 'edit' and return
84 84 end
85 85 @problem.description = @description
86 86 elsif @description!=nil
87 87 if !@description.update_attributes(params[:description])
88 88 flash[:notice] = 'Error saving description'
89 89 render :action => 'edit' and return
90 90 end
91 91 end
92 + if params[:file] and params[:file].content_type != 'application/pdf'
93 + flash[:notice] = 'Error: Uploaded file is not PDF'
94 + render :action => 'edit' and return
95 + end
92 96 if @problem.update_attributes(params[:problem])
93 97 flash[:notice] = 'Problem was successfully updated.'
98 + unless params[:file] == nil or params[:file] == ''
99 + flash[:notice] = 'Problem was successfully updated and a new PDF file is uploaded.'
100 + out_dirname = "#{Problem.download_file_basedir}/#{@problem.id}"
101 + if not FileTest.exists? out_dirname
102 + Dir.mkdir out_dirname
103 + end
104 +
105 + out_filename = "#{out_dirname}/#{@problem.name}.pdf"
106 + if FileTest.exists? out_filename
107 + File.delete out_filename
108 + end
109 +
110 + File.open(out_filename,"wb") do |file|
111 + file.write(params[:file].read)
112 + end
113 + @problem.description_filename = "#{@problem.name}.pdf"
114 + @problem.save
115 + end
94 116 redirect_to :action => 'show', :id => @problem
95 117 else
96 118 render :action => 'edit'
97 119 end
98 120 end
99 121
100 122 def destroy
101 123 Problem.find(params[:id]).destroy
102 124 redirect_to :action => 'list'
103 125 end
104 126
105 127 def toggle
106 128 @problem = Problem.find(params[:id])
107 129 @problem.available = !(@problem.available)
108 130 @problem.save
109 131 end
110 132
111 133 def turn_all_off
112 134 Problem.find(:all,
113 135 :conditions => "available = 1").each do |problem|
114 136 problem.available = false
115 137 problem.save
116 138 end
117 139 redirect_to :action => 'list'
118 140 end
119 141
120 142 def turn_all_on
121 143 Problem.find(:all,
122 144 :conditions => "available = 0").each do |problem|
123 145 problem.available = true
124 146 problem.save
125 147 end
126 148 redirect_to :action => 'list'
127 149 end
128 150
129 151 def stat
130 152 @problem = Problem.find(params[:id])
131 153 if !@problem.available
132 154 redirect_to :controller => 'main', :action => 'list'
133 155 else
134 156 @submissions = Submission.find_all_last_by_problem(params[:id])
135 157 end
136 158 end
137 159
138 160 def manage
139 161 @problems = Problem.find(:all, :order => 'date_added DESC')
140 162 end
141 163
142 164 def do_manage
143 165 if params.has_key? 'change_date_added'
144 166 change_date_added
145 167 else params.has_key? 'add_to_contest'
146 168 add_to_contest
147 169 end
148 170 redirect_to :action => 'manage'
149 171 end
150 172
151 173 def import
152 174 @allow_test_pair_import = allow_test_pair_import?
153 175 end
154 176
155 177 def do_import
156 178 old_problem = Problem.find_by_name(params[:name])
157 179 if !allow_test_pair_import? and params.has_key? :import_to_db
158 180 params.delete :import_to_db
159 181 end
160 182 @problem, import_log = Problem.create_from_import_form_params(params,
161 183 old_problem)
162 184
163 185 if !@problem.errors.empty?
164 186 render :action => 'import' and return
165 187 end
166 188
167 189 if old_problem!=nil
168 190 flash[:notice] = "The test data has been replaced for problem #{@problem.name}"
169 191 end
170 192 @log = import_log
171 193 end
172 194
173 195 def remove_contest
174 196 problem = Problem.find(params[:id])
175 197 contest = Contest.find(params[:contest_id])
176 198 if problem!=nil and contest!=nil
177 199 problem.contests.delete(contest)
178 200 end
179 201 redirect_to :action => 'manage'
180 202 end
181 203
182 204 ##################################
183 205 protected
184 206
185 207 def allow_test_pair_import?
186 208 if defined? ALLOW_TEST_PAIR_IMPORT
187 209 return ALLOW_TEST_PAIR_IMPORT
188 210 else
189 211 return false
190 212 end
191 213 end
192 214
193 215 def change_date_added
194 216 problems = get_problems_from_params
195 217 year = params[:date_added][:year].to_i
196 218 month = params[:date_added][:month].to_i
197 219 day = params[:date_added][:day].to_i
198 220 date = Date.new(year,month,day)
199 221 problems.each do |p|
200 222 p.date_added = date
201 223 p.save
202 224 end
203 225 end
204 226
205 227 def add_to_contest
206 228 problems = get_problems_from_params
207 229 contest = Contest.find(params[:contest][:id])
208 230 if contest!=nil and contest.enabled
209 231 problems.each do |p|
210 232 p.contests << contest
211 233 end
212 234 end
213 235 end
214 236
215 237 def get_problems_from_params
216 238 problems = []
217 239 params.keys.each do |k|
218 240 if k.index('prob-')==0
219 241 name, id = k.split('-')
220 242 problems << Problem.find(id)
221 243 end
222 244 end
223 245 problems
224 246 end
225 247
226 248 end
@@ -1,52 +1,54
1 1 <%= error_messages_for 'problem' %>
2 2
3 3 <!--[form:problem]-->
4 4 <p><label for="problem_name">Name</label><br/>
5 5 <%= text_field 'problem', 'name' %></p>
6 6
7 7 <p><label for="problem_full_name">Full name</label><br/>
8 8 <%= text_field 'problem', 'full_name' %></p>
9 9
10 10 <p><label for="problem_full_score">Full score</label><br/>
11 11 <%= text_field 'problem', 'full_score' %></p>
12 12
13 13 <p><label for="problem_date_added">Date added</label><br/>
14 14 <%= date_select 'problem', 'date_added' %></p>
15 15
16 16 <%
17 17 # TODO: these should be put in model Problem, but I can't think of
18 18 # nice default values for them. These values look fine only
19 19 # in this case (of lazily adding new problems).
20 20 @problem.available = true if @problem!=nil and @problem.available==nil
21 21 @problem.test_allowed = true if @problem!=nil and @problem.test_allowed==nil
22 22 @problem.output_only = false if @problem!=nil and @problem.output_only==nil
23 23 %>
24 24
25 25 <p>
26 26 <label for="problem_available">Available?</label>
27 27 <%= check_box :problem, :available %>
28 28
29 29 <label for="problem_test_allowed">Test allowed?</label>
30 30 <%= check_box :problem, :test_allowed %>
31 31
32 32 <label for="problem_output_only">Output only?</label>
33 33 <%= check_box :problem, :output_only %>
34 34 </p>
35 35
36 36 <%= error_messages_for 'description' %>
37 37
38 38 <p><label for="description_body">Description</label><br/>
39 39 <%= text_area :description, :body, :rows => 10, :cols => 80 %></p>
40 40
41 41 <p><label for="description_markdowned">Markdowned?</label>
42 42 <%= select "description",
43 43 "markdowned",
44 44 [['True',true],['False',false]],
45 45 {:selected => (@description) ? @description.markdowned : false }
46 46 %></p>
47 47
48 48 <p><label for="problem_url">URL</label><br/>
49 49 <%= text_field 'problem', 'url' %></p>
50 50
51 + <p>Task PDF <%= file_field_tag 'file' %></p>
52 +
51 53
52 54 <!--[eoform:problem]-->
@@ -1,9 +1,9
1 1 <h1>Editing problem</h1>
2 2
3 - <%= form_tag :action => 'update', :id => @problem do %>
3 + <%= form_tag({action: 'update', id: @problem},multipart: true) do %>
4 4 <%= render :partial => 'form' %>
5 5 <%= submit_tag 'Edit' %>
6 6 <% end %>
7 7
8 8 <%= link_to 'Show', :action => 'show', :id => @problem %> |
9 9 <%= link_to 'Back', :action => 'list' %>
You need to be logged in to leave comments. Login now