Description:
add jquery to manage problem, now we can select a range of problem
Commit status:
[Not Reviewed]
References:
Diff options:
Comments:
0 Commit comments
0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
r456:2cbe975cbc59 - - 9 files changed: 65 inserted, 61 deleted
file renamed from app/assets/javascripts/new.js to app/assets/javascripts/local_jquery.js |
@@ -119,130 +119,142 | |||||
|
119 | end |
|
119 | end |
|
120 | end |
|
120 | end |
|
121 |
|
121 | ||
|
122 | def destroy |
|
122 | def destroy |
|
123 | Problem.find(params[:id]).destroy |
|
123 | Problem.find(params[:id]).destroy |
|
124 | redirect_to :action => 'list' |
|
124 | redirect_to :action => 'list' |
|
125 | end |
|
125 | end |
|
126 |
|
126 | ||
|
127 | def toggle |
|
127 | def toggle |
|
128 | @problem = Problem.find(params[:id]) |
|
128 | @problem = Problem.find(params[:id]) |
|
129 | @problem.available = !(@problem.available) |
|
129 | @problem.available = !(@problem.available) |
|
130 | @problem.save |
|
130 | @problem.save |
|
131 | end |
|
131 | end |
|
132 |
|
132 | ||
|
133 | def turn_all_off |
|
133 | def turn_all_off |
|
134 | Problem.find(:all, |
|
134 | Problem.find(:all, |
|
135 | :conditions => "available = 1").each do |problem| |
|
135 | :conditions => "available = 1").each do |problem| |
|
136 | problem.available = false |
|
136 | problem.available = false |
|
137 | problem.save |
|
137 | problem.save |
|
138 | end |
|
138 | end |
|
139 | redirect_to :action => 'list' |
|
139 | redirect_to :action => 'list' |
|
140 | end |
|
140 | end |
|
141 |
|
141 | ||
|
142 | def turn_all_on |
|
142 | def turn_all_on |
|
143 | Problem.find(:all, |
|
143 | Problem.find(:all, |
|
144 | :conditions => "available = 0").each do |problem| |
|
144 | :conditions => "available = 0").each do |problem| |
|
145 | problem.available = true |
|
145 | problem.available = true |
|
146 | problem.save |
|
146 | problem.save |
|
147 | end |
|
147 | end |
|
148 | redirect_to :action => 'list' |
|
148 | redirect_to :action => 'list' |
|
149 | end |
|
149 | end |
|
150 |
|
150 | ||
|
151 | def stat |
|
151 | def stat |
|
152 | @problem = Problem.find(params[:id]) |
|
152 | @problem = Problem.find(params[:id]) |
|
153 | if !@problem.available |
|
153 | if !@problem.available |
|
154 | redirect_to :controller => 'main', :action => 'list' |
|
154 | redirect_to :controller => 'main', :action => 'list' |
|
155 | else |
|
155 | else |
|
156 | @submissions = Submission.includes(:user).where(problem_id: params[:id]).order(:user_id,:id) |
|
156 | @submissions = Submission.includes(:user).where(problem_id: params[:id]).order(:user_id,:id) |
|
157 | end |
|
157 | end |
|
158 | end |
|
158 | end |
|
159 |
|
159 | ||
|
160 | def manage |
|
160 | def manage |
|
161 | @problems = Problem.find(:all, :order => 'date_added DESC') |
|
161 | @problems = Problem.find(:all, :order => 'date_added DESC') |
|
162 | end |
|
162 | end |
|
163 |
|
163 | ||
|
164 | def do_manage |
|
164 | def do_manage |
|
165 | if params.has_key? 'change_date_added' |
|
165 | if params.has_key? 'change_date_added' |
|
166 | change_date_added |
|
166 | change_date_added |
|
167 |
- els |
|
167 | + elsif params.has_key? 'add_to_contest' |
|
168 | add_to_contest |
|
168 | add_to_contest |
|
|
169 | + elsif params.has_key? 'enable_problem' | ||
|
|
170 | + set_available(true) | ||
|
|
171 | + elsif params.has_key? 'disable_problem' | ||
|
|
172 | + set_available(false) | ||
|
169 | end |
|
173 | end |
|
170 | redirect_to :action => 'manage' |
|
174 | redirect_to :action => 'manage' |
|
171 | end |
|
175 | end |
|
172 |
|
176 | ||
|
173 | def import |
|
177 | def import |
|
174 | @allow_test_pair_import = allow_test_pair_import? |
|
178 | @allow_test_pair_import = allow_test_pair_import? |
|
175 | end |
|
179 | end |
|
176 |
|
180 | ||
|
177 | def do_import |
|
181 | def do_import |
|
178 | old_problem = Problem.find_by_name(params[:name]) |
|
182 | old_problem = Problem.find_by_name(params[:name]) |
|
179 | if !allow_test_pair_import? and params.has_key? :import_to_db |
|
183 | if !allow_test_pair_import? and params.has_key? :import_to_db |
|
180 | params.delete :import_to_db |
|
184 | params.delete :import_to_db |
|
181 | end |
|
185 | end |
|
182 | @problem, import_log = Problem.create_from_import_form_params(params, |
|
186 | @problem, import_log = Problem.create_from_import_form_params(params, |
|
183 | old_problem) |
|
187 | old_problem) |
|
184 |
|
188 | ||
|
185 | if !@problem.errors.empty? |
|
189 | if !@problem.errors.empty? |
|
186 | render :action => 'import' and return |
|
190 | render :action => 'import' and return |
|
187 | end |
|
191 | end |
|
188 |
|
192 | ||
|
189 | if old_problem!=nil |
|
193 | if old_problem!=nil |
|
190 | flash[:notice] = "The test data has been replaced for problem #{@problem.name}" |
|
194 | flash[:notice] = "The test data has been replaced for problem #{@problem.name}" |
|
191 | end |
|
195 | end |
|
192 | @log = import_log |
|
196 | @log = import_log |
|
193 | end |
|
197 | end |
|
194 |
|
198 | ||
|
195 | def remove_contest |
|
199 | def remove_contest |
|
196 | problem = Problem.find(params[:id]) |
|
200 | problem = Problem.find(params[:id]) |
|
197 | contest = Contest.find(params[:contest_id]) |
|
201 | contest = Contest.find(params[:contest_id]) |
|
198 | if problem!=nil and contest!=nil |
|
202 | if problem!=nil and contest!=nil |
|
199 | problem.contests.delete(contest) |
|
203 | problem.contests.delete(contest) |
|
200 | end |
|
204 | end |
|
201 | redirect_to :action => 'manage' |
|
205 | redirect_to :action => 'manage' |
|
202 | end |
|
206 | end |
|
203 |
|
207 | ||
|
204 | ################################## |
|
208 | ################################## |
|
205 | protected |
|
209 | protected |
|
206 |
|
210 | ||
|
207 | def allow_test_pair_import? |
|
211 | def allow_test_pair_import? |
|
208 | if defined? ALLOW_TEST_PAIR_IMPORT |
|
212 | if defined? ALLOW_TEST_PAIR_IMPORT |
|
209 | return ALLOW_TEST_PAIR_IMPORT |
|
213 | return ALLOW_TEST_PAIR_IMPORT |
|
210 | else |
|
214 | else |
|
211 | return false |
|
215 | return false |
|
212 | end |
|
216 | end |
|
213 | end |
|
217 | end |
|
214 |
|
218 | ||
|
215 | def change_date_added |
|
219 | def change_date_added |
|
216 | problems = get_problems_from_params |
|
220 | problems = get_problems_from_params |
|
217 | year = params[:date_added][:year].to_i |
|
221 | year = params[:date_added][:year].to_i |
|
218 | month = params[:date_added][:month].to_i |
|
222 | month = params[:date_added][:month].to_i |
|
219 | day = params[:date_added][:day].to_i |
|
223 | day = params[:date_added][:day].to_i |
|
220 | date = Date.new(year,month,day) |
|
224 | date = Date.new(year,month,day) |
|
221 | problems.each do |p| |
|
225 | problems.each do |p| |
|
222 | p.date_added = date |
|
226 | p.date_added = date |
|
223 | p.save |
|
227 | p.save |
|
224 | end |
|
228 | end |
|
225 | end |
|
229 | end |
|
226 |
|
230 | ||
|
227 | def add_to_contest |
|
231 | def add_to_contest |
|
228 | problems = get_problems_from_params |
|
232 | problems = get_problems_from_params |
|
229 | contest = Contest.find(params[:contest][:id]) |
|
233 | contest = Contest.find(params[:contest][:id]) |
|
230 | if contest!=nil and contest.enabled |
|
234 | if contest!=nil and contest.enabled |
|
231 | problems.each do |p| |
|
235 | problems.each do |p| |
|
232 | p.contests << contest |
|
236 | p.contests << contest |
|
233 | end |
|
237 | end |
|
234 | end |
|
238 | end |
|
235 | end |
|
239 | end |
|
236 |
|
240 | ||
|
|
241 | + def set_available(avail) | ||
|
|
242 | + problems = get_problems_from_params | ||
|
|
243 | + problems.each do |p| | ||
|
|
244 | + p.available = avail | ||
|
|
245 | + p.save | ||
|
|
246 | + end | ||
|
|
247 | + end | ||
|
|
248 | + | ||
|
237 | def get_problems_from_params |
|
249 | def get_problems_from_params |
|
238 | problems = [] |
|
250 | problems = [] |
|
239 | params.keys.each do |k| |
|
251 | params.keys.each do |k| |
|
240 | if k.index('prob-')==0 |
|
252 | if k.index('prob-')==0 |
|
241 | - name, id = k.split('-') |
|
253 | + name, id, order = k.split('-') |
|
242 | problems << Problem.find(id) |
|
254 | problems << Problem.find(id) |
|
243 | end |
|
255 | end |
|
244 | end |
|
256 | end |
|
245 | problems |
|
257 | problems |
|
246 | end |
|
258 | end |
|
247 |
|
259 | ||
|
248 | end |
|
260 | end |
@@ -1,43 +1,85 | |||||
|
1 | - content_for :head do |
|
1 | - content_for :head do |
|
2 | = stylesheet_link_tag 'problems' |
|
2 | = stylesheet_link_tag 'problems' |
|
|
3 | + = javascript_include_tag 'local_jquery' | ||
|
|
4 | + | ||
|
|
5 | + :javascript | ||
|
|
6 | + $(document).ready( function() { | ||
|
|
7 | + function shiftclick(start,stop,value) { | ||
|
|
8 | + $('tr input').each( function(id,input) { | ||
|
|
9 | + var $input=$(input); | ||
|
|
10 | + var iid=parseInt($input.attr('id').split('-')[2]); | ||
|
|
11 | + if(iid>=start&&iid<=stop){ | ||
|
|
12 | + $input.prop('checked',value) | ||
|
|
13 | + } | ||
|
|
14 | + }); | ||
|
|
15 | + } | ||
|
|
16 | + | ||
|
|
17 | + $('tr input').click( function(e) { | ||
|
|
18 | + if (e.shiftKey) { | ||
|
|
19 | + stop = parseInt($(this).attr('id').split('-')[2]); | ||
|
|
20 | + var orig_stop = stop | ||
|
|
21 | + if (typeof start !== 'undefined') { | ||
|
|
22 | + if (start > stop) { | ||
|
|
23 | + var tmp = start; | ||
|
|
24 | + start = stop; | ||
|
|
25 | + stop = tmp; | ||
|
|
26 | + } | ||
|
|
27 | + shiftclick(start,stop,$(this).is(':checked') ) | ||
|
|
28 | + } | ||
|
|
29 | + start = orig_stop | ||
|
|
30 | + } else { | ||
|
|
31 | + start = parseInt($(this).attr('id').split('-')[2]); | ||
|
|
32 | + } | ||
|
|
33 | + }); | ||
|
|
34 | + }); | ||
|
|
35 | + | ||
|
3 |
|
36 | ||
|
4 | %h1 Manage problems |
|
37 | %h1 Manage problems |
|
5 |
|
38 | ||
|
6 | %p= link_to '[Back to problem list]', :action => 'list' |
|
39 | %p= link_to '[Back to problem list]', :action => 'list' |
|
7 |
|
40 | ||
|
8 | = form_tag :action=>'do_manage' do |
|
41 | = form_tag :action=>'do_manage' do |
|
9 | .submitbox |
|
42 | .submitbox |
|
10 | - What do you want to do? |
|
43 | + What do you want to do to the selected problem? |
|
11 | %br/ |
|
44 | %br/ |
|
|
45 | + (You can shift-click to select a range of problems) | ||
|
12 | %ul |
|
46 | %ul |
|
13 | %li |
|
47 | %li |
|
14 | Change date added to |
|
48 | Change date added to |
|
15 | = select_date Date.current, :prefix => 'date_added' |
|
49 | = select_date Date.current, :prefix => 'date_added' |
|
16 | |
|
50 | |
|
17 | = submit_tag 'Change', :name => 'change_date_added' |
|
51 | = submit_tag 'Change', :name => 'change_date_added' |
|
|
52 | + %li | ||
|
|
53 | + Set available to | ||
|
|
54 | + = submit_tag 'True', :name => 'enable_problem' | ||
|
|
55 | + = submit_tag 'False', :name => 'disable_problem' | ||
|
18 |
|
56 | ||
|
19 | - if GraderConfiguration.multicontests? |
|
57 | - if GraderConfiguration.multicontests? |
|
20 | %li |
|
58 | %li |
|
21 | Add to |
|
59 | Add to |
|
22 | = select("contest","id",Contest.all.collect {|c| [c.title, c.id]}) |
|
60 | = select("contest","id",Contest.all.collect {|c| [c.title, c.id]}) |
|
23 | = submit_tag 'Add', :name => 'add_to_contest' |
|
61 | = submit_tag 'Add', :name => 'add_to_contest' |
|
24 |
|
62 | ||
|
25 | %table |
|
63 | %table |
|
26 | - %tr |
|
64 | + %tr{style: "text-align: left;"} |
|
27 | - %th/ |
|
65 | + %th= check_box_tag 'select_all' |
|
28 | %th Name |
|
66 | %th Name |
|
29 | %th Full name |
|
67 | %th Full name |
|
|
68 | + %th Available | ||
|
30 | %th Date added |
|
69 | %th Date added |
|
31 | - if GraderConfiguration.multicontests? |
|
70 | - if GraderConfiguration.multicontests? |
|
32 | %th Contests |
|
71 | %th Contests |
|
33 |
|
72 | ||
|
|
73 | + - num = 0 | ||
|
34 | - for problem in @problems |
|
74 | - for problem in @problems |
|
|
75 | + - num += 1 | ||
|
35 | %tr{:id => "row-prob-#{problem.id}", :name=> "prob-#{problem.id}"} |
|
76 | %tr{:id => "row-prob-#{problem.id}", :name=> "prob-#{problem.id}"} |
|
36 | - %td= check_box_tag "prob-#{problem.id}" |
|
77 | + %td= check_box_tag "prob-#{problem.id}-#{num}" |
|
37 | %td= problem.name |
|
78 | %td= problem.name |
|
38 | %td= problem.full_name |
|
79 | %td= problem.full_name |
|
|
80 | + %td= problem.available | ||
|
39 | %td= problem.date_added |
|
81 | %td= problem.date_added |
|
40 | - if GraderConfiguration.multicontests? |
|
82 | - if GraderConfiguration.multicontests? |
|
41 | %td |
|
83 | %td |
|
42 | - problem.contests.each do |contest| |
|
84 | - problem.contests.each do |contest| |
|
43 | = "(#{contest.name} [#{link_to 'x', :action => 'remove_contest', :id => problem.id, :contest_id => contest.id }])" |
|
85 | = "(#{contest.name} [#{link_to 'x', :action => 'remove_contest', :id => problem.id, :contest_id => contest.id }])" |
@@ -1,36 +1,36 | |||||
|
1 | - content_for :header do |
|
1 | - content_for :header do |
|
2 | = stylesheet_link_tag 'tablesorter-theme.cafe' |
|
2 | = stylesheet_link_tag 'tablesorter-theme.cafe' |
|
3 |
- = javascript_include_tag ' |
|
3 | + = javascript_include_tag 'local_jquery' |
|
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({widthFixed: true, widgets: ['zebra']}); |
|
9 | $('#my_table').tablesorter({widthFixed: true, widgets: ['zebra']}); |
|
10 | }); |
|
10 | }); |
|
11 |
|
11 | ||
|
12 | %h1 Login status |
|
12 | %h1 Login status |
|
13 |
|
13 | ||
|
14 | =render partial: 'report_menu' |
|
14 | =render partial: 'report_menu' |
|
15 | =render partial: 'date_range', locals: {param_text: 'Login date range:', title: 'Query login stat in the range' } |
|
15 | =render partial: 'date_range', locals: {param_text: 'Login date range:', title: 'Query login stat in the range' } |
|
16 |
|
16 | ||
|
17 | %table.tablesorter-cafe#my_table |
|
17 | %table.tablesorter-cafe#my_table |
|
18 | %thead |
|
18 | %thead |
|
19 | %tr |
|
19 | %tr |
|
20 | %th login |
|
20 | %th login |
|
21 | %th full name |
|
21 | %th full name |
|
22 | %th login count |
|
22 | %th login count |
|
23 | %th earliest |
|
23 | %th earliest |
|
24 | %th latest |
|
24 | %th latest |
|
25 | %th IP |
|
25 | %th IP |
|
26 | %tbody |
|
26 | %tbody |
|
27 | - @logins.each do |l| |
|
27 | - @logins.each do |l| |
|
28 | %tr{class: cycle('info-even','info-odd')} |
|
28 | %tr{class: cycle('info-even','info-odd')} |
|
29 | %td= link_to l[:login], controller: 'users', action: 'profile', id: l[:id] |
|
29 | %td= link_to l[:login], controller: 'users', action: 'profile', id: l[:id] |
|
30 | %td= l[:full_name] |
|
30 | %td= l[:full_name] |
|
31 | %td= l[:count] |
|
31 | %td= l[:count] |
|
32 | %td= l[:min] ? l[:min].in_time_zone.strftime('%Y-%m-%d %H:%M') : '' |
|
32 | %td= l[:min] ? l[:min].in_time_zone.strftime('%Y-%m-%d %H:%M') : '' |
|
33 | %td= l[:max] ? "#{l[:max].in_time_zone.strftime('%Y-%m-%d %H:%M.%S')} (#{time_ago_in_words(l[:max].in_time_zone)} ago)" : '' |
|
33 | %td= l[:max] ? "#{l[:max].in_time_zone.strftime('%Y-%m-%d %H:%M.%S')} (#{time_ago_in_words(l[:max].in_time_zone)} ago)" : '' |
|
34 | %td |
|
34 | %td |
|
35 | - l[:ip].each do |ip| |
|
35 | - l[:ip].each do |ip| |
|
36 | #{ip.ip_address} <br/> |
|
36 | #{ip.ip_address} <br/> |
@@ -1,37 +1,37 | |||||
|
1 | - content_for :header do |
|
1 | - content_for :header do |
|
2 |
- = javascript_include_tag ' |
|
2 | + = javascript_include_tag 'local_jquery' |
|
3 |
|
3 | ||
|
4 | %script{:type=>"text/javascript"} |
|
4 | %script{:type=>"text/javascript"} |
|
5 | $(function () { |
|
5 | $(function () { |
|
6 | $('#since_datetime').datetimepicker({ showButtonPanel: true, dateFormat: "yy-mm-dd", controlType: "slider"} ); |
|
6 | $('#since_datetime').datetimepicker({ showButtonPanel: true, dateFormat: "yy-mm-dd", controlType: "slider"} ); |
|
7 | $('#until_datetime').datetimepicker({ showButtonPanel: true, dateFormat: "yy-mm-dd", controlType: "slider"} ); |
|
7 | $('#until_datetime').datetimepicker({ showButtonPanel: true, dateFormat: "yy-mm-dd", controlType: "slider"} ); |
|
8 | }); |
|
8 | }); |
|
9 |
|
9 | ||
|
10 | %h1 Login status |
|
10 | %h1 Login status |
|
11 |
|
11 | ||
|
12 | =render partial: 'report_menu' |
|
12 | =render partial: 'report_menu' |
|
13 | =render partial: 'date_range', locals: {param_text: 'Submission date range:', title: 'Query submission stat in the range' } |
|
13 | =render partial: 'date_range', locals: {param_text: 'Submission date range:', title: 'Query submission stat in the range' } |
|
14 |
|
14 | ||
|
15 | %table.info |
|
15 | %table.info |
|
16 | %thead |
|
16 | %thead |
|
17 | %tr.info-head |
|
17 | %tr.info-head |
|
18 | %th login |
|
18 | %th login |
|
19 | %th full name |
|
19 | %th full name |
|
20 | %th total submissions |
|
20 | %th total submissions |
|
21 | %th submissions |
|
21 | %th submissions |
|
22 | %tbody |
|
22 | %tbody |
|
23 | - @submissions.each do |user_id,data| |
|
23 | - @submissions.each do |user_id,data| |
|
24 | %tr{class: cycle('info-even','info-odd')} |
|
24 | %tr{class: cycle('info-even','info-odd')} |
|
25 | %td= data[:login] |
|
25 | %td= data[:login] |
|
26 | %td= data[:full_name] |
|
26 | %td= data[:full_name] |
|
27 | %td= data[:count] |
|
27 | %td= data[:count] |
|
28 | %td |
|
28 | %td |
|
29 | - data[:sub].each do |prob_id,sub_data| |
|
29 | - data[:sub].each do |prob_id,sub_data| |
|
30 | = "#{sub_data[:prob_name]}: [" |
|
30 | = "#{sub_data[:prob_name]}: [" |
|
31 | - st = [] |
|
31 | - st = [] |
|
32 | - sub_data[:sub_ids].each do |id| |
|
32 | - sub_data[:sub_ids].each do |id| |
|
33 | - st << link_to(id, controller: 'graders' , action: 'submission', id: id) |
|
33 | - st << link_to(id, controller: 'graders' , action: 'submission', id: id) |
|
34 | = raw st.join ', ' |
|
34 | = raw st.join ', ' |
|
35 | = ']' |
|
35 | = ']' |
|
36 | %br/ |
|
36 | %br/ |
|
37 |
|
37 |
@@ -1,50 +1,50 | |||||
|
1 | - content_for :header do |
|
1 | - content_for :header do |
|
2 |
- = javascript_include_tag ' |
|
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.tablesorter-cafe#my_table |
|
30 | %thead |
|
30 | %thead |
|
31 | %tr |
|
31 | %tr |
|
32 | %th User |
|
32 | %th User |
|
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 | - @problems.each do |p| |
|
37 | - @problems.each do |p| |
|
38 | %th= p.name |
|
38 | %th= p.name |
|
39 | %th Total |
|
39 | %th Total |
|
40 | %th Passed |
|
40 | %th Passed |
|
41 | %tbody |
|
41 | %tbody |
|
42 | - @scorearray.each do |sc| |
|
42 | - @scorearray.each do |sc| |
|
43 | %tr{class: cycle('info-even','info-odd')} |
|
43 | %tr{class: cycle('info-even','info-odd')} |
|
44 | - total,num_passed = 0,0 |
|
44 | - total,num_passed = 0,0 |
|
45 | - sc.each_index do |i| |
|
45 | - sc.each_index do |i| |
|
46 | - if i == 0 |
|
46 | - if i == 0 |
|
47 | %td= link_to sc[i].login, controller: 'users', action: 'profile', id: sc[i] |
|
47 | %td= link_to sc[i].login, controller: 'users', action: 'profile', id: sc[i] |
|
48 | %td= sc[i].full_name |
|
48 | %td= sc[i].full_name |
|
49 | %td= sc[i].activated |
|
49 | %td= sc[i].activated |
|
50 | %td= sc[i].try(:contest_stat).try(:started_at)!=nil ? 'yes' : 'no' |
|
50 | %td= sc[i].try(:contest_stat).try(:started_at)!=nil ? 'yes' : 'no' |
@@ -1,50 +1,50 | |||||
|
1 | - content_for :header do |
|
1 | - content_for :header do |
|
2 |
- = javascript_include_tag ' |
|
2 | + = javascript_include_tag 'local_jquery' |
|
3 |
|
3 | ||
|
4 | %script{:type=>"text/javascript"} |
|
4 | %script{:type=>"text/javascript"} |
|
5 | $(function () { |
|
5 | $(function () { |
|
6 | $('#submission_table').tablesorter({widgets: ['zebra']}); |
|
6 | $('#submission_table').tablesorter({widgets: ['zebra']}); |
|
7 | }); |
|
7 | }); |
|
8 |
|
8 | ||
|
9 | :css |
|
9 | :css |
|
10 | .fix-width { |
|
10 | .fix-width { |
|
11 | font-family: Droid Sans Mono,Consolas, monospace, mono, Courier New, Courier; |
|
11 | font-family: Droid Sans Mono,Consolas, monospace, mono, Courier New, Courier; |
|
12 | } |
|
12 | } |
|
13 |
|
13 | ||
|
14 | %h1= @user.full_name + ' Profile' |
|
14 | %h1= @user.full_name + ' Profile' |
|
15 |
|
15 | ||
|
16 | %h2 Basic info |
|
16 | %h2 Basic info |
|
17 | <b>Login:</b> #{@user.login} <br/> |
|
17 | <b>Login:</b> #{@user.login} <br/> |
|
18 | <b>Full name:</b> #{@user.full_name} <br /> |
|
18 | <b>Full name:</b> #{@user.full_name} <br /> |
|
19 |
|
19 | ||
|
20 |
|
20 | ||
|
21 | %h2 Problem Stat |
|
21 | %h2 Problem Stat |
|
22 |
|
22 | ||
|
23 | %h2 Submissions |
|
23 | %h2 Submissions |
|
24 |
|
24 | ||
|
25 | %table.tablesorter-cafe#submission_table |
|
25 | %table.tablesorter-cafe#submission_table |
|
26 | %thead |
|
26 | %thead |
|
27 | %tr |
|
27 | %tr |
|
28 | %th ID |
|
28 | %th ID |
|
29 | %th Problem code |
|
29 | %th Problem code |
|
30 | %th Problem full name |
|
30 | %th Problem full name |
|
31 | %th Language |
|
31 | %th Language |
|
32 | %th Submitted at |
|
32 | %th Submitted at |
|
33 | %th Result |
|
33 | %th Result |
|
34 | %th Score |
|
34 | %th Score |
|
35 | - if session[:admin] |
|
35 | - if session[:admin] |
|
36 | %th IP |
|
36 | %th IP |
|
37 | %tbody |
|
37 | %tbody |
|
38 | - @submission.each do |s| |
|
38 | - @submission.each do |s| |
|
39 | - next unless s.problem |
|
39 | - next unless s.problem |
|
40 | %tr |
|
40 | %tr |
|
41 | %td= link_to "#{s.id}", controller: "graders", action: "submission", id: s.id |
|
41 | %td= link_to "#{s.id}", controller: "graders", action: "submission", id: s.id |
|
42 | %td= s.problem.name |
|
42 | %td= s.problem.name |
|
43 | %td= s.problem.full_name |
|
43 | %td= s.problem.full_name |
|
44 | %td= s.language.pretty_name |
|
44 | %td= s.language.pretty_name |
|
45 | %td #{s.submitted_at.strftime('%Y-%m-%d %H:%M')} (#{time_ago_in_words(s.submitted_at)} ago) |
|
45 | %td #{s.submitted_at.strftime('%Y-%m-%d %H:%M')} (#{time_ago_in_words(s.submitted_at)} ago) |
|
46 | %td.fix-width= s.grader_comment |
|
46 | %td.fix-width= s.grader_comment |
|
47 | %td= (s.points*100)/s.problem.full_score |
|
47 | %td= (s.points*100)/s.problem.full_score |
|
48 | - if session[:admin] |
|
48 | - if session[:admin] |
|
49 | %td= s.ip_address |
|
49 | %td= s.ip_address |
|
50 |
|
50 |
@@ -15,51 +15,51 | |||||
|
15 | # Application configuration should go into files in config/initializers |
|
15 | # Application configuration should go into files in config/initializers |
|
16 | # -- all .rb files in that directory are automatically loaded. |
|
16 | # -- all .rb files in that directory are automatically loaded. |
|
17 |
|
17 | ||
|
18 | # Custom directories with classes and modules you want to be autoloadable. |
|
18 | # Custom directories with classes and modules you want to be autoloadable. |
|
19 | config.autoload_paths += %W(#{config.root}/lib) |
|
19 | config.autoload_paths += %W(#{config.root}/lib) |
|
20 |
|
20 | ||
|
21 | # Only load the plugins named here, in the order given (default is alphabetical). |
|
21 | # Only load the plugins named here, in the order given (default is alphabetical). |
|
22 | # :all can be used as a placeholder for all plugins not explicitly named. |
|
22 | # :all can be used as a placeholder for all plugins not explicitly named. |
|
23 | # config.plugins = [ :exception_notification, :ssl_requirement, :all ] |
|
23 | # config.plugins = [ :exception_notification, :ssl_requirement, :all ] |
|
24 |
|
24 | ||
|
25 | # Activate observers that should always be running. |
|
25 | # Activate observers that should always be running. |
|
26 | # config.active_record.observers = :cacher, :garbage_collector, :forum_observer |
|
26 | # config.active_record.observers = :cacher, :garbage_collector, :forum_observer |
|
27 |
|
27 | ||
|
28 | # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. |
|
28 | # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. |
|
29 | # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. |
|
29 | # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. |
|
30 | config.time_zone = 'UTC' |
|
30 | config.time_zone = 'UTC' |
|
31 |
|
31 | ||
|
32 | # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. |
|
32 | # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. |
|
33 | # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] |
|
33 | # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] |
|
34 | config.i18n.default_locale = :en |
|
34 | config.i18n.default_locale = :en |
|
35 |
|
35 | ||
|
36 | # Configure the default encoding used in templates for Ruby 1.9. |
|
36 | # Configure the default encoding used in templates for Ruby 1.9. |
|
37 | config.encoding = "utf-8" |
|
37 | config.encoding = "utf-8" |
|
38 |
|
38 | ||
|
39 | # Configure sensitive parameters which will be filtered from the log file. |
|
39 | # Configure sensitive parameters which will be filtered from the log file. |
|
40 | config.filter_parameters += [:password] |
|
40 | config.filter_parameters += [:password] |
|
41 |
|
41 | ||
|
42 | # Enable escaping HTML in JSON. |
|
42 | # Enable escaping HTML in JSON. |
|
43 | config.active_support.escape_html_entities_in_json = true |
|
43 | config.active_support.escape_html_entities_in_json = true |
|
44 |
|
44 | ||
|
45 | # Use SQL instead of Active Record's schema dumper when creating the database. |
|
45 | # Use SQL instead of Active Record's schema dumper when creating the database. |
|
46 | # This is necessary if your schema can't be completely dumped by the schema dumper, |
|
46 | # This is necessary if your schema can't be completely dumped by the schema dumper, |
|
47 | # like if you have constraints or database-specific column types |
|
47 | # like if you have constraints or database-specific column types |
|
48 | # config.active_record.schema_format = :sql |
|
48 | # config.active_record.schema_format = :sql |
|
49 |
|
49 | ||
|
50 | # Enforce whitelist mode for mass assignment. |
|
50 | # Enforce whitelist mode for mass assignment. |
|
51 | # This will create an empty whitelist of attributes available for mass-assignment for all models |
|
51 | # This will create an empty whitelist of attributes available for mass-assignment for all models |
|
52 | # in your app. As such, your models will need to explicitly whitelist or blacklist accessible |
|
52 | # in your app. As such, your models will need to explicitly whitelist or blacklist accessible |
|
53 | # parameters by using an attr_accessible or attr_protected declaration. |
|
53 | # parameters by using an attr_accessible or attr_protected declaration. |
|
54 | config.active_record.whitelist_attributes = false |
|
54 | config.active_record.whitelist_attributes = false |
|
55 |
|
55 | ||
|
56 | # Enable the asset pipeline |
|
56 | # Enable the asset pipeline |
|
57 | config.assets.enabled = true |
|
57 | config.assets.enabled = true |
|
58 |
|
58 | ||
|
59 | # Version of your assets, change this if you want to expire all your assets |
|
59 | # Version of your assets, change this if you want to expire all your assets |
|
60 | config.assets.version = '1.0' |
|
60 | config.assets.version = '1.0' |
|
61 |
|
61 | ||
|
62 | config.assets.precompile += ['announcement_refresh.js','effects.js','site_update.js','graders.css','problems.css'] |
|
62 | config.assets.precompile += ['announcement_refresh.js','effects.js','site_update.js','graders.css','problems.css'] |
|
63 |
- config.assets.precompile += [' |
|
63 | + config.assets.precompile += ['local_jquery.js','tablesorter-theme.cafe.css'] |
|
64 | end |
|
64 | end |
|
65 | end |
|
65 | end |
deleted file |
You need to be logged in to leave comments.
Login now