diff --git a/pyfpdb/AlchemyMappings.py b/pyfpdb/AlchemyMappings.py index c2e088a9..dfb255b4 100644 --- a/pyfpdb/AlchemyMappings.py +++ b/pyfpdb/AlchemyMappings.py @@ -34,8 +34,8 @@ class Gametype(MappedBase): @staticmethod def get_or_create(session, siteId, gametype): map = zip( - ['type', 'base', 'category', 'limitType', 'smallBlind', 'bigBlind', 'smallBet', 'bigBet'], - ['type', 'base', 'category', 'limitType', 'sb', 'bb', 'dummy', 'dummy', ]) + ['type', 'base', 'category', 'limitType', 'smallBlind', 'bigBlind', 'smallBet', 'bigBet', 'currency'], + ['type', 'base', 'category', 'limitType', 'sb', 'bb', 'dummy', 'dummy', 'currency']) gametype = dict([(new, gametype.get(old)) for new, old in map ]) hilo = "h" @@ -152,7 +152,8 @@ class HandInternal(DerivedStats): 'speed': 'speed', 'maxSeats': 'maxseats', 'knockout': 'isKO', - 'rebuyOrAddon': 'isRebuy', + 'rebuy': 'isRebuy', + 'addOn': 'isAddOn', 'headsUp': 'isHU', 'shootout': 'isShootout', 'matrix': 'isMatrix', @@ -185,7 +186,7 @@ class HandInternal(DerivedStats): # fetch and update tourney players for hp in self.handPlayers: - tp = TourneyPlayer.get_or_create(session, tour.id, hp.playerId) + tp = TourneysPlayer.get_or_create(session, tour.id, hp.playerId) # FIXME: other TourneysPlayers should be added here session.flush() @@ -340,18 +341,20 @@ class HandPlayer(MappedBase): class Site(object): """Class reflecting Players db table""" INITIAL_DATA = [ - (1 , 'Full Tilt Poker','USD'), - (2 , 'PokerStars', 'USD'), - (3 , 'Everleaf', 'USD'), - (4 , 'Win2day', 'USD'), - (5 , 'OnGame', 'USD'), - (6 , 'UltimateBet', 'USD'), - (7 , 'Betfair', 'USD'), - (8 , 'Absolute', 'USD'), - (9 , 'PartyPoker', 'USD'), - (10, 'Partouche', 'EUR'), + (1 , 'Full Tilt Poker','FT'), + (2 , 'PokerStars', 'PS'), + (3 , 'Everleaf', 'EV'), + (4 , 'Win2day', 'W2'), + (5 , 'OnGame', 'OG'), + (6 , 'UltimateBet', 'UB'), + (7 , 'Betfair', 'BF'), + (8 , 'Absolute', 'AB'), + (9 , 'PartyPoker', 'PP'), + (10, 'Partouche', 'PA'), + (11, 'Carbon', 'CA'), + (12, 'PKR', 'PK'), ] - INITIAL_DATA_KEYS = ('id', 'name', 'currency') + INITIAL_DATA_KEYS = ('id', 'name', 'code') INITIAL_DATA_DICTS = [ dict(zip(INITIAL_DATA_KEYS, datum)) for datum in INITIAL_DATA ] @@ -372,7 +375,7 @@ class Tourney(MappedBase): class TourneyType(MappedBase): - """Class reflecting TourneysType db table""" + """Class reflecting TourneyType db table""" @classmethod def get_or_create(cls, session, **kwargs): @@ -380,12 +383,12 @@ class TourneyType(MappedBase): Required kwargs: buyin fee speed maxSeats knockout - rebuyOrAddon headsUp shootout matrix sng + rebuy addOn headsUp shootout matrix sng currency """ return get_or_create(cls, session, **kwargs)[0] -class TourneyPlayer(MappedBase): +class TourneysPlayer(MappedBase): """Class reflecting TourneysPlayers db table""" @classmethod @@ -437,7 +440,7 @@ mapper (Gametype, gametypes_table, properties={ }) mapper (Player, players_table, properties={ 'playerHands': relation(HandPlayer, backref='player'), - 'playerTourney': relation(TourneyPlayer, backref='player'), + 'playerTourney': relation(TourneysPlayer, backref='player'), }) mapper (Site, sites_table, properties={ 'gametypes': relation(Gametype, backref = 'site'), @@ -455,7 +458,7 @@ mapper (Tourney, tourneys_table) mapper (TourneyType, tourney_types_table, properties={ 'tourneys': relation(Tourney, backref='type'), }) -mapper (TourneyPlayer, tourneys_players_table) +mapper (TourneysPlayer, tourneys_players_table) class LambdaKeyDict(defaultdict): """Operates like defaultdict but passes key argument to the factory function""" diff --git a/pyfpdb/AlchemyTables.py b/pyfpdb/AlchemyTables.py index 3165a480..d78fb160 100644 --- a/pyfpdb/AlchemyTables.py +++ b/pyfpdb/AlchemyTables.py @@ -29,6 +29,7 @@ autorates_table = Table('Autorates', metadata, gametypes_table = Table('Gametypes', metadata, Column('id', SmallInteger, primary_key=True), Column('siteId', SmallInteger, ForeignKey("Sites.id"), nullable=False), # SMALLINT + Column('currency', String(4), nullable=False), # varchar(4) NOT NULL Column('type', String(4), nullable=False), # char(4) NOT NULL Column('base', String(4), nullable=False), # char(4) NOT NULL Column('category', String(9), nullable=False), # varchar(9) NOT NULL @@ -338,7 +339,7 @@ settings_table = Table('Settings', metadata, sites_table = Table('Sites', metadata, Column('id', SmallInteger, primary_key=True), Column('name', String(32), nullable=False), # varchar(32) NOT NULL - Column('currency', String(3), nullable=False), # char(3) NOT NULL + Column('code', String(2), nullable=False), # char(2) NOT NULL mysql_charset='utf8', mysql_engine='InnoDB', ) @@ -352,17 +353,11 @@ tourneys_table = Table('Tourneys', metadata, Column('prizepool', Integer), # INT NOT NULL Column('tourStartTime', DateTime), # DATETIME NOT NULL Column('tourEndTime', DateTime), # DATETIME - Column('buyinChips', Integer), # INT Column('tourneyName', String(40)), # varchar(40) # Mask use : 1=Positionnal Winnings|2=Match1|4=Match2|...|pow(2,n)=Matchn Column('matrixIdProcessed',SmallInteger, default=0), # TINYINT UNSIGNED DEFAULT 0 - Column('rebuyChips', Integer, default=0), # INT DEFAULT 0 - Column('addonChips', Integer, default=0), # INT DEFAULT 0 - Column('rebuyAmount', MoneyColumn, default=0), # INT DEFAULT 0 - Column('addonAmount', MoneyColumn, default=0), # INT DEFAULT 0 - Column('totalRebuys', Integer, default=0), # INT DEFAULT 0 - Column('totalAddons', Integer, default=0), # INT DEFAULT 0 - Column('koBounty', Integer, default=0), # INT DEFAULT 0 + Column('totalRebuyCount', Integer, default=0), # INT DEFAULT 0 + Column('totalAddOnCount', Integer, default=0), # INT DEFAULT 0 Column('comment', Text), # TEXT Column('commentTs', DateTime), # DATETIME mysql_charset='utf8', @@ -374,24 +369,35 @@ Index('siteTourneyNo', tourneys_table.c.siteTourneyNo, tourneys_table.c.tourneyT tourney_types_table = Table('TourneyTypes', metadata, Column('id', Integer, primary_key=True), Column('siteId', SmallInteger, ForeignKey("Sites.id"), nullable=False), + Column('currency', String(4), nullable=False), # varchar(4) NOT NULL Column('buyin', Integer, nullable=False), # INT NOT NULL - Column('fee', Integer, nullable=False, default=0), # INT NOT NULL + Column('fee', Integer, nullable=False), # INT NOT NULL + Column('buyInChips', Integer, nullable=False), # INT NOT NULL Column('maxSeats', Boolean, nullable=False, default=-1), # INT NOT NULL DEFAULT -1 + Column('rebuy', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False + Column('rebuyCost', Integer), # INT + Column('rebuyChips', Integer), # INT + Column('addOn', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False + Column('addOnCost', Integer), # INT + Column('addOnChips', Integer), # INT Column('knockout', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False - Column('rebuyOrAddon', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False + Column('koBounty', Integer), # INT Column('speed', String(10)), # varchar(10) Column('headsUp', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False Column('shootout', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False Column('matrix', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False Column('sng', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False + Column('satellite', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False + Column('doubleOrNothing', Boolean, nullable=False, default=False), # BOOLEAN NOT NULL DEFAULT False + Column('guarantee', Integer, nullable=False, default=0), # INT NOT NULL DEFAULT 0 mysql_charset='utf8', mysql_engine='InnoDB', ) Index('tourneyTypes_all', tourney_types_table.c.siteId, tourney_types_table.c.buyin, tourney_types_table.c.fee, - tourney_types_table.c.maxSeats, tourney_types_table.c.knockout, tourney_types_table.c.rebuyOrAddon, - tourney_types_table.c.speed, tourney_types_table.c.headsUp, tourney_types_table.c.shootout, - tourney_types_table.c.matrix, tourney_types_table.c.sng) + tourney_types_table.c.maxSeats, tourney_types_table.c.knockout, tourney_types_table.c.rebuy, + tourney_types_table.c.addOn, tourney_types_table.c.speed, tourney_types_table.c.headsUp, + tourney_types_table.c.shootout, tourney_types_table.c.matrix, tourney_types_table.c.sng) tourneys_players_table = Table('TourneysPlayers', metadata, @@ -401,9 +407,10 @@ tourneys_players_table = Table('TourneysPlayers', metadata, Column('payinAmount', Integer), # INT NOT NULL Column('rank', Integer), # INT NOT NULL Column('winnings', Integer), # INT NOT NULL - Column('nbRebuys', Integer, default=0), # INT DEFAULT 0 - Column('nbAddons', Integer, default=0), # INT DEFAULT 0 - Column('nbKO', Integer, default=0), # INT DEFAULT 0 + Column('winningsCurrency', Text), # TEXT + Column('rebuyCount', Integer, default=0), # INT DEFAULT 0 + Column('addOnCount', Integer, default=0), # INT DEFAULT 0 + Column('koCount', Integer, default=0), # INT DEFAULT 0 Column('comment', Text), # TEXT Column('commentTs', DateTime), # DATETIME mysql_charset='utf8', diff --git a/pyfpdb/Database.py b/pyfpdb/Database.py index 37a1daf1..d43133cb 100644 --- a/pyfpdb/Database.py +++ b/pyfpdb/Database.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +# -*- coding: utf-8 -*- """Database.py Create and manage the database objects. @@ -74,7 +75,7 @@ except ImportError: use_numpy = False -DB_VERSION = 119 +DB_VERSION = 121 # Variance created as sqlite has a bunch of undefined aggregate functions. @@ -1343,29 +1344,30 @@ class Database: def fillDefaultData(self): c = self.get_cursor() c.execute("INSERT INTO Settings (version) VALUES (%s);" % (DB_VERSION)) - c.execute("INSERT INTO Sites (name,currency) VALUES ('Full Tilt Poker', 'USD')") - c.execute("INSERT INTO Sites (name,currency) VALUES ('PokerStars', 'USD')") - c.execute("INSERT INTO Sites (name,currency) VALUES ('Everleaf', 'USD')") - c.execute("INSERT INTO Sites (name,currency) VALUES ('Win2day', 'USD')") - c.execute("INSERT INTO Sites (name,currency) VALUES ('OnGame', 'USD')") - c.execute("INSERT INTO Sites (name,currency) VALUES ('UltimateBet', 'USD')") - c.execute("INSERT INTO Sites (name,currency) VALUES ('Betfair', 'USD')") - c.execute("INSERT INTO Sites (name,currency) VALUES ('Absolute', 'USD')") - c.execute("INSERT INTO Sites (name,currency) VALUES ('PartyPoker', 'USD')") - c.execute("INSERT INTO Sites (name,currency) VALUES ('Partouche', 'EUR')") - c.execute("INSERT INTO Sites (name,currency) VALUES ('Carbon', 'USD')") - c.execute("INSERT INTO Sites (name,currency) VALUES ('PKR', 'USD')") + c.execute("INSERT INTO Sites (name,code) VALUES ('Full Tilt Poker', 'FT')") + c.execute("INSERT INTO Sites (name,code) VALUES ('PokerStars', 'PS')") + c.execute("INSERT INTO Sites (name,code) VALUES ('Everleaf', 'EV')") + c.execute("INSERT INTO Sites (name,code) VALUES ('Win2day', 'W2')") + c.execute("INSERT INTO Sites (name,code) VALUES ('OnGame', 'OG')") + c.execute("INSERT INTO Sites (name,code) VALUES ('UltimateBet', 'UB')") + c.execute("INSERT INTO Sites (name,code) VALUES ('Betfair', 'BF')") + c.execute("INSERT INTO Sites (name,code) VALUES ('Absolute', 'AB')") + c.execute("INSERT INTO Sites (name,code) VALUES ('PartyPoker', 'PP')") + c.execute("INSERT INTO Sites (name,code) VALUES ('Partouche', 'PA')") + c.execute("INSERT INTO Sites (name,code) VALUES ('Carbon', 'CA')") + c.execute("INSERT INTO Sites (name,code) VALUES ('PKR', 'PK')") if self.backend == self.SQLITE: - c.execute("INSERT INTO TourneyTypes (id, siteId, buyin, fee) VALUES (NULL, 1, 0, 0);") + c.execute("""INSERT INTO TourneyTypes (id, siteId, currency, buyin, fee, buyInChips, maxSeats, knockout, + rebuy, addOn, speed, headsUp, shootout, matrix) + VALUES (NULL, 1, 'USD', 0, 0, 0, 0, 0, 0, 0, NULL, 0, 0, 0);""") elif self.backend == self.PGSQL: - c.execute("""insert into TourneyTypes(siteId, buyin, fee, maxSeats, knockout - ,rebuyOrAddon, speed, headsUp, shootout, matrix) - values (1, 0, 0, 0, False, False, null, False, False, False);""") + c.execute("""insert into TourneyTypes(siteId, currency, buyin, fee, buyInChips, maxSeats, knockout + ,rebuy, addOn, speed, headsUp, shootout, matrix) + values (1, 'USD', 0, 0, 0, 0, False, False, False, null, False, False, False);""") elif self.backend == self.MYSQL_INNODB: - c.execute("""insert into TourneyTypes(id, siteId, buyin, fee, maxSeats, knockout - ,rebuyOrAddon, speed, headsUp, shootout, matrix) - values (DEFAULT, 1, 0, 0, 0, False, False, null, False, False, False);""") - + c.execute("""insert into TourneyTypes(id, siteId, currency, buyin, fee, buyInChips, maxSeats, knockout + ,rebuy, addOn, speed, headsUp, shootout, matrix) + values (DEFAULT, 1, 'USD', 0, 0, 0, 0, False, False, False, null, False, False, False);""") #end def fillDefaultData def rebuild_indexes(self, start=None): @@ -1373,6 +1375,7 @@ class Database: self.createAllIndexes() self.dropAllForeignKeys() self.createAllForeignKeys() + #end def rebuild_indexes def rebuild_hudcache(self, h_start=None, v_start=None): """clears hudcache and rebuilds from the individual handsplayers records""" @@ -1792,8 +1795,9 @@ class Database: hilo = "s" elif game['category'] in ['razz','27_3draw','badugi']: hilo = "l" - tmp = self.insertGameTypes( (siteid, game['type'], game['base'], game['category'], game['limitType'], hilo, + tmp = self.insertGameTypes( (siteid, 'USD', game['type'], game['base'], game['category'], game['limitType'], hilo, int(Decimal(game['sb'])*100), int(Decimal(game['bb'])*100), 0, 0) ) + #FIXME: recognise currency return tmp[0] def getSqlPlayerIDs(self, pnames, siteid): @@ -1853,48 +1857,6 @@ class Database: # Finish of NEWIMPORT CODE ################################# - - - def store_tourneys_players(self, tourney_id, player_ids, payin_amounts, ranks, winnings): - try: - result=[] - cursor = self.get_cursor() - #print "in store_tourneys_players. tourney_id:",tourney_id - #print "player_ids:",player_ids - #print "payin_amounts:",payin_amounts - #print "ranks:",ranks - #print "winnings:",winnings - for i in xrange(len(player_ids)): - try: - cursor.execute("savepoint ins_tplayer") - cursor.execute("""INSERT INTO TourneysPlayers - (tourneyId, playerId, payinAmount, rank, winnings) VALUES (%s, %s, %s, %s, %s)""".replace('%s', self.sql.query['placeholder']), - (tourney_id, player_ids[i], payin_amounts[i], ranks[i], winnings[i])) - - tmp = self.get_last_insert_id(cursor) - result.append(tmp) - #print "created new tourneys_players.id:", tmp - except: - cursor.execute("rollback to savepoint ins_tplayer") - cursor.execute("SELECT id FROM TourneysPlayers WHERE tourneyId=%s AND playerId+0=%s".replace('%s', self.sql.query['placeholder']) - ,(tourney_id, player_ids[i])) - tmp = cursor.fetchone() - #print "tried SELECTing tourneys_players.id:", tmp - try: - len(tmp) - result.append(tmp[0]) - except: - print "tplayer id not found for tourney,player %s,%s" % (tourney_id, player_ids[i]) - pass - except: - raise FpdbError( "store_tourneys_players error: " + str(sys.exc_value) ) - - cursor.execute("release savepoint ins_tplayer") - #print "store_tourneys_players returning", result - return result - #end def store_tourneys_players - - # read HandToWrite objects from q and insert into database def insert_queue_hands(self, q, maxwait=10, commitEachHand=True): n,fails,maxTries,firstWait = 0,0,4,0.1 @@ -1970,8 +1932,8 @@ class Database: print "***Error sending finish: "+err[2]+"("+str(err[1])+"): "+str(sys.exc_info()[1]) # end def send_finish_msg(): - def tRecogniseTourneyType(self, tourney): - log.debug("Database.tRecogniseTourneyType") + def recogniseTourneyType(self, tourney): + log.debug("Database.recogniseTourneyType") typeId = 1 # Check if Tourney exists, and if so retrieve TTypeId : in that case, check values of the ttype cursor = self.get_cursor() @@ -2020,7 +1982,7 @@ class Database: typeId = self.get_last_insert_id(cursor) return typeId - #end def tRecogniseTourneyType + #end def recogniseTourneyType diff --git a/pyfpdb/DerivedStats.py b/pyfpdb/DerivedStats.py index d730c232..ba0028c6 100644 --- a/pyfpdb/DerivedStats.py +++ b/pyfpdb/DerivedStats.py @@ -431,6 +431,11 @@ class DerivedStats(): self.handsplayers[player[1]]['street%sAggr' % i] = True else: self.handsplayers[player[1]]['street%sAggr' % i] = False + + if len(aggrers)>0 and i>0: + for playername in others: + self.handsplayers[playername]['otherRaisedStreet%s' % i] = True + #print "otherRaised detected on handid "+str(hand.handid)+" for "+playername+" on street "+str(i) if i > 0 and len(aggrers) > 0: for playername in others: @@ -450,8 +455,7 @@ class DerivedStats(): for act in hand.actions[hand.actionStreets[i+1]]: if act[1] in ('bets'): self.handsplayers[act[0]]['street%sBets' % i] = 1 + self.handsplayers[act[0]]['street%sBets' % i] - - + def folds(self, hand, i): for act in hand.actions[hand.actionStreets[i+1]]: if act[1] in ('folds'): diff --git a/pyfpdb/FulltiltToFpdb.py b/pyfpdb/FulltiltToFpdb.py index 2c6370e6..5ee24db0 100755 --- a/pyfpdb/FulltiltToFpdb.py +++ b/pyfpdb/FulltiltToFpdb.py @@ -66,7 +66,7 @@ class Fulltilt(HandHistoryConverter): ''', re.VERBOSE) re_Button = re.compile('^The button is in seat #(?P