diff --git a/pyfpdb/Filters.py b/pyfpdb/Filters.py index dc2e4859..9ebeb0c5 100644 --- a/pyfpdb/Filters.py +++ b/pyfpdb/Filters.py @@ -56,7 +56,7 @@ class Filters(threading.Thread): ,'limitstitle':'Limits:', 'seatstitle':'Number of Players:' ,'groupstitle':'Grouping:', 'posnshow':'Show Position Stats:' ,'groupsall':'All Players' - ,'limitsFL':'FL', 'limitsNL':'NL', 'ring':'Ring', 'tour':'Tourney' + ,'limitsFL':'FL', 'limitsNL':'NL', 'limitsPL':'PL', 'ring':'Ring', 'tour':'Tourney' } # For use in date ranges. @@ -107,6 +107,7 @@ class Filters(threading.Thread): self.cbAllLimits = None self.cbFL = None self.cbNL = None + self.cbPL = None self.rb = {} # radio buttons for ring/tour self.type = None # ring/tour self.types = {} # list of all ring/tour values @@ -191,6 +192,9 @@ class Filters(threading.Thread): def getSites(self): return self.sites + def getGames(self): + return self.games + def getSiteIds(self): return self.siteid @@ -303,7 +307,7 @@ class Filters(threading.Thread): #print w.get_active() self.limits[limit] = w.get_active() print "self.limit[%s] set to %s" %(limit, self.limits[limit]) - if limit.isdigit() or (len(limit) > 2 and limit[-2:] == 'nl'): + if limit.isdigit() or (len(limit) > 2 and (limit[-2:] == 'nl' or limit[-2:] == 'fl' or limit[-2:] == 'pl')): if self.limits[limit]: if self.cbNoLimits is not None: self.cbNoLimits.set_active(False) @@ -314,9 +318,12 @@ class Filters(threading.Thread): if limit.isdigit(): if self.cbFL is not None: self.cbFL.set_active(False) - else: + elif (len(limit) > 2 and (limit[-2:] == 'nl')): if self.cbNL is not None: self.cbNL.set_active(False) + else: + if self.cbPL is not None: + self.cbPL.set_active(False) elif limit == "all": if self.limits[limit]: #for cb in self.cbLimits.values(): @@ -325,6 +332,8 @@ class Filters(threading.Thread): self.cbFL.set_active(True) if self.cbNL is not None: self.cbNL.set_active(True) + if self.cbPL is not None: + self.cbPL.set_active(True) elif limit == "none": if self.limits[limit]: for cb in self.cbLimits.values(): @@ -333,6 +342,8 @@ class Filters(threading.Thread): self.cbNL.set_active(False) if self.cbFL is not None: self.cbFL.set_active(False) + if self.cbPL is not None: + self.cbPL.set_active(False) elif limit == "fl": if not self.limits[limit]: # only toggle all fl limits off if they are all currently on @@ -384,6 +395,30 @@ class Filters(threading.Thread): self.rb['tour'].set_active(True) elif self.type == 'tour': self.rb['ring'].set_active(True) + elif limit == "pl": + if not self.limits[limit]: + # only toggle all nl limits off if they are all currently on + # this stops turning one off from cascading into 'nl' box off + # and then all nl limits being turned off + all_nl_on = True + for cb in self.cbLimits.values(): + t = cb.get_children()[0].get_text() + if "pl" in t and len(t) > 2: + if not cb.get_active(): + all_nl_on = False + found = {'ring':False, 'tour':False} + for cb in self.cbLimits.values(): + t = cb.get_children()[0].get_text() + if "pl" in t and len(t) > 2: + if self.limits[limit] or all_nl_on: + cb.set_active(self.limits[limit]) + found[self.types[t]] = True + if self.limits[limit]: + if not found[self.type]: + if self.type == 'ring': + self.rb['tour'].set_active(True) + elif self.type == 'tour': + self.rb['ring'].set_active(True) elif limit == "ring": print "set", limit, "to", self.limits[limit] if self.limits[limit]: @@ -479,7 +514,7 @@ class Filters(threading.Thread): self.cursor.execute(self.sql.query['getLimits2']) # selects limitType, bigBlind result = self.db.cursor.fetchall() - found = {'nl':False, 'fl':False, 'ring':False, 'tour':False} + found = {'nl':False, 'fl':False, 'pl':False, 'ring':False, 'tour':False} if len(result) >= 1: hbox = gtk.HBox(True, 0) @@ -497,14 +532,18 @@ class Filters(threading.Thread): vbox2.pack_start(hbox, False, False, 0) else: vbox3.pack_start(hbox, False, False, 0) - if line[1] == 'fl': - name = str(line[2]) - found['fl'] = True - else: - name = str(line[2])+line[1] - found['nl'] = True - self.cbLimits[name] = self.createLimitLine(hbox, name, name) - self.types[name] = line[0] + if line[0] == 'ring': + if line[1] == 'fl': + name = str(line[2]) + found['fl'] = True + elif line[1] == 'pl': + name = str(line[2])+line[1] + found['pl'] = True + else: + name = str(line[2])+line[1] + found['nl'] = True + self.cbLimits[name] = self.createLimitLine(hbox, name, name) + self.types[name] = line[0] found[line[0]] = True # type is ring/tour self.type = line[0] # if only one type, set it now if "LimitSep" in display and display["LimitSep"] == True and len(result) >= 2: @@ -532,6 +571,9 @@ class Filters(threading.Thread): hbox = gtk.HBox(False, 0) vbox3.pack_start(hbox, False, False, 0) self.cbNL = self.createLimitLine(hbox, 'nl', self.filterText['limitsNL']) + hbox = gtk.HBox(False, 0) + vbox3.pack_start(hbox, False, False, 0) + self.cbPL = self.createLimitLine(hbox, 'pl', self.filterText['limitsPL']) dest = vbox2 # for ring/tour buttons else: print "INFO: No games returned from database" diff --git a/pyfpdb/GuiPlayerStats.py b/pyfpdb/GuiPlayerStats.py index 889988c5..1da08fbc 100644 --- a/pyfpdb/GuiPlayerStats.py +++ b/pyfpdb/GuiPlayerStats.py @@ -64,7 +64,7 @@ class GuiPlayerStats (threading.Thread): filters_display = { "Heroes" : True, "Sites" : True, - "Games" : False, + "Games" : True, "Limits" : True, "LimitSep" : True, "LimitType" : True, @@ -180,6 +180,7 @@ class GuiPlayerStats (threading.Thread): seats = self.filters.getSeats() groups = self.filters.getGroups() dates = self.filters.getDates() + games = self.filters.getGames() sitenos = [] playerids = [] @@ -205,9 +206,9 @@ class GuiPlayerStats (threading.Thread): print "No limits found" return - self.createStatsTable(vbox, playerids, sitenos, limits, type, seats, groups, dates) + self.createStatsTable(vbox, playerids, sitenos, limits, type, seats, groups, dates, games) - def createStatsTable(self, vbox, playerids, sitenos, limits, type, seats, groups, dates): + def createStatsTable(self, vbox, playerids, sitenos, limits, type, seats, groups, dates, games): starttime = time() # Scrolled window for summary table @@ -223,7 +224,7 @@ class GuiPlayerStats (threading.Thread): # gridnum - index for grid data structures flags = [False, self.filters.getNumHands(), 0] self.addGrid(swin, 'playerDetailedStats', flags, playerids - ,sitenos, limits, type, seats, groups, dates) + ,sitenos, limits, type, seats, groups, dates, games) # Separator vbox2 = gtk.VBox(False, 0) @@ -243,7 +244,7 @@ class GuiPlayerStats (threading.Thread): flags[0] = True flags[2] = 1 self.addGrid(swin, 'playerDetailedStats', flags, playerids - ,sitenos, limits, type, seats, groups, dates) + ,sitenos, limits, type, seats, groups, dates, games) self.db.rollback() print "Stats page displayed in %4.2f seconds" % (time() - starttime) @@ -317,7 +318,7 @@ class GuiPlayerStats (threading.Thread): print "***sortcols error: " + str(sys.exc_info()[1]) print "\n".join( [e[0]+':'+str(e[1])+" "+e[2] for e in err] ) - def addGrid(self, vbox, query, flags, playerids, sitenos, limits, type, seats, groups, dates): + def addGrid(self, vbox, query, flags, playerids, sitenos, limits, type, seats, groups, dates, games): counter = 0 row = 0 sqlrow = 0 @@ -325,7 +326,7 @@ class GuiPlayerStats (threading.Thread): else: holecards,grid = flags[0],flags[2] tmp = self.sql.query[query] - tmp = self.refineQuery(tmp, flags, playerids, sitenos, limits, type, seats, groups, dates) + tmp = self.refineQuery(tmp, flags, playerids, sitenos, limits, type, seats, groups, dates, games) self.cursor.execute(tmp) result = self.cursor.fetchall() colnames = [desc[0].lower() for desc in self.cursor.description] @@ -428,7 +429,7 @@ class GuiPlayerStats (threading.Thread): #end def addGrid(self, query, vars, playerids, sitenos, limits, type, seats, groups, dates): - def refineQuery(self, query, flags, playerids, sitenos, limits, type, seats, groups, dates): + def refineQuery(self, query, flags, playerids, sitenos, limits, type, seats, groups, dates, games): having = '' if not flags: holecards = False @@ -466,6 +467,20 @@ class GuiPlayerStats (threading.Thread): query = query.replace("", pname) query = query.replace("", having) + gametest = "" + q = [] + for m in self.filters.display.items(): + if m[0] == 'Games' and m[1]: + for n in games: + if games[n]: + q.append(n) + gametest = str(tuple(q)) + gametest = gametest.replace("L", "") + gametest = gametest.replace(",)",")") + gametest = gametest.replace("u'","'") + gametest = "and gt.category in %s" % gametest + query = query.replace("", gametest) + if seats: query = query.replace('', 'between ' + str(seats['from']) + ' and ' + str(seats['to'])) if 'show' in seats and seats['show']: diff --git a/pyfpdb/SQL.py b/pyfpdb/SQL.py index 2b19b04a..c377c7b6 100644 --- a/pyfpdb/SQL.py +++ b/pyfpdb/SQL.py @@ -1881,6 +1881,7 @@ class Sql: inner join Sites s on (s.Id = gt.siteId) inner join Players p on (p.Id = hp.playerId) where hp.playerId in + /*and hp.tourneysPlayersId IS NULL*/ and h.seats @@ -1964,6 +1965,7 @@ class Sql: inner join Sites s on (s.Id = gt.siteId) inner join Players p on (p.Id = hp.playerId) where hp.playerId in + /*and hp.tourneysPlayersId IS NULL*/ and h.seats @@ -2047,6 +2049,7 @@ class Sql: inner join Gametypes gt on (gt.Id = h.gameTypeId) inner join Sites s on (s.Id = gt.siteId) where hp.playerId in + /*and hp.tourneysPlayersId IS NULL*/ and h.seats