tournament 3.0.3 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/History.txt +5 -0
  2. data/lib/tournament/bracket.rb +9 -5
  3. data/lib/tournament/pool.rb +15 -10
  4. data/lib/tournament.rb +1 -1
  5. data/webgui/app/controllers/reports_controller.rb +10 -4
  6. data/webgui/app/controllers/users_controller.rb +61 -0
  7. data/webgui/app/models/user.rb +31 -3
  8. data/webgui/app/models/user_mailer.rb +7 -0
  9. data/webgui/app/views/sessions/new.html.erb +2 -0
  10. data/webgui/app/views/user_mailer/password_reset_notification.erb +7 -0
  11. data/webgui/app/views/users/lost_password.html.erb +20 -0
  12. data/webgui/app/views/users/reset_password.html.erb +15 -0
  13. data/webgui/config/environments/development.rb +1 -1
  14. data/webgui/config/routes.rb +8 -6
  15. data/webgui/db/migrate/20100312053540_add_password_reset_code.rb +9 -0
  16. data/webgui/db/schema.rb +92 -0
  17. data/webgui/doc/README_FOR_APP +47 -4
  18. data/webgui/lib/tasks/possibility.rake +1 -1
  19. data/webgui/vendor/plugins/restful_authentication/LICENSE +20 -0
  20. data/webgui/vendor/plugins/restful_authentication/README.textile +25 -25
  21. data/webgui/vendor/plugins/restful_authentication/generators/authenticated/authenticated_generator.rb +19 -19
  22. data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/authenticated_test_helper.rb +1 -1
  23. data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/accounts.feature +109 -0
  24. data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/{stories/users/sessions.story → features/sessions.feature} +44 -44
  25. data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/step_definitions/ra_env.rb +9 -0
  26. data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/step_definitions/ra_navigation_steps.rb +48 -0
  27. data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/step_definitions/ra_resource_steps.rb +178 -0
  28. data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/step_definitions/ra_response_steps.rb +169 -0
  29. data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/{stories/rest_auth_stories_helper.rb → features/step_definitions/rest_auth_features_helper.rb} +5 -5
  30. data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/features/step_definitions/user_steps.rb +131 -0
  31. data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/model.rb +2 -2
  32. metadata +17 -11
  33. data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/rest_auth_stories.rb +0 -22
  34. data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/steps/ra_navigation_steps.rb +0 -49
  35. data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/steps/ra_resource_steps.rb +0 -179
  36. data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/steps/ra_response_steps.rb +0 -171
  37. data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/steps/user_steps.rb +0 -153
  38. data/webgui/vendor/plugins/restful_authentication/generators/authenticated/templates/stories/users/accounts.story +0 -186
data/History.txt CHANGED
@@ -1,3 +1,8 @@
1
+ == 3.1.0 / 2009-03-12
2
+ * Account for multiple pools when saving/loading possibility yaml file.
3
+ * Update restful_authentication to latest version.
4
+ * Add ability to reset passwords.
5
+
1
6
  == 3.0.3 / 2009-03-11
2
7
  * Fix bug with bad string encoding and prince xml for pdf generation.
3
8
 
@@ -1,9 +1,13 @@
1
1
  # Class representing a bracket in a tournament.
2
2
  class Tournament::Bracket
3
- attr_reader :name # The name of the bracket
4
- attr_reader :teams # The teams in the bracket
5
- attr_reader :rounds # The number of rounds in the bracket
6
- attr_reader :winners # The winners of each game in the bracket
3
+ # The name of the bracket
4
+ attr_reader :name
5
+ # The teams in the bracket
6
+ attr_reader :teams
7
+ # The number of rounds in the bracket
8
+ attr_reader :rounds
9
+ # The winners of each game in the bracket
10
+ attr_reader :winners
7
11
 
8
12
  # Marker for an unknown team
9
13
  UNKNOWN_TEAM = :unk unless defined?(UNKNOWN_TEAM)
@@ -69,7 +73,7 @@ class Tournament::Bracket
69
73
 
70
74
  # Returns the number of teams left in the bracket.
71
75
  def teams_left
72
- return 1 + @winners.inject(0) { |memo, arr| arr.inject(memo) {|memo, team| memo += (team == UNKNOWN_TEAM ? 1 : 0)} }
76
+ return 1 + @winners.inject(0) { |memo, arr| arr.inject(memo) {|memo2, team| memo2 += (team == UNKNOWN_TEAM ? 1 : 0)} }
73
77
  end
