Description:
update cheat scrutinize
Commit status:
[Not Reviewed]
References:
Diff options:
Comments:
0 Commit comments
0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
r793:8cbec24011e9 - - 4 files changed: 112 inserted, 87 deleted
@@ -0,0 +1,107 | |||||
|
|
1 | + - content_for :header do | ||
|
|
2 | + = stylesheet_link_tag 'tablesorter-theme.cafe' | ||
|
|
3 | + = javascript_include_tag 'local_jquery' | ||
|
|
4 | + | ||
|
|
5 | + %script{:type=>"text/javascript"} | ||
|
|
6 | + $(function () { | ||
|
|
7 | + $('#since_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']}); | ||
|
|
10 | + $('#my_table2').tablesorter({widthFixed: true, widgets: ['zebra']}); | ||
|
|
11 | + $('#sub_table').tablesorter({widthFixed: true, widgets: ['zebra']}); | ||
|
|
12 | + }); | ||
|
|
13 | + | ||
|
|
14 | + %h1 Login status | ||
|
|
15 | + | ||
|
|
16 | + .panel.panel-primary | ||
|
|
17 | + .panel-heading | ||
|
|
18 | + User ID and time rnage | ||
|
|
19 | + .panel-body | ||
|
|
20 | + = form_tag({session: :url }) do | ||
|
|
21 | + .row.form-group | ||
|
|
22 | + .col-md-2 | ||
|
|
23 | + From Date: | ||
|
|
24 | + .col-md-4 | ||
|
|
25 | + .input-group.date | ||
|
|
26 | + = text_field_tag :since_datetime, @since_time, class: 'form-control' | ||
|
|
27 | + %span.input-group-addon | ||
|
|
28 | + %span.glyphicon.glyphicon-calendar | ||
|
|
29 | + .row.form-group | ||
|
|
30 | + .col-md-2 | ||
|
|
31 | + Until Date: | ||
|
|
32 | + .col-md-4 | ||
|
|
33 | + .input-group.date | ||
|
|
34 | + = text_field_tag :until_datetime, @until_time, class: 'form-control' | ||
|
|
35 | + %span.input-group-addon | ||
|
|
36 | + %span.glyphicon.glyphicon-calendar | ||
|
|
37 | + .row.form-group | ||
|
|
38 | + .col-md-2 | ||
|
|
39 | + IDs (separated by space): | ||
|
|
40 | + .col-md-10 | ||
|
|
41 | + = text_field_tag 'SID', @sid, size: 40, class: 'form-control' | ||
|
|
42 | + .row.form-group | ||
|
|
43 | + .col-md-2 | ||
|
|
44 | + .col-md-10 | ||
|
|
45 | + =submit_tag 'query', class: 'btn btn-primary' | ||
|
|
46 | + | ||
|
|
47 | + -# | ||
|
|
48 | + %table | ||
|
|
49 | + %tr | ||
|
|
50 | + %td{style: 'width: 120px; font-weight: bold'}= 'Login date range' | ||
|
|
51 | + %td{align: 'right'} since: | ||
|
|
52 | + %td= text_field_tag 'since_datetime', @since_time, class: 'form-control datetimepicker' | ||
|
|
53 | + %tr | ||
|
|
54 | + %td | ||
|
|
55 | + %td{align: 'right'} until: | ||
|
|
56 | + %td= text_field_tag 'until_datetime', @until_time | ||
|
|
57 | + %tr | ||
|
|
58 | + %td | ||
|
|
59 | + %td | ||
|
|
60 | + %td Blank mean no condition | ||
|
|
61 | + %tr | ||
|
|
62 | + %td{style: 'width: 120px; font-weight: bold'}= "ID" | ||
|
|
63 | + %td{colspan: 2}= text_field_tag 'SID', @sid, size: 40 | ||
|
|
64 | + %tr | ||
|
|
65 | + %td | ||
|
|
66 | + %td | ||
|
|
67 | + %td= submit_tag 'query' | ||
|
|
68 | + | ||
|
|
69 | + | ||
|
|
70 | + %h2 Logs | ||
|
|
71 | + | ||
|
|
72 | + - if @sid | ||
|
|
73 | + %table | ||
|
|
74 | + %tbody | ||
|
|
75 | + - @sid.each do |id| | ||
|
|
76 | + - user = User.where("login = ?",id).first | ||
|
|
77 | + %tr | ||
|
|
78 | + //%td= link_to id, controller: :user, action: :profile, id: id | ||
|
|
79 | + %td= link_to id, "https://www.nattee.net/java/users/profile/#{user.id}" | ||
|
|
80 | + %td= user.full_name | ||
|
|
81 | + | ||
|
|
82 | + //%table.tablesorter-cafe#my_table | ||
|
|
83 | + %table.info | ||
|
|
84 | + %thead | ||
|
|
85 | + %tr.info-head | ||
|
|
86 | + %th Time | ||
|
|
87 | + %th Action | ||
|
|
88 | + %th IP | ||
|
|
89 | + %th login | ||
|
|
90 | + %th name | ||
|
|
91 | + %th problem | ||
|
|
92 | + %th score | ||
|
|
93 | + %tbody | ||
|
|
94 | + - if @logs | ||
|
|
95 | + - @logs.each do |l| | ||
|
|
96 | + %tr{class: cycle('info-even','info-odd')} | ||
|
|
97 | + %td= l[:submitted_at].strftime "%Y.%b.%d %H:%M:%S" | ||
|
|
98 | + //%td= l[:id] == -1 ? "LOGIN" : link_to("submit #{l[:id]}", controller: 'graders' , action: 'submission', id: l[:id]) | ||
|
|
99 | + %td= l[:id] == -1 ? "LOGIN" : link_to( "submit #{l[:id]}", "https://www.nattee.net/java/graders/submission/#{l[:id]}") | ||
|
|
100 | + %td= l[:ip_address] | ||
|
|
101 | + //%td= link_to l[:login], controller: 'users', action: 'profile', id: l[:id] | ||
|
|
102 | + %td= link_to( l[:login], "https://www.nattee.net/java/users/profile/#{l.user_id}") | ||
|
|
103 | + %td= l[:full_name] | ||
|
|
104 | + %td= l[:id] == -1 ? "" : l.problem.name | ||
|
|
105 | + %td= l[:id] == -1 ? "" : l.points * 100/ l.problem.full_score | ||
|
|
106 | + | ||
|
|
107 | + |
@@ -1,33 +1,33 | |||||
|
1 | require 'csv' |
|
1 | require 'csv' |
|
2 |
|
2 | ||
|
3 | class ReportController < ApplicationController |
|
3 | class ReportController < ApplicationController |
|
4 |
|
4 | ||
|
5 | before_action :check_valid_login |
|
5 | before_action :check_valid_login |
|
6 |
|
6 | ||
|
7 | before_action :admin_authorization, only: [:login_stat,:submission, :submission_query, |
|
7 | before_action :admin_authorization, only: [:login_stat,:submission, :submission_query, |
|
8 | :login, :login_detail_query, :login_summary_query, |
|
8 | :login, :login_detail_query, :login_summary_query, |
|
9 |
- :stuck, :cheat_report, :cheat_scru |
|
9 | + :stuck, :cheat_report, :cheat_scrutinize, :show_max_score, :current_score] |
|
10 |
|
10 | ||
|
11 | before_action(only: [:problem_hof]) { |c| |
|
11 | before_action(only: [:problem_hof]) { |c| |
|
12 | return false unless check_valid_login |
|
12 | return false unless check_valid_login |
|
13 |
|
13 | ||
|
14 | admin_authorization unless GraderConfiguration["right.user_view_submission"] |
|
14 | admin_authorization unless GraderConfiguration["right.user_view_submission"] |
|
15 | } |
|
15 | } |
|
16 |
|
16 | ||
|
17 | def max_score |
|
17 | def max_score |
|
18 | end |
|
18 | end |
|
19 |
|
19 | ||
|
20 | def current_score |
|
20 | def current_score |
|
21 | @problems = Problem.available_problems |
|
21 | @problems = Problem.available_problems |
|
22 | if params[:group_id] |
|
22 | if params[:group_id] |
|
23 | @group = Group.find(params[:group_id]) |
|
23 | @group = Group.find(params[:group_id]) |
|
24 | @users = @group.users.where(enabled: true) |
|
24 | @users = @group.users.where(enabled: true) |
|
25 | else |
|
25 | else |
|
26 | @users = User.includes(:contests).includes(:contest_stat).where(enabled: true) |
|
26 | @users = User.includes(:contests).includes(:contest_stat).where(enabled: true) |
|
27 | end |
|
27 | end |
|
28 | @scorearray = calculate_max_score(@problems, @users,0,0,true) |
|
28 | @scorearray = calculate_max_score(@problems, @users,0,0,true) |
|
29 |
|
29 | ||
|
30 | #rencer accordingly |
|
30 | #rencer accordingly |
|
31 | if params[:button] == 'download' then |
|
31 | if params[:button] == 'download' then |
|
32 | csv = gen_csv_from_scorearray(@scorearray,@problems) |
|
32 | csv = gen_csv_from_scorearray(@scorearray,@problems) |
|
33 | send_data csv, filename: 'max_score.csv' |
|
33 | send_data csv, filename: 'max_score.csv' |
@@ -432,69 +432,69 | |||||
|
432 | GROUP BY u.id |
|
432 | GROUP BY u.id |
|
433 | HAVING count > 1 |
|
433 | HAVING count > 1 |
|
434 | ) ml ON s.user_id = ml.id |
|
434 | ) ml ON s.user_id = ml.id |
|
435 | WHERE s.submitted_at >= ? and s.submitted_at <= ? |
|
435 | WHERE s.submitted_at >= ? and s.submitted_at <= ? |
|
436 | UNION |
|
436 | UNION |
|
437 | SELECT s.id,s.user_id,s.ip_address,s.submitted_at,s.problem_id |
|
437 | SELECT s.id,s.user_id,s.ip_address,s.submitted_at,s.problem_id |
|
438 | FROM submissions s INNER JOIN |
|
438 | FROM submissions s INNER JOIN |
|
439 | (SELECT l.ip_address,COUNT(DISTINCT u.id) as count |
|
439 | (SELECT l.ip_address,COUNT(DISTINCT u.id) as count |
|
440 | FROM logins l |
|
440 | FROM logins l |
|
441 | INNER JOIN users u ON l.user_id = u.id |
|
441 | INNER JOIN users u ON l.user_id = u.id |
|
442 | WHERE l.created_at >= ? and l.created_at <= ? |
|
442 | WHERE l.created_at >= ? and l.created_at <= ? |
|
443 | GROUP BY l.ip_address |
|
443 | GROUP BY l.ip_address |
|
444 | HAVING count > 1 |
|
444 | HAVING count > 1 |
|
445 | ) ml on ml.ip_address = s.ip_address |
|
445 | ) ml on ml.ip_address = s.ip_address |
|
446 | WHERE s.submitted_at >= ? and s.submitted_at <= ? |
|
446 | WHERE s.submitted_at >= ? and s.submitted_at <= ? |
|
447 | ORDER BY ip_address,submitted_at |
|
447 | ORDER BY ip_address,submitted_at |
|
448 | SQL |
|
448 | SQL |
|
449 | @subs = Submission.joins(:problem).find_by_sql([st,@since_time,@until_time, |
|
449 | @subs = Submission.joins(:problem).find_by_sql([st,@since_time,@until_time, |
|
450 | @since_time,@until_time, |
|
450 | @since_time,@until_time, |
|
451 | @since_time,@until_time, |
|
451 | @since_time,@until_time, |
|
452 | @since_time,@until_time]) |
|
452 | @since_time,@until_time]) |
|
453 |
|
453 | ||
|
454 | end |
|
454 | end |
|
455 |
|
455 | ||
|
456 |
- def cheat_scru |
|
456 | + def cheat_scrutinize |
|
457 | #convert date & time |
|
457 | #convert date & time |
|
458 | date_and_time = '%Y-%m-%d %H:%M' |
|
458 | date_and_time = '%Y-%m-%d %H:%M' |
|
459 | begin |
|
459 | begin |
|
460 | md = params[:since_datetime].match(/(\d+)-(\d+)-(\d+) (\d+):(\d+)/) |
|
460 | md = params[:since_datetime].match(/(\d+)-(\d+)-(\d+) (\d+):(\d+)/) |
|
461 | @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) |
|
461 | @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) |
|
462 | rescue |
|
462 | rescue |
|
463 | @since_time = Time.zone.now.ago( 90.minutes) |
|
463 | @since_time = Time.zone.now.ago( 90.minutes) |
|
464 | end |
|
464 | end |
|
465 | begin |
|
465 | begin |
|
466 | md = params[:until_datetime].match(/(\d+)-(\d+)-(\d+) (\d+):(\d+)/) |
|
466 | md = params[:until_datetime].match(/(\d+)-(\d+)-(\d+) (\d+):(\d+)/) |
|
467 | @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) |
|
467 | @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) |
|
468 | rescue |
|
468 | rescue |
|
469 | @until_time = Time.zone.now |
|
469 | @until_time = Time.zone.now |
|
470 | end |
|
470 | end |
|
471 |
|
471 | ||
|
472 | #convert sid |
|
472 | #convert sid |
|
473 | @sid = params[:SID].split(/[,\s]/) if params[:SID] |
|
473 | @sid = params[:SID].split(/[,\s]/) if params[:SID] |
|
474 | unless @sid and @sid.size > 0 |
|
474 | unless @sid and @sid.size > 0 |
|
475 | return |
|
475 | return |
|
476 |
- redirect_to actoin: :cheat_scru |
|
476 | + redirect_to actoin: :cheat_scrutinize |
|
477 | flash[:notice] = 'Please enter at least 1 student id' |
|
477 | flash[:notice] = 'Please enter at least 1 student id' |
|
478 | end |
|
478 | end |
|
479 | mark = Array.new(@sid.size,'?') |
|
479 | mark = Array.new(@sid.size,'?') |
|
480 | condition = "(u.login = " + mark.join(' OR u.login = ') + ')' |
|
480 | condition = "(u.login = " + mark.join(' OR u.login = ') + ')' |
|
481 |
|
481 | ||
|
482 | @st = <<-SQL |
|
482 | @st = <<-SQL |
|
483 | 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 |
|
483 | 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 |
|
484 | FROM logins l INNER JOIN users u on l.user_id = u.id |
|
484 | FROM logins l INNER JOIN users u on l.user_id = u.id |
|
485 | WHERE l.created_at >= ? AND l.created_at <= ? AND #{condition} |
|
485 | WHERE l.created_at >= ? AND l.created_at <= ? AND #{condition} |
|
486 | UNION |
|
486 | UNION |
|
487 | SELECT s.submitted_at,s.id,u.login,u.full_name,s.ip_address,s.problem_id,s.points,s.user_id |
|
487 | SELECT s.submitted_at,s.id,u.login,u.full_name,s.ip_address,s.problem_id,s.points,s.user_id |
|
488 | FROM submissions s INNER JOIN users u ON s.user_id = u.id |
|
488 | FROM submissions s INNER JOIN users u ON s.user_id = u.id |
|
489 | WHERE s.submitted_at >= ? AND s.submitted_at <= ? AND #{condition} |
|
489 | WHERE s.submitted_at >= ? AND s.submitted_at <= ? AND #{condition} |
|
490 | ORDER BY submitted_at |
|
490 | ORDER BY submitted_at |
|
491 | SQL |
|
491 | SQL |
|
492 |
|
492 | ||
|
493 | p = [@st,@since_time,@until_time] + @sid + [@since_time,@until_time] + @sid |
|
493 | p = [@st,@since_time,@until_time] + @sid + [@since_time,@until_time] + @sid |
|
494 | @logs = Submission.joins(:problem).find_by_sql(p) |
|
494 | @logs = Submission.joins(:problem).find_by_sql(p) |
|
495 |
|
495 | ||
|
496 |
|
496 | ||
|
497 |
|
497 | ||
|
498 |
|
498 | ||
|
499 |
|
499 | ||
|
500 | end |
|
500 | end |
@@ -129,50 +129,50 | |||||
|
129 | get 'clear_stat' |
|
129 | get 'clear_stat' |
|
130 | get 'clear_all_stat' |
|
130 | get 'clear_all_stat' |
|
131 | get 'change_contest_mode' |
|
131 | get 'change_contest_mode' |
|
132 | end |
|
132 | end |
|
133 | end |
|
133 | end |
|
134 |
|
134 | ||
|
135 | #get 'user_admin', to: 'user_admin#index' |
|
135 | #get 'user_admin', to: 'user_admin#index' |
|
136 | #get 'user_admin/bulk_manage', to: 'user_admin#bulk_manage', as: 'bulk_manage_user_admin' |
|
136 | #get 'user_admin/bulk_manage', to: 'user_admin#bulk_manage', as: 'bulk_manage_user_admin' |
|
137 | #post 'user_admin', to: 'user_admin#create' |
|
137 | #post 'user_admin', to: 'user_admin#create' |
|
138 | #delete 'user_admin/:id', to: 'user_admin#destroy', as: 'user_admin_destroy' |
|
138 | #delete 'user_admin/:id', to: 'user_admin#destroy', as: 'user_admin_destroy' |
|
139 |
|
139 | ||
|
140 | #singular resource |
|
140 | #singular resource |
|
141 | #---- BEWARE ---- singular resource maps to plural controller by default, we can override by provide controller name directly |
|
141 | #---- BEWARE ---- singular resource maps to plural controller by default, we can override by provide controller name directly |
|
142 | #report |
|
142 | #report |
|
143 | resource :report, only: [], controller: 'report' do |
|
143 | resource :report, only: [], controller: 'report' do |
|
144 | get 'login' |
|
144 | get 'login' |
|
145 | get 'multiple_login' |
|
145 | get 'multiple_login' |
|
146 | get 'problem_hof(/:id)', action: 'problem_hof', as: 'problem_hof' |
|
146 | get 'problem_hof(/:id)', action: 'problem_hof', as: 'problem_hof' |
|
147 | get 'current_score(/:group_id)', action: 'current_score', as: 'current_score' |
|
147 | get 'current_score(/:group_id)', action: 'current_score', as: 'current_score' |
|
148 | get 'max_score' |
|
148 | get 'max_score' |
|
149 | post 'show_max_score' |
|
149 | post 'show_max_score' |
|
150 | get 'stuck' |
|
150 | get 'stuck' |
|
151 | get 'cheat_report' |
|
151 | get 'cheat_report' |
|
152 | post 'cheat_report' |
|
152 | post 'cheat_report' |
|
153 |
- get 'cheat_scru |
|
153 | + get 'cheat_scrutinize' |
|
154 |
- post 'cheat_scru |
|
154 | + post 'cheat_scrutinize' |
|
155 | get 'submission' |
|
155 | get 'submission' |
|
156 | post 'submission_query' |
|
156 | post 'submission_query' |
|
157 | get 'login_stat' |
|
157 | get 'login_stat' |
|
158 | post 'login_stat' |
|
158 | post 'login_stat' |
|
159 | get 'login' |
|
159 | get 'login' |
|
160 | post 'login_summary_query' |
|
160 | post 'login_summary_query' |
|
161 | post 'login_detail_query' |
|
161 | post 'login_detail_query' |
|
162 | end |
|
162 | end |
|
163 | #get 'report/current_score', to: 'report#current_score', as: 'report_current_score' |
|
163 | #get 'report/current_score', to: 'report#current_score', as: 'report_current_score' |
|
164 | #get 'report/problem_hof(/:id)', to: 'report#problem_hof', as: 'report_problem_hof' |
|
164 | #get 'report/problem_hof(/:id)', to: 'report#problem_hof', as: 'report_problem_hof' |
|
165 | #get "report/login" |
|
165 | #get "report/login" |
|
166 | #get 'report/max_score', to: 'report#max_score', as: 'report_max_score' |
|
166 | #get 'report/max_score', to: 'report#max_score', as: 'report_max_score' |
|
167 | #post 'report/show_max_score', to: 'report#show_max_score', as: 'report_show_max_score' |
|
167 | #post 'report/show_max_score', to: 'report#show_max_score', as: 'report_show_max_score' |
|
168 |
|
168 | ||
|
169 | resource :main, only: [], controller: 'main' do |
|
169 | resource :main, only: [], controller: 'main' do |
|
170 | get 'login' |
|
170 | get 'login' |
|
171 | get 'logout' |
|
171 | get 'logout' |
|
172 | get 'list' |
|
172 | get 'list' |
|
173 | get 'submission(/:id)', action: 'submission', as: 'main_submission' |
|
173 | get 'submission(/:id)', action: 'submission', as: 'main_submission' |
|
174 | get 'announcements' |
|
174 | get 'announcements' |
|
175 | get 'help' |
|
175 | get 'help' |
|
176 | post 'submit' |
|
176 | post 'submit' |
|
177 | end |
|
177 | end |
|
178 | #main |
|
178 | #main |
deleted file |
You need to be logged in to leave comments.
Login now