diff --git a/app/controllers/report_controller.rb b/app/controllers/report_controller.rb --- a/app/controllers/report_controller.rb +++ b/app/controllers/report_controller.rb @@ -1,3 +1,5 @@ +require 'csv' + class ReportController < ApplicationController before_filter :authenticate @@ -23,7 +25,7 @@ @scorearray = calculate_max_score(@problems, @users,0,0,true) #rencer accordingly - if params[:commit] == 'download csv' then + if params[:button] == 'download' then csv = gen_csv_from_scorearray(@scorearray,@problems) send_data csv, filename: 'max_score.csv' else @@ -57,7 +59,7 @@ @scorearray = calculate_max_score(@problems, @users,since_id,until_id) #rencer accordingly - if params[:commit] == 'download csv' then + if params[:button] == 'download' then csv = gen_csv_from_scorearray(@scorearray,@problems) send_data csv, filename: 'max_score.csv' else @@ -485,4 +487,35 @@ return scorearray 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/problem.rb b/app/models/problem.rb --- a/app/models/problem.rb +++ b/app/models/problem.rb @@ -3,6 +3,7 @@ belongs_to :description has_and_belongs_to_many :contests, :uniq => true has_many :test_pairs, :dependent => :delete_all + has_many :testcases, :dependent => :destroy validates_presence_of :name validates_format_of :name, :with => /^\w+$/ diff --git a/app/models/testcase.rb b/app/models/testcase.rb new file mode 100644 --- /dev/null +++ b/app/models/testcase.rb @@ -0,0 +1,4 @@ +class Testcase < ActiveRecord::Base + belongs_to :problem + attr_accessible :group, :input, :num, :score, :sol +end diff --git a/app/views/report/max_score.html.haml b/app/views/report/max_score.html.haml --- a/app/views/report/max_score.html.haml +++ b/app/views/report/max_score.html.haml @@ -11,7 +11,7 @@ Select problem(s) that we wish to know the score. = label_tag :problem_id, "Problems" = select_tag 'problem_id[]', - options_for_select(Problem.all.collect {|p| ["[#{p.name}] #{p.full_name}", p.id]}), + options_for_select(Problem.all.collect {|p| ["[#{p.name}] #{p.full_name}", p.id]},params[:problem_id]), { class: 'select2 form-control', multiple: "true" } .col-md-4 .panel.panel-primary @@ -41,8 +41,8 @@ Only enabled users .row .col-md-12 - = button_tag 'Show', class: "btn btn-primary btn-large" - = button_tag 'Download CSV', class: "btn btn-primary btn-large" + = button_tag 'Show', class: "btn btn-primary btn-large", value: "show" + = button_tag 'Download CSV', class: "btn btn-primary btn-large", value: "download" - if @scorearray %h2 Result diff --git a/db/migrate/20161014091417_create_testcases.rb b/db/migrate/20161014091417_create_testcases.rb new file mode 100644 --- /dev/null +++ b/db/migrate/20161014091417_create_testcases.rb @@ -0,0 +1,15 @@ +class CreateTestcases < ActiveRecord::Migration + def change + create_table :testcases do |t| + t.references :problem + t.integer :num + t.integer :group + t.integer :score + t.text :input + t.text :sol + + t.timestamps + end + add_index :testcases, :problem_id + end +end diff --git a/db/schema.rb b/db/schema.rb --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20161008050135) do +ActiveRecord::Schema.define(:version => 20161014091417) do create_table "announcements", :force => true do |t| t.string "author" @@ -236,6 +236,19 @@ add_index "test_requests", ["user_id", "problem_id"], :name => "index_test_requests_on_user_id_and_problem_id" + create_table "testcases", :force => true do |t| + t.integer "problem_id" + t.integer "num" + t.integer "group" + t.integer "score" + t.text "input" + t.text "sol" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "testcases", ["problem_id"], :name => "index_testcases_on_problem_id" + create_table "user_contest_stats", :force => true do |t| t.integer "user_id" t.datetime "started_at" diff --git a/spec/models/testcases_spec.rb b/spec/models/testcases_spec.rb new file mode 100644 --- /dev/null +++ b/spec/models/testcases_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe Testcases do + pending "add some examples to (or delete) #{__FILE__}" +end