Description:
[web] added site and time out basic functionality git-svn-id: http://theory.cpe.ku.ac.th/grader/web/trunk@169 6386c4cd-e34a-4fa8-8920-d93eb39b512e
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r85:f0e9de51d9aa - - 23 files changed: 436 inserted, 3 deleted

@@ -0,0 +1,87
1 + class SitesController < ApplicationController
2 + # GET /sites
3 + # GET /sites.xml
4 + def index
5 + @sites = Site.find(:all)
6 +
7 + respond_to do |format|
8 + format.html # index.html.erb
9 + format.xml { render :xml => @sites }
10 + end
11 + end
12 +
13 + # GET /sites/1
14 + # GET /sites/1.xml
15 + def show
16 + @site = Site.find(params[:id])
17 +
18 + respond_to do |format|
19 + format.html # show.html.erb
20 + format.xml { render :xml => @site }
21 + end
22 + end
23 +
24 + # GET /sites/new
25 + # GET /sites/new.xml
26 + def new
27 + @site = Site.new
28 +
29 + respond_to do |format|
30 + format.html # new.html.erb
31 + format.xml { render :xml => @site }
32 + end
33 + end
34 +
35 + # GET /sites/1/edit
36 + def edit
37 + @site = Site.find(params[:id])
38 + end
39 +
40 + # POST /sites
41 + # POST /sites.xml
42 + def create
43 + @site = Site.new(params[:site])
44 + @site.clear_start_time_if_not_started
45 +
46 + respond_to do |format|
47 + if @site.save
48 + flash[:notice] = 'Site was successfully created.'
49 + format.html { redirect_to(@site) }
50 + format.xml { render :xml => @site, :status => :created, :location => @site }
51 + else
52 + format.html { render :action => "new" }
53 + format.xml { render :xml => @site.errors, :status => :unprocessable_entity }
54 + end
55 + end
56 + end
57 +
58 + # PUT /sites/1
59 + # PUT /sites/1.xml
60 + def update
61 + @site = Site.find(params[:id])
62 + @site.clear_start_time_if_not_started
63 +
64 + respond_to do |format|
65 + if @site.update_attributes(params[:site])
66 + flash[:notice] = 'Site was successfully updated.'
67 + format.html { redirect_to(@site) }
68 + format.xml { head :ok }
69 + else
70 + format.html { render :action => "edit" }
71 + format.xml { render :xml => @site.errors, :status => :unprocessable_entity }
72 + end
73 + end
74 + end
75 +
76 + # DELETE /sites/1
77 + # DELETE /sites/1.xml
78 + def destroy
79 + @site = Site.find(params[:id])
80 + @site.destroy
81 +
82 + respond_to do |format|
83 + format.html { redirect_to(sites_url) }
84 + format.xml { head :ok }
85 + end
86 + end
87 + end
@@ -0,0 +1,2
1 + module SitesHelper
2 + end
@@ -0,0 +1,24
1 + class Site < ActiveRecord::Base
2 +
3 + def clear_start_time_if_not_started
4 + if !self.started
5 + self.start_time = nil
6 + end
7 + end
8 +
9 + def finished?
10 + if !self.started
11 + return false
12 + end
13 +
14 + contest_time = Configuration['contest.time_limit']
15 + if tmatch = /(\d+):(\d+)/.match(contest_time)
16 + h = tmatch[1].to_i
17 + m = tmatch[2].to_i
18 + return Time.now > (self.start_time + h.hour + m.minute)
19 + else
20 + false
21 + end
22 + end
23 +
24 + end
@@ -0,0 +1,17
1 + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2 + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3 +
4 + <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5 + <head>
6 + <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
7 + <title>Sites: <%= controller.action_name %></title>
8 + <%= stylesheet_link_tag 'scaffold' %>
9 + </head>
10 + <body>
11 +
12 + <p style="color: green"><%= flash[:notice] %></p>
13 +
14 + <%= yield %>
15 +
16 + </body>
17 + </html>
@@ -0,0 +1,27
1 + <h1>Editing site</h1>
2 +
3 + <%= error_messages_for :site %>
4 +
5 + <% form_for(@site) do |f| %>
6 + <p>
7 + <b>Name</b><br />
8 + <%= f.text_field :name %>
9 + </p>
10 +
11 + <p>
12 + <b>Started</b><br />
13 + <%= f.check_box :started %>
14 + </p>
15 +
16 + <p>
17 + <b>Start time</b><br />
18 + <%= f.datetime_select :start_time %>
19 + </p>
20 +
21 + <p>
22 + <%= f.submit "Update" %>
23 + </p>
24 + <% end %>
25 +
26 + <%= link_to 'Show', @site %> |
27 + <%= link_to 'Back', sites_path %>
@@ -0,0 +1,24
1 + <h1>Listing sites</h1>
2 +
3 + <table>
4 + <tr>
5 + <th>Name</th>
6 + <th>Started</th>
7 + <th>Start time</th>
8 + </tr>
9 +
10 + <% for site in @sites %>
11 + <tr>
12 + <td><%=h site.name %></td>
13 + <td><%=h site.started %></td>
14 + <td><%=h site.start_time %></td>
15 + <td><%= link_to 'Show', site %></td>
16 + <td><%= link_to 'Edit', edit_site_path(site) %></td>
17 + <td><%= link_to 'Destroy', site, :confirm => 'Are you sure?', :method => :delete %></td>
18 + </tr>
19 + <% end %>
20 + </table>
21 +
22 + <br />
23 +
24 + <%= link_to 'New site', new_site_path %>
@@ -0,0 +1,26
1 + <h1>New site</h1>
2 +
3 + <%= error_messages_for :site %>
4 +
5 + <% form_for(@site) do |f| %>
6 + <p>
7 + <b>Name</b><br />
8 + <%= f.text_field :name %>
9 + </p>
10 +
11 + <p>
12 + <b>Started</b><br />
13 + <%= f.check_box :started %>
14 + </p>
15 +
16 + <p>
17 + <b>Start time</b><br />
18 + <%= f.datetime_select :start_time %>
19 + </p>
20 +
21 + <p>
22 + <%= f.submit "Create" %>
23 + </p>
24 + <% end %>
25 +
26 + <%= link_to 'Back', sites_path %>
@@ -0,0 +1,18
1 + <p>
2 + <b>Name:</b>
3 + <%=h @site.name %>
4 + </p>
5 +
6 + <p>
7 + <b>Started:</b>
8 + <%=h @site.started %>
9 + </p>
10 +
11 + <p>
12 + <b>Start time:</b>
13 + <%=h @site.start_time %>
14 + </p>
15 +
16 +
17 + <%= link_to 'Edit', edit_site_path(@site) %> |
18 + <%= link_to 'Back', sites_path %>
@@ -0,0 +1,15
1 + class CreateSites < ActiveRecord::Migration
2 + def self.up
3 + create_table :sites do |t|
4 + t.string :name
5 + t.boolean :started
6 + t.datetime :start_time
7 +
8 + t.timestamps
9 + end
10 + end
11 +
12 + def self.down
13 + drop_table :sites
14 + end
15 + end
@@ -0,0 +1,22
1 + class AddSiteToUserAndAddDefaultSite < ActiveRecord::Migration
2 + def self.up
3 + default_site = Site.new({:name => 'default',
4 + :started => false})
5 + default_site.save!
6 +
7 + add_column :users, :site_id, :integer
8 + User.reset_column_information
9 +
10 + User.find(:all).each do |user|
11 + user.site_id = default_site.id
12 + user.save
13 + end
14 + end
15 +
16 + def self.down
17 + remove_column :users, :site_id
18 +
19 + default_site = Site.find_by_name('default')
20 + default_site.destroy
21 + end
22 + end
@@ -0,0 +1,43
1 +
2 + require File.dirname(__FILE__) + '/../spec_helper'
3 +
4 + describe Site do
5 +
6 + before(:each) do
7 + start_time = Time.local(2008,5,10,9,00)
8 + @site = Site.new({:name => 'Test site',
9 + :started => true,
10 + :start_time => start_time })
11 + end
12 +
13 + it "should report that the contest is not finished when the contest time limit is not set" do
14 + Configuration.should_receive(:[]).with('contest.time_limit').
15 + and_return('unlimit')
16 + Time.should_not_receive(:now)
17 + @site.finished?.should == false
18 + end
19 +
20 + it "should report that the contest is finished when the contest is over" do
21 + Configuration.should_receive(:[]).with('contest.time_limit').
22 + and_return('5:00')
23 + Time.should_receive(:now).and_return(Time.local(2008,5,10,14,01))
24 + @site.finished?.should == true
25 + end
26 +
27 + it "should report if the contest is finished correctly, when the contest is over, and the contest time contains some minutes" do
28 + Configuration.should_receive(:[]).twice.with('contest.time_limit').
29 + and_return('5:15')
30 + Time.should_receive(:now).
31 + and_return(Time.local(2008,5,10,14,14),Time.local(2008,5,10,14,16))
32 + @site.finished?.should == false
33 + @site.finished?.should == true
34 + end
35 +
36 + it "should report that the contest is not finished, when the time is exactly at the finish time" do
37 + Configuration.should_receive(:[]).with('contest.time_limit').
38 + and_return('5:00')
39 + Time.should_receive(:now).and_return(Time.local(2008,5,10,14,00))
40 + @site.finished?.should == false
41 + end
42 +
43 + end
@@ -0,0 +1,11
1 + # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
2 +
3 + one:
4 + name: MyString
5 + started: false
6 + start_time: 2008-04-09 14:08:28
7 +
8 + two:
9 + name: MyString
10 + started: false
11 + start_time: 2008-04-09 14:08:28
@@ -0,0 +1,45
1 + require File.dirname(__FILE__) + '/../test_helper'
2 +
3 + class SitesControllerTest < ActionController::TestCase
4 + def test_should_get_index
5 + get :index
6 + assert_response :success
7 + assert_not_nil assigns(:sites)
8 + end
9 +
10 + def test_should_get_new
11 + get :new
12 + assert_response :success
13 + end
14 +
15 + def test_should_create_site
16 + assert_difference('Site.count') do
17 + post :create, :site => { }
18 + end
19 +
20 + assert_redirected_to site_path(assigns(:site))
21 + end
22 +
23 + def test_should_show_site
24 + get :show, :id => sites(:one).id
25 + assert_response :success
26 + end
27 +
28 + def test_should_get_edit
29 + get :edit, :id => sites(:one).id
30 + assert_response :success
31 + end
32 +
33 + def test_should_update_site
34 + put :update, :id => sites(:one).id, :site => { }
35 + assert_redirected_to site_path(assigns(:site))
36 + end
37 +
38 + def test_should_destroy_site
39 + assert_difference('Site.count', -1) do
40 + delete :destroy, :id => sites(:one).id
41 + end
42 +
43 + assert_redirected_to sites_path
44 + end
45 + end
@@ -0,0 +1,8
1 + require File.dirname(__FILE__) + '/../test_helper'
2 +
3 + class SiteTest < ActiveSupport::TestCase
4 + # Replace this with your real tests.
5 + def test_truth
6 + assert true
7 + end
8 + end
@@ -53,5 +53,17
53 end
53 end
54 end
54 end
55
55
56 + def verify_time_limit
57 + return true if session[:user_id]==nil
58 + user = User.find(session[:user_id], :include => :site)
59 + return true if user==nil or user.site == nil
60 + if user.site.finished?
61 + flash[:notice] = 'Error: the contest on your site is over.'
62 + redirect_to :back
63 + return false
64 + end
65 + return true
56 end
66 end
57
67
68 + end
69 +
@@ -2,6 +2,11
2
2
3 before_filter :authenticate, :except => [:index, :login]
3 before_filter :authenticate, :except => [:index, :login]
4
4
5 + #
6 + # COMMENT OUT: filter in each action instead
7 + #
8 + # before_filter :verify_time_limit, :only => [:submit]
9 +
5 verify :method => :post, :only => [:submit],
10 verify :method => :post, :only => [:submit],
6 :redirect_to => { :action => :index }
11 :redirect_to => { :action => :index }
7
12
@@ -23,11 +28,20
23 end
28 end
24
29
25 def submit
30 def submit
31 + user = User.find(session[:user_id])
32 +
26 @submission = Submission.new(params[:submission])
33 @submission = Submission.new(params[:submission])
27 - @submission.user_id = session[:user_id]
34 + @submission.user = user
28 @submission.language_id = 0
35 @submission.language_id = 0
29 @submission.source = params['file'].read if params['file']!=''
36 @submission.source = params['file'].read if params['file']!=''
30 @submission.submitted_at = Time.new
37 @submission.submitted_at = Time.new
38 +
39 + if user.site!=nil and user.site.finished?
40 + @submission.errors.add_to_base "The contest is over."
41 + prepare_list_information
42 + render :action => 'list' and return
43 + end
44 +
31 if @submission.valid?
45 if @submission.valid?
32 if @submission.save == false
46 if @submission.save == false
33 flash[:notice] = 'Error saving your submission'
47 flash[:notice] = 'Error saving your submission'
@@ -2,6 +2,11
2
2
3 before_filter :authenticate
3 before_filter :authenticate
4
4
5 + #
6 + # COMMENT OUT: filter in each action instead
7 + #
8 + # before_filter :verify_time_limit, :only => [:submit]
9 +
5 verify :method => :post, :only => [:submit],
10 verify :method => :post, :only => [:submit],
6 :redirect_to => { :action => :index }
11 :redirect_to => { :action => :index }
7
12
@@ -13,6 +18,12
13
18
14 def submit
19 def submit
15 @user = User.find(session[:user_id])
20 @user = User.find(session[:user_id])
21 +
22 + if @user.site!=nil and @user.site.finished?
23 + flash[:notice] = 'Error saving your test submission: Contest is over.'
24 + redirect_to :action => 'index' and return
25 + end
26 +
16 test_request = TestRequest.new_from_form_params(@user,params[:test_request])
27 test_request = TestRequest.new_from_form_params(@user,params[:test_request])
17 if test_request.save
28 if test_request.save
18 redirect_to :action => 'index'
29 redirect_to :action => 'index'
@@ -45,9 +45,17
45
45
46
46
47 def user_title_bar(user)
47 def user_title_bar(user)
48 + if user.site!=nil and user.site.finished?
49 + contest_over_string = <<CONTEST_OVER
50 + <tr><td colspan="2" align="center">
51 + <span class="contest-over-msg">THE CONTEST IS OVER</span>
52 + </td></tr>
53 + CONTEST_OVER
54 + end
48 <<TITLEBAR
55 <<TITLEBAR
49 <div class="title">
56 <div class="title">
50 <table>
57 <table>
58 + #{contest_over_string}
51 <tr>
59 <tr>
52 <td class="left-col">
60 <td class="left-col">
53 #{user.full_name}<br/>
61 #{user.full_name}<br/>
@@ -6,6 +6,8
6
6
7 has_many :test_requests, :order => "submitted_at DESC"
7 has_many :test_requests, :order => "submitted_at DESC"
8
8
9 + belongs_to :site
10 +
9 validates_presence_of :login
11 validates_presence_of :login
10 validates_presence_of :full_name
12 validates_presence_of :full_name
11 validates_length_of :full_name, :minimum => 1
13 validates_length_of :full_name, :minimum => 1
@@ -1,4 +1,6
1 ActionController::Routing::Routes.draw do |map|
1 ActionController::Routing::Routes.draw do |map|
2 + map.resources :sites
3 +
2 # The priority is based upon order of creation: first created -> highest priority.
4 # The priority is based upon order of creation: first created -> highest priority.
3
5
4 # Sample of regular route:
6 # Sample of regular route:
@@ -9,7 +9,7
9 #
9 #
10 # It's strongly recommended to check this file into your version control system.
10 # It's strongly recommended to check this file into your version control system.
11
11
12 - ActiveRecord::Schema.define(:version => 23) do
12 + ActiveRecord::Schema.define(:version => 25) do
13
13
14 create_table "configurations", :force => true do |t|
14 create_table "configurations", :force => true do |t|
15 t.string "key"
15 t.string "key"
@@ -79,6 +79,14
79 add_index "sessions", ["session_id"], :name => "index_sessions_on_session_id"
79 add_index "sessions", ["session_id"], :name => "index_sessions_on_session_id"
80 add_index "sessions", ["updated_at"], :name => "index_sessions_on_updated_at"
80 add_index "sessions", ["updated_at"], :name => "index_sessions_on_updated_at"
81
81
82 + create_table "sites", :force => true do |t|
83 + t.string "name"
84 + t.boolean "started"
85 + t.datetime "start_time"
86 + t.datetime "created_at"
87 + t.datetime "updated_at"
88 + end
89 +
82 create_table "submissions", :force => true do |t|
90 create_table "submissions", :force => true do |t|
83 t.integer "user_id"
91 t.integer "user_id"
84 t.integer "problem_id"
92 t.integer "problem_id"
@@ -133,6 +141,7
133 t.string "salt", :limit => 5
141 t.string "salt", :limit => 5
134 t.string "alias"
142 t.string "alias"
135 t.string "email"
143 t.string "email"
144 + t.integer "site_id"
136 end
145 end
137
146
138 add_index "users", ["login"], :name => "index_users_on_login", :unique => true
147 add_index "users", ["login"], :name => "index_users_on_login", :unique => true
@@ -21,6 +21,12
21 margin-bottom: 5px;
21 margin-bottom: 5px;
22 }
22 }
23
23
24 + div.title span.contest-over-msg {
25 + font-size: 15px;
26 + color: red;
27 + font-weight: bold;
28 + }
29 +
24 div.title table {
30 div.title table {
25 width: 100%;
31 width: 100%;
26 }
32 }
@@ -62,7 +62,7
62
62
63 div.progressBar div.border {
63 div.progressBar div.border {
64 background-color: #fff;
64 background-color: #fff;
65 - border: 1px solid grey;
65 + border: 1px solid gray;
66 width: 100%;
66 width: 100%;
67 }
67 }
68
68
You need to be logged in to leave comments. Login now