From c1a998b7d87b9de7ddb0a206613566c84b76eafb Mon Sep 17 00:00:00 2001 From: sqlcoder Date: Sun, 18 Oct 2009 22:56:10 +0100 Subject: [PATCH] add all player (and min hands) ability to stats window --- pyfpdb/Filters.py | 45 ++++++++++++++++++++++++++++----- pyfpdb/GuiPlayerStats.py | 54 +++++++++++++++++++++++++++++----------- pyfpdb/SQL.py | 5 ++-- 3 files changed, 80 insertions(+), 24 deletions(-) diff --git a/pyfpdb/Filters.py b/pyfpdb/Filters.py index 6ad242bb..e67df502 100644 --- a/pyfpdb/Filters.py +++ b/pyfpdb/Filters.py @@ -55,6 +55,7 @@ class Filters(threading.Thread): ,'seatsbetween':'Between:', 'seatsand':'And:', 'seatsshow':'Show Number of _Players' ,'limitstitle':'Limits:', 'seatstitle':'Number of Players:' ,'groupstitle':'Grouping:', 'posnshow':'Show Position Stats:' + ,'groupsall':'All Players' ,'limitsFL':'FL', 'limitsNL':'NL', 'ring':'Ring', 'tour':'Tourney' } @@ -64,6 +65,10 @@ class Filters(threading.Thread): self.start_date.set_property('editable', False) self.end_date.set_property('editable', False) + # For use in groups etc + self.sbGroups = {} + self.numHands = 0 + # Outer Packing box self.mainVBox = gtk.VBox(False, 0) @@ -71,7 +76,7 @@ class Filters(threading.Thread): playerFrame.set_label_align(0.0, 0.0) vbox = gtk.VBox(False, 0) - self.fillPlayerFrame(vbox) + self.fillPlayerFrame(vbox, self.display) playerFrame.add(vbox) self.boxes['player'] = vbox @@ -122,7 +127,6 @@ class Filters(threading.Thread): groupsFrame = gtk.Frame() groupsFrame.show() vbox = gtk.VBox(False, 0) - self.sbGroups = {} self.fillGroupsFrame(vbox, self.display) groupsFrame.add(vbox) @@ -181,6 +185,9 @@ class Filters(threading.Thread): return self.mainVBox #end def get_vbox + def getNumHands(self): + return self.numHands + def getSites(self): return self.sites @@ -256,6 +263,13 @@ class Filters(threading.Thread): self.heroes[site] = w.get_text() # print "DEBUG: setting heroes[%s]: %s"%(site, self.heroes[site]) + def __set_num_hands(self, w, val): + try: + self.numHands = int(w.get_text()) + except: + self.numHands = 0 + print "DEBUG: setting numHands:", self.numHands + def createSiteLine(self, hbox, site): cb = gtk.CheckButton(site) cb.connect('clicked', self.__set_site_select, site) @@ -393,13 +407,32 @@ class Filters(threading.Thread): self.groups[group] = w.get_active() print "self.groups[%s] set to %s" %(group, self.groups[group]) - def fillPlayerFrame(self, vbox): + def fillPlayerFrame(self, vbox, display): for site in self.conf.get_supported_sites(): - pathHBox = gtk.HBox(False, 0) - vbox.pack_start(pathHBox, False, True, 0) + hBox = gtk.HBox(False, 0) + vbox.pack_start(hBox, False, True, 0) player = self.conf.supported_sites[site].screen_name - self.createPlayerLine(pathHBox, site, player) + self.createPlayerLine(hBox, site, player) + + if "GroupsAll" in display and display["GroupsAll"] == True: + hbox = gtk.HBox(False, 0) + vbox.pack_start(hbox, False, False, 0) + cb = gtk.CheckButton(self.filterText['groupsall']) + cb.connect('clicked', self.__set_group_select, 'allplayers') + hbox.pack_start(cb, False, False, 0) + self.sbGroups['allplayers'] = cb + self.groups['allplayers'] = False + + lbl = gtk.Label('Min # Hands:') + lbl.set_alignment(xalign=1.0, yalign=0.5) + hbox.pack_start(lbl, expand=True, padding=3) + + phands = gtk.Entry() + phands.set_text('0') + phands.set_width_chars(8) + hbox.pack_start(phands, False, False, 0) + phands.connect("changed", self.__set_num_hands, site) def fillSitesFrame(self, vbox): for site in self.conf.get_supported_sites(): diff --git a/pyfpdb/GuiPlayerStats.py b/pyfpdb/GuiPlayerStats.py index 9d90974c..cb5f2936 100644 --- a/pyfpdb/GuiPlayerStats.py +++ b/pyfpdb/GuiPlayerStats.py @@ -65,6 +65,7 @@ class GuiPlayerStats (threading.Thread): "SeatSep" : True, "Dates" : True, "Groups" : True, + "GroupsAll" : True, "Button1" : True, "Button2" : True } @@ -198,7 +199,6 @@ class GuiPlayerStats (threading.Thread): def createStatsTable(self, vbox, playerids, sitenos, limits, type, seats, groups, dates): starttime = time() - #groups['allplayers'] = True # testing # Scrolled window for summary table swin = gtk.ScrolledWindow(hadjustment=None, vadjustment=None) @@ -214,35 +214,38 @@ class GuiPlayerStats (threading.Thread): # Display summary table at top of page # 3rd parameter passes extra flags, currently includes: # holecards - whether to display card breakdown (True/False) - flags = [False] + # numhands - min number hands required when displaying all players + flags = [False, self.filters.getNumHands()] self.addTable(vbox1, 'playerDetailedStats', flags, playerids, sitenos, limits, type, seats, groups, dates) # Only display one section if all players being shown (query currently too slow for startcards) - if 'allplayers' in groups and groups['allplayers']: - return + #if 'allplayers' in groups and groups['allplayers'] and 1==2: + # return # Separator #sep = gtk.HSeparator() #vbox.pack_start(sep, expand=False, padding=3) #sep.show_now() #vbox.show_now() - #heading = gtk.Label(self.filterText['handhead']) - #heading.show() - #vbox.pack_start(heading, expand=False, padding=3) + vbox2 = gtk.VBox(False, 0) + heading = gtk.Label(self.filterText['handhead']) + heading.show() + vbox2.pack_start(heading, expand=False, padding=3) # Scrolled window for detailed table (display by hand) swin = gtk.ScrolledWindow(hadjustment=None, vadjustment=None) swin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) swin.show() - #vbox.pack_start(swin, expand=True, padding=3) - vbox.pack2(swin) + vbox2.pack_start(swin, expand=True, padding=3) + vbox.pack2(vbox2) + vbox2.show() vbox1 = gtk.VBox(False, 0) vbox1.show() swin.add_with_viewport(vbox1) # Detailed table - flags = [True] + flags[0] = True self.addTable(vbox1, 'playerDetailedStats', flags, playerids, sitenos, limits, type, seats, groups, dates) self.db.rollback() @@ -346,13 +349,29 @@ class GuiPlayerStats (threading.Thread): #end def addTable(self, query, vars, playerids, sitenos, limits, type, seats, groups, dates): def refineQuery(self, query, flags, playerids, sitenos, limits, type, seats, groups, dates): - if not flags: holecards = False - else: holecards = flags[0] + having = '' + if not flags: + holecards = False + numhands = 0 + else: + holecards = flags[0] + numhands = flags[1] if 'allplayers' in groups and groups['allplayers']: - nametest = "(select id from players)" - # set flag in self.columns to show player name column - [x for x in self.columns if x[0] == 'pname'][0][1] = True + nametest = "(hp.playerId)" + if holecards or groups['posn']: + pname = "'all players'" + # set flag in self.columns to not show player name column + [x for x in self.columns if x[0] == 'pname'][0][1] = False + # can't do this yet (re-write doing more maths in python instead of sql?) + if numhands: + nametest = "(-1)" + else: + pname = "p.name" + # set flag in self.columns to show player name column + [x for x in self.columns if x[0] == 'pname'][0][1] = True + if numhands: + having = ' and count(1) > %d ' % (numhands,) else: if playerids: nametest = str(tuple(playerids)) @@ -360,7 +379,12 @@ class GuiPlayerStats (threading.Thread): nametest = nametest.replace(",)",")") else: nametest = "1 = 2" + pname = "p.name" + # set flag in self.columns to not show player name column + [x for x in self.columns if x[0] == 'pname'][0][1] = False query = query.replace("", nametest) + query = query.replace("", pname) + query = query.replace("", having) if seats: query = query.replace('', 'between ' + str(seats['from']) + ' and ' + str(seats['to'])) diff --git a/pyfpdb/SQL.py b/pyfpdb/SQL.py index a226825f..4b137e0c 100644 --- a/pyfpdb/SQL.py +++ b/pyfpdb/SQL.py @@ -1807,7 +1807,7 @@ class Sql: elif db_server == 'postgresql': self.query['playerDetailedStats'] = """ select AS hgametypeid - ,p.name AS pname + , AS pname ,gt.base ,gt.category ,upper(gt.limitType) AS limittype @@ -1867,15 +1867,14 @@ class Sql: and to_char(h.handStart, 'YYYY-MM-DD') group by hgameTypeId ,pname - ,hp.playerId ,gt.base ,gt.category ,plposition ,upper(gt.limitType) ,s.name + having 1 = 1 order by pname - ,hp.playerId ,gt.base ,gt.category