Description:
add show testcase feature
Commit status:
[Not Reviewed]
References:
Diff options:
Comments:
0 Commit comments
0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
r625:7645a0f771ce - - 12 files changed: 112 inserted, 1 deleted
@@ -0,0 +1,24 | |||||
|
|
1 | + class TestcasesController < ApplicationController | ||
|
|
2 | + before_action :set_testcase, only: [:download_input,:download_sol] | ||
|
|
3 | + before_action :testcase_authorization | ||
|
|
4 | + | ||
|
|
5 | + def download_input | ||
|
|
6 | + send_data @testcase.input, type: 'text/plain', filename: "#{@testcase.problem.name}.#{@testcase.num}.in" | ||
|
|
7 | + end | ||
|
|
8 | + | ||
|
|
9 | + def download_sol | ||
|
|
10 | + send_data @testcase.sol, type: 'text/plain', filename: "#{@testcase.problem.name}.#{@testcase.num}.sol" | ||
|
|
11 | + end | ||
|
|
12 | + | ||
|
|
13 | + | ||
|
|
14 | + private | ||
|
|
15 | + # Use callbacks to share common setup or constraints between actions. | ||
|
|
16 | + def set_testcase | ||
|
|
17 | + @testcase = Testcase.find(params[:id]) | ||
|
|
18 | + end | ||
|
|
19 | + | ||
|
|
20 | + # Only allow a trusted parameter "white list" through. | ||
|
|
21 | + def testcase_params | ||
|
|
22 | + params[:testcase] | ||
|
|
23 | + end | ||
|
|
24 | + end |
@@ -0,0 +1,25 | |||||
|
|
1 | + %h1 Test cases | ||
|
|
2 | + %h2= @problem.long_name | ||
|
|
3 | + | ||
|
|
4 | + /navbar | ||
|
|
5 | + %ul.nav.nav-pills{role: :tablist} | ||
|
|
6 | + - @problem.testcases.each.with_index do |tc,id| | ||
|
|
7 | + %li{role: :presentation, class: ('active' if id == 0)} | ||
|
|
8 | + %a{href:"#tc#{tc.id}", role: 'tab', data: {toggle: 'tab'}}= tc.num | ||
|
|
9 | + | ||
|
|
10 | + /actual data | ||
|
|
11 | + .tab-content | ||
|
|
12 | + - @problem.testcases.each.with_index do |tc,id| | ||
|
|
13 | + .tab-pane{id: "tc#{tc.id}",class: ('active' if id == 0)} | ||
|
|
14 | + .row | ||
|
|
15 | + .col-md-6 | ||
|
|
16 | + %h3 Input | ||
|
|
17 | + = link_to "Download",download_input_problem_testcase_path(@problem,tc),class: 'btn btn-info btn-sm' | ||
|
|
18 | + .col-md-6 | ||
|
|
19 | + %h3 Output | ||
|
|
20 | + = link_to "Download",download_sol_problem_testcase_path(@problem,tc),class: 'btn btn-info btn-sm' | ||
|
|
21 | + .row | ||
|
|
22 | + .col-md-6 | ||
|
|
23 | + %textarea{ rows: 25,readonly: true,style: "width:100%;resize=none;overflow-y: scroll;"}= tc.input | ||
|
|
24 | + .col-md-6 | ||
|
|
25 | + %textarea{ rows: 25,readonly: true,style: "width:100%;resize=none;overflow-y: scroll;"}= tc.sol |
@@ -0,0 +1,7 | |||||
|
|
1 | + require 'test_helper' | ||
|
|
2 | + | ||
|
|
3 | + class TestcasesControllerTest < ActionController::TestCase | ||
|
|
4 | + setup do | ||
|
|
5 | + @testcase = testcases(:one) | ||
|
|
6 | + end | ||
|
|
7 | + end |
@@ -37,6 +37,15 | |||||
|
37 | end |
|
37 | end |
|
38 | end |
|
38 | end |
|
39 |
|
39 | ||
|
|
40 | + def testcase_authorization | ||
|
|
41 | + #admin always has privileged | ||
|
|
42 | + if @current_user.admin? | ||
|
|
43 | + return true | ||
|
|
44 | + end | ||
|
|
45 | + | ||
|
|
46 | + unauthorized_redirect if GraderConfiguration["right.view_testcase"] | ||
|
|
47 | + end | ||
|
|
48 | + | ||
|
40 | protected |
|
49 | protected |
|
41 |
|
50 | ||
|
42 | def authenticate |
|
51 | def authenticate |
@@ -1,6 +1,7 | |||||
|
1 | class ProblemsController < ApplicationController |
|
1 | class ProblemsController < ApplicationController |
|
2 |
|
2 | ||
|
3 |
- before_ |
|
3 | + before_action :authenticate, :authorization |
|
|
4 | + before_action :testcase_authorization, only: [:show_testcase] | ||
|
4 |
|
5 | ||
|
5 | in_place_edit_for :problem, :name |
|
6 | in_place_edit_for :problem, :name |
|
6 | in_place_edit_for :problem, :full_name |
|
7 | in_place_edit_for :problem, :full_name |
@@ -221,6 +222,10 | |||||
|
221 | redirect_to :action => 'manage' |
|
222 | redirect_to :action => 'manage' |
|
222 | end |
|
223 | end |
|
223 |
|
224 | ||
|
|
225 | + def show_testcase | ||
|
|
226 | + @problem = Problem.includes(:testcases).find(params[:id]) | ||
|
|
227 | + end | ||
|
|
228 | + | ||
|
224 | ################################## |
|
229 | ################################## |
|
225 | protected |
|
230 | protected |
|
226 |
|
231 |
@@ -10,6 +10,7 | |||||
|
10 | MULTICONTESTS_KEY = 'system.multicontests' |
|
10 | MULTICONTESTS_KEY = 'system.multicontests' |
|
11 | CONTEST_TIME_LIMIT_KEY = 'contest.time_limit' |
|
11 | CONTEST_TIME_LIMIT_KEY = 'contest.time_limit' |
|
12 | MULTIPLE_IP_LOGIN_KEY = 'right.multiple_ip_login' |
|
12 | MULTIPLE_IP_LOGIN_KEY = 'right.multiple_ip_login' |
|
|
13 | + VIEW_TESTCASE = 'right.view_testcase' | ||
|
13 |
|
14 | ||
|
14 | cattr_accessor :config_cache |
|
15 | cattr_accessor :config_cache |
|
15 | cattr_accessor :task_grading_info_cache |
|
16 | cattr_accessor :task_grading_info_cache |
@@ -70,6 +71,10 | |||||
|
70 | return (get(SYSTEM_MODE_CONF_KEY)=='analysis') |
|
71 | return (get(SYSTEM_MODE_CONF_KEY)=='analysis') |
|
71 | end |
|
72 | end |
|
72 |
|
73 | ||
|
|
74 | + def self.show_testcase | ||
|
|
75 | + return get(VIEW_TESTCASE) | ||
|
|
76 | + end | ||
|
|
77 | + | ||
|
73 | def self.allow_test_request(user) |
|
78 | def self.allow_test_request(user) |
|
74 | mode = get(SYSTEM_MODE_CONF_KEY) |
|
79 | mode = get(SYSTEM_MODE_CONF_KEY) |
|
75 | early_timeout = get(TEST_REQUEST_EARLY_TIMEOUT_KEY) |
|
80 | early_timeout = get(TEST_REQUEST_EARLY_TIMEOUT_KEY) |
@@ -24,4 +24,6 | |||||
|
24 | = link_to "#{t 'main.cmp_msg'}", compiler_msg_submission_path(submission.id), {popup: true,remote: true,class: 'btn btn-xs btn-info'} |
|
24 | = link_to "#{t 'main.cmp_msg'}", compiler_msg_submission_path(submission.id), {popup: true,remote: true,class: 'btn btn-xs btn-info'} |
|
25 | = link_to "#{t 'main.src_link'}",{:action => 'source', :id => submission.id}, class: 'btn btn-xs btn-info' |
|
25 | = link_to "#{t 'main.src_link'}",{:action => 'source', :id => submission.id}, class: 'btn btn-xs btn-info' |
|
26 | = link_to "#{t 'main.submissions_link'}", problem_submissions_path(problem_id), class: 'btn btn-xs btn-info' |
|
26 | = link_to "#{t 'main.submissions_link'}", problem_submissions_path(problem_id), class: 'btn btn-xs btn-info' |
|
|
27 | + - if GraderConfiguration.show_testcase | ||
|
|
28 | + = link_to "testcases", show_testcase_problem_path(problem_id), class: 'btn btn-xs btn-info' | ||
|
27 |
|
29 |
@@ -18,6 +18,7 | |||||
|
18 | get 'toggle' |
|
18 | get 'toggle' |
|
19 | get 'toggle_test' |
|
19 | get 'toggle_test' |
|
20 | get 'stat' |
|
20 | get 'stat' |
|
|
21 | + get 'show_testcase' | ||
|
21 | end |
|
22 | end |
|
22 | collection do |
|
23 | collection do |
|
23 | get 'turn_all_off' |
|
24 | get 'turn_all_off' |
@@ -25,6 +26,13 | |||||
|
25 | get 'import' |
|
26 | get 'import' |
|
26 | get 'manage' |
|
27 | get 'manage' |
|
27 | end |
|
28 | end |
|
|
29 | + | ||
|
|
30 | + resources :testcases, only: [] do | ||
|
|
31 | + member do | ||
|
|
32 | + get 'download_input' | ||
|
|
33 | + get 'download_sol' | ||
|
|
34 | + end | ||
|
|
35 | + end | ||
|
28 | end |
|
36 | end |
|
29 |
|
37 | ||
|
30 | resources :grader_configuration, controller: 'configurations' |
|
38 | resources :grader_configuration, controller: 'configurations' |
@@ -89,6 +89,12 | |||||
|
89 | :description => 'Heart beat response text' |
|
89 | :description => 'Heart beat response text' |
|
90 | }, |
|
90 | }, |
|
91 |
|
91 | ||
|
|
92 | + { | ||
|
|
93 | + :key => 'right.view_testcase', | ||
|
|
94 | + :value_type => 'boolean', | ||
|
|
95 | + :default_value => 'false', | ||
|
|
96 | + :description => 'When true, any user can view/download test data' | ||
|
|
97 | + }, | ||
|
92 | # If Configuration['system.online_registration'] is true, the |
|
98 | # If Configuration['system.online_registration'] is true, the |
|
93 | # system allows online registration, and will use these |
|
99 | # system allows online registration, and will use these |
|
94 | # information for sending confirmation emails. |
|
100 | # information for sending confirmation emails. |
@@ -55,4 +55,19 | |||||
|
55 | return '' |
|
55 | return '' |
|
56 | end |
|
56 | end |
|
57 |
|
57 | ||
|
|
58 | + def self.call_import_testcase(problem_name) | ||
|
|
59 | + if GraderScript.grader_control_enabled? | ||
|
|
60 | + cur_dir = `pwd`.chomp | ||
|
|
61 | + Dir.chdir(GRADER_ROOT_DIR) | ||
|
|
62 | + | ||
|
|
63 | + script_name = File.join(GRADER_ROOT_DIR, "scripts/load_testcase") | ||
|
|
64 | + cmd = "#{script_name} #{problem_name}" | ||
|
|
65 | + | ||
|
|
66 | + output = `#{cmd}` | ||
|
|
67 | + | ||
|
|
68 | + Dir.chdir(cur_dir) | ||
|
|
69 | + return "Testcase import result:\n" + output | ||
|
58 | end |
|
70 | end |
|
|
71 | + end | ||
|
|
72 | + | ||
|
|
73 | + end |
@@ -38,6 +38,9 | |||||
|
38 | @log_msg << import_problem_pdf(dirname) |
|
38 | @log_msg << import_problem_pdf(dirname) |
|
39 | @log_msg << import_full_score(dirname) |
|
39 | @log_msg << import_full_score(dirname) |
|
40 |
|
40 | ||
|
|
41 | + #import test data | ||
|
|
42 | + @log_msg << GraderScript.call_import_testcase(@problem.name) | ||
|
|
43 | + | ||
|
41 | return true |
|
44 | return true |
|
42 | end |
|
45 | end |
|
43 |
|
46 |
You need to be logged in to leave comments.
Login now