From 15e31eccb28656cf61c4cecf1cceae75a2dc5430 Mon Sep 17 00:00:00 2001 From: Worros Date: Sat, 11 Apr 2009 20:07:50 +0800 Subject: [PATCH] Make player and positional stats use Filters --- pyfpdb/Filters.py | 27 +++- pyfpdb/GuiPlayerStats.py | 222 +++++++++++++---------------- pyfpdb/GuiPositionalStats.py | 261 ++++++++++++++--------------------- 3 files changed, 226 insertions(+), 284 deletions(-) diff --git a/pyfpdb/Filters.py b/pyfpdb/Filters.py index 6e075973..1e93127b 100644 --- a/pyfpdb/Filters.py +++ b/pyfpdb/Filters.py @@ -56,7 +56,6 @@ class Filters(threading.Thread): playerFrame = gtk.Frame("Hero:") playerFrame.set_label_align(0.0, 0.0) - playerFrame.show() vbox = gtk.VBox(False, 0) self.fillPlayerFrame(vbox) @@ -64,7 +63,6 @@ class Filters(threading.Thread): sitesFrame = gtk.Frame("Sites:") sitesFrame.set_label_align(0.0, 0.0) - sitesFrame.show() vbox = gtk.VBox(False, 0) self.fillSitesFrame(vbox) @@ -133,6 +131,9 @@ class Filters(threading.Thread): def registerGraphCallback(self, callback): self.graphButton.connect("clicked", callback, "clicked") + def cardCallback(self, widget, data=None): + print "DEBUG: %s was toggled %s" % (data, ("OFF", "ON")[widget.get_active()]) + def createPlayerLine(self, hbox, site, player): label = gtk.Label(site +" id:") hbox.pack_start(label, False, False, 0) @@ -153,6 +154,7 @@ class Filters(threading.Thread): def createSiteLine(self, hbox, site): cb = gtk.CheckButton(site) cb.connect('clicked', self.__set_site_select, site) + cb.set_active(True) hbox.pack_start(cb, False, False, 0) def createGameLine(self, hbox, game): @@ -223,6 +225,27 @@ class Filters(threading.Thread): else: print "INFO: No games returned from database" + def fillCardsFrame(self, vbox): + hbox1 = gtk.HBox(True,0) + hbox1.show() + vbox.pack_start(hbox1, True, True, 0) + + cards = [ "A", "K","Q","J","T","9","8","7","6","5","4","3","2" ] + + for j in range(0, len(cards)): + hbox1 = gtk.HBox(True,0) + hbox1.show() + vbox.pack_start(hbox1, True, True, 0) + for i in range(0, len(cards)): + if i < (j + 1): + suit = "o" + else: + suit = "s" + button = gtk.ToggleButton("%s%s%s" %(cards[i], cards[j], suit)) + button.connect("toggled", self.cardCallback, "%s%s%s" %(cards[i], cards[j], suit)) + hbox1.pack_start(button, True, True, 0) + button.show() + def fillDateFrame(self, vbox): # Hat tip to Mika Bostrom - calendar code comes from PokerStats hbox = gtk.HBox() diff --git a/pyfpdb/GuiPlayerStats.py b/pyfpdb/GuiPlayerStats.py index b2eb0108..76aa06dd 100644 --- a/pyfpdb/GuiPlayerStats.py +++ b/pyfpdb/GuiPlayerStats.py @@ -23,146 +23,34 @@ import os import fpdb_import import fpdb_db +import Filters import FpdbSQLQueries class GuiPlayerStats (threading.Thread): - def get_vbox(self): - """returns the vbox of this thread""" - return self.main_hbox - - def toggleCallback(self, widget, data=None): -# print "%s was toggled %s" % (data, ("OFF", "ON")[widget.get_active()]) - self.activesite = data - print "DEBUG: activesite set to %s" %(self.activesite) - - def refreshStats(self, widget, data): - try: self.stats_table.destroy() - except AttributeError: pass - self.fillStatsFrame(self.stats_frame) - - def fillStatsFrame(self, vbox): - # Get currently active site and grab playerid - tmp = self.sql.query['playerStats'] - - result = self.cursor.execute(self.sql.query['getPlayerId'], (self.heroes[self.activesite],)) - result = self.cursor.fetchall() - if not result == (): - pid = result[0][0] - pid = result[0][0] - tmp = tmp.replace("", "(" + str(pid) + ")") - self.cursor.execute(tmp) - result = self.cursor.fetchall() - cols = 16 - rows = len(result)+1 # +1 for title row - self.stats_table = gtk.Table(rows, cols, False) - self.stats_table.set_col_spacings(4) - self.stats_table.show() - vbox.add(self.stats_table) - - # Create header row - titles = ("Game", "Hands", "VPIP", "PFR", "Saw_F", "SawSD", "WtSDwsF", "W$SD", "FlAFq", "TuAFq", "RvAFq", "PoFAFq", "Net($)", "BB/100", "$/hand", "Variance") - - col = 0 - row = 0 - for t in titles: - l = gtk.Label(titles[col]) - l.show() - self.stats_table.attach(l, col, col+1, row, row+1, yoptions=gtk.SHRINK) - col +=1 - - for row in range(rows-1): - if(row%2 == 0): - bgcolor = "white" - else: - bgcolor = "lightgrey" - for col in range(cols): - eb = gtk.EventBox() - eb.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(bgcolor)) - if result[row][col]: - l = gtk.Label(result[row][col]) - else: - l = gtk.Label(' ') - if col == 0: - l.set_alignment(xalign=0.0, yalign=0.5) - else: - l.set_alignment(xalign=1.0, yalign=0.5) - eb.add(l) - self.stats_table.attach(eb, col, col+1, row+1, row+2, yoptions=gtk.SHRINK) - l.show() - eb.show() - self.fdb.db.commit() - #end def fillStatsFrame(self, vbox): - - def fillPlayerFrame(self, vbox): - for site in self.conf.supported_sites.keys(): - hbox = gtk.HBox(False, 0) - vbox.pack_start(hbox, False, True, 0) - hbox.show() - - player = self.conf.supported_sites[site].screen_name - self.createPlayerLine(hbox, site, player) - hbox = gtk.HBox(False, 0) - button = gtk.Button("Refresh") - button.connect("clicked", self.refreshStats, False) - button.show() - hbox.add(button) - vbox.pack_start(hbox, False, True, 0) - hbox.show() - - def createPlayerLine(self, hbox, site, player): - if(self.buttongroup == None): - button = gtk.RadioButton(None, site + " id:") - button.set_active(True) - self.buttongroup = button - self.activesite = site - else: - button = gtk.RadioButton(self.buttongroup, site + " id:") - hbox.pack_start(button, True, True, 0) - button.connect("toggled", self.toggleCallback, site) - button.show() - - pname = gtk.Entry() - pname.set_text(player) - pname.set_width_chars(20) - hbox.pack_start(pname, False, True, 0) - pname.connect("changed", self.__set_hero_name, site) - #TODO: Look at GtkCompletion - to fill out usernames - pname.show() - self.__set_hero_name(pname, site) - - def __set_hero_name(self, w, site): - self.heroes[site] = w.get_text() - def __init__(self, db, config, querylist, debug=True): self.debug=debug self.conf=config # create new db connection to avoid conflicts with other threads - self.fdb = fpdb_db.fpdb_db() - self.fdb.do_connect(self.conf) - self.cursor=self.fdb.cursor - + self.db = fpdb_db.fpdb_db() + self.db.do_connect(self.conf) + self.cursor=self.db.cursor self.sql = querylist - self.activesite = None - self.buttongroup = None + settings = {} + settings.update(config.get_db_parameters()) + settings.update(config.get_tv_parameters()) + settings.update(config.get_import_parameters()) + settings.update(config.get_default_paths()) + + self.filters = Filters.Filters(db, settings, config, querylist) - self.heroes = {} self.stat_table = None self.stats_frame = None self.main_hbox = gtk.HBox(False, 0) self.main_hbox.show() - playerFrame = gtk.Frame("Hero:") - playerFrame.set_label_align(0.0, 0.0) - playerFrame.show() - vbox = gtk.VBox(False, 0) - vbox.show() - - self.fillPlayerFrame(vbox) - playerFrame.add(vbox) - statsFrame = gtk.Frame("Stats:") statsFrame.set_label_align(0.0, 0.0) statsFrame.show() @@ -172,6 +60,92 @@ class GuiPlayerStats (threading.Thread): self.fillStatsFrame(self.stats_frame) statsFrame.add(self.stats_frame) - self.main_hbox.pack_start(playerFrame) + self.main_hbox.pack_start(self.filters.get_vbox()) self.main_hbox.pack_start(statsFrame) + def get_vbox(self): + """returns the vbox of this thread""" + return self.main_hbox + + def refreshStats(self, widget, data): + try: self.stats_table.destroy() + except AttributeError: pass + self.fillStatsFrame(self.stats_frame) + + def fillStatsFrame(self, vbox): + sites = self.filters.getSites() + heroes = self.filters.getHeroes() + siteids = self.filters.getSiteIds() + sitenos = [] + playerids = [] + + # Which sites are selected? + for site in sites: + if sites[site] == True: + sitenos.append(siteids[site]) + self.cursor.execute(self.sql.query['getPlayerId'], (heroes[site],)) + result = self.db.cursor.fetchall() + if len(result) == 1: + playerids.append(result[0][0]) + + if not sitenos: + #Should probably pop up here. + print "No sites selected - defaulting to PokerStars" + sitenos = [2] + if not playerids: + print "No player ids found" + return + + self.createStatsTable(vbox, playerids, sitenos) + + def createStatsTable(self, vbox, playerids, sitenos): + tmp = self.sql.query['playerStats'] + + nametest = str(tuple(playerids)) + nametest = nametest.replace("L", "") + nametest = nametest.replace(",)",")") + + tmp = tmp.replace("", nametest) + + self.cursor.execute(tmp) + result = self.cursor.fetchall() + cols = 16 + rows = len(result)+1 # +1 for title row + self.stats_table = gtk.Table(rows, cols, False) + self.stats_table.set_col_spacings(4) + self.stats_table.show() + vbox.add(self.stats_table) + + # Create header row + titles = ("Game", "Hands", "VPIP", "PFR", "Saw_F", "SawSD", "WtSDwsF", "W$SD", "FlAFq", "TuAFq", "RvAFq", "PoFAFq", "Net($)", "BB/100", "$/hand", "Variance") + + col = 0 + row = 0 + for t in titles: + l = gtk.Label(titles[col]) + l.show() + self.stats_table.attach(l, col, col+1, row, row+1, yoptions=gtk.SHRINK) + col +=1 + + for row in range(rows-1): + if(row%2 == 0): + bgcolor = "white" + else: + bgcolor = "lightgrey" + for col in range(cols): + eb = gtk.EventBox() + eb.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(bgcolor)) + if result[row][col]: + l = gtk.Label(result[row][col]) + else: + l = gtk.Label(' ') + if col == 0: + l.set_alignment(xalign=0.0, yalign=0.5) + else: + l.set_alignment(xalign=1.0, yalign=0.5) + eb.add(l) + self.stats_table.attach(eb, col, col+1, row+1, row+2, yoptions=gtk.SHRINK) + l.show() + eb.show() + self.db.db.commit() + #end def fillStatsFrame(self, vbox): diff --git a/pyfpdb/GuiPositionalStats.py b/pyfpdb/GuiPositionalStats.py index 64828573..41b51829 100644 --- a/pyfpdb/GuiPositionalStats.py +++ b/pyfpdb/GuiPositionalStats.py @@ -23,180 +23,34 @@ import os import fpdb_import import fpdb_db +import Filters import FpdbSQLQueries class GuiPositionalStats (threading.Thread): - def get_vbox(self): - """returns the vbox of this thread""" - return self.main_hbox - - def toggleCallback(self, widget, data=None): -# print "%s was toggled %s" % (data, ("OFF", "ON")[widget.get_active()]) - self.activesite = data - print "DEBUG: activesite set to %s" %(self.activesite) - - def cardCallback(self, widget, data=None): - print "DEBUG: %s was toggled %s" % (data, ("OFF", "ON")[widget.get_active()]) - - def refreshStats(self, widget, data): - try: self.stats_table.destroy() - except AttributeError: pass - self.fillStatsFrame(self.stats_frame) - - def fillStatsFrame(self, vbox): - # Get currently active site and grab playerid - print "DEBUG: attempting to fill stats frame" - tmp = self.sql.query['playerStatsByPosition'] - - result = self.cursor.execute(self.sql.query['getPlayerId'], (self.heroes[self.activesite],)) - result = self.cursor.fetchall() - if not result == (): - pid = result[0][0] - pid = result[0][0] - tmp = tmp.replace("", "(" + str(pid) + ")") - self.cursor.execute(tmp) - result = self.cursor.fetchall() - cols = 16 - rows = len(result)+1 # +1 for title row - self.stats_table = gtk.Table(rows, cols, False) - self.stats_table.set_col_spacings(4) - self.stats_table.show() - vbox.add(self.stats_table) - - # Create header row - titles = ("Game", "Position", "#", "VPIP", "PFR", "Saw_F", "SawSD", "WtSDwsF", "W$SD", "FlAFq", "TuAFq", "RvAFq", "PoFAFq", "Net($)", "BB/100", "$/hand", "Variance") - - col = 0 - row = 0 - for t in titles: - l = gtk.Label(titles[col]) - l.show() - self.stats_table.attach(l, col, col+1, row, row+1, yoptions=gtk.SHRINK) - col +=1 - - for row in range(rows-1): - if(row%2 == 0): - bgcolor = "white" - else: - bgcolor = "lightgrey" - for col in range(cols): - eb = gtk.EventBox() - eb.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(bgcolor)) - if result[row][col]: - l = gtk.Label(result[row][col]) - else: - l = gtk.Label(' ') - if col == 0: - l.set_alignment(xalign=0.0, yalign=0.5) - else: - l.set_alignment(xalign=1.0, yalign=0.5) - eb.add(l) - self.stats_table.attach(eb, col, col+1, row+1, row+2, yoptions=gtk.SHRINK) - l.show() - eb.show() - self.fdb.db.commit() - #end def fillStatsFrame(self, vbox): - - def fillPlayerFrame(self, vbox): - for site in self.conf.supported_sites.keys(): - hbox = gtk.HBox(False, 0) - vbox.pack_start(hbox, False, True, 0) - hbox.show() - - player = self.conf.supported_sites[site].screen_name - self.createPlayerLine(hbox, site, player) - hbox = gtk.HBox(False, 0) - button = gtk.Button("Refresh") - button.connect("clicked", self.refreshStats, False) - button.show() - hbox.add(button) - vbox.pack_start(hbox, False, True, 0) - hbox.show() - - def fillCardsFrame(self, vbox): - hbox1 = gtk.HBox(True,0) - hbox1.show() - vbox.pack_start(hbox1, True, True, 0) - - cards = [ "A", "K","Q","J","T","9","8","7","6","5","4","3","2" ] - - for j in range(0, len(cards)): - hbox1 = gtk.HBox(True,0) - hbox1.show() - vbox.pack_start(hbox1, True, True, 0) - for i in range(0, len(cards)): - if i < (j + 1): - suit = "o" - else: - suit = "s" - button = gtk.ToggleButton("%s%s%s" %(cards[i], cards[j], suit)) - button.connect("toggled", self.cardCallback, "%s%s%s" %(cards[i], cards[j], suit)) - hbox1.pack_start(button, True, True, 0) - button.show() - - def createPlayerLine(self, hbox, site, player): - if(self.buttongroup == None): - button = gtk.RadioButton(None, site + " id:") - button.set_active(True) - self.buttongroup = button - self.activesite = site - else: - button = gtk.RadioButton(self.buttongroup, site + " id:") - hbox.pack_start(button, True, True, 0) - button.connect("toggled", self.toggleCallback, site) - button.show() - - pname = gtk.Entry() - pname.set_text(player) - pname.set_width_chars(20) - hbox.pack_start(pname, False, True, 0) - pname.connect("changed", self.__set_hero_name, site) - #TODO: Look at GtkCompletion - to fill out usernames - pname.show() - self.__set_hero_name(pname, site) - - def __set_hero_name(self, w, site): - self.heroes[site] = w.get_text() - def __init__(self, db, config, querylist, debug=True): self.debug=debug self.conf=config # create new db connection to avoid conflicts with other threads - self.fdb = fpdb_db.fpdb_db() - self.fdb.do_connect(self.conf) - self.cursor=self.fdb.cursor - + self.db = fpdb_db.fpdb_db() + self.db.do_connect(self.conf) + self.cursor=self.db.cursor self.sql = querylist - self.activesite = None - self.buttongroup = None + settings = {} + settings.update(config.get_db_parameters()) + settings.update(config.get_tv_parameters()) + settings.update(config.get_import_parameters()) + settings.update(config.get_default_paths()) + + self.filters = Filters.Filters(db, settings, config, querylist) - self.heroes = {} self.stat_table = None self.stats_frame = None self.main_hbox = gtk.HBox(False, 0) self.main_hbox.show() - playerFrame = gtk.Frame("Hero:") - playerFrame.set_label_align(0.0, 0.0) - playerFrame.show() - vbox = gtk.VBox(False, 0) - vbox.show() - - self.fillPlayerFrame(vbox) - playerFrame.add(vbox) - - cardsFrame = gtk.Frame("Cards:") - cardsFrame.set_label_align(0.0, 0.0) - cardsFrame.show() - vbox = gtk.VBox(False, 0) - vbox.show() - - self.fillCardsFrame(vbox) - cardsFrame.add(vbox) - statsFrame = gtk.Frame("Stats:") statsFrame.set_label_align(0.0, 0.0) statsFrame.show() @@ -206,6 +60,97 @@ class GuiPositionalStats (threading.Thread): self.fillStatsFrame(self.stats_frame) statsFrame.add(self.stats_frame) - self.main_hbox.pack_start(playerFrame) + self.main_hbox.pack_start(self.filters.get_vbox()) self.main_hbox.pack_start(statsFrame) + def get_vbox(self): + """returns the vbox of this thread""" + return self.main_hbox + + def toggleCallback(self, widget, data=None): +# print "%s was toggled %s" % (data, ("OFF", "ON")[widget.get_active()]) + self.activesite = data + print "DEBUG: activesite set to %s" %(self.activesite) + + def refreshStats(self, widget, data): + try: self.stats_table.destroy() + except AttributeError: pass + self.fillStatsFrame(self.stats_frame) + + def fillStatsFrame(self, vbox): + sites = self.filters.getSites() + heroes = self.filters.getHeroes() + siteids = self.filters.getSiteIds() + sitenos = [] + playerids = [] + + # Which sites are selected? + for site in sites: + if sites[site] == True: + sitenos.append(siteids[site]) + self.cursor.execute(self.sql.query['getPlayerId'], (heroes[site],)) + result = self.db.cursor.fetchall() + if len(result) == 1: + playerids.append(result[0][0]) + + if not sitenos: + #Should probably pop up here. + print "No sites selected - defaulting to PokerStars" + sitenos = [2] + if not playerids: + print "No player ids found" + return + + self.createStatsTable(vbox, playerids, sitenos) + + def createStatsTable(self, vbox, playerids, sitenos): + tmp = self.sql.query['playerStatsByPosition'] + + nametest = str(tuple(playerids)) + nametest = nametest.replace("L", "") + nametest = nametest.replace(",)",")") + + tmp = tmp.replace("", nametest) + + self.cursor.execute(tmp) + result = self.cursor.fetchall() + cols = 16 + rows = len(result)+1 # +1 for title row + self.stats_table = gtk.Table(rows, cols, False) + self.stats_table.set_col_spacings(4) + self.stats_table.show() + vbox.add(self.stats_table) + + # Create header row + titles = ("Game", "Position", "#", "VPIP", "PFR", "Saw_F", "SawSD", "WtSDwsF", "W$SD", "FlAFq", "TuAFq", "RvAFq", "PoFAFq", "Net($)", "BB/100", "$/hand", "Variance") + + col = 0 + row = 0 + for t in titles: + l = gtk.Label(titles[col]) + l.show() + self.stats_table.attach(l, col, col+1, row, row+1, yoptions=gtk.SHRINK) + col +=1 + + for row in range(rows-1): + if(row%2 == 0): + bgcolor = "white" + else: + bgcolor = "lightgrey" + for col in range(cols): + eb = gtk.EventBox() + eb.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(bgcolor)) + if result[row][col]: + l = gtk.Label(result[row][col]) + else: + l = gtk.Label(' ') + if col == 0: + l.set_alignment(xalign=0.0, yalign=0.5) + else: + l.set_alignment(xalign=1.0, yalign=0.5) + eb.add(l) + self.stats_table.attach(eb, col, col+1, row+1, row+2, yoptions=gtk.SHRINK) + l.show() + eb.show() + self.db.db.commit() + #end def fillStatsFrame(self, vbox):