tournament 3.0.3 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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.