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,3 +1,5 @@ +require 'csv' + class UserAdminController < ApplicationController include MailHelperMethods @@ -81,11 +83,17 @@ added_random_password = true end - user = User.new({:login => login, - :full_name => full_name, - :password => password, - :password_confirmation => password, - :alias => user_alias}) + user = User.find_by_login(login) + if (user) + user.full_name = full_name + user.password = password + else + user = User.new({:login => login, + :full_name => full_name, + :password => password, + :password_confirmation => password, + :alias => user_alias}) + end user.activated = true user.save @@ -122,7 +130,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| @@ -141,7 +153,11 @@ 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 @@ -159,6 +175,13 @@ end @scorearray << ustat end + + 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 @@ -473,4 +496,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