diff --git a/app/controllers/problems_controller.rb b/app/controllers/problems_controller.rb --- a/app/controllers/problems_controller.rb +++ b/app/controllers/problems_controller.rb @@ -131,7 +131,7 @@ if !@problem.available redirect_to :controller => 'main', :action => 'list' else - @submissions = Submission.find_all_last_by_problem(params[:id]) + @submissions = Submission.includes(:user).where(problem_id: params[:id]).order(:user_id,:id) end end diff --git a/app/controllers/user_admin_controller.rb b/app/controllers/user_admin_controller.rb --- a/app/controllers/user_admin_controller.rb +++ b/app/controllers/user_admin_controller.rb @@ -1,5 +1,8 @@ +require 'csv' + class UserAdminController < ApplicationController + include MailHelperMethods before_filter :admin_authorization @@ -122,7 +125,11 @@ end def user_stat - @problems = Problem.find_available_problems + if params[:commit] == 'download csv' + @problems = Problem.all + else + @problems = Problem.find_available_problems + end @users = User.find(:all, :include => [:contests, :contest_stat]) @scorearray = Array.new @users.each do |u| @@ -138,10 +145,21 @@ end @scorearray << ustat end + + if params[:commit] == 'download csv' then + csv = gen_csv_from_scorearray(@scorearray,@problems) + send_data csv, filename: 'last_score.csv' + else + render template: 'user_admin/user_stat' + end end def user_stat_max - @problems = Problem.find_available_problems + if params[:commit] == 'download csv' + @problems = Problem.all + else + @problems = Problem.find_available_problems + end @users = User.find(:all, :include => [:contests, :contest_stat]) @scorearray = Array.new #set up range from param @@ -160,7 +178,12 @@ @scorearray << ustat end - render template: 'user_admin/user_stat' + if params[:commit] == 'download csv' then + csv = gen_csv_from_scorearray(@scorearray,@problems) + send_data csv, filename: 'max_score.csv' + else + render template: 'user_admin/user_stat' + end end def import @@ -475,4 +498,35 @@ end return [@contest, @users] end + + def gen_csv_from_scorearray(scorearray,problem) + CSV.generate do |csv| + #add header + header = ['User','Name', 'Activated?', 'Logged in', 'Contest'] + problem.each { |p| header << p.name } + header += ['Total','Passed'] + csv << header + #add data + scorearray.each do |sc| + total = num_passed = 0 + row = Array.new + sc.each_index do |i| + if i == 0 + row << sc[i].login + row << sc[i].full_name + row << sc[i].activated + row << (sc[i].try(:contest_stat).try(:started_at)!=nil ? 'yes' : 'no') + row << sc[i].contests.collect {|c| c.name}.join(', ') + else + row << sc[i][0] + total += sc[i][0] + num_passed += 1 if sc[i][1] + end + end + row << total + row << num_passed + csv << row + end + end + end end diff --git a/app/models/submission.rb b/app/models/submission.rb --- a/app/models/submission.rb +++ b/app/models/submission.rb @@ -25,7 +25,7 @@ def self.find_all_last_by_problem(problem_id) # need to put in SQL command, maybe there's a better way - Submission.find_by_sql("SELECT * FROM submissions " + + Submission.includes(:user).find_by_sql("SELECT * FROM submissions " + "WHERE id = " + "(SELECT MAX(id) FROM submissions AS subs " + "WHERE subs.user_id = submissions.user_id AND " + diff --git a/app/views/main/_problem.html.erb b/app/views/main/_problem.html.erb --- a/app/views/main/_problem.html.erb +++ b/app/views/main/_problem.html.erb @@ -3,7 +3,10 @@ <%= "#{problem_counter+1}" %>
login | -name | -submitted_at | -points | -comment | -
---|---|---|---|---|
<%= sub.user.login %> | -<%= sub.user.full_name if sub.user %> | -<%= sub.submitted_at.to_s %> | -<%= sub.points %> | -<%= sub.grader_comment %> |
-