Description:
- remove inplace editor from view - add link to edit announcement directly - modify submission_short display button
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r598:db36298d10ca - - 4 files changed: 55 inserted, 22 deleted

@@ -1,452 +1,484
1 1 class ReportController < ApplicationController
2 2
3 3 before_filter :admin_authorization, only: [:login_stat,:submission_stat, :stuck, :cheat_report, :cheat_scruntinize, :show_max_score]
4 4
5 5 before_filter(only: [:problem_hof]) { |c|
6 6 return false unless authenticate
7 7
8 8 if GraderConfiguration["right.user_view_submission"]
9 9 return true;
10 10 end
11 11
12 12 admin_authorization
13 13 }
14 14
15 15 def max_score
16 16 end
17 17
18 + def current_score
19 + @problems = Problem.find_available_problems
20 + @users = User.includes(:contests).includes(:contest_stat).where(enabled: true)
21 + @scorearray = calculate_max_score(problems, users,0,0,{max: true})
22 +
23 + #rencer accordingly
24 + if params[:commit] == 'download csv' then
25 + csv = gen_csv_from_scorearray(@scorearray,@problems)
26 + send_data csv, filename: 'max_score.csv'
27 + else
28 + #render template: 'user_admin/user_stat'
29 + render 'current_score'
30 + end
31 + end
32 +
18 33 def show_max_score
19 34 #process parameters
20 35 #problems
21 36 @problems = []
22 37 params[:problem_id].each do |id|
23 38 next unless id.strip != ""
24 39 @problems << Problem.find(id.to_i)
25 40 end
26 41
27 42 #users
28 43 @users = if params[:user] == "all" then
29 44 User.find(:all, :include => [:contests, :contest_stat])
30 45 else
31 46 User.includes(:contests).includes(:contest_stat).where(enabled: true)
32 47 end
33 48
34 49 #set up range from param
35 50 since_id = params.fetch(:min_id, 0).to_i
36 51 until_id = params.fetch(:max_id, 0).to_i
37 52
38 - #get data
39 - @scorearray = Array.new
40 - @users.each do |u|
41 - ustat = Array.new
42 - ustat[0] = u
43 - @problems.each do |p|
44 - max_points = 0
45 - Submission.find_in_range_by_user_and_problem(u.id,p.id,since_id,until_id).each do |sub|
46 - max_points = sub.points if sub and sub.points and (sub.points > max_points)
47 - end
48 - ustat << [(max_points.to_f*100/p.full_score).round, (max_points>=p.full_score)]
49 - end
50 - @scorearray << ustat
51 - end
53 + #calculate the routine
54 + @scorearray = calculate_max_score(problems, users,since_id,until_id)
52 55
56 + #rencer accordingly
53 57 if params[:commit] == 'download csv' then
54 58 csv = gen_csv_from_scorearray(@scorearray,@problems)
55 59 send_data csv, filename: 'max_score.csv'
56 60 else
57 61 #render template: 'user_admin/user_stat'
58 62 render 'max_score'
59 63 end
60 64
61 65 end
62 66
63 67 def score
64 68 if params[:commit] == 'download csv'
65 69 @problems = Problem.all
66 70 else
67 71 @problems = Problem.find_available_problems
68 72 end
69 73 @users = User.includes(:contests, :contest_stat).where(enabled: true) #find(:all, :include => [:contests, :contest_stat]).where(enabled: true)
70 74 @scorearray = Array.new
71 75 @users.each do |u|
72 76 ustat = Array.new
73 77 ustat[0] = u
74 78 @problems.each do |p|
75 79 sub = Submission.find_last_by_user_and_problem(u.id,p.id)
76 80 if (sub!=nil) and (sub.points!=nil) and p and p.full_score
77 81 ustat << [(sub.points.to_f*100/p.full_score).round, (sub.points>=p.full_score)]
78 82 else
79 83 ustat << [0,false]
80 84 end
81 85 end
82 86 @scorearray << ustat
83 87 end
84 88 if params[:commit] == 'download csv' then
85 89 csv = gen_csv_from_scorearray(@scorearray,@problems)
86 90 send_data csv, filename: 'last_score.csv'
87 91 else
88 92 render template: 'user_admin/user_stat'
89 93 end
90 94
91 95 end
92 96
93 97 def login_stat
94 98 @logins = Array.new
95 99
96 100 date_and_time = '%Y-%m-%d %H:%M'
97 101 begin
98 102 md = params[:since_datetime].match(/(\d+)-(\d+)-(\d+) (\d+):(\d+)/)
99 103 @since_time = Time.zone.local(md[1].to_i,md[2].to_i,md[3].to_i,md[4].to_i,md[5].to_i)
100 104 rescue
101 105 @since_time = DateTime.new(1000,1,1)
102 106 end
103 107 begin
104 108 md = params[:until_datetime].match(/(\d+)-(\d+)-(\d+) (\d+):(\d+)/)
105 109 @until_time = Time.zone.local(md[1].to_i,md[2].to_i,md[3].to_i,md[4].to_i,md[5].to_i)
106 110 rescue
107 111 @until_time = DateTime.new(3000,1,1)
108 112 end
109 113
110 114 User.all.each do |user|
111 115 @logins << { id: user.id,
112 116 login: user.login,
113 117 full_name: user.full_name,
114 118 count: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
115 119 user.id,@since_time,@until_time)
116 120 .count(:id),
117 121 min: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
118 122 user.id,@since_time,@until_time)
119 123 .minimum(:created_at),
120 124 max: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
121 125 user.id,@since_time,@until_time)
122 126 .maximum(:created_at),
123 127 ip: Login.where("user_id = ? AND created_at >= ? AND created_at <= ?",
124 128 user.id,@since_time,@until_time)
125 129 .select(:ip_address).uniq
126 130
127 131 }
128 132 end
129 133 end
130 134
131 135 def submission_stat
132 136
133 137 date_and_time = '%Y-%m-%d %H:%M'
134 138 begin
135 139 @since_time = DateTime.strptime(params[:since_datetime],date_and_time)
136 140 rescue
137 141 @since_time = DateTime.new(1000,1,1)
138 142 end
139 143 begin
140 144 @until_time = DateTime.strptime(params[:until_datetime],date_and_time)
141 145 rescue
142 146 @until_time = DateTime.new(3000,1,1)
143 147 end
144 148
145 149 @submissions = {}
146 150
147 151 User.find_each do |user|
148 152 @submissions[user.id] = { login: user.login, full_name: user.full_name, count: 0, sub: { } }
149 153 end
150 154
151 155 Submission.where("submitted_at >= ? AND submitted_at <= ?",@since_time,@until_time).find_each do |s|
152 156 if @submissions[s.user_id]
153 157 if not @submissions[s.user_id][:sub].has_key?(s.problem_id)
154 158 a = Problem.find_by_id(s.problem_id)
155 159 @submissions[s.user_id][:sub][s.problem_id] =
156 160 { prob_name: (a ? a.full_name : '(NULL)'),
157 161 sub_ids: [s.id] }
158 162 else
159 163 @submissions[s.user_id][:sub][s.problem_id][:sub_ids] << s.id
160 164 end
161 165 @submissions[s.user_id][:count] += 1
162 166 end
163 167 end
164 168 end
165 169
166 170 def problem_hof
167 171 # gen problem list
168 172 @user = User.find(session[:user_id])
169 173 @problems = @user.available_problems
170 174
171 175 # get selected problems or the default
172 176 if params[:id]
173 177 begin
174 178 @problem = Problem.available.find(params[:id])
175 179 rescue
176 180 redirect_to action: :problem_hof
177 181 flash[:notice] = 'Error: submissions for that problem are not viewable.'
178 182 return
179 183 end
180 184 end
181 185
182 186 return unless @problem
183 187
184 188 @by_lang = {} #aggregrate by language
185 189
186 190 range =65
187 191 @histogram = { data: Array.new(range,0), summary: {} }
188 192 @summary = {count: 0, solve: 0, attempt: 0}
189 193 user = Hash.new(0)
190 194 Submission.where(problem_id: @problem.id).find_each do |sub|
191 195 #histogram
192 196 d = (DateTime.now.in_time_zone - sub.submitted_at) / 24 / 60 / 60
193 197 @histogram[:data][d.to_i] += 1 if d < range
194 198
195 199 next unless sub.points
196 200 @summary[:count] += 1
197 201 user[sub.user_id] = [user[sub.user_id], (sub.points >= @problem.full_score) ? 1 : 0].max
198 202
199 203 lang = Language.find_by_id(sub.language_id)
200 204 next unless lang
201 205 next unless sub.points >= @problem.full_score
202 206
203 207 #initialize
204 208 unless @by_lang.has_key?(lang.pretty_name)
205 209 @by_lang[lang.pretty_name] = {
206 210 runtime: { avail: false, value: 2**30-1 },
207 211 memory: { avail: false, value: 2**30-1 },
208 212 length: { avail: false, value: 2**30-1 },
209 213 first: { avail: false, value: DateTime.new(3000,1,1) }
210 214 }
211 215 end
212 216
213 217 if sub.max_runtime and sub.max_runtime < @by_lang[lang.pretty_name][:runtime][:value]
214 218 @by_lang[lang.pretty_name][:runtime] = { avail: true, user_id: sub.user_id, value: sub.max_runtime, sub_id: sub.id }
215 219 end
216 220
217 221 if sub.peak_memory and sub.peak_memory < @by_lang[lang.pretty_name][:memory][:value]
218 222 @by_lang[lang.pretty_name][:memory] = { avail: true, user_id: sub.user_id, value: sub.peak_memory, sub_id: sub.id }
219 223 end
220 224
221 225 if sub.submitted_at and sub.submitted_at < @by_lang[lang.pretty_name][:first][:value] and
222 226 !sub.user.admin?
223 227 @by_lang[lang.pretty_name][:first] = { avail: true, user_id: sub.user_id, value: sub.submitted_at, sub_id: sub.id }
224 228 end
225 229
226 230 if @by_lang[lang.pretty_name][:length][:value] > sub.effective_code_length
227 231 @by_lang[lang.pretty_name][:length] = { avail: true, user_id: sub.user_id, value: sub.effective_code_length, sub_id: sub.id }
228 232 end
229 233 end
230 234
231 235 #process user_id
232 236 @by_lang.each do |lang,prop|
233 237 prop.each do |k,v|
234 238 v[:user] = User.exists?(v[:user_id]) ? User.find(v[:user_id]).full_name : "(NULL)"
235 239 end
236 240 end
237 241
238 242 #sum into best
239 243 if @by_lang and @by_lang.first
240 244 @best = @by_lang.first[1].clone
241 245 @by_lang.each do |lang,prop|
242 246 if @best[:runtime][:value] >= prop[:runtime][:value]
243 247 @best[:runtime] = prop[:runtime]
244 248 @best[:runtime][:lang] = lang
245 249 end
246 250 if @best[:memory][:value] >= prop[:memory][:value]
247 251 @best[:memory] = prop[:memory]
248 252 @best[:memory][:lang] = lang
249 253 end
250 254 if @best[:length][:value] >= prop[:length][:value]
251 255 @best[:length] = prop[:length]
252 256 @best[:length][:lang] = lang
253 257 end
254 258 if @best[:first][:value] >= prop[:first][:value]
255 259 @best[:first] = prop[:first]
256 260 @best[:first][:lang] = lang
257 261 end
258 262 end
259 263 end
260 264
261 265 @histogram[:summary][:max] = [@histogram[:data].max,1].max
262 266 @summary[:attempt] = user.count
263 267 user.each_value { |v| @summary[:solve] += 1 if v == 1 }
264 268 end
265 269
266 270 def stuck #report struggling user,problem
267 271 # init
268 272 user,problem = nil
269 273 solve = true
270 274 tries = 0
271 275 @struggle = Array.new
272 276 record = {}
273 277 Submission.includes(:problem,:user).order(:problem_id,:user_id).find_each do |sub|
274 278 next unless sub.problem and sub.user
275 279 if user != sub.user_id or problem != sub.problem_id
276 280 @struggle << { user: record[:user], problem: record[:problem], tries: tries } unless solve
277 281 record = {user: sub.user, problem: sub.problem}
278 282 user,problem = sub.user_id, sub.problem_id
279 283 solve = false
280 284 tries = 0
281 285 end
282 286 if sub.points >= sub.problem.full_score
283 287 solve = true
284 288 else
285 289 tries += 1
286 290 end
287 291 end
288 292 @struggle.sort!{|a,b| b[:tries] <=> a[:tries] }
289 293 @struggle = @struggle[0..50]
290 294 end
291 295
292 296
293 297 def multiple_login
294 298 #user with multiple IP
295 299 raw = Submission.joins(:user).joins(:problem).where("problems.available != 0").group("login,ip_address").order(:login)
296 300 last,count = 0,0
297 301 first = 0
298 302 @users = []
299 303 raw.each do |r|
300 304 if last != r.user.login
301 305 count = 1
302 306 last = r.user.login
303 307 first = r
304 308 else
305 309 @users << first if count == 1
306 310 @users << r
307 311 count += 1
308 312 end
309 313 end
310 314
311 315 #IP with multiple user
312 316 raw = Submission.joins(:user).joins(:problem).where("problems.available != 0").group("login,ip_address").order(:ip_address)
313 317 last,count = 0,0
314 318 first = 0
315 319 @ip = []
316 320 raw.each do |r|
317 321 if last != r.ip_address
318 322 count = 1
319 323 last = r.ip_address
320 324 first = r
321 325 else
322 326 @ip << first if count == 1
323 327 @ip << r
324 328 count += 1
325 329 end
326 330 end
327 331 end
328 332
329 333 def cheat_report
330 334 date_and_time = '%Y-%m-%d %H:%M'
331 335 begin
332 336 md = params[:since_datetime].match(/(\d+)-(\d+)-(\d+) (\d+):(\d+)/)
333 337 @since_time = Time.zone.local(md[1].to_i,md[2].to_i,md[3].to_i,md[4].to_i,md[5].to_i)
334 338 rescue
335 339 @since_time = Time.zone.now.ago( 90.minutes)
336 340 end
337 341 begin
338 342 md = params[:until_datetime].match(/(\d+)-(\d+)-(\d+) (\d+):(\d+)/)
339 343 @until_time = Time.zone.local(md[1].to_i,md[2].to_i,md[3].to_i,md[4].to_i,md[5].to_i)
340 344 rescue
341 345 @until_time = Time.zone.now
342 346 end
343 347
344 348 #multi login
345 349 @ml = Login.joins(:user).where("logins.created_at >= ? and logins.created_at <= ?",@since_time,@until_time).select('users.login,count(distinct ip_address) as count,users.full_name').group("users.id").having("count > 1")
346 350
347 351 st = <<-SQL
348 352 SELECT l2.*
349 353 FROM logins l2 INNER JOIN
350 354 (SELECT u.id,COUNT(DISTINCT ip_address) as count,u.login,u.full_name
351 355 FROM logins l
352 356 INNER JOIN users u ON l.user_id = u.id
353 357 WHERE l.created_at >= '#{@since_time.in_time_zone("UTC")}' and l.created_at <= '#{@until_time.in_time_zone("UTC")}'
354 358 GROUP BY u.id
355 359 HAVING count > 1
356 360 ) ml ON l2.user_id = ml.id
357 361 WHERE l2.created_at >= '#{@since_time.in_time_zone("UTC")}' and l2.created_at <= '#{@until_time.in_time_zone("UTC")}'
358 362 UNION
359 363 SELECT l2.*
360 364 FROM logins l2 INNER JOIN
361 365 (SELECT l.ip_address,COUNT(DISTINCT u.id) as count
362 366 FROM logins l
363 367 INNER JOIN users u ON l.user_id = u.id
364 368 WHERE l.created_at >= '#{@since_time.in_time_zone("UTC")}' and l.created_at <= '#{@until_time.in_time_zone("UTC")}'
365 369 GROUP BY l.ip_address
366 370 HAVING count > 1
367 371 ) ml on ml.ip_address = l2.ip_address
368 372 INNER JOIN users u ON l2.user_id = u.id
369 373 WHERE l2.created_at >= '#{@since_time.in_time_zone("UTC")}' and l2.created_at <= '#{@until_time.in_time_zone("UTC")}'
370 374 ORDER BY ip_address,created_at
371 375 SQL
372 376 @mld = Login.find_by_sql(st)
373 377
374 378 st = <<-SQL
375 379 SELECT s.id,s.user_id,s.ip_address,s.submitted_at,s.problem_id
376 380 FROM submissions s INNER JOIN
377 381 (SELECT u.id,COUNT(DISTINCT ip_address) as count,u.login,u.full_name
378 382 FROM logins l
379 383 INNER JOIN users u ON l.user_id = u.id
380 384 WHERE l.created_at >= ? and l.created_at <= ?
381 385 GROUP BY u.id
382 386 HAVING count > 1
383 387 ) ml ON s.user_id = ml.id
384 388 WHERE s.submitted_at >= ? and s.submitted_at <= ?
385 389 UNION
386 390 SELECT s.id,s.user_id,s.ip_address,s.submitted_at,s.problem_id
387 391 FROM submissions s INNER JOIN
388 392 (SELECT l.ip_address,COUNT(DISTINCT u.id) as count
389 393 FROM logins l
390 394 INNER JOIN users u ON l.user_id = u.id
391 395 WHERE l.created_at >= ? and l.created_at <= ?
392 396 GROUP BY l.ip_address
393 397 HAVING count > 1
394 398 ) ml on ml.ip_address = s.ip_address
395 399 WHERE s.submitted_at >= ? and s.submitted_at <= ?
396 400 ORDER BY ip_address,submitted_at
397 401 SQL
398 402 @subs = Submission.joins(:problem).find_by_sql([st,@since_time,@until_time,
399 403 @since_time,@until_time,
400 404 @since_time,@until_time,
401 405 @since_time,@until_time])
402 406
403 407 end
404 408
405 409 def cheat_scruntinize
406 410 #convert date & time
407 411 date_and_time = '%Y-%m-%d %H:%M'
408 412 begin
409 413 md = params[:since_datetime].match(/(\d+)-(\d+)-(\d+) (\d+):(\d+)/)
410 414 @since_time = Time.zone.local(md[1].to_i,md[2].to_i,md[3].to_i,md[4].to_i,md[5].to_i)
411 415 rescue
412 416 @since_time = Time.zone.now.ago( 90.minutes)
413 417 end
414 418 begin
415 419 md = params[:until_datetime].match(/(\d+)-(\d+)-(\d+) (\d+):(\d+)/)
416 420 @until_time = Time.zone.local(md[1].to_i,md[2].to_i,md[3].to_i,md[4].to_i,md[5].to_i)
417 421 rescue
418 422 @until_time = Time.zone.now
419 423 end
420 424
421 425 #convert sid
422 426 @sid = params[:SID].split(/[,\s]/) if params[:SID]
423 427 unless @sid and @sid.size > 0
424 428 return
425 429 redirect_to actoin: :cheat_scruntinize
426 430 flash[:notice] = 'Please enter at least 1 student id'
427 431 end
428 432 mark = Array.new(@sid.size,'?')
429 433 condition = "(u.login = " + mark.join(' OR u.login = ') + ')'
430 434
431 435 @st = <<-SQL
432 436 SELECT l.created_at as submitted_at ,-1 as id,u.login,u.full_name,l.ip_address,"" as problem_id,"" as points,l.user_id
433 437 FROM logins l INNER JOIN users u on l.user_id = u.id
434 438 WHERE l.created_at >= ? AND l.created_at <= ? AND #{condition}
435 439 UNION
436 440 SELECT s.submitted_at,s.id,u.login,u.full_name,s.ip_address,s.problem_id,s.points,s.user_id
437 441 FROM submissions s INNER JOIN users u ON s.user_id = u.id
438 442 WHERE s.submitted_at >= ? AND s.submitted_at <= ? AND #{condition}
439 443 ORDER BY submitted_at
440 444 SQL
441 445
442 446 p = [@st,@since_time,@until_time] + @sid + [@since_time,@until_time] + @sid
443 447 @logs = Submission.joins(:problem).find_by_sql(p)
444 448
445 449
446 450
447 451
448 452
449 453 end
450 454
455 + protected
456 +
457 + def calculate_max_score(problems, users,since_id,until_id, get_last_score = false)
458 + scorearray = Array.new
459 + users.each do |u|
460 + ustat = Array.new
461 + ustat[0] = u
462 + problems.each do |p|
463 + unless get_last_score
464 + #get max score
465 + max_points = 0
466 + Submission.find_in_range_by_user_and_problem(u.id,p.id,since_id,until_id).each do |sub|
467 + max_points = sub.points if sub and sub.points and (sub.points > max_points)
468 + end
469 + ustat << [(max_points.to_f*100/p.full_score).round, (max_points>=p.full_score)]
470 + else
471 + #get latest score
472 + sub = Submission.find_last_by_user_and_problem(u.id,p.id)
473 + if (sub!=nil) and (sub.points!=nil) and p and p.full_score
474 + ustat << [(sub.points.to_f*100/p.full_score).round, (sub.points>=p.full_score)]
475 + else
476 + ustat << [0,false]
477 + end
478 + end
479 + scorearray << ustat
480 + end
481 + return scorearray
482 + end
451 483
452 484 end
@@ -1,13 +1,15
1 1 %li.list-group-item
2 2 %strong
3 3 = announcement.title
4 + - if @current_user.admin?
5 + = link_to 'Edit', edit_announcement_path(announcement), class: 'btn btn-xs btn-default'
4 6 %small= "(updated #{time_ago_in_words(announcement.updated_at)} ago on #{announcement.updated_at})"
5 7
6 8 %br
7 9 = markdown(announcement.body)
8 10 :javascript
9 11 Announcement.updateRecentId(#{announcement.id});
10 12 - if (defined? announcement_effect) and announcement_effect
11 13 :javascript
12 14 $("announcement-#{announcement.id}").blindDown({duration: 0.2});
13 15 $("announcement-#{announcement.id}").appear({duration: 0.5, queue: 'end'});
@@ -1,27 +1,26
1 1
2 2 - if submission.nil?
3 3 = "-"
4 4 - else
5 5 - if submission.graded_at.nil?
6 6 = t 'main.submitted_at'
7 7 = format_short_time(submission.submitted_at.localtime)
8 8 - else
9 9 %strong= t 'main.graded_at'
10 10 = "#{format_short_time(submission.graded_at.localtime)} "
11 11 %br
12 12 - if GraderConfiguration['ui.show_score']
13 13 %strong= t 'main.score'
14 14 = "#{(submission.points*100/submission.problem.full_score).to_i} "
15 15 = " ["
16 16 %tt
17 17 = submission.grader_comment
18 18 = "]"
19 19 %br
20 20 %strong View:
21 21 - if GraderConfiguration.show_grading_result
22 22 = link_to '[detailed result]', :action => 'result', :id => submission.id
23 - = link_to("[#{t 'main.cmp_msg'}]", {:action => 'compiler_msg', :id => submission.id}, {:popup => true})
24 - = " | "
25 - = link_to("[#{t 'main.src_link'}]",{:action => 'source', :id => submission.id})
26 - = " | "
27 - = link_to "[#{t 'main.submissions_link'}]", problem_submissions_path(problem_id)
23 + = link_to "#{t 'main.cmp_msg'}", {:action => 'compiler_msg', :id => submission.id}, {popup: true,class: 'btn btn-xs btn-info'}
24 + = link_to "#{t 'main.src_link'}",{:action => 'source', :id => submission.id}, class: 'btn btn-xs btn-info'
25 + = link_to "#{t 'main.submissions_link'}", problem_submissions_path(problem_id), class: 'btn btn-xs btn-info'
26 +
@@ -1,50 +1,50
1 1 - content_for :head do
2 2 = stylesheet_link_tag 'problems'
3 3 %h1 Listing problems
4 4 %p
5 5 = link_to 'New problem', new_problem_path, class: 'btn btn-default btn-sm'
6 6 = link_to 'Manage problems', { action: 'manage'}, class: 'btn btn-default btn-sm'
7 7 = link_to 'Import problems', {:action => 'import'}, class: 'btn btn-default btn-sm'
8 8 = link_to 'Turn off all problems', {:action => 'turn_all_off'}, class: 'btn btn-default btn-sm'
9 9 = link_to 'Turn on all problems', {:action => 'turn_all_on'}, class: 'btn btn-default btn-sm'
10 10 .submitbox
11 11 = form_tag :action => 'quick_create' do
12 12 %b Quick New:
13 13 %label{:for => "problem_name"} Name
14 14 = text_field 'problem', 'name'
15 15 |
16 16 %label{:for => "problem_full_name"} Full name
17 17 = text_field 'problem', 'full_name'
18 18 = submit_tag "Create"
19 19 %table.table.table-condense.table-hover
20 20 %thead
21 21 %th Name
22 22 %th Full name
23 23 %th.text-right Full score
24 24 %th Date added
25 25 %th.text-center
26 26 Avail?
27 27 %sup{class: 'text-primary',data: {toggle: 'tooltip'}, title: 'Let user submits to this problem?' } [?]
28 28 %th.text-center
29 29 Test?
30 30 %sup{class: 'text-primary',data: {toggle: 'tooltip'}, title: 'Let user uses test interface on this problem?' } [?]
31 31 - if GraderConfiguration.multicontests?
32 32 %th Contests
33 33 - for problem in @problems
34 34 %tr{:class => "#{(problem.available) ? "success" : "danger"}", :id => "prob-#{problem.id}", :name => "prob-#{problem.id}"}
35 35 - @problem=problem
36 - %td= in_place_editor_field :problem, :name, {}, :rows=>1
37 - %td= in_place_editor_field :problem, :full_name, {}, :rows=>1
38 - %td.text-right= in_place_editor_field :problem, :full_score, {}, :rows=>1
36 + %td= problem.name #in_place_editor_field :problem, :name, {}, :rows=>1
37 + %td= problem.full_name #in_place_editor_field :problem, :full_name, {}, :rows=>1
38 + %td.text-right= problem.full_score #in_place_editor_field :problem, :full_score, {}, :rows=>1
39 39 %td= problem.date_added
40 40 %td= toggle_button(@problem.available?, toggle_problem_url(@problem), "problem-avail-#{@problem.id}")
41 41 %td= toggle_button(@problem.test_allowed?, toggle_test_problem_url(@problem), "problem-test-#{@problem.id}")
42 42 - if GraderConfiguration.multicontests?
43 43 %td
44 44 = problem.contests.collect { |c| c.name }.join(', ')
45 45 %td= link_to 'Stat', {:action => 'stat', :id => problem.id}, class: 'btn btn-info btn-xs btn-block'
46 46 %td= link_to 'Show', {:action => 'show', :id => problem}, class: 'btn btn-info btn-xs btn-block'
47 47 %td= link_to 'Edit', {:action => 'edit', :id => problem}, class: 'btn btn-info btn-xs btn-block'
48 48 %td= link_to 'Destroy', { :action => 'destroy', :id => problem }, :confirm => 'Are you sure?', :method => :post, class: 'btn btn-danger btn-xs btn-block'
49 49 %br/
50 50 = link_to '[New problem]', :action => 'new'
You need to be logged in to leave comments. Login now