74
78
 
75
79
  # Returns the number of possible outcomes for the bracket
@@ -3,11 +3,16 @@
3
3
  # and champions of Region 3 and Region 4 play each
4
4
  # other in the final four.
5
5
  class Tournament::Pool
6
- attr_reader :regions # The regions in the pool
7
- attr_reader :entries # Tournament::Entry objects for participants
8
- attr_reader :payouts # Hash of payouts by rank
9
- attr_accessor :entry_fee # The amount each entry paid to participate
10
- attr_reader :scoring_strategy # The scoring strategy for the pool
6
+ # The regions in the pool.
7
+ attr_reader :regions
8
+ # Tournament::Entry objects for the participants
9
+ attr_reader :entries
10
+ # Hash of payouts by rank
11
+ attr_reader :payouts
12
+ # The entry fee
13
+ attr_accessor :entry_fee
14
+ # The scoring strategy for the pool
15
+ attr_reader :scoring_strategy
11
16
 
12
17
  # Create a new empty pool with no Regions or Entries
13
18
  def initialize
@@ -286,9 +291,9 @@ class Tournament::Pool
286
291
  picks = (1..num_picks).map {|n| Tournament::Bracket.random_bracket(b.teams)}
287
292
  # Play out the bracket
288
293
  32.times { |n| b.set_winner(1,n+1, b.matchup(1, n+1)[rand(2)])}
289
- 16.times { |n| b.set_winner(2,n+1, b.matchup(2, n+1)[rand(2)])}
290
- 8.times { |n| b.set_winner(3,n+1, b.matchup(3, n+1)[rand(2)])}
291
- 4.times { |n| b.set_winner(4,n+1, b.matchup(4, n+1)[rand(2)])}
294
+ 10.times { |n| b.set_winner(2,n+1, b.matchup(2, n+1)[rand(2)])}
295
+ # 8.times { |n| b.set_winner(3,n+1, b.matchup(3, n+1)[rand(2)])}
296
+ #4.times { |n| b.set_winner(4,n+1, b.matchup(4, n+1)[rand(2)])}
292
297
  #2.times { |n| b.set_winner(5,n+1, b.matchup(5, n+1)[rand(2)])}
293
298
  #1.times { |n| b.set_winner(6,n+1, b.matchup(6, n+1)[rand(2)])}
294
299
  picks.each_with_index {|p, idx| pool.add_entry Tournament::Entry.new("picker_#{idx}", p) }
@@ -377,8 +382,8 @@ class Tournament::Pool
377
382
  else
378
383
  out << fmt2 % [round, round_total, scores_str_arr[0]] << "\n"
379
384
  end
380
- scores_str_arr[1..-1].each do |scores_str|
381
- out << fmt3 % scores_str << "\n"
385
+ scores_str_arr[1..-1].each do |ss2|
386
+ out << fmt3 % ss2 << "\n"
382
387
  end
383
388
  else
384
389
  out << fmt2 % [round, round_total, scores_str] << "\n"
data/lib/tournament.rb CHANGED
@@ -7,7 +7,7 @@ unless defined? Tournament
7
7
  module Tournament
8
8
 
9
9
  # :stopdoc:
10
- VERSION = '3.0.3'
10
+ VERSION = '3.1.0'
11
11
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
12
12
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
13
13
  # :startdoc:
@@ -1,5 +1,5 @@
1
1
  class ReportsController < ApplicationController
2
- STATS_DATAFILE = File.expand_path(File.join(RAILS_ROOT, 'db', 'stats.yml')) unless defined?(STATS_DATAFILE)
2
+ STATS_DATAFILE_NAME = "stats_%d.yml" unless defined?(STATS_DATAFILE_NAME)
3
3
  layout 'report'
4
4
  def show
5
5
  @pool = Pool.find(params[:id])
@@ -9,11 +9,13 @@ class ReportsController < ApplicationController
9
9
  end
10
10
 
11
11
  def possibility
12
- if !File.exist?(STATS_DATAFILE)
12
+ pool_id = params[:id]
13
+ my_data_file = self.stats_data_file(pool_id)
14
+ if !File.exist?(my_data_file)
13
15
  @message = "The statistics data has not yet been generated. Please try again later or send an email to #{ADMIN_EMAIL}."
