Description:
merge
Commit status:
[Not Reviewed]
References:
merge java
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r511:d90a3f1b39d0 - - 8 files changed: 102 inserted, 35 deleted

@@ -0,0 +1,34
1 + :css
2 + .fix-width {
3 + font-family: "Consolas, Monaco, Droid Sans Mono,Mono, Monospace,Courier"
4 + }
5 +
6 + %h1 Problem stat: #{@problem.name}
7 + %h2 Overview
8 +
9 + %h2 Submissions
10 + - if @submissions and @submissions.count > 0
11 + %table.info#main_table
12 + %thead
13 + %tr.info-head
14 + %th ID
15 + %th Login
16 + %th Name
17 + %th Submitted_at
18 + %th Points
19 + %th comment
20 + %tbody
21 + - row_odd,curr = true,''
22 + - @submissions.each do |sub|
23 + - next unless sub.user
24 + - row_odd,curr = !row_odd, sub.user if curr != sub.user
25 + %tr{class: row_odd ? "info-odd" : "info-even"}
26 + %td= link_to sub.id, controller: 'graders', action: 'submission', id: sub.id
27 + %td= link_to sub.user.login, controller: :users, action: :profile, id: sub.user.id
28 + %td= sub.user.full_name
29 + %td= time_ago_in_words(sub.submitted_at) + " ago"
30 + %td= sub.points
31 + %td.fix-width= sub.grader_comment
32 + - else
33 + No submission
34 +
@@ -128,13 +128,13
128
128
129 def stat
129 def stat
130 @problem = Problem.find(params[:id])
130 @problem = Problem.find(params[:id])
131 if !@problem.available
131 if !@problem.available
132 redirect_to :controller => 'main', :action => 'list'
132 redirect_to :controller => 'main', :action => 'list'
133 else
133 else
134 - @submissions = Submission.find_all_last_by_problem(params[:id])
134 + @submissions = Submission.includes(:user).where(problem_id: params[:id]).order(:user_id,:id)
135 end
135 end
136 end
136 end
137
137
138 def manage
138 def manage
139 @problems = Problem.find(:all, :order => 'date_added DESC')
139 @problems = Problem.find(:all, :order => 'date_added DESC')
140 end
140 end
@@ -1,8 +1,11
1 + require 'csv'
2 +
1 class UserAdminController < ApplicationController
3 class UserAdminController < ApplicationController
2
4
5 +
3 include MailHelperMethods
6 include MailHelperMethods
4
7
5 before_filter :admin_authorization
8 before_filter :admin_authorization
6
9
7 # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
10 # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
8 verify :method => :post, :only => [ :destroy,
11 verify :method => :post, :only => [ :destroy,
@@ -119,13 +122,17
119 def destroy
122 def destroy
120 User.find(params[:id]).destroy
123 User.find(params[:id]).destroy
121 redirect_to :action => 'list'
124 redirect_to :action => 'list'
122 end
125 end
123
126
124 def user_stat
127 def user_stat
128 + if params[:commit] == 'download csv'
129 + @problems = Problem.all
130 + else
125 @problems = Problem.find_available_problems
131 @problems = Problem.find_available_problems
132 + end
126 @users = User.find(:all, :include => [:contests, :contest_stat])
133 @users = User.find(:all, :include => [:contests, :contest_stat])
127 @scorearray = Array.new
134 @scorearray = Array.new
128 @users.each do |u|
135 @users.each do |u|
129 ustat = Array.new
136 ustat = Array.new
130 ustat[0] = u
137 ustat[0] = u
131 @problems.each do |p|
138 @problems.each do |p|
@@ -135,16 +142,27
135 else
142 else
136 ustat << [0,false]
143 ustat << [0,false]
137 end
144 end
138 end
145 end
139 @scorearray << ustat
146 @scorearray << ustat
140 end
147 end
148 +
149 + if params[:commit] == 'download csv' then
150 + csv = gen_csv_from_scorearray(@scorearray,@problems)
151 + send_data csv, filename: 'last_score.csv'
152 + else
153 + render template: 'user_admin/user_stat'
154 + end
141 end
155 end
142
156
143 def user_stat_max
157 def user_stat_max
158 + if params[:commit] == 'download csv'
159 + @problems = Problem.all
160 + else
144 @problems = Problem.find_available_problems
161 @problems = Problem.find_available_problems
162 + end
145 @users = User.find(:all, :include => [:contests, :contest_stat])
163 @users = User.find(:all, :include => [:contests, :contest_stat])
146 @scorearray = Array.new
164 @scorearray = Array.new
147 #set up range from param
165 #set up range from param
148 since_id = params.fetch(:since_id, 0).to_i
166 since_id = params.fetch(:since_id, 0).to_i
149 until_id = params.fetch(:until_id, 0).to_i
167 until_id = params.fetch(:until_id, 0).to_i
150 @users.each do |u|
168 @users.each do |u|
@@ -157,14 +175,19
157 end
175 end
158 ustat << [(max_points.to_f*100/p.full_score).round, (max_points>=p.full_score)]
176 ustat << [(max_points.to_f*100/p.full_score).round, (max_points>=p.full_score)]
159 end
177 end
160 @scorearray << ustat
178 @scorearray << ustat
161 end
179 end
162
180
181 + if params[:commit] == 'download csv' then
182 + csv = gen_csv_from_scorearray(@scorearray,@problems)
183 + send_data csv, filename: 'max_score.csv'
184 + else
163 render template: 'user_admin/user_stat'
185 render template: 'user_admin/user_stat'
164 end
186 end
187 + end
165
188
166 def import
189 def import
167 if params[:file]==''
190 if params[:file]==''
168 flash[:notice] = 'Error importing no file'
191 flash[:notice] = 'Error importing no file'
169 redirect_to :action => 'list' and return
192 redirect_to :action => 'list' and return
170 end
193 end
@@ -472,7 +495,38
472 @users = @contest.users
495 @users = @contest.users
473 else
496 else
474 @users = User.find_users_with_no_contest
497 @users = User.find_users_with_no_contest
475 end
498 end
476 return [@contest, @users]
499 return [@contest, @users]
477 end
500 end
501 +
502 + def gen_csv_from_scorearray(scorearray,problem)
503 + CSV.generate do |csv|
504 + #add header
505 + header = ['User','Name', 'Activated?', 'Logged in', 'Contest']
506 + problem.each { |p| header << p.name }
507 + header += ['Total','Passed']
508 + csv << header
509 + #add data
510 + scorearray.each do |sc|
511 + total = num_passed = 0
512 + row = Array.new
513 + sc.each_index do |i|
514 + if i == 0
515 + row << sc[i].login
516 + row << sc[i].full_name
517 + row << sc[i].activated
518 + row << (sc[i].try(:contest_stat).try(:started_at)!=nil ? 'yes' : 'no')
519 + row << sc[i].contests.collect {|c| c.name}.join(', ')
520 + else
521 + row << sc[i][0]
522 + total += sc[i][0]
523 + num_passed += 1 if sc[i][1]
478 end
524 end
525 + end
526 + row << total
527 + row << num_passed
528 + csv << row
529 + end
530 + end
531 + end
532 + end
@@ -22,13 +22,13
22 :order => 'number DESC')
22 :order => 'number DESC')
23 return last_sub
23 return last_sub
24 end
24 end
25
25
26 def self.find_all_last_by_problem(problem_id)
26 def self.find_all_last_by_problem(problem_id)
27 # need to put in SQL command, maybe there's a better way
27 # need to put in SQL command, maybe there's a better way
28 - Submission.find_by_sql("SELECT * FROM submissions " +
28 + Submission.includes(:user).find_by_sql("SELECT * FROM submissions " +
29 "WHERE id = " +
29 "WHERE id = " +
30 "(SELECT MAX(id) FROM submissions AS subs " +
30 "(SELECT MAX(id) FROM submissions AS subs " +
31 "WHERE subs.user_id = submissions.user_id AND " +
31 "WHERE subs.user_id = submissions.user_id AND " +
32 "problem_id = " + problem_id.to_s + " " +
32 "problem_id = " + problem_id.to_s + " " +
33 "GROUP BY user_id) " +
33 "GROUP BY user_id) " +
34 "ORDER BY user_id")
34 "ORDER BY user_id")
@@ -1,12 +1,15
1 <tr class="info-<%= (problem_counter%2==0) ? "even" : "odd" %>">
1 <tr class="info-<%= (problem_counter%2==0) ? "even" : "odd" %>">
2 <td>
2 <td>
3 <%= "#{problem_counter+1}" %>
3 <%= "#{problem_counter+1}" %>
4 </td>
4 </td>
5 <td>
5 <td>
6 - <%= "(#{problem.name}) #{problem.full_name}" %>
6 + <%= "#{problem.name}"%>
7 + </td>
8 + <td>
9 + <%= "#{problem.full_name}" %>
7 <%= link_to_description_if_any "[#{t 'main.problem_desc'}]", problem %>
10 <%= link_to_description_if_any "[#{t 'main.problem_desc'}]", problem %>
8 </td>
11 </td>
9 <td align="center">
12 <td align="center">
10 <%= @prob_submissions[problem.id][:count] %>
13 <%= @prob_submissions[problem.id][:count] %>
11 </td>
14 </td>
12 <td>
15 <td>
@@ -22,25 +22,27
22
22
23 - if GraderConfiguration.show_tasks_to?(@user)
23 - if GraderConfiguration.show_tasks_to?(@user)
24 - if not GraderConfiguration.multicontests?
24 - if not GraderConfiguration.multicontests?
25 %table.info
25 %table.info
26 %tr.info-head
26 %tr.info-head
27 %th
27 %th
28 - %th Tasks
28 + %th Tasks name
29 + %th Full name
29 %th # of sub(s)
30 %th # of sub(s)
30 %th Results
31 %th Results
31 = render :partial => 'problem', :collection => @problems
32 = render :partial => 'problem', :collection => @problems
32 - else
33 - else
33 - @contest_problems.each do |cp|
34 - @contest_problems.each do |cp|
34 - if cp[:problems].length > 0
35 - if cp[:problems].length > 0
35 %h2{:class =>'contest-title'}
36 %h2{:class =>'contest-title'}
36 = "#{cp[:contest] ? cp[:contest].title : 'Public problems'}"
37 = "#{cp[:contest] ? cp[:contest].title : 'Public problems'}"
37 %table.info
38 %table.info
38 %tr.info-head
39 %tr.info-head
39 %th
40 %th
40 - %th Tasks
41 + %th Tasks name
42 + %th Full name
41 %th # of sub(s)
43 %th # of sub(s)
42 %th Results
44 %th Results
43 = render :partial => 'problem', :collection => cp[:problems]
45 = render :partial => 'problem', :collection => cp[:problems]
44
46
45
47
46 %hr/
48 %hr/
@@ -16,15 +16,18
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 - = "latest score"
22 + %h3 Latest score
23 + = link_to '[download csv with all problems]', controller: :user_admin, action: :user_stat, commit: 'download csv'
23 - else
24 - else
25 + %h3 Max score
24 = 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'
25
28
26 %table.tablesorter-cafe#my_table
29 %table.tablesorter-cafe#my_table
27 %thead
30 %thead
28 %tr
31 %tr
29 %th User
32 %th User
30 %th Name
33 %th Name
deleted file
You need to be logged in to leave comments. Login now