tournament 2.3.0 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +3 -0
- data/Manifest.txt +2 -0
- data/Rakefile +1 -1
- data/lib/tournament/pool.rb +51 -31
- data/lib/tournament/possibility.rb +19 -0
- data/webgui/app/controllers/admin_controller.rb +2 -1
- data/webgui/app/controllers/entry_controller.rb +8 -3
- data/webgui/app/controllers/reports_controller.rb +54 -0
- data/webgui/app/models/pool.rb +6 -0
- data/webgui/app/views/admin/recap.html.erb +1 -0
- data/webgui/app/views/pool/index.html.erb +8 -4
- data/webgui/app/views/reports/_leader.html.erb +2 -1
- data/webgui/app/views/reports/_possibility.html.erb +45 -0
- data/webgui/app/views/reports/_report.html.erb +2 -2
- data/webgui/app/views/reports/show.html.erb +6 -0
- data/webgui/app/views/shared/_bracket.html.erb +7 -5
- data/webgui/config/routes.rb +1 -0
- data/webgui/db/development.sqlite3 +0 -0
- data/webgui/db/pool.yml +5756 -399
- data/webgui/db/test.sqlite3 +0 -0
- data/webgui/public/stylesheets/bracket.css +5 -5
- data/webgui/test/functional/admin_controller_test.rb +2 -2
- metadata +4 -2
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
@@ -10,6 +10,7 @@ lib/tournament.rb
|
|
10
10
|
lib/tournament/bracket.rb
|
11
11
|
lib/tournament/entry.rb
|
12
12
|
lib/tournament/pool.rb
|
13
|
+
lib/tournament/possibility.rb
|
13
14
|
lib/tournament/scoring_strategy.rb
|
14
15
|
lib/tournament/team.rb
|
15
16
|
lib/tournament/webgui_installer.rb
|
@@ -73,6 +74,7 @@ webgui/app/views/layouts/print.html.erb
|
|
73
74
|
webgui/app/views/layouts/report.html.erb
|
74
75
|
webgui/app/views/pool/index.html.erb
|
75
76
|
webgui/app/views/reports/_leader.html.erb
|
77
|
+
webgui/app/views/reports/_possibility.html.erb
|
76
78
|
webgui/app/views/reports/_report.html.erb
|
77
79
|
webgui/app/views/reports/show.html.erb
|
78
80
|
webgui/app/views/sessions/new.html.erb
|
data/Rakefile
CHANGED
@@ -20,7 +20,7 @@ PROJ.authors = 'Douglas A. Seifert'
|
|
20
20
|
PROJ.email = 'doug+rubyforge@dseifert.net'
|
21
21
|
PROJ.url = 'http://www.dseifert.net/code/tournament'
|
22
22
|
PROJ.rubyforge.name = 'tournament'
|
23
|
-
PROJ.version = '2.
|
23
|
+
PROJ.version = '2.4.0'
|
24
24
|
PROJ.group_id = 5863
|
25
25
|
|
26
26
|
PROJ.spec.opts << '--color'
|
data/lib/tournament/pool.rb
CHANGED
@@ -588,14 +588,20 @@ class Tournament::Pool
|
|
588
588
|
nil
|
589
589
|
end
|
590
590
|
|
591
|
-
# Runs through every possible outcome of the tournament and
|
592
|
-
# each entry's chance to win as a percentage of the
|
593
|
-
# the entry would win if the
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
591
|
+
# Runs through every possible outcome of the tournament and
|
592
|
+
# calculates each entry's chance to win as a percentage of the
|
593
|
+
# possible outcomes the entry would win if the tournment came
|
594
|
+
# out that way. If a block is provided, periodically reports
|
595
|
+
# progress by calling the block and passing it the percent complete
|
596
|
+
# and time remaining in seconds as arguments.
|
597
|
+
# Returns array of structs responding to times_champ, max_score,
|
598
|
+
# min_rank, entry and champs methods. The entry method returns the
|
599
|
+
# Tournament::Entry object and the champs method returns a hash
|
600
|
+
# keyed on team name and whose values are the number of times that
|
601
|
+
# team could win that would make the entry come in on top.
|
602
|
+
def possibility_stats
|
603
|
+
stats = @entries.map do |e|
|
604
|
+
Tournament::Possibility.new(e)
|
599
605
|
end
|
600
606
|
max_possible_score = @entries.map{|p| 0}
|
601
607
|
min_ranking = @entries.map{|p| @entries.size + 1}
|
@@ -604,19 +610,20 @@ class Tournament::Pool
|
|
604
610
|
count = 0
|
605
611
|
old_percentage = -1
|
606
612
|
old_remaining = 1_000_000_000_000
|
607
|
-
out << "Checking #{self.tournament_entry.picks.number_of_outcomes} possible outcomes" << "\n"
|
608
613
|
start = Time.now.to_f
|
609
614
|
self.tournament_entry.picks.each_possible_bracket do |poss|
|
610
615
|
poss_scores = @entries.map{|p| p.picks.score_against(poss, self.scoring_strategy)}
|
611
616
|
sort_scores = poss_scores.sort.reverse
|
612
617
|
@entries.each_with_index do |entry, i|
|
613
618
|
score = poss_scores[i]
|
614
|
-
|
619
|
+
stat = stats[i]
|
620
|
+
stat.max_score = score if score > stat.max_score
|
615
621
|
rank = sort_scores.index(score) + 1
|
616
|
-
|
617
|
-
|
622
|
+
stat.min_rank = rank if rank < stat.min_rank
|
623
|
+
stat.times_champ += 1 if rank == 1
|
618
624
|
if rank == 1
|
619
|
-
|
625
|
+
stat.champs[poss.champion.name] ||= 0
|
626
|
+
stat.champs[poss.champion.name] += 1
|
620
627
|
end
|
621
628
|
end
|
622
629
|
count += 1
|
@@ -627,42 +634,55 @@ class Tournament::Pool
|
|
627
634
|
if (percentage.to_i != old_percentage) || (remaining < old_remaining)
|
628
635
|
old_remaining = remaining
|
629
636
|
old_percentage = percentage.to_i
|
630
|
-
|
631
|
-
|
637
|
+
if block_given?
|
638
|
+
yield(percentage.to_i, remaining)
|
639
|
+
end
|
632
640
|
end
|
633
641
|
end
|
642
|
+
stats.sort!
|
643
|
+
return stats
|
644
|
+
end
|
645
|
+
|
646
|
+
# Runs through every possible outcome of the tournament and calculates
|
647
|
+
# each entry's chance to win as a percentage of the possible outcomes
|
648
|
+
# the entry would win if the tournament came out that way. Generates
|
649
|
+
# an ASCII report of the results.
|
650
|
+
def possibility_report(out = $stdout)
|
651
|
+
$stdout.sync = true
|
652
|
+
if @entries.size == 0
|
653
|
+
out << "There are no entries in the pool." << "\n"
|
654
|
+
return
|
655
|
+
end
|
656
|
+
out << "Checking #{self.tournament_entry.picks.number_of_outcomes} possible outcomes" << "\n"
|
657
|
+
stats = possibility_stats do |percentage, remaining|
|
658
|
+
hashes = '#' * (percentage.to_i/5) + '>'
|
659
|
+
out << "\rCalculating: %3d%% +#{hashes.ljust(20, '-')}+ %5d seconds remaining" % [percentage.to_i, remaining]
|
660
|
+
end
|
634
661
|
out << "\n"
|
635
|
-
#puts "
|
636
|
-
#puts "Highest Place: #{min_ranking.inspect}"
|
637
|
-
#puts " Times Winner: #{times_winner.inspect}"
|
638
|
-
sort_array = []
|
639
|
-
times_winner.each_with_index { |n, i| sort_array << [n, i, min_ranking[i], max_possible_score[i], player_champions[i]] }
|
640
|
-
sort_array = sort_array.sort_by {|arr| arr[0] == 0 ? (arr[2] == 0 ? -arr[3] : arr[2]) : -arr[0]}
|
641
|
-
#puts "SORT: #{sort_array.inspect}"
|
662
|
+
#puts "SORT: #{stats.inspect}"
|
642
663
|
out << " Entry | Win Chance | Highest Place | Curr Score | Max Score | Tie Break " << "\n"
|
643
664
|
out << "--------------------+------------+---------------+------------+-----------+------------" << "\n"
|
644
|
-
|
645
|
-
chance =
|
665
|
+
stats.each do |stat|
|
666
|
+
chance = stat.times_champ.to_f * 100.0 / self.tournament_entry.picks.number_of_outcomes
|
646
667
|
out << "%19s | %10.2f | %13d | %10d | %9d | %7d " %
|
647
|
-
[
|
668
|
+
[stat.entry.name, chance, stat.min_rank, stat.entry.picks.score_against(self.tournament_entry.picks, self.scoring_strategy), stat.max_score, stat.entry.tie_breaker] << "\n"
|
648
669
|
end
|
649
670
|
out << "Possible Champions For Win" << "\n"
|
650
671
|
out << " Entry | Champion | Ocurrences | Chance " << "\n"
|
651
672
|
out << "--------------------+-----------------+---------------+---------" << "\n"
|
652
|
-
|
653
|
-
next if
|
654
|
-
|
673
|
+
stats.each do |stat|
|
674
|
+
next if stat.champs.size == 0
|
675
|
+
stat.champs.sort_by{|k,v| -v}.each_with_index do |harr, idx|
|
655
676
|
team = harr[0]
|
656
677
|
occurences = harr[1]
|
657
678
|
if idx == 0
|
658
|
-
out << "%19s | %15s | %13d | %8.2f " % [
|
679
|
+
out << "%19s | %15s | %13d | %8.2f " % [stat.entry.name, team, occurences, occurences.to_f * 100.0 / stat.times_champ] << "\n"
|
659
680
|
else
|
660
|
-
out << "%19s | %15s | %13d | %8.2f " % ['', team
|
681
|
+
out << "%19s | %15s | %13d | %8.2f " % ['', team, occurences, occurences.to_f * 100.0 / stat.times_champ] << "\n"
|
661
682
|
end
|
662
683
|
end
|
663
684
|
out << "--------------------+-----------------+---------------+---------" << "\n"
|
664
685
|
end
|
665
686
|
nil
|
666
687
|
end
|
667
|
-
|
668
688
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Holds information about an Tournament::Entry's possibilities for
|
2
|
+
# remaining games in a tournament.
|
3
|
+
class Tournament::Possibility
|
4
|
+
include Comparable
|
5
|
+
attr_accessor :times_champ, :max_score, :min_rank
|
6
|
+
attr_reader :champs, :entry
|
7
|
+
def initialize(entry)
|
8
|
+
@times_champ = 0
|
9
|
+
@max_score = 0
|
10
|
+
@min_rank = 1_000_000_000
|
11
|
+
@champs = {}
|
12
|
+
@entry = entry
|
13
|
+
end
|
14
|
+
def <=>(other)
|
15
|
+
(other.times_champ <=> self.times_champ).nonzero? ||
|
16
|
+
(self.min_rank <=> other.min_rank).nonzero? ||
|
17
|
+
other.max_score <=> self.max_score
|
18
|
+
end
|
19
|
+
end
|
@@ -31,9 +31,10 @@ class AdminController < ApplicationController
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def recap
|
34
|
+
@pool = Pool.find(params[:id])
|
34
35
|
if request.post?
|
35
36
|
begin
|
36
|
-
UserMailer.deliver_recap(
|
37
|
+
UserMailer.deliver_recap(@pool.entrants, params[:subject], params[:content], root_path(:only_path => false))
|
37
38
|
flash[:notice] = "Email was delivered."
|
38
39
|
rescue Exception => e
|
39
40
|
flash[:error] = "Email could not be delivered: #{e}"
|
@@ -1,21 +1,25 @@
|
|
1
1
|
class EntryController < ApplicationController
|
2
2
|
layout 'bracket'
|
3
3
|
before_filter :login_required
|
4
|
-
before_filter :
|
4
|
+
before_filter :resolve_entry, :only => [:edit, :show, :print, :pdf]
|
5
|
+
before_filter :check_access, :only => [:edit]
|
5
6
|
before_filter :pool_taking_edits, :only => [:edit]
|
6
7
|
include SavesPicks
|
7
8
|
include PdfHelper
|
8
9
|
|
9
|
-
def
|
10
|
+
def resolve_entry
|
10
11
|
# Resolve the entry
|
11
12
|
@entry = params[:id] ? Entry.find(params[:id]) : Entry.new({:user_id => current_user.id, :pool_id => params[:pool_id]})
|
13
|
+
end
|
12
14
|
|
15
|
+
def check_access
|
13
16
|
# Admin user
|
14
17
|
return true if current_user.has_role?(:admin)
|
15
18
|
|
16
19
|
# Check if entry being viewed belongs to current user
|
17
20
|
if current_user != @entry.user
|
18
|
-
flash[:info] = "You
|
21
|
+
flash[:info] = "You can't make edits to that entry. This has been reported to the pool administrator."
|
22
|
+
logger.warn("User #{current_user.login} tried to edit entry #{@entry.id}")
|
19
23
|
redirect_to root_path
|
20
24
|
return false
|
21
25
|
end
|
@@ -62,6 +66,7 @@ class EntryController < ApplicationController
|
|
62
66
|
end
|
63
67
|
|
64
68
|
def edit
|
69
|
+
@pool = @entry.pool.pool
|
65
70
|
if params[:reset] == 'Reset Picks'
|
66
71
|
@entry.reset
|
67
72
|
if @entry.new_record?
|
@@ -1,7 +1,61 @@
|
|
1
1
|
class ReportsController < ApplicationController
|
2
|
+
STATS_DATAFILE = File.expand_path(File.join(RAILS_ROOT, 'db', 'stats.yml')) unless defined?(STATS_DATAFILE)
|
2
3
|
layout 'report'
|
3
4
|
def show
|
4
5
|
@pool = Pool.find(params[:id])
|
6
|
+
if params[:report] == 'possibility'
|
7
|
+
possibility
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def possibility
|
12
|
+
if !File.exist?(STATS_DATAFILE)
|
13
|
+
@message = "The statistics data has not yet been generated. Please try again later or send an email to #{ADMIN_EMAIL}."
|
14
|
+
@stats = []
|
15
|
+
else
|
16
|
+
@stats = YAML.load_file(STATS_DATAFILE)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def gen_possibility
|
21
|
+
@pool = Pool.find(params[:id])
|
22
|
+
pool = @pool.pool
|
23
|
+
reporter = Proc.new do |response, output|
|
24
|
+
output.write "Starting to generate possibility statistics for #{pool.tournament_entry.picks.number_of_outcomes} possible outcomes...<br/>\n"
|
25
|
+
output.flush
|
26
|
+
stats_thread = Thread.new do
|
27
|
+
begin
|
28
|
+
Thread.current[:stats] = pool.possibility_stats do |percentage, remaining|
|
29
|
+
Thread.current[:percentage] = percentage
|
30
|
+
Thread.current[:remaining] = remaining
|
31
|
+
end
|
32
|
+
rescue Exception => e
|
33
|
+
Thread.current[:error] = e
|
34
|
+
Thread.current[:percentage] = 100
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
while stats_thread[:percentage].nil? || stats_thread[:percentage] < 100
|
39
|
+
logger.info " -> #{stats_thread[:percentage] || 'UNK'}% Complete #{stats_thread[:remaining] || 'UNK'}s remaining ... "
|
40
|
+
output.write " -> #{stats_thread[:percentage] || 'UNK'}% Complete #{stats_thread[:remaining] || 'UNK'}s remaining ... <br/>"
|
41
|
+
output.flush
|
42
|
+
sleep 10
|
43
|
+
end
|
44
|
+
|
45
|
+
output.write "Waiting for thread to end ..."
|
46
|
+
stats_thread.join
|
47
|
+
|
48
|
+
if stats_thread[:error]
|
49
|
+
output.write "Got error #{stats_thread[:error]}"
|
50
|
+
output.write "<br/>"
|
51
|
+
output.flush
|
52
|
+
else
|
53
|
+
data = stats_thread[:stats]
|
54
|
+
File.open(STATS_DATAFILE, "w") {|f| f.write YAML.dump(data)}
|
55
|
+
output.write "Generated file!"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
render :text => reporter
|
5
59
|
end
|
6
60
|
|
7
61
|
end
|
data/webgui/app/models/pool.rb
CHANGED
@@ -7,6 +7,7 @@ class Pool < ActiveRecord::Base
|
|
7
7
|
belongs_to :user
|
8
8
|
has_many :entries
|
9
9
|
has_many :user_entries, :class_name => 'Entry', :conditions => ['user_id != ?', '#{user_id}']
|
10
|
+
has_many :users, :through => :user_entries
|
10
11
|
has_many :pending_entries, :class_name => 'Entry', :conditions => ['completed = ? and user_id != ?', false, '#{user_id}']
|
11
12
|
has_one :tournament_entry, :class_name => 'Entry', :conditions => {:user_id => '#{user_id}'}
|
12
13
|
has_many :seedings
|
@@ -29,6 +30,11 @@ class Pool < ActiveRecord::Base
|
|
29
30
|
end
|
30
31
|
end
|
31
32
|
|
33
|
+
# entrants: the unique set of users having entries in this pool
|
34
|
+
def entrants
|
35
|
+
self.users.uniq
|
36
|
+
end
|
37
|
+
|
32
38
|
# True if the number of teams in the pool is 64
|
33
39
|
def ready?
|
34
40
|
return teams.size == 64
|
@@ -6,22 +6,26 @@
|
|
6
6
|
<span class="poollisthead"><%= pool.name %></span>
|
7
7
|
<small>
|
8
8
|
<% if current_user && pool.user_id == current_user.id %>
|
9
|
-
|
10
|
-
<%= link_to '[
|
11
|
-
<%= link_to '[Recap]', :controller => 'admin', :action => 'recap'%>
|
9
|
+
<%= link_to '[Tourny Bracket]', :controller => 'admin', :action => 'bracket', :id => pool.tournament_entry.id %>
|
10
|
+
<%= link_to '[Recap]', :controller => 'admin', :action => 'recap', :id => pool.id%>
|
12
11
|
<%= link_to '[Edit]', :controller => 'admin', :action => 'pool', :id => pool.id %>
|
13
12
|
<%= link_to '[Entries]', :controller => 'admin', :action => 'entries', :id => pool.id %>
|
13
|
+
<% else %>
|
14
|
+
<%= link_to '[Tourny Bracket]', :controller => 'entry', :action => 'show', :id => pool.tournament_entry.id %>
|
14
15
|
<% end %>
|
15
16
|
<%= link_to '[Leader Board]', :controller => 'reports', :action => 'show', :id => pool.id, :report => 'leader' %>
|
16
17
|
<%= link_to '[Reports]', :controller => 'reports', :action => 'show', :id => pool.id %>
|
17
18
|
</small>
|
18
19
|
<div class="poollistinfo">
|
19
20
|
<div class="poollistinfodetail">
|
20
|
-
Starts
|
21
|
+
<% if pool.starts_at < Time.zone.now %>Started<%else%>Starts<%end%>: <%= pool.starts_at.to_formatted_s(:long)%>
|
21
22
|
Pending Entries: <%= pool.pending_entries.size%>
|
22
23
|
Total Entries: <%= pool.user_entries.size%>
|
23
24
|
</div>
|
24
25
|
<div class="poollistinfodetail">
|
26
|
+
Last Update: <%=pool.updated_at.to_formatted_s(:long)%>
|
27
|
+
</div>
|
28
|
+
<div class="poollistinfodetail">
|
25
29
|
Entry Fee: $<%=pool.fee%>
|
26
30
|
</div>
|
27
31
|
<div class="poollistinfodetail">
|
@@ -35,6 +35,7 @@
|
|
35
35
|
</thead>
|
36
36
|
<tbody>
|
37
37
|
<%
|
38
|
+
db_entry_ids = @pool.user_entries.inject({}) {|h,e| h[e.name] = e.id; h}
|
38
39
|
pool.entries.sort do |e1, e2|
|
39
40
|
s1 = e1.picks.score_against(pool.tournament_entry.picks, pool.scoring_strategy)
|
40
41
|
s2 = e2.picks.score_against(pool.tournament_entry.picks, pool.scoring_strategy)
|
@@ -63,7 +64,7 @@
|
|
63
64
|
<td><%=rank_display%></td>
|
64
65
|
<td><%=total%></td>
|
65
66
|
<td><%=max%></td>
|
66
|
-
<td><%=entry.name%></td>
|
67
|
+
<td><%=link_to entry.name, :controller => 'entry', :action => 'show', :id => db_entry_ids[entry.name]%></td>
|
67
68
|
<td><%=champ.short_name%> <%=pool.tournament_entry.picks.still_alive?(champ) ? 'Y' : 'N'%></td>
|
68
69
|
<td><%=entry.tie_breaker || '-'%></td>
|
69
70
|
<% round_scores.each do |rs| %>
|
@@ -0,0 +1,45 @@
|
|
1
|
+
<% show_header = defined?(show_header) ? show_header : true %>
|
2
|
+
<% if show_header %>
|
3
|
+
<h1>Possibility Report</h1>
|
4
|
+
<ul>
|
5
|
+
<li>Total games played: <%= pool.tournament_entry.picks.games_played %></li>
|
6
|
+
<li>Pool Tie Break: <%=pool.tournament_entry.tie_breaker || '-' %></li>
|
7
|
+
<li>Number of entries: <%=pool.entries.size%></li>
|
8
|
+
<li>Number of remaining outcomes: <%=pool.tournament_entry.picks.number_of_outcomes%></li>
|
9
|
+
</ul>
|
10
|
+
<% end %>
|
11
|
+
<% if @message %>
|
12
|
+
<span class="message"><%=@message%></span>
|
13
|
+
<% end %>
|
14
|
+
<table class="report">
|
15
|
+
<thead>
|
16
|
+
<tr>
|
17
|
+
<td>Entry</td>
|
18
|
+
<td>Chance<br/>for 1st</td>
|
19
|
+
<td>Highest<br/>Place</td>
|
20
|
+
<td>Current<br/>Score</td>
|
21
|
+
<td>Max<br/>Score</td>
|
22
|
+
<td>Tie<br/>Break</td>
|
23
|
+
<td>Champions for 1st</td>
|
24
|
+
</tr>
|
25
|
+
</thead>
|
26
|
+
<tbody>
|
27
|
+
<% @stats.each do |stat| -%>
|
28
|
+
<tr class="<%=cycle('even', 'odd', :name => 'rtclass')%>">
|
29
|
+
<td><%=stat.entry.name%></td>
|
30
|
+
<td><%=stat.times_champ * 100.0/pool.tournament_entry.picks.number_of_outcomes%>%</td>
|
31
|
+
<td><%=stat.min_rank.ordinal%></td>
|
32
|
+
<td><%=stat.entry.bracket.score_against(pool.tournament_entry.picks, pool.scoring_strategy)%></td>
|
33
|
+
<td><%=stat.max_score%></td>
|
34
|
+
<td><%=stat.entry.tie_breaker%></td>
|
35
|
+
<td>
|
36
|
+
<% stat.champs.sort_by{|k,v| -v}.each do |team, occurrences| -%>
|
37
|
+
<%=team%> <%=occurrences%> (<%="%5.2f" % (occurrences.to_f * 100.0 / stat.times_champ)%>%)
|
38
|
+
<br/>
|
39
|
+
<% end -%>
|
40
|
+
|
41
|
+
</td>
|
42
|
+
</tr>
|
43
|
+
<% end -%>
|
44
|
+
</tbody>
|
45
|
+
</table>
|
@@ -1,5 +1,5 @@
|
|
1
|
-
<% if
|
2
|
-
<%= render :partial =>
|
1
|
+
<% if ['leader', 'possibility'].include?(report) %>
|
2
|
+
<%= render :partial => report, :locals => {:pool => pool, :show_header => true}%>
|
3
3
|
<br/>
|
4
4
|
<br/>
|
5
5
|
<% else %>
|
@@ -4,6 +4,12 @@
|
|
4
4
|
<li><%= link_to 'Entries', :report => 'entry'%></li>
|
5
5
|
<li><%= link_to 'Score', :report => 'score'%></li>
|
6
6
|
<li><%= link_to 'Leader', :report => 'leader'%></li>
|
7
|
+
<% if @pool.pool.tournament_entry.picks.teams_left <= 16 %>
|
8
|
+
<li><%= link_to 'Possibility', :report => 'possibility'%></li>
|
9
|
+
<% end %>
|
10
|
+
<% if @pool.pool.tournament_entry.picks.teams_left <= 4 %>
|
11
|
+
<li><%= link_to 'Final Four', :report => 'final_four'%></li>
|
12
|
+
<% end %>
|
7
13
|
</ul>
|
8
14
|
<div id="report">
|
9
15
|
<% if params[:report] -%>
|
@@ -61,27 +61,29 @@ end
|
|
61
61
|
<div style="float: left">
|
62
62
|
<table border="0">
|
63
63
|
<tr>
|
64
|
-
<td><%= f.label :name, "Entry Name"%></td><td
|
64
|
+
<td><%= f.label :name, "Entry Name"%></td><td><% if is_editable%><%= f.text_field :name %><% else %> : <%=@entry.name%><% end %></td>
|
65
65
|
</tr>
|
66
66
|
<tr>
|
67
|
-
<td><%= f.label :tie_break, 'Tie Breaker'%></td><td
|
67
|
+
<td><%= f.label :tie_break, 'Tie Breaker'%></td><td><% if is_editable%><%= f.text_field :tie_break %><%else%> : <%=@entry.tie_break || '-'%><%end%></td>
|
68
68
|
</tr>
|
69
69
|
</table>
|
70
70
|
</div>
|
71
|
-
<div style="float: left">
|
71
|
+
<div style="float: left; margin-left: 25px;">
|
72
|
+
<% if @entry.name != @pool.tournament_entry.name %>
|
72
73
|
<small>
|
73
74
|
Current Score: <%= @entry.bracket.score_against(@pool.tournament_entry.picks, @pool.scoring_strategy) %> Max. Possible Score: <%= @entry.bracket.maximum_score(@pool.tournament_entry.picks, @pool.scoring_strategy) %>
|
74
75
|
</small>
|
76
|
+
<% end %>
|
75
77
|
</div>
|
76
78
|
<input type="hidden" name="pool_id" value="<%=@entry.pool_id%>">
|
77
79
|
<input type="hidden" name="picks" id="picks" value="">
|
78
|
-
<% if is_editable %>
|
79
80
|
<div style="clear: both">
|
81
|
+
<% if is_editable %>
|
80
82
|
<input type="Submit" value="Save Changes">
|
81
83
|
<%= submit_tag 'Cancel Changes', :name => 'cancel', :confirm => 'Are you sure?'%>
|
82
84
|
<%= submit_tag 'Reset Picks', :name => 'reset', :confirm => 'Are you sure? Resetting will clear all picks and start the bracket over from scratch!'%>
|
83
|
-
</div>
|
84
85
|
<% end -%>
|
86
|
+
</div>
|
85
87
|
<% end -%>
|
86
88
|
<TABLE cellspacing=0 class="bracket">
|
87
89
|
<TR>
|