14
16
  @stats = []
15
17
  else
16
- @stats = YAML.load_file(STATS_DATAFILE)
18
+ @stats = YAML.load_file(my_data_file)
17
19
  end
18
20
  end
19
21
 
@@ -51,11 +53,15 @@ class ReportsController < ApplicationController
51
53
  output.flush
52
54
  else
53
55
  data = stats_thread[:stats]
54
- File.open(STATS_DATAFILE, "w") {|f| f.write YAML.dump(data)}
56
+ File.open(self.stats_data_file(@pool.id), "w") {|f| f.write YAML.dump(data)}
55
57
  output.write "Generated file!"
56
58
  end
57
59
  end
58
60
  render :text => reporter
59
61
  end
60
62
 
63
+ def stats_data_file(pool_id)
64
+ File.expand_path(File.join(RAILS_ROOT, 'db', STATS_DATAFILE_NAME % pool_id))
65
+ end
66
+
61
67
  end
@@ -54,4 +54,65 @@ class UsersController < ApplicationController
54
54
  redirect_back_or_default(root_path)
55
55
  end
56
56
  end
57
+
58
+ def lost_password
59
+ case request.method
60
+ when :post
61
+ logout_keeping_session!
62
+ @user = User.new(params[:user])
63
+ @user.confirming_email = true
64
+ @user.updating_email = false
65
+ if valid_for_attributes(@user, ["email","email_confirmation"])
66
+ user = User.find_by_email(params[:user][:email])
67
+ if user
68
+ user.create_password_reset_code
69
+ UserMailer.deliver_password_reset_notification(user, reset_password_path(:reset_code => user.password_reset_code, :only_path => false))
70
+ end
71
+ flash[:notice] = "Reset code sent to #{params[:user][:email]}"
72
+ redirect_back_or_default('/')
73
+ else
74
+ flash[:error] = "Please enter a valid email address"
75
+ end
76
+ when :get
77
+ @user = User.new
78
+ end
79
+ end
80
+
81
+ def reset_password
82
+ @user = User.find_by_password_reset_code(params[:reset_code]) unless params[:reset_code].nil?
83
+ if !@user
84
+ flash[:error] = "Reset password token invalid, please contact support."
85
+ redirect_to('/')
86
+ return
87
+ else
88
+ @user.crypted_password = nil
89
+ end
90
+ if request.post?
91
+ if @user.update_attributes(:password => params[:user][:password], :password_confirmation => params[:user][:password_confirmation])
92
+ #self.current_user = @user
93
+ @user.delete_password_reset_code
94
+ flash[:notice] = "Password updated successfully for #{@user.email} - You may now log in using your new password."
95
+ redirect_back_or_default('/')
96
+ else
97
+ render :action => :reset_password
98
+ end
99
+ end
100
+ end
101
+
102
+ # Might be a good addition to AR::Base
103
+ def valid_for_attributes( model, attributes )
104
+ unless model.valid?
105
+ errors = model.errors
106
+ our_errors = Array.new
107
+ errors.each do |attr,error|
108
+ if attributes.include? attr
109
+ our_errors << [attr,error]
110
+ end
111
+ end
112
+ errors.clear
113
+ our_errors.each { |attr,error| errors.add(attr,error) }
114
+ return false unless errors.empty?
115
+ end
116
+ return true
117
+ end
57
118
  end
@@ -9,6 +9,8 @@ class User < ActiveRecord::Base
9
9
  has_many :pools
10
10
  has_and_belongs_to_many :roles
11
11
 
12
+ attr_accessor :updating_email, :confirming_email
13
+
12
14
  validates_presence_of :login
13
15
  validates_length_of :login, :within => 3..40
14
16
  validates_uniqueness_of :login
@@ -19,7 +21,9 @@ class User < ActiveRecord::Base
19
21
 
20
22
  validates_presence_of :email
21
23
  validates_length_of :email, :within => 6..100 #r@a.wk
22
- validates_uniqueness_of :email
24
+ validates_uniqueness_of :email, :if => :updating_email?
25
+ validates_presence_of :email_confirmation, :if => :confirming_email
26
+ validates_confirmation_of :email, :if => :confirming_email
23
27
  validates_format_of :email, :with => Authentication.email_regex, :message => Authentication.bad_email_message
24
28
 
