# HG changeset patch # User Nattee Niparnan # Date 2014-09-20 10:37:44 # Node ID d90a3f1b39d03e31d8ad5f5b37819ac7d9bba8c2 # Parent 89d1f8d661eca0a5e2e62a645a51dbb45d76b400 # Parent c1892413ee469235b66377aa2fd2373f08e8e0a3 merge 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}" %> - <%= "(#{problem.name}) #{problem.full_name}" %> + <%= "#{problem.name}"%> + + + <%= "#{problem.full_name}" %> <%= link_to_description_if_any "[#{t 'main.problem_desc'}]", problem %> diff --git a/app/views/main/list.html.haml b/app/views/main/list.html.haml --- a/app/views/main/list.html.haml +++ b/app/views/main/list.html.haml @@ -25,7 +25,8 @@ %table.info %tr.info-head %th - %th Tasks + %th Tasks name + %th Full name %th # of sub(s) %th Results = render :partial => 'problem', :collection => @problems @@ -37,7 +38,8 @@ %table.info %tr.info-head %th - %th Tasks + %th Tasks name + %th Full name %th # of sub(s) %th Results = render :partial => 'problem', :collection => cp[:problems] diff --git a/app/views/problems/stat.html.erb b/app/views/problems/stat.html.erb deleted file mode 100644 --- a/app/views/problems/stat.html.erb +++ /dev/null @@ -1,29 +0,0 @@ -

Problem stat: <%= @problem.name %>

- -This is just a hack. Really not efficient.

- -<% if @submissions!=nil %> - - - - - - - - - <% count = 0 %> - <% @submissions.each do |sub| %> - <% next unless sub.user %> - "> - - - - - - - <% count += 1 %> - <% end %> -
loginnamesubmitted_atpointscomment
<%= sub.user.login %><%= sub.user.full_name if sub.user %><%= sub.submitted_at.to_s %><%= sub.points %>
<%= sub.grader_comment %>
-<% else %> -No submission -<% end %> diff --git a/app/views/problems/stat.html.haml b/app/views/problems/stat.html.haml new file mode 100644 --- /dev/null +++ b/app/views/problems/stat.html.haml @@ -0,0 +1,34 @@ +:css + .fix-width { + font-family: "Consolas, Monaco, Droid Sans Mono,Mono, Monospace,Courier" + } + +%h1 Problem stat: #{@problem.name} +%h2 Overview + +%h2 Submissions +- if @submissions and @submissions.count > 0 + %table.info#main_table + %thead + %tr.info-head + %th ID + %th Login + %th Name + %th Submitted_at + %th Points + %th comment + %tbody + - row_odd,curr = true,'' + - @submissions.each do |sub| + - next unless sub.user + - row_odd,curr = !row_odd, sub.user if curr != sub.user + %tr{class: row_odd ? "info-odd" : "info-even"} + %td= link_to sub.id, controller: 'graders', action: 'submission', id: sub.id + %td= link_to sub.user.login, controller: :users, action: :profile, id: sub.user.id + %td= sub.user.full_name + %td= time_ago_in_words(sub.submitted_at) + " ago" + %td= sub.points + %td.fix-width= sub.grader_comment +- else + No submission + diff --git a/app/views/user_admin/user_stat.html.haml b/app/views/user_admin/user_stat.html.haml --- a/app/views/user_admin/user_stat.html.haml +++ b/app/views/user_admin/user_stat.html.haml @@ -18,10 +18,13 @@ = render partial: 'submission_range' -- if params[:action] == 'user_stat' - = "latest score" +- if params[:action] == 'user_stat' + %h3 Latest score + = link_to '[download csv with all problems]', controller: :user_admin, action: :user_stat, commit: 'download csv' - else + %h3 Max score = link_to '[Show only latest submissions]', controller: :user_admin, action: :user_stat + = link_to '[download csv with all problems]', controller: :user_admin, action: :user_stat_max, commit: 'download csv' %table.tablesorter-cafe#my_table %thead