# HG changeset patch # User Nattee Niparnan # Date 2014-08-26 11:26:51 # Node ID 1c14a43c4f1f0b270aac9a043196a35b0ada474c # Parent 4e03b3c502cc0b66617f28646f8e3af8580df53d add login stat diff --git a/app/assets/javascripts/report.js.coffee b/app/assets/javascripts/report.js.coffee new file mode 100644 --- /dev/null +++ b/app/assets/javascripts/report.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ diff --git a/app/assets/stylesheets/report.css.scss b/app/assets/stylesheets/report.css.scss new file mode 100644 --- /dev/null +++ b/app/assets/stylesheets/report.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the report controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/login_controller.rb b/app/controllers/login_controller.rb --- a/app/controllers/login_controller.rb +++ b/app/controllers/login_controller.rb @@ -22,6 +22,9 @@ end end + #save login information + Login.create(user_id: user.id, ip_address: request.remote_ip) + redirect_to :controller => 'main', :action => 'list' else flash[:notice] = 'Wrong password' diff --git a/app/controllers/report_controller.rb b/app/controllers/report_controller.rb new file mode 100644 --- /dev/null +++ b/app/controllers/report_controller.rb @@ -0,0 +1,13 @@ +class ReportController < ApplicationController + def login_stat + @logins = Array.new + login = Login.all + User.all.each do |user| + @logins << { login: user.login, + full_name: user.full_name, + count: Login.where(user_id: user.id).count(:id), + min: Login.where(user_id: user.id).maximum(:created_at), + max: Login.where(user_id: user.id).minimum(:created_at) } + end + end +end diff --git a/app/helpers/report_helper.rb b/app/helpers/report_helper.rb new file mode 100644 --- /dev/null +++ b/app/helpers/report_helper.rb @@ -0,0 +1,2 @@ +module ReportHelper +end diff --git a/app/models/login.rb b/app/models/login.rb new file mode 100644 --- /dev/null +++ b/app/models/login.rb @@ -0,0 +1,3 @@ +class Login < ActiveRecord::Base + attr_accessible :ip_address, :logged_in_at, :user_id +end diff --git a/app/views/report/login_stat.html.haml b/app/views/report/login_stat.html.haml new file mode 100644 --- /dev/null +++ b/app/views/report/login_stat.html.haml @@ -0,0 +1,26 @@ +%h1 Login status + + +.task-menu + Reports + %br/ + = link_to '[Submission]', :action => 'submit_stat' + = link_to '[Login]', :action => 'login_stat' + +%table.info + %thead + %tr.info-head + %th login + %th full name + %th login count + %th earliest + %th latest + %tbody + - @logins.each do |l| + %tr{class: cycle('info-even','info-odd')} + %td= l[:login] + %td= l[:full_name] + %td= l[:count] + %td= l[:min] + %td= l[:max] + diff --git a/config/routes.rb b/config/routes.rb --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,8 @@ CafeGrader::Application.routes.draw do + get "report/login" + + get "logins/list" + resources :contests resources :announcements diff --git a/db/migrate/20140826095949_create_logins.rb b/db/migrate/20140826095949_create_logins.rb new file mode 100644 --- /dev/null +++ b/db/migrate/20140826095949_create_logins.rb @@ -0,0 +1,10 @@ +class CreateLogins < ActiveRecord::Migration + def change + create_table :logins do |t| + t.string :user_id + t.string :ip_address + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb --- a/db/schema.rb +++ b/db/schema.rb @@ -11,33 +11,25 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20121001033508) do +ActiveRecord::Schema.define(:version => 20140826095949) do create_table "announcements", :force => true do |t| t.string "author" t.text "body" t.boolean "published" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.boolean "frontpage", :default => false t.boolean "contest_only", :default => false t.string "title" t.string "notes" end - create_table "codejom_statuses", :force => true do |t| - t.integer "user_id" - t.boolean "alive" - t.integer "num_problems_passed" - t.datetime "created_at" - t.datetime "updated_at" - end - create_table "contests", :force => true do |t| t.string "title" t.boolean "enabled" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.string "name" end @@ -53,23 +45,23 @@ create_table "countries", :force => true do |t| t.string "name" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false end create_table "descriptions", :force => true do |t| t.text "body" t.boolean "markdowned" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false end create_table "grader_configurations", :force => true do |t| t.string "key" t.string "value_type" t.string "value" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.text "description" end @@ -78,8 +70,8 @@ t.integer "pid" t.string "mode" t.boolean "active" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.integer "task_id" t.string "task_type" t.boolean "terminated" @@ -94,29 +86,34 @@ t.string "common_ext" end + create_table "logins", :force => true do |t| + t.string "user_id" + t.string "ip_address" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + create_table "messages", :force => true do |t| t.integer "sender_id" t.integer "receiver_id" t.integer "replying_message_id" t.text "body" t.boolean "replied" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false end create_table "problems", :force => true do |t| - t.string "name", :limit => 30 - t.string "full_name" - t.integer "full_score" - t.date "date_added" - t.boolean "available" - t.string "url" - t.integer "description_id" - t.boolean "test_allowed" - t.boolean "output_only" - t.integer "level", :default => 0 - t.datetime "updated_at" - t.string "description_filename" + t.string "name", :limit => 30 + t.string "full_name" + t.integer "full_score" + t.date "date_added" + t.boolean "available" + t.string "url" + t.integer "description_id" + t.boolean "test_allowed" + t.boolean "output_only" + t.string "description_filename" end create_table "rights", :force => true do |t| @@ -156,21 +153,12 @@ t.string "name" t.boolean "started" t.datetime "start_time" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.integer "country_id" t.string "password" end - create_table "submission_statuses", :force => true do |t| - t.integer "user_id" - t.integer "problem_id" - t.boolean "passed" - t.integer "submission_count" - t.datetime "created_at" - t.datetime "updated_at" - end - create_table "submissions", :force => true do |t| t.integer "user_id" t.integer "problem_id" @@ -197,24 +185,12 @@ t.datetime "updated_at" end - create_table "test_pair_assignments", :force => true do |t| - t.integer "user_id" - t.integer "problem_id" - t.integer "test_pair_id" - t.integer "test_pair_number" - t.integer "request_number" - t.datetime "created_at" - t.datetime "updated_at" - t.boolean "submitted" - end - create_table "test_pairs", :force => true do |t| t.integer "problem_id" t.text "input", :limit => 16777215 t.text "solution", :limit => 16777215 - t.datetime "created_at" - t.datetime "updated_at" - t.integer "number" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false end create_table "test_requests", :force => true do |t| @@ -225,13 +201,13 @@ t.string "output_file_name" t.string "running_stat" t.integer "status" - t.datetime "updated_at" + t.datetime "updated_at", :null => false t.datetime "submitted_at" t.datetime "compiled_at" t.text "compiler_message" t.datetime "graded_at" t.string "grader_comment" - t.datetime "created_at" + t.datetime "created_at", :null => false t.float "running_time" t.string "exit_status" t.integer "memory_usage" @@ -242,30 +218,23 @@ create_table "user_contest_stats", :force => true do |t| t.integer "user_id" t.datetime "started_at" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.boolean "forced_logout" end create_table "users", :force => true do |t| - t.string "login", :limit => 50 + t.string "login", :limit => 50 t.string "full_name" t.string "hashed_password" - t.string "salt", :limit => 5 + t.string "salt", :limit => 5 t.string "alias" t.string "email" t.integer "site_id" t.integer "country_id" - t.boolean "activated", :default => false + t.boolean "activated", :default => false t.datetime "created_at" t.datetime "updated_at" - t.string "member1_full_name" - t.string "member2_full_name" - t.string "member3_full_name" - t.boolean "high_school" - t.string "member1_school_name" - t.string "member2_school_name" - t.string "member3_school_name" end add_index "users", ["login"], :name => "index_users_on_login", :unique => true diff --git a/spec/models/login_spec.rb b/spec/models/login_spec.rb new file mode 100644 --- /dev/null +++ b/spec/models/login_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe Login do + pending "add some examples to (or delete) #{__FILE__}" +end