Description:
- add problem toggle test js reponse (it was forgotten) - change score report to bootstrap-sortable
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r570:0b74eb4e28fa - - 7 files changed: 76 inserted, 24 deleted

@@ -0,0 +1,2
1 + = render partial: 'toggle_button',
2 + locals: {button_id: "#problem-test-#{@problem.id}",button_on: @problem.test_allowed?}
@@ -48,27 +48,31
48 gem 'jquery-timepicker-addon-rails'
48 gem 'jquery-timepicker-addon-rails'
49 gem 'jquery-tablesorter'
49 gem 'jquery-tablesorter'
50
50
51 #syntax highlighter
51 #syntax highlighter
52 gem 'rouge'
52 gem 'rouge'
53
53
54 #add bootstrap
54 #add bootstrap
55 gem 'bootstrap-sass', '~> 3.2.0'
55 gem 'bootstrap-sass', '~> 3.2.0'
56 gem 'bootstrap-switch-rails'
56 gem 'bootstrap-switch-rails'
57 gem 'bootstrap-toggle-rails'
57 gem 'bootstrap-toggle-rails'
58 gem 'autoprefixer-rails'
58 gem 'autoprefixer-rails'
59
59
60 + #bootstrap sortable
61 + gem 'momentjs-rails'
62 + gem 'rails_bootstrap_sortable'
63 +
64 + #ace editor
60 gem 'ace-rails-ap'
65 gem 'ace-rails-ap'
61
66
62 -
63 gem 'haml'
67 gem 'haml'
64 gem 'haml-rails'
68 gem 'haml-rails'
65 gem 'mail'
69 gem 'mail'
66 gem 'rdiscount'
70 gem 'rdiscount'
67 gem 'test-unit'
71 gem 'test-unit'
68 gem 'will_paginate', '~> 3.0.7'
72 gem 'will_paginate', '~> 3.0.7'
69 gem 'dynamic_form'
73 gem 'dynamic_form'
70 gem 'in_place_editing'
74 gem 'in_place_editing'
71 gem 'verification', :git => 'https://github.com/sikachu/verification.git'
75 gem 'verification', :git => 'https://github.com/sikachu/verification.git'
72
76
73 group :test, :development do
77 group :test, :development do
74 gem 'rspec-rails', '~> 2.99.0'
78 gem 'rspec-rails', '~> 2.99.0'
@@ -81,45 +81,49
81 jquery-ui-rails (4.0.3)
81 jquery-ui-rails (4.0.3)
82 jquery-rails
82 jquery-rails
83 railties (>= 3.1.0)
83 railties (>= 3.1.0)
84 jquery-ui-sass-rails (4.0.3.0)
84 jquery-ui-sass-rails (4.0.3.0)
85 jquery-rails
85 jquery-rails
86 jquery-ui-rails (= 4.0.3)
86 jquery-ui-rails (= 4.0.3)
87 railties (>= 3.1.0)
87 railties (>= 3.1.0)
88 json (1.8.2)
88 json (1.8.2)
89 mail (2.5.4)
89 mail (2.5.4)
90 mime-types (~> 1.16)
90 mime-types (~> 1.16)
91 treetop (~> 1.4.8)
91 treetop (~> 1.4.8)
92 mime-types (1.25.1)
92 mime-types (1.25.1)
93 + momentjs-rails (2.11.1)
94 + railties (>= 3.1)
93 multi_json (1.10.1)
95 multi_json (1.10.1)
94 mysql2 (0.3.20)
96 mysql2 (0.3.20)
95 polyglot (0.3.5)
97 polyglot (0.3.5)
96 power_assert (0.2.2)
98 power_assert (0.2.2)
97 prototype-rails (3.2.1)
99 prototype-rails (3.2.1)
98 rails (~> 3.2)
100 rails (~> 3.2)
99 rack (1.4.5)
101 rack (1.4.5)
100 rack-cache (1.2)
102 rack-cache (1.2)
101 rack (>= 0.4)
103 rack (>= 0.4)
102 rack-ssl (1.3.4)
104 rack-ssl (1.3.4)
103 rack
105 rack
104 rack-test (0.6.3)
106 rack-test (0.6.3)
105 rack (>= 1.0)
107 rack (>= 1.0)
106 rails (3.2.21)
108 rails (3.2.21)
107 actionmailer (= 3.2.21)
109 actionmailer (= 3.2.21)
108 actionpack (= 3.2.21)
110 actionpack (= 3.2.21)
109 activerecord (= 3.2.21)
111 activerecord (= 3.2.21)
110 activeresource (= 3.2.21)
112 activeresource (= 3.2.21)
111 activesupport (= 3.2.21)
113 activesupport (= 3.2.21)
112 bundler (~> 1.0)
114 bundler (~> 1.0)
113 railties (= 3.2.21)
115 railties (= 3.2.21)
116 + rails_bootstrap_sortable (2.0.0)
117 + momentjs-rails (~> 2, >= 2.8.3)
114 railties (3.2.21)
118 railties (3.2.21)
115 actionpack (= 3.2.21)
119 actionpack (= 3.2.21)
116 activesupport (= 3.2.21)
120 activesupport (= 3.2.21)
117 rack-ssl (~> 1.3.2)
121 rack-ssl (~> 1.3.2)
118 rake (>= 0.8.7)
122 rake (>= 0.8.7)
119 rdoc (~> 3.4)
123 rdoc (~> 3.4)
120 thor (>= 0.14.6, < 2.0)
124 thor (>= 0.14.6, < 2.0)
121 rake (10.4.2)
125 rake (10.4.2)
122 rdiscount (2.1.8)
126 rdiscount (2.1.8)
123 rdoc (3.12.2)
127 rdoc (3.12.2)
124 json (~> 1.4)
128 json (~> 1.4)
125 rouge (1.8.0)
129 rouge (1.8.0)
@@ -174,24 +178,26
174 bootstrap-switch-rails
178 bootstrap-switch-rails
175 bootstrap-toggle-rails
179 bootstrap-toggle-rails
176 coffee-rails (~> 3.2.2)
180 coffee-rails (~> 3.2.2)
177 dynamic_form
181 dynamic_form
178 haml
182 haml
179 haml-rails
183 haml-rails
180 in_place_editing
184 in_place_editing
181 jquery-rails
185 jquery-rails
182 jquery-tablesorter
186 jquery-tablesorter
183 jquery-timepicker-addon-rails
187 jquery-timepicker-addon-rails
184 jquery-ui-sass-rails
188 jquery-ui-sass-rails
185 mail
189 mail
190 + momentjs-rails
186 mysql2
191 mysql2
187 prototype-rails
192 prototype-rails
188 rails (= 3.2.21)
193 rails (= 3.2.21)
194 + rails_bootstrap_sortable
189 rdiscount
195 rdiscount
190 rouge
196 rouge
191 rspec-rails (~> 2.99.0)
197 rspec-rails (~> 2.99.0)
192 sass-rails (~> 3.2.6)
198 sass-rails (~> 3.2.6)
193 select2-rails
199 select2-rails
194 test-unit
200 test-unit
195 uglifier
201 uglifier
196 verification!
202 verification!
197 will_paginate (~> 3.0.7)
203 will_paginate (~> 3.0.7)
@@ -5,26 +5,26
5 // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
5 // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6 //
6 //
7 // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
7 // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8 // the compiled file.
8 // the compiled file.
9 //
9 //
10 // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
10 // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11 // GO AFTER THE REQUIRES BELOW.
11 // GO AFTER THE REQUIRES BELOW.
12 //
12 //
13 //= require jquery
13 //= require jquery
14 //= require jquery_ujs
14 //= require jquery_ujs
15 //= require jquery.ui.all
15 //= require jquery.ui.all
16 //= require bootstrap-sprockets
16 //= require bootstrap-sprockets
17 - //x= require bootstrap-switch
17 + //= require moment
18 - //= require bootstrap-toggle
18 + //= require bootstrap-sortable
19 //= require select2
19 //= require select2
20 //= require custom
20 //= require custom
21 //= require ace-rails-ap
21 //= require ace-rails-ap
22 //= require ace/mode-c_cpp
22 //= require ace/mode-c_cpp
23 //= require ace/mode-ruby
23 //= require ace/mode-ruby
24 //= require ace/mode-pascal
24 //= require ace/mode-pascal
25 //= require ace/mode-javascript
25 //= require ace/mode-javascript
26 //= require ace/mode-java
26 //= require ace/mode-java
27 //= require ace/theme-merbivore
27 //= require ace/theme-merbivore
28
28
29
29
30 // since this is after blank line, it is not downloaded
30 // since this is after blank line, it is not downloaded
@@ -23,24 +23,25
23 @import jquery.ui.slider
23 @import jquery.ui.slider
24 @import jquery-ui-timepicker-addon
24 @import jquery-ui-timepicker-addon
25 @import jquery-tablesorter/theme.metro-dark
25 @import jquery-tablesorter/theme.metro-dark
26 @import tablesorter-theme.cafe
26 @import tablesorter-theme.cafe
27
27
28 //bootstrap
28 //bootstrap
29 @import bootstrap-sprockets
29 @import bootstrap-sprockets
30 @import bootstrap
30 @import bootstrap
31 @import select2
31 @import select2
32 @import select2-bootstrap
32 @import select2-bootstrap
33 //@import bootstrap3-switch
33 //@import bootstrap3-switch
34 @import bootstrap-toggle
34 @import bootstrap-toggle
35 + @import bootstrap-sortable
35
36
36 //bootstrap navbar color (from)
37 //bootstrap navbar color (from)
37 $bgDefault : #19197b
38 $bgDefault : #19197b
38 $bgHighlight : #06064b
39 $bgHighlight : #06064b
39 $colDefault : #8e8eb4
40 $colDefault : #8e8eb4
40 $colHighlight : #ffffff
41 $colHighlight : #ffffff
41 $dropDown : false
42 $dropDown : false
42 .navbar-default
43 .navbar-default
43 background-color: $bgDefault
44 background-color: $bgDefault
44 border-color: $bgHighlight
45 border-color: $bgHighlight
45 .navbar-brand
46 .navbar-brand
46 color: $colDefault
47 color: $colDefault
@@ -96,24 +97,26
96 > li > a
97 > li > a
97 color: $colDefault
98 color: $colDefault
98 &:hover, &:focus
99 &:hover, &:focus
99 color: $colHighlight
100 color: $colHighlight
100 > .active
101 > .active
101 > a, > a:hover, > a:focus
102 > a, > a:hover, > a:focus
102 color: $colHighlight
103 color: $colHighlight
103 background-color: $bgHighlight
104 background-color: $bgHighlight
104
105
105 .secondnavbar
106 .secondnavbar
106 top: 50px
107 top: 50px
107
108
109 +
110 + // --------------- bootstrap file upload ----------------------
108 .btn-file
111 .btn-file
109 position: relative
112 position: relative
110 overflow: hidden
113 overflow: hidden
111
114
112 .btn-file input[type=file]
115 .btn-file input[type=file]
113 position: absolute
116 position: absolute
114 top: 0
117 top: 0
115 right: 0
118 right: 0
116 min-width: 100%
119 min-width: 100%
117 min-height: 100%
120 min-height: 100%
118 font-size: 100px
121 font-size: 100px
119 text-align: right
122 text-align: right
@@ -121,26 +124,36
121 opacity: 0
124 opacity: 0
122 outline: none
125 outline: none
123 background: white
126 background: white
124 cursor: inherit
127 cursor: inherit
125 display: block
128 display: block
126
129
127 body
130 body
128 background: white image-url("topbg.jpg") repeat-x top center
131 background: white image-url("topbg.jpg") repeat-x top center
129 //font-size: 13px
132 //font-size: 13px
130 //font-family: Tahoma, "sans-serif"
133 //font-family: Tahoma, "sans-serif"
131 margin: 10px
134 margin: 10px
132 padding: 10px
135 padding: 10px
133 - padding-top: 40px
136 + padding-top: 60px
134
137
138 + // ------------------ bootstrap sortable --------------------
139 + table.sortable th
140 + padding-right: 20px !important
141 + span.sign
142 + right: -15px !important
143 + &.text-right
144 + padding-left: 20px !important
145 + padding-right: 8px !important
146 + &:after, span.sign
147 + left: -15px !important
135
148
136 input
149 input
137 font-family: Tahoma, "sans-serif"
150 font-family: Tahoma, "sans-serif"
138
151
139
152
140 h1
153 h1
141 font-size: 24px
154 font-size: 24px
142 color: #334488
155 color: #334488
143 line-height: 2em
156 line-height: 2em
144
157
145
158
146 h2
159 h2
@@ -3,24 +3,54
3 before_filter :admin_authorization, only: [:login_stat,:submission_stat, :stuck, :cheat_report, :cheat_scruntinize]
3 before_filter :admin_authorization, only: [:login_stat,:submission_stat, :stuck, :cheat_report, :cheat_scruntinize]
4
4
5 before_filter(only: [:problem_hof]) { |c|
5 before_filter(only: [:problem_hof]) { |c|
6 return false unless authenticate
6 return false unless authenticate
7
7
8 if GraderConfiguration["right.user_view_submission"]
8 if GraderConfiguration["right.user_view_submission"]
9 return true;
9 return true;
10 end
10 end
11
11
12 admin_authorization
12 admin_authorization
13 }
13 }
14
14
15 + def score
16 + if params[:commit] == 'download csv'
17 + @problems = Problem.all
18 + else
19 + @problems = Problem.find_available_problems
20 + end
21 + @users = User.includes(:contests, :contest_stat).where(enabled: true) #find(:all, :include => [:contests, :contest_stat]).where(enabled: true)
22 + @scorearray = Array.new
23 + @users.each do |u|
24 + ustat = Array.new
25 + ustat[0] = u
26 + @problems.each do |p|
27 + sub = Submission.find_last_by_user_and_problem(u.id,p.id)
28 + if (sub!=nil) and (sub.points!=nil) and p and p.full_score
29 + ustat << [(sub.points.to_f*100/p.full_score).round, (sub.points>=p.full_score)]
30 + else
31 + ustat << [0,false]
32 + end
33 + end
34 + @scorearray << ustat
35 + end
36 + if params[:commit] == 'download csv' then
37 + csv = gen_csv_from_scorearray(@scorearray,@problems)
38 + send_data csv, filename: 'last_score.csv'
39 + else
40 + render template: 'user_admin/user_stat'
41 + end
42 +
43 + end
44 +
15 def login_stat
45 def login_stat
16 @logins = Array.new
46 @logins = Array.new
17
47
18 date_and_time = '%Y-%m-%d %H:%M'
48 date_and_time = '%Y-%m-%d %H:%M'
19 begin
49 begin
20 md = params[:since_datetime].match(/(\d+)-(\d+)-(\d+) (\d+):(\d+)/)
50 md = params[:since_datetime].match(/(\d+)-(\d+)-(\d+) (\d+):(\d+)/)
21 @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)
51 @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)
22 rescue
52 rescue
23 @since_time = DateTime.new(1000,1,1)
53 @since_time = DateTime.new(1000,1,1)
24 end
54 end
25 begin
55 begin
26 md = params[:until_datetime].match(/(\d+)-(\d+)-(\d+) (\d+):(\d+)/)
56 md = params[:until_datetime].match(/(\d+)-(\d+)-(\d+) (\d+):(\d+)/)
@@ -64,30 +94,25
64 @until_time = DateTime.new(3000,1,1)
94 @until_time = DateTime.new(3000,1,1)
65 end
95 end
66
96
67 @submissions = {}
97 @submissions = {}
68
98
69 User.find_each do |user|
99 User.find_each do |user|
70 @submissions[user.id] = { login: user.login, full_name: user.full_name, count: 0, sub: { } }
100 @submissions[user.id] = { login: user.login, full_name: user.full_name, count: 0, sub: { } }
71 end
101 end
72
102
73 Submission.where("submitted_at >= ? AND submitted_at <= ?",@since_time,@until_time).find_each do |s|
103 Submission.where("submitted_at >= ? AND submitted_at <= ?",@since_time,@until_time).find_each do |s|
74 if @submissions[s.user_id]
104 if @submissions[s.user_id]
75 if not @submissions[s.user_id][:sub].has_key?(s.problem_id)
105 if not @submissions[s.user_id][:sub].has_key?(s.problem_id)
76 - a = nil
106 + a = Problem.find_by_id(s.problem_id)
77 - begin
78 - a = Problem.find(s.problem_id)
79 - rescue
80 - a = nil
81 - end
82 @submissions[s.user_id][:sub][s.problem_id] =
107 @submissions[s.user_id][:sub][s.problem_id] =
83 { prob_name: (a ? a.full_name : '(NULL)'),
108 { prob_name: (a ? a.full_name : '(NULL)'),
84 sub_ids: [s.id] }
109 sub_ids: [s.id] }
85 else
110 else
86 @submissions[s.user_id][:sub][s.problem_id][:sub_ids] << s.id
111 @submissions[s.user_id][:sub][s.problem_id][:sub_ids] << s.id
87 end
112 end
88 @submissions[s.user_id][:count] += 1
113 @submissions[s.user_id][:count] += 1
89 end
114 end
90 end
115 end
91 end
116 end
92
117
93 def problem_hof
118 def problem_hof
@@ -1,59 +1,61
1 - - content_for :header do
1 + /- content_for :header do
2 - = javascript_include_tag 'local_jquery'
2 + / = javascript_include_tag 'local_jquery'
3 - = stylesheet_link_tag 'tablesorter-theme.cafe'
3 + / = stylesheet_link_tag 'tablesorter-theme.cafe'
4
4
5 %script{:type=>"text/javascript"}
5 %script{:type=>"text/javascript"}
6 $(function () {
6 $(function () {
7 $('#since_datetime').datetimepicker({ showButtonPanel: true, dateFormat: "yy-mm-dd", controlType: "slider"} );
7 $('#since_datetime').datetimepicker({ showButtonPanel: true, dateFormat: "yy-mm-dd", controlType: "slider"} );
8 $('#until_datetime').datetimepicker({ showButtonPanel: true, dateFormat: "yy-mm-dd", controlType: "slider"} );
8 $('#until_datetime').datetimepicker({ showButtonPanel: true, dateFormat: "yy-mm-dd", controlType: "slider"} );
9 - $('#my_table').tablesorter({widgets: ['zebra']});
9 + /$('#my_table').tablesorter({widgets: ['zebra']});
10 });
10 });
11
11
12 %h1 User grading results
12 %h1 User grading results
13 %h2= params[:action] == 'user_stat' ? "Show scores from latest submission" : "Show max scores in submission range"
13 %h2= params[:action] == 'user_stat' ? "Show scores from latest submission" : "Show max scores in submission range"
14
14
15
15
16 - if @problem and @problem.errors
16 - if @problem and @problem.errors
17 =error_messages_for 'problem'
17 =error_messages_for 'problem'
18
18
19 = render partial: 'submission_range'
19 = render partial: 'submission_range'
20
20
21 - if params[:action] == 'user_stat'
21 - if params[:action] == 'user_stat'
22 %h3 Latest score
22 %h3 Latest score
23 = link_to '[download csv with all problems]', controller: :user_admin, action: :user_stat, commit: 'download csv'
23 = link_to '[download csv with all problems]', controller: :user_admin, action: :user_stat, commit: 'download csv'
24 - else
24 - else
25 %h3 Max score
25 %h3 Max score
26 = link_to '[Show only latest submissions]', controller: :user_admin, action: :user_stat
26 = link_to '[Show only latest submissions]', controller: :user_admin, action: :user_stat
27 = link_to '[download csv with all problems]', controller: :user_admin, action: :user_stat_max, commit: 'download csv'
27 = link_to '[download csv with all problems]', controller: :user_admin, action: :user_stat_max, commit: 'download csv'
28
28
29 - %table.tablesorter-cafe#my_table
29 + %table.table.sortable.table-striped.table-bordered
30 %thead
30 %thead
31 %tr
31 %tr
32 - %th User
32 + %th Login
33 %th Name
33 %th Name
34 %th Activated?
34 %th Activated?
35 - %th Logged in
35 + %th Logged_in
36 %th Contest(s)
36 %th Contest(s)
37 %th Remark
37 %th Remark
38 - @problems.each do |p|
38 - @problems.each do |p|
39 - %th= p.name
39 + %th.text-right= p.name
40 - %th Total
40 + %th.text-right Total
41 - %th Passed
41 + %th.text-right Passed
42 %tbody
42 %tbody
43 - @scorearray.each do |sc|
43 - @scorearray.each do |sc|
44 - %tr{class: cycle('info-even','info-odd')}
44 + %tr
45 - total,num_passed = 0,0
45 - total,num_passed = 0,0
46 - sc.each_index do |i|
46 - sc.each_index do |i|
47 - if i == 0
47 - if i == 0
48 %td= link_to sc[i].login, controller: 'users', action: 'profile', id: sc[i]
48 %td= link_to sc[i].login, controller: 'users', action: 'profile', id: sc[i]
49 %td= sc[i].full_name
49 %td= sc[i].full_name
50 %td= sc[i].activated
50 %td= sc[i].activated
51 %td= sc[i].try(:contest_stat).try(:started_at)!=nil ? 'yes' : 'no'
51 %td= sc[i].try(:contest_stat).try(:started_at)!=nil ? 'yes' : 'no'
52 %td= sc[i].contests.collect {|c| c.name}.join(', ')
52 %td= sc[i].contests.collect {|c| c.name}.join(', ')
53 %td= sc[i].remark
53 %td= sc[i].remark
54 - else
54 - else
55 - %td= sc[i][0]
55 + %td.text-right= sc[i][0]
56 - total += sc[i][0]
56 - total += sc[i][0]
57 - num_passed += 1 if sc[i][1]
57 - num_passed += 1 if sc[i][1]
58 - %td= total
58 + %td.text-right= total
59 - %td= num_passed
59 + %td.text-right= num_passed
60 + :javascript
61 + $.bootstrapSortable(true,'reversed')
You need to be logged in to leave comments. Login now