25
29
  before_create :make_activation_code
@@ -27,7 +31,7 @@ class User < ActiveRecord::Base
27
31
  # HACK HACK HACK -- how to do attr_accessible from here?
28
32
  # prevents a user from submitting a crafted form that bypasses activation
29
33
  # anything else you want your user to change should be added here.
30
- attr_accessible :login, :email, :name, :password, :password_confirmation
34
+ attr_accessible :login, :email, :email_confirmation, :name, :password, :password_confirmation
31
35
 
32
36
  # Return all users with admin role
33
37
  def self.admin_users
@@ -87,11 +91,35 @@ class User < ActiveRecord::Base
87
91
  def email=(value)
88
92
  write_attribute :email, (value ? value.downcase : nil)
89
93
  end
94
+
95
+ def create_password_reset_code
96
+ @password_reset = true
97
+ self.password_reset_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )
98
+ self.save(false)
99
+ end
100
+
101
+ def password_recently_reset?
102
+ @password_reset
103
+ end
104
+
105
+ def delete_password_reset_code
106
+ self.password_reset_code = nil
107
+ self.save(false)
108
+ end
90
109
 
91
110
  protected
92
111
 
93
112
  def make_activation_code
94
- self.activation_code = self.class.make_token
113
+ self.activation_code = self.class.make_token
114
+ end
115
+
116
+ def updating_email?
117
+ # validate_uniqueness_of email unless specifically set to false
118
+ if updating_email == false
119
+ return false
120
+ else
121
+ return true
122
+ end
95
123
  end
96
124
 
97
125
 
@@ -21,9 +21,16 @@ class UserMailer < ActionMailer::Base
21
21
  @body[:content] = content
22
22
  @body[:url] = home_url
23
23
  end
24
+
25
+ def password_reset_notification(user, reset_url)
26
+ setup_email(user)
27
+ @subject = 'Link to reset your password'
28
+ @body[:url] = reset_url
29
+ end
24
30
 
25
31
  protected
26
32
  def setup_email(user)
33
+ @user = user
27
34
  @recipients = user.email
28
35
  @from = ADMIN_EMAIL
29
36
  @subject = "[#{TOURNAMENT_TITLE}] "
@@ -14,6 +14,8 @@
14
14
 
15
15
  <p><%= submit_tag 'Log in' %></p>
16
16
  <% end -%>
17
+
18
+ <p><%= link_to " > Lost Password?", lost_password_path %></p>
17
19
  <p>
18
20
  <i>Don't have an account?</i>
19
21
  <br/>
@@ -0,0 +1,7 @@
1
+ Request to reset password at <%=TOURNAMENT_TITLE%> received for <%=h @user.login %>
2
+
3
+ Visit this url to choose a new password:
4
+
5
+ <%=h @url %>
6
+
7
+ (Your password will remain the same if you don't follow this link)
@@ -0,0 +1,20 @@
1
+ <h1>Lost Password</h1>
2
+ <p>
3
+ Please enter the email address that you registered with. Once you click
4
+ on the Send button, we will send you an email that allows you to change
5
+ your password.
6
+ </p>
7
+ <%= error_messages_for :user, :header_message => "Please review the following errors:", :message => '' %>
8
+ <% form_for :user do |f| -%>
9
+ <table>
10
+ <tr>
11
+ <td align="right"><%= label_tag 'email' %></td>
12
+ <td><%= f.text_field :email %></td>
13
+ </tr>
14
+ <tr>
15
+ <td align="right"><%= label_tag 'email_confirmation' %></td>
16
+ <td><%= f.text_field :email_confirmation %></td>
17
+ </tr>
18
+ </table>
19
+ <p><%= submit_tag 'Send' %></p>
20
+ <% end -%>
@@ -0,0 +1,15 @@
1
+ <%= error_messages_for :user %>
2
+
3
+ <h1>Choose a new password</h1>
4
+
5
+ <% form_for :user do |f| -%>
6
+ <div>
7
+ New Password: <%= f.password_field :password %>
8
+ </div>
9
+ <div>
10
+ Confirm Password: <%= f.password_field :password_confirmation %>
11
+ </div>
12
+ <div>
13
+ <%= submit_tag 'Change Password' %>
14
+ </div>
15
+ <% end -%>
@@ -21,7 +21,7 @@ ActionMailer::Base.smtp_settings = {
21
21
  :port => 25,
22
22
  :domain => "comcast.net",
23
23
  :user_name => 'doug.seifert@comcast.net',
24
- :password => "ccSBBatl1",
24
+ :password => "cfamn2nan",
25
25
  :authentication => :login
26
26
  }
27
27
 
@@ -35,12 +35,14 @@ ActionController::Routing::Routes.draw do |map|
35
35
 
36
36
  # See how all your routes lay out with "rake routes"
37
37
 
38
- # restful_authentication routs
39
- map.logout '/logout', :controller => 'sessions', :action => 'destroy'
40
- map.login '/login', :controller => 'sessions', :action => 'new'
41
- map.register '/register', :controller => 'users', :action => 'create'
42
- map.signup '/signup', :controller => 'users', :action => 'new'
43
- map.activate '/activate/:activation_code', :controller => 'users', :action => 'activate', :activation_code => nil
38
+ # restful_authentication routes
39
+ map.logout 'logout', :controller => 'sessions', :action => 'destroy'
40
+ map.login 'login', :controller => 'sessions', :action => 'new'
41
+ map.register 'register', :controller => 'users', :action => 'create'
42
+ map.signup 'signup', :controller => 'users', :action => 'new'
43
+ map.activate 'activate/:activation_code', :controller => 'users', :action => 'activate', :activation_code => nil
44
+ map.reset_password 'reset_password/:reset_code', :controller => 'users', :action => 'reset_password'
45
+ map.lost_password 'lost_password', :controller => 'users', :action => 'lost_password'
44
46
  map.resources :users
45
47
  map.resource :session
46
48
 
@@ -0,0 +1,9 @@
1
+ class AddPasswordResetCode < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :users, :password_reset_code, :string, :limit => 40
4
+ end
5
+
6
+ def self.down
7
+ remove_column :users, :password_reset_code
8
+ end
9
+ end
@@ -0,0 +1,92 @@
1
+ # This file is auto-generated from the current state of the database. Instead of editing this file,
2
+ # please use the migrations feature of Active Record to incrementally modify your database, and
3
+ # then regenerate this schema definition.
4
+ #
5
+ # Note that this schema.rb definition is the authoritative source for your database schema. If you need
6
+ # to create the application database on another system, you should be using db:schema:load, not running
7
+ # all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
8
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
9
+ #
10
+ # It's strongly recommended to check this file into your version control system.
11
+
12
+ ActiveRecord::Schema.define(:version => 20100312053540) do
13
+
14
+ create_table "entries", :force => true do |t|
15
+ t.string "name", :limit => 64, :null => false
16
+ t.binary "data"
17
+ t.datetime "created_at"
18
+ t.datetime "updated_at"
19
+ t.integer "tie_break"
20
+ t.integer "user_id", :default => 1, :null => false
21
+ t.integer "pool_id"
22
+ t.boolean "completed", :default => false, :null => false
23
+ end
24
+
25
+ add_index "entries", ["pool_id"], :name => "index_entries_on_pool_id"
26
+ add_index "entries", ["user_id"], :name => "index_entries_on_user_id"
27
+
28
+ create_table "pools", :force => true do |t|
29
+ t.string "name", :null => false
30
+ t.binary "data"
31
+ t.boolean "started", :default => false, :null => false
32
+ t.datetime "starts_at"
33
+ t.datetime "created_at"
34
+ t.datetime "updated_at"
35
+ t.integer "user_id"
36
+ t.boolean "active", :default => false, :null => false
37
+ end
38
+
39
+ create_table "regions", :force => true do |t|
40
+ t.integer "pool_id"
41
+ t.string "name"
42
+ t.integer "position"
43
+ t.datetime "created_at"
44
+ t.datetime "updated_at"
45
+ end
46
+
47
+ create_table "roles", :force => true do |t|
48
+ t.string "name", :limit => 32
49
+ t.datetime "created_at"
50
+ t.datetime "updated_at"
51
+ t.integer "position", :default => 0, :null => false
52
+ end
53
+
54
+ create_table "roles_users", :id => false, :force => true do |t|
55
+ t.integer "role_id"
56
+ t.integer "user_id"
57
+ end
58
+
59
+ create_table "seedings", :force => true do |t|
60
+ t.integer "pool_id"
61
+ t.integer "team_id"
62
+ t.string "region"
63
+ t.integer "seed"
64
+ t.datetime "created_at"
65
+ t.datetime "updated_at"
66
+ end
67
+
68
+ create_table "teams", :force => true do |t|
69
+ t.string "name"
70
+ t.string "short_name"
71
+ t.datetime "created_at"
72
+ t.datetime "updated_at"
73
+ end
74
+
75
+ create_table "users", :force => true do |t|
76
+ t.string "login", :limit => 40
77
+ t.string "name", :limit => 100, :default => ""
78
+ t.string "email", :limit => 100
79
+ t.string "crypted_password", :limit => 40
80
+ t.string "salt", :limit => 40
81
+ t.datetime "created_at"
82
+ t.datetime "updated_at"
83
+ t.string "remember_token", :limit => 40
84
+ t.datetime "remember_token_expires_at"
85
+ t.string "activation_code", :limit => 40
86
+ t.datetime "activated_at"
87
+ t.string "password_reset_code", :limit => 40
88
+ end
89
+
90
+ add_index "users", ["login"], :name => "index_users_on_login", :unique => true
91
+
92
+ end
@@ -1,5 +1,48 @@
1
- To build the guides:
1
+ = USING THE WEB GUI:
2
2
 
3
- * Install source-highlighter (http://www.gnu.org/software/src-highlite/source-highlight.html)
4
- * Install the mizuho gem (http://github.com/FooBarWidget/mizuho/tree/master)
5
- * Run `rake guides` from the railties directory
3
+ Load the entry page in your brower. Log in as the admin user you
4
+ configured during installation. Click on on the 'All Pools' link on
5
+ the right sidebar. Create a new pool and fill in the information.
6
+ Each time you save this form, a new blank payouts line will be added
7
+ so that you can configure as many payouts as you desire.
8
+
9
+ After the basic pool configuration is set up, click on the 'Teams'
10
+ link in the right sidebar. You are presented with four region
11
+ brackets to fill in. Keep in mind that the pink region champs will
12
+ play each other in the final four and the light blue region champs
13
+ will play each other in the final four so you can get the bracket
14
+ right. The web application is preconfigured with over 300 NCAA
15
+ schools. The team name fields are auto-complete fields -- type in
16
+ a few letters and pause and you will be presented with a list of
17
+ matching teams. The Short Name field should be a three letter
18
+ abbreviation for the team. The abbreviations have to be unique
19
+ across the entire tournament field.
20
+
21
+ Once the teams are configured, go back to the pool basic information
22
+ form, click the Active check box and save the form. The pool is now
23
+ ready for entries to be added to it. Invite your friends to join the pool
24
+ by giving them the url for the entry page. They will be asked to
25
+ register. After registering and logging in, they will be able to
26
+ submit entries to your pool.
27
+
28
+ As the tournament progresses, use the 'Tournament Bracket' link
29
+ on the right sidebar to record the winning teams.
30
+
31
+ Use the report links to run reports, etc.
32
+
33
+ == POSSIBILITY REPORT
34
+
35
+ After about 21 teams are left in the tournament, you can run the
36
+ possibility report. This report runs through every possible way the
37
+ tournament can come out and ranks each entry against the possiblity.
38
+ The report lists the "chance to win" for each entry. The chance
39
+ to win is the percentage of possible outcomes that would result in
40
+ that entry coming in first.
41
+
42
+ The possibility report requires that a rake task be run on the
43
+ web server. It is very processor intensive and can take a long
44
+ time to complete. To generate the possibility report data file,
45
+ run the following command from the web gui install directory
46
+ on the server:
47
+
48
+ RAILS_ENV=production rake report:possibilities
@@ -10,7 +10,7 @@ namespace :report do
10
10
  print "\rCalculating: %3d%% +#{hashes.ljust(20, '-')}+ %5d seconds remaining" % [percentage.to_i, remaining]
11
11
  end
12
12
  puts
13
- stats_yaml_file = File.join(RAILS_ROOT, 'db', 'stats.yml')
13
+ stats_yaml_file = File.join(RAILS_ROOT, 'db', "stats_#{pool_id}.yml")
14
14
  bytes = File.open(stats_yaml_file, "w") {|f| f.write YAML.dump(stats)}
15
15
  puts "Wrote #{bytes} bytes to #{stats_yaml_file} ..."
16
16
  end
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 rick olson
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.