sportdb-play 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.md ADDED
@@ -0,0 +1,3 @@
1
+ ### 0.1.0 / 2012-12-03
2
+
3
+ * Everything is new. First release
data/Manifest.txt ADDED
@@ -0,0 +1,17 @@
1
+ History.md
2
+ Manifest.txt
3
+ README.md
4
+ Rakefile
5
+ lib/sportdb/play.rb
6
+ lib/sportdb/play/models/bonus_point.rb
7
+ lib/sportdb/play/models/bonus_question.rb
8
+ lib/sportdb/play/models/bonus_round.rb
9
+ lib/sportdb/play/models/bonus_tip.rb
10
+ lib/sportdb/play/models/game.rb
11
+ lib/sportdb/play/models/play.rb
12
+ lib/sportdb/play/models/point.rb
13
+ lib/sportdb/play/models/pool.rb
14
+ lib/sportdb/play/models/tip.rb
15
+ lib/sportdb/play/models/user.rb
16
+ lib/sportdb/play/schema.rb
17
+ lib/sportdb/play/version.rb
data/README.md ADDED
@@ -0,0 +1,16 @@
1
+ # sport.db-play
2
+
3
+ Open sports database (sport.db) plugin for plays (predictions,
4
+ betting pools, etc.)
5
+
6
+ TBD
7
+
8
+
9
+ ## License
10
+
11
+ The `sport.db-play` scripts are dedicated to the public domain.
12
+ Use it as you please with no restrictions whatsoever.
13
+
14
+ ## Questions? Comments?
15
+
16
+ Send them along to the [Open Sports Database & Friends Forum/Mailing List](http://groups.google.com/group/opensport). Thanks!
data/Rakefile ADDED
@@ -0,0 +1,30 @@
1
+ require 'hoe'
2
+ require './lib/sportdb/play/version.rb'
3
+
4
+ ## NB: plugin (hoe-manifest) not required; just used for future testing/development
5
+ Hoe::plugin :manifest # more options for manifests (in the future; not yet)
6
+
7
+
8
+ Hoe.spec 'sportdb-play' do
9
+
10
+ self.version = SportDB::Play::VERSION
11
+
12
+ self.summary = 'sportdb plugin for plays (predictions, betting pool, etc.)'
13
+ self.description = summary
14
+
15
+ self.urls = ['http://geraldb.github.com/sport.db']
16
+
17
+ self.author = 'Gerald Bauer'
18
+ self.email = 'opensport@googlegroups.com'
19
+
20
+
21
+ ## soft deps (dependencies)
22
+ ## -- sportdb gem must be installed already
23
+
24
+ self.licenses = ['Public Domain']
25
+
26
+ self.spec_extras = {
27
+ :required_ruby_version => '>= 1.9.2'
28
+ }
29
+
30
+ end
@@ -0,0 +1,39 @@
1
+ ## NB: do NOT require sportdb (avoid circular loading)
2
+ #### require 'sportdb'
3
+
4
+
5
+ require 'sportdb/play/version'
6
+
7
+ require 'sportdb/play/schema'
8
+ require 'sportdb/play/models/bonus_point'
9
+ require 'sportdb/play/models/bonus_question'
10
+ require 'sportdb/play/models/bonus_round'
11
+ require 'sportdb/play/models/bonus_tip'
12
+ require 'sportdb/play/models/game'
13
+ require 'sportdb/play/models/play'
14
+ require 'sportdb/play/models/point'
15
+ require 'sportdb/play/models/pool'
16
+ require 'sportdb/play/models/tip'
17
+ require 'sportdb/play/models/user'
18
+
19
+
20
+ module SportDB::Play
21
+
22
+ def self.banner
23
+ "sportdb-play #{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
24
+ end
25
+
26
+ ## cut off folders lib(#1)/sportdb(#2) to get to root
27
+ def self.root
28
+ "#{File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )}"
29
+ end
30
+
31
+ def self.create
32
+ CreateDB.up
33
+ end
34
+
35
+ end # module SportDB::Play
36
+
37
+
38
+ ## say hello
39
+ puts SportDB::Play.banner
@@ -0,0 +1,17 @@
1
+
2
+ ## NB: just use namespace SportDB::Models (not SportDB::Models::Play)
3
+
4
+ module SportDB::Models
5
+
6
+
7
+ class BonusPoint < ActiveRecord::Base
8
+
9
+ belongs_to :user
10
+ belongs_to :pool
11
+ belongs_to :round, :class_name => 'BonusRound', :foreign_key => 'round_id'
12
+
13
+ end # class BonusPoint
14
+
15
+
16
+
17
+ end # module SportDB::Models
@@ -0,0 +1,16 @@
1
+
2
+ ## NB: just use namespace SportDB::Models (not SportDB::Models::Play)
3
+
4
+ module SportDB::Models
5
+
6
+
7
+ class BonusQuestion < ActiveRecord::Base
8
+
9
+ self.table_name = 'bonus_questions'
10
+
11
+ has_many :tips, :class_name => 'BonusTip', :foreign_key => 'question_id'
12
+
13
+ end # class BonusQuestion
14
+
15
+
16
+ end # module SportDB::Models
@@ -0,0 +1,15 @@
1
+
2
+ ## NB: just use namespace SportDB::Models (not SportDB::Models::Play)
3
+
4
+ module SportDB::Models
5
+
6
+ class BonusRound < ActiveRecord::Base
7
+
8
+ self.table_name = 'bonus_rounds'
9
+
10
+ has_many :questions, :order => 'pos', :class_name => 'BonusQuestion', :foreign_key => 'round_id'
11
+ belongs_to :pool
12
+
13
+ end # class BonusRound
14
+
15
+ end # module SportDB::Models
@@ -0,0 +1,16 @@
1
+
2
+ ## NB: just use namespace SportDB::Models (not SportDB::Models::Play)
3
+
4
+ module SportDB::Models
5
+
6
+
7
+ class BonusTip < ActiveRecord::Base
8
+
9
+ self.table_name = 'bonus_tips'
10
+
11
+ belongs_to :user
12
+
13
+ end # class BonusTip
14
+
15
+
16
+ end # module SportDB::Models
@@ -0,0 +1,91 @@
1
+
2
+
3
+
4
+ module SportDB::Models
5
+
6
+
7
+ ### NB: extend Game model from sport.db gem
8
+
9
+ class Game
10
+
11
+ has_many :tips
12
+
13
+ ##############
14
+ ## move to sport.db gem ? why? why not?
15
+
16
+ def job_running!
17
+ @job_running = true
18
+ end
19
+
20
+ def job_done!
21
+ @job_running = false
22
+ end
23
+
24
+ def job_running?
25
+ (@job_running ||= false) == true
26
+ end
27
+
28
+ # move end
29
+ ##########
30
+
31
+
32
+ ###
33
+ ## keep style helpers here? why? why not?
34
+
35
+
36
+ def tip_1_style_class
37
+ toto12x == '1' ? ' bingo ' : ' '
38
+ end
39
+
40
+ def tip_2_style_class
41
+ toto12x == '2' ? ' bingo ' : ' '
42
+ end
43
+
44
+ def tip_x_style_class
45
+ toto12x == 'X' ? ' bingo ' : ' '
46
+ end
47
+
48
+
49
+ ############ some methods for stats
50
+
51
+ def complete_tips
52
+ tips.where( 'toto12x is not null' )
53
+ end
54
+
55
+ def complete_tips_1
56
+ tips.where( 'toto12x is not null' ).where( :toto12x => '1' ).order( 'score1 desc,score2 desc')
57
+ end
58
+
59
+ def complete_tips_2
60
+ tips.where( 'toto12x is not null' ).where( :toto12x => '2' ).order( 'score2 desc,score1 desc')
61
+ end
62
+
63
+ def complete_tips_x
64
+ tips.where( 'toto12x is not null' ).where( :toto12x => 'X' ).order( 'score1 desc,score2 desc')
65
+ end
66
+
67
+
68
+ def incomplete_tips
69
+ tips.where( 'toto12x is null' )
70
+ end
71
+
72
+ def tip_1_count
73
+ complete_tips.where( :toto12x => '1' ).count()
74
+ end
75
+
76
+ def tip_2_count
77
+ complete_tips.where( :toto12x => '2' ).count()
78
+ end
79
+
80
+ def tip_x_count
81
+ complete_tips.where( :toto12x => 'X' ).count()
82
+ end
83
+
84
+ def tip_12x_count
85
+ complete_tips.count()
86
+ end
87
+
88
+ end # class Game
89
+
90
+
91
+ end # module SportDB::Models
@@ -0,0 +1,59 @@
1
+
2
+ ## NB: just use namespace SportDB::Models (not SportDB::Models::Play)
3
+
4
+ module SportDB::Models
5
+
6
+ class Play < ActiveRecord::Base
7
+
8
+ belongs_to :user
9
+ belongs_to :pool
10
+
11
+ belongs_to :team1, :class_name => 'Team', :foreign_key => 'team1_id'
12
+ belongs_to :team2, :class_name => 'Team', :foreign_key => 'team2_id'
13
+ belongs_to :team3, :class_name => 'Team', :foreign_key => 'team3_id'
14
+
15
+
16
+ def job_running!
17
+ @job_running = true
18
+ end
19
+
20
+ def job_done!
21
+ @job_running = false
22
+ end
23
+
24
+ def job_running?
25
+ (@job_running ||= false) == true
26
+ end
27
+
28
+ def public?
29
+ return true if pool.public?
30
+
31
+ # team1, team2 public after kickoff of event
32
+ ## use past?
33
+ Time.now.utc > pool.event.start_at.utc
34
+ end
35
+
36
+
37
+ ## todo/fix: can it be done w/ a has_many macro and a condition?
38
+ def tips
39
+ recs = Tip.where( :pool_id => pool_id, :user_id => user_id ).all
40
+ recs
41
+ end
42
+
43
+ ## todo/fix: can it be done w/ a has_many macro and a condition?
44
+ def complete_rankings # fix rename to points and remove points column from play table??
45
+ recs = Point.where( :pool_id => pool_id, :user_id => user_id ).joins( :round ).order('rounds.pos').all
46
+ recs
47
+ end
48
+
49
+ def export?
50
+ # check if user entered some data
51
+ # - do NOT export nil records (all teams blank)
52
+
53
+ (team1_id.blank? && team2_id.blank? && team3_id.blank?)==false
54
+ end
55
+
56
+ end # class Play
57
+
58
+
59
+ end # module SportDB::Models
@@ -0,0 +1,55 @@
1
+ # encoding: utf-8
2
+
3
+ ## NB: just use namespace SportDB::Models (not SportDB::Models::Play)
4
+
5
+ module SportDB::Models
6
+
7
+
8
+ class Point < ActiveRecord::Base
9
+
10
+ belongs_to :user
11
+ belongs_to :pool
12
+ belongs_to :round
13
+
14
+ def round_pts_str
15
+ buf = ''
16
+ round_pts.times { buf << '♣' }
17
+ buf
18
+ end
19
+
20
+ def total_pts_str
21
+ buf = ''
22
+ total_pts.times { buf << '♣' }
23
+ buf
24
+ end
25
+
26
+
27
+ def diff_total_pos_style_class
28
+ if diff_total_pos > 0
29
+ ' ranking-up '
30
+ elsif diff_total_pos < 0
31
+ ' ranking-down '
32
+ else # == 0
33
+ ' '
34
+ end
35
+ end
36
+
37
+ def diff_total_pos_str
38
+ ## todo: diff 2 use ⇑⇑
39
+ # diff 3 use ⇑⇑⇑
40
+ # diff 4 use ⇑⇑⇑⇑
41
+ # etc.
42
+
43
+ if diff_total_pos > 0
44
+ "⇑#{diff_total_pos}"
45
+ elsif diff_total_pos < 0
46
+ "⇓#{diff_total_pos.abs}"
47
+ else # == 0
48
+ ""
49
+ end
50
+ end
51
+
52
+ end # class Point
53
+
54
+
55
+ end # module SportDB::Models
@@ -0,0 +1,36 @@
1
+ # encoding: utf-8
2
+
3
+ ## NB: just use namespace SportDB::Models (not SportDB::Models::Play)
4
+
5
+ module SportDB::Models
6
+
7
+
8
+ class Pool < ActiveRecord::Base
9
+
10
+ belongs_to :user # is owner/admin/manager
11
+
12
+ has_many :bonus_rounds
13
+
14
+ has_many :plays # pools_users join table
15
+
16
+ ## rename to users from players??
17
+ has_many :players, :through => :plays, :source => :user
18
+
19
+ belongs_to :event
20
+
21
+
22
+ def full_title
23
+ #### "#{title} #{event.title}#{fix? ? ' Fix' : ''}"
24
+ "#{title} #{event.title}"
25
+ end
26
+
27
+
28
+ def team3? # tip for 3rd place?
29
+ event.team3 == true
30
+ end
31
+
32
+ end # class Pool
33
+
34
+
35
+ end # module SportDB::Models
36
+
@@ -0,0 +1,247 @@
1
+ # encoding: utf-8
2
+
3
+
4
+ ## NB: just use namespace SportDB::Models (not SportDB::Models::Play)
5
+
6
+ module SportDB::Models
7
+
8
+
9
+ class Tip < ActiveRecord::Base
10
+
11
+ belongs_to :user
12
+ belongs_to :pool
13
+ belongs_to :game
14
+
15
+ before_save :calc_toto12x
16
+
17
+ ## todo: rename to find_by_play_and_game ????
18
+ def self.find_by_user_and_pool_and_game( user_arg, pool_arg, game_arg )
19
+ recs = self.where( :user_id => user_arg.id, :pool_id => pool_arg.id, :game_id => game_arg.id )
20
+ recs.first
21
+ end
22
+
23
+
24
+ def export?
25
+ # check if user entered some data
26
+ # - do NOT export nil records (all scores blank)
27
+
28
+ (score1.blank? && score2.blank? && score3.blank? && score4.blank? && score5.blank? && score6.blank?)==false
29
+ end
30
+
31
+
32
+ def calc_points_worker
33
+ pts = 0
34
+
35
+ if(((game.score1 == game.score2) && (score1 == score2)) ||
36
+ ((game.score1 > game.score2) && (score1 > score2)) ||
37
+ ((game.score1 < game.score2) && (score1 < score2)))
38
+ pts += 1
39
+ end
40
+
41
+ # tordifferenz richtig? todo: auch fuer unentschieden???
42
+ if((game.score1-game.score2) == (score1-score2))
43
+ ## nb: for now now points for tordifferenz
44
+ ### pts +=1
45
+ end
46
+
47
+ # ergebnis richtig?
48
+ if game.score1 == score1 && game.score2 == score2
49
+ pts += 2
50
+ end
51
+
52
+ ## check n.V.
53
+
54
+ if (game.score3.present? && game.score4.present? && score3.present? && score4.present?)
55
+
56
+ if(((game.score3 == game.score4) && (score3 == score4)) ||
57
+ ((game.score3 > game.score4) && (score3 > score4)) ||
58
+ ((game.score3 < game.score4) && (score3 < score4)))
59
+ pts += 1
60
+ end
61
+ end
62
+
63
+ ## check i.E.
64
+
65
+ if (game.score5.present? && game.score6.present? && score5.present? && score6.present?)
66
+
67
+ if(((game.score5 > game.score6) && (score5 > score6)) ||
68
+ ((game.score5 < game.score6) && (score5 < score6)))
69
+ pts += 1
70
+ end
71
+ end
72
+
73
+ pts
74
+ end
75
+
76
+ def calc_points
77
+ pts = 0
78
+ pts = calc_points_worker() if complete?
79
+ pts
80
+ end
81
+
82
+ def calc_points_str
83
+ buf = ''
84
+ calc_points.times { buf << '♣' }
85
+ buf
86
+ end
87
+
88
+
89
+ ## todo: use tip-fail, tip-bingo, etc.
90
+
91
+ def bingo_style_class
92
+ if incomplete?
93
+ # show missing label for upcoming games only
94
+ if game.over?
95
+ ''
96
+ elsif score1.blank? || score2.blank?
97
+ 'missing' # missing tip scores
98
+ else
99
+ '' # tip scores filled in; game scores not yet available
100
+ end
101
+ else
102
+ pts = calc_points()
103
+ if pts == 0
104
+ 'fail'
105
+ elsif pts == 1
106
+ 'bingo'
107
+ elsif pts == 2
108
+ 'bingoo'
109
+ elsif pts == 3
110
+ 'bingooo'
111
+ else
112
+ '' # unknown state; return empty (css) class
113
+ end
114
+ end
115
+ end
116
+
117
+ # like bingo_style_class but only for pts>0 (that is not for fail)
118
+ def bingo_win_style_class
119
+ if incomplete?
120
+ # show missing label for upcoming games only
121
+ if game.over?
122
+ ''
123
+ elsif score1.blank? || score2.blank?
124
+ 'missing' # missing tip scores
125
+ else
126
+ '' # tip scores filled in; game scores not yet available
127
+ end
128
+ else
129
+ pts = calc_points()
130
+ if pts == 0
131
+ ''
132
+ elsif pts == 1
133
+ 'bingo'
134
+ elsif pts == 2
135
+ 'bingoo'
136
+ elsif pts == 3
137
+ 'bingooo'
138
+ else
139
+ '' # unknown state; return empty (css) class
140
+ end
141
+ end
142
+ end
143
+
144
+ def bingo_text
145
+ if incomplete?
146
+ # show missing label for upcoming games only
147
+ if game.over?
148
+ ''
149
+ elsif score1.blank? || score2.blank?
150
+ '?' # missing tip scores
151
+ else
152
+ '' # tip scores filled in; game scores not yet available
153
+ end
154
+ else
155
+ pts = calc_points()
156
+ if pts == 0
157
+ ### FIX: - make extendable how?
158
+ ### if game.calc? && (game.team1_id != calc_team1_id || game.team2_id != calc_team2_id )
159
+ ## ## sorry, wrong teams - show team1 n team2 tags
160
+ ## "× Leider, nein. Richtige Spielpaarung (#{game.team1.tag}) - (#{game.team2.tag})."
161
+ ## else
162
+ "× Leider, nein. Richtiger Tipp #{game.toto12x}." # return 1,2,X from game
163
+ ## end
164
+ elsif pts == 1
165
+ '♣ 1 Pkt - Ja!'
166
+ elsif pts == 2
167
+ '♣♣ 2 Pkte - Jaaa!'
168
+ elsif pts == 3
169
+ '♣♣♣ 3 Pkte - Jaaaaa!'
170
+ else
171
+ '' # unknown state; return empty (css) class
172
+ end
173
+ end
174
+ end
175
+
176
+ def calc_toto12x
177
+ if score1.nil? || score2.nil?
178
+ self.toto12x = nil
179
+ elsif score1 == score2
180
+ self.toto12x = 'X'
181
+ elsif score1 > score2
182
+ self.toto12x = '1'
183
+ elsif score1 < score2
184
+ self.toto12x = '2'
185
+ end
186
+ end
187
+
188
+
189
+ def complete?
190
+ game.score1.present? && game.score2.present? && score1.present? && score2.present?
191
+ end
192
+
193
+ def incomplete?
194
+ complete? == false
195
+ end
196
+
197
+ def locked?
198
+ ### FIX: make extendable (pool.fix? only in addon??)
199
+ ### return true if pool.fix? && pool.locked? # if fix pool is locked all games are (automatically) locked too
200
+ return true if pool.locked?
201
+ game.locked?
202
+ end
203
+
204
+ def public?
205
+ return true if pool.public?
206
+ return true if locked? # if fix pool is locked or game (make tip public)
207
+
208
+ ## todo: use builtin utc.past? method ???
209
+ Time.now.utc > game.play_at.utc
210
+ end
211
+
212
+ def score_str
213
+ ## fix: use new game.toto12x instead of game.over ??? (doesn't depend on time)
214
+ if score1.blank? && score2.blank? && game.over?
215
+ # return no data marker (e.g. middot) if not touched by user
216
+ '·'
217
+ else
218
+ str = ''
219
+ if score5.present? && score6.present? # im Elfmeterschiessen i.E.?
220
+ str = "#{score1_str} : #{score2_str} / #{score3} : #{score4} n.V. / #{score5} : #{score6} i.E."
221
+ elsif score3.present? && score4.present? # nach Verlaengerung n.V.?
222
+ str = "#{score1_str} : #{score2_str} / #{score3} : #{score4} n.V."
223
+ else
224
+ str = "#{score1_str} : #{score2_str}"
225
+ end
226
+
227
+ ##### FIX: make extendable!!
228
+ # if calc
229
+ # str_calc_team1 = calc_team1_id.blank? ? '' : calc_team1.tag
230
+ # str_calc_team2 = calc_team2_id.blank? ? '' : calc_team2.tag
231
+ # str = "(#{str_calc_team1}) #{str} (#{str_calc_team2})"
232
+ # end
233
+ str
234
+ end
235
+ end
236
+
237
+ def score1_str
238
+ if score1.blank? then '?' else score1.to_s end
239
+ end
240
+
241
+ def score2_str
242
+ if score2.blank? then '?' else score2.to_s end
243
+ end
244
+
245
+ end # class Tip
246
+
247
+ end # module SportDB::Models
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+
4
+ ## NB: just use namespace SportDB::Models (not SportDB::Models::Play)
5
+
6
+ module SportDB::Models
7
+
8
+
9
+ class User < ActiveRecord::Base
10
+
11
+ has_many :pools
12
+ has_many :tips
13
+ has_many :plays
14
+
15
+
16
+ end # class User
17
+
18
+ end # module SportDB::Models
@@ -0,0 +1,158 @@
1
+ module SportDB::Play
2
+
3
+ class CreateDB
4
+
5
+ ## make models available in sportdb module by default with namespace
6
+ # e.g. lets you use Team instead of Models::Team
7
+ include SportDB::Models
8
+
9
+
10
+ def self.up
11
+
12
+ ActiveRecord::Schema.define do
13
+
14
+ change_table :games do |t|
15
+ t.boolean :locked, :null => false, :default => false
16
+ end
17
+
18
+ #####################################
19
+ ## new tables / create tables
20
+ ####################################
21
+
22
+ create_table :users do |t|
23
+ t.string :key, :null => false # import/export key
24
+ t.timestamps
25
+ end
26
+
27
+ add_index :users, :key, :unique => true
28
+
29
+
30
+ create_table :pools do |t|
31
+ t.references :event, :null => false
32
+ t.string :title, :null => false
33
+ t.references :user, :null => false # owner/manager/admin of pool
34
+ t.boolean :public, :null => false, :default => true # make all tips public (not private/secret)
35
+ t.boolean :locked, :null => false, :default => false
36
+ t.string :key # import/export key
37
+ t.timestamps
38
+ end
39
+
40
+ add_index :pools, :key, :unique => true
41
+ add_index :pools, :event_id
42
+ add_index :pools, :user_id
43
+
44
+
45
+ create_table :plays do |t|
46
+ t.references :user, :null => false
47
+ t.references :pool, :null => false
48
+ t.references :team1 # winner (1st)
49
+ t.references :team2 # runnerup (2nd)
50
+ t.references :team3 # 2n runnerup (3nd)
51
+
52
+ t.integer :total_pts, :null => false, :default => 0 # cached total player points
53
+ t.integer :total_pos, :null => false, :default => 0 # cached total ranking/position
54
+
55
+ t.timestamps
56
+ end
57
+
58
+ add_index :plays, [:user_id,:pool_id], :unique => true # enforce only one play per user and pool
59
+ add_index :plays, :user_id
60
+ add_index :plays, :pool_id
61
+
62
+
63
+ create_table :tips do |t|
64
+ t.references :user, :null => false
65
+ t.references :pool, :null => false
66
+ t.references :game, :null => false
67
+ t.integer :score1
68
+ t.integer :score2
69
+ t.integer :score3 # verlaengerung (opt)
70
+ t.integer :score4
71
+ t.integer :score5 # elfmeter (opt)
72
+ t.integer :score6
73
+ t.string :toto12x # 1,2,X,nil calculate on save
74
+
75
+ t.timestamps
76
+ end
77
+
78
+ add_index :tips, [:user_id,:pool_id,:game_id], :unique => true
79
+ add_index :tips, :user_id
80
+ add_index :tips, :pool_id
81
+ add_index :tips, :game_id
82
+
83
+
84
+
85
+ create_table :points do |t|
86
+ t.references :user, :null => false
87
+ t.references :pool, :null => false
88
+ t.references :round, :null => false
89
+
90
+ t.integer :round_pts, :null => false, :default => 0 # points for this round
91
+ t.integer :round_pos, :null => false, :default => 0 # ranking/position for this round
92
+
93
+ t.integer :total_pts, :null => false, :default => 0 # total points up to(*) this round (including) (* rounds sorted by pos)
94
+ t.integer :total_pos, :null => false, :default => 0 # ranking/position for points up to this round
95
+
96
+ t.integer :diff_total_pos, :null => false, :default => 0
97
+
98
+ t.timestamps
99
+ end
100
+
101
+ add_index :points, [:user_id,:pool_id,:round_id], :unique => true
102
+
103
+
104
+
105
+ create_table :bonus_rounds do |t|
106
+ t.references :pool, :null => false
107
+ t.string :title, :null => false
108
+ t.integer :pos, :null => false
109
+ t.timestamps
110
+ end
111
+
112
+ create_table :bonus_questions do |t|
113
+ t.references :round, :null => false
114
+ t.string :title, :null => false
115
+ t.integer :pos, :null => false
116
+ t.timestamps
117
+ end
118
+
119
+ create_table :bonus_answers do |t|
120
+ # to be done
121
+ t.timestamps
122
+ end
123
+
124
+ create_table :bonus_tips do |t|
125
+ t.references :user, :null => false
126
+ t.references :question, :null => false
127
+ t.integer :pts , :null => false, :default => 0
128
+ t.timestamps
129
+ end
130
+
131
+ create_table :bonus_points do |t|
132
+ t.references :user, :null => false
133
+ t.references :pool, :null => false ## todo: check if we keep reference to pool (because round_id depends itself on pool)
134
+ t.references :round, :null => false # nb: is bonus_round_id
135
+
136
+ t.integer :round_pts, :null => false, :default => 0 # points for this round
137
+ t.integer :round_pos, :null => false, :default => 0 # ranking/position for this round
138
+
139
+ t.integer :total_pts, :null => false, :default => 0 # total points up to(*) this round (including) (* rounds sorted by pos)
140
+ t.integer :total_pos, :null => false, :default => 0 # ranking/position for points up to this round
141
+
142
+ t.integer :diff_total_pos, :null => false, :default => 0
143
+
144
+ t.timestamps
145
+ end
146
+
147
+ add_index :bonus_points, [:user_id,:pool_id,:round_id], :unique => true
148
+
149
+ end # block Schema.define
150
+
151
+ Prop.create!( key: 'db.schema.sport.play.version', value: SportDB::Play::VERSION )
152
+
153
+ end # method self.up
154
+
155
+ end # class CreateDB
156
+
157
+
158
+ end # module SportDB::Play
@@ -0,0 +1,7 @@
1
+
2
+ module SportDB ; end # forward reference (for hoe require)
3
+
4
+ module SportDB::Play
5
+ VERSION = '0.1.0'
6
+ end
7
+
metadata ADDED
@@ -0,0 +1,113 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sportdb-play
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Gerald Bauer
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-12-03 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rdoc
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ hash: 19
29
+ segments:
30
+ - 3
31
+ - 10
32
+ version: "3.10"
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: hoe
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ hash: 1
44
+ segments:
45
+ - 3
46
+ - 3
47
+ version: "3.3"
48
+ type: :development
49
+ version_requirements: *id002
50
+ description: sportdb plugin for plays (predictions, betting pool, etc.)
51
+ email: opensport@googlegroups.com
52
+ executables: []
53
+
54
+ extensions: []
55
+
56
+ extra_rdoc_files:
57
+ - Manifest.txt
58
+ files:
59
+ - History.md
60
+ - Manifest.txt
61
+ - README.md
62
+ - Rakefile
63
+ - lib/sportdb/play.rb
64
+ - lib/sportdb/play/models/bonus_point.rb
65
+ - lib/sportdb/play/models/bonus_question.rb
66
+ - lib/sportdb/play/models/bonus_round.rb
67
+ - lib/sportdb/play/models/bonus_tip.rb
68
+ - lib/sportdb/play/models/game.rb
69
+ - lib/sportdb/play/models/play.rb
70
+ - lib/sportdb/play/models/point.rb
71
+ - lib/sportdb/play/models/pool.rb
72
+ - lib/sportdb/play/models/tip.rb
73
+ - lib/sportdb/play/models/user.rb
74
+ - lib/sportdb/play/schema.rb
75
+ - lib/sportdb/play/version.rb
76
+ homepage: http://geraldb.github.com/sport.db
77
+ licenses:
78
+ - Public Domain
79
+ post_install_message:
80
+ rdoc_options:
81
+ - --main
82
+ - README.md
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ hash: 55
91
+ segments:
92
+ - 1
93
+ - 9
94
+ - 2
95
+ version: 1.9.2
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ hash: 3
102
+ segments:
103
+ - 0
104
+ version: "0"
105
+ requirements: []
106
+
107
+ rubyforge_project: sportdb-play
108
+ rubygems_version: 1.8.24
109
+ signing_key:
110
+ specification_version: 3
111
+ summary: sportdb plugin for plays (predictions, betting pool, etc.)
112
+ test_files: []
113
+