diff --git a/files/fpdb.desktop b/files/fpdb.desktop new file mode 100644 index 00000000..eed85047 --- /dev/null +++ b/files/fpdb.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=Free Poker Database +Comment=Online Poker Tracker + HUD +Exec=/usr/bin/fpdb +Icon=fpdb-icon.png +Terminal=true +Type=Application +Categories=Utility + diff --git a/gfx/fpdb-icon.png b/gfx/fpdb-icon.png new file mode 100644 index 00000000..673b0e54 Binary files /dev/null and b/gfx/fpdb-icon.png differ diff --git a/gfx/fpdb-icon2.png b/gfx/fpdb-icon2.png new file mode 100644 index 00000000..acf50124 Binary files /dev/null and b/gfx/fpdb-icon2.png differ diff --git a/gfx/magnified_cards.png b/gfx/magnified_cards.png new file mode 100644 index 00000000..e7566821 Binary files /dev/null and b/gfx/magnified_cards.png differ diff --git a/packaging/debian/changelog b/packaging/debian/changelog index 84ecbce5..ce102bf5 100644 --- a/packaging/debian/changelog +++ b/packaging/debian/changelog @@ -1,3 +1,9 @@ +free-poker-tools (0.11.3+git20091023) unstable; urgency=low + + * Snapshot release + + -- Mika Bostrom Wed, 21 Oct 2009 16:47:12 +0300 + free-poker-tools (0.10.99) unstable; urgency=low * Initial packaging release. diff --git a/packaging/debian/links b/packaging/debian/links index 01d1c490..5a4601a7 100644 --- a/packaging/debian/links +++ b/packaging/debian/links @@ -1 +1 @@ -/usr/share/python-support/python-fpdb/fpdb/fpdb.py /usr/bin/fpdb +/usr/share/pyshared/fpdb/fpdb.py /usr/bin/fpdb diff --git a/pyfpdb/Configuration.py b/pyfpdb/Configuration.py index 924d6584..5dba6aac 100755 --- a/pyfpdb/Configuration.py +++ b/pyfpdb/Configuration.py @@ -35,7 +35,13 @@ import xml.dom.minidom from xml.dom.minidom import Node import logging, logging.config -logging.config.fileConfig(os.path.join(sys.path[0],"logging.conf")) +import ConfigParser + +try: # local path + logging.config.fileConfig(os.path.join(sys.path[0],"logging.conf")) +except ConfigParser.NoSectionError: # debian package path + logging.config.fileConfig('/usr/share/python-fpdb/logging.conf') + log = logging.getLogger("config") log.debug("config logger initialised") diff --git a/pyfpdb/Database.py b/pyfpdb/Database.py index 828efba0..bb9739ec 100755 --- a/pyfpdb/Database.py +++ b/pyfpdb/Database.py @@ -46,7 +46,13 @@ import Tourney from Exceptions import * import logging, logging.config -logging.config.fileConfig(os.path.join(sys.path[0],"logging.conf")) +import ConfigParser + +try: # local path + logging.config.fileConfig(os.path.join(sys.path[0],"logging.conf")) +except ConfigParser.NoSectionError: # debian package path + logging.config.fileConfig('/usr/share/python-fpdb/logging.conf') + log = logging.getLogger('db') diff --git a/pyfpdb/GuiPlayerStats.py b/pyfpdb/GuiPlayerStats.py index e51ff4a3..dd3db0be 100644 --- a/pyfpdb/GuiPlayerStats.py +++ b/pyfpdb/GuiPlayerStats.py @@ -36,6 +36,8 @@ class GuiPlayerStats (threading.Thread): self.main_window = mainwin self.sql = querylist + self.liststore = None + self.MYSQL_INNODB = 2 self.PGSQL = 3 self.SQLITE = 4 @@ -79,30 +81,30 @@ class GuiPlayerStats (threading.Thread): # ToDo: store in config # ToDo: create popup to adjust column config # columns to display, keys match column name returned by sql, values in tuple are: - # is column displayed, column heading, xalignment, formatting - self.columns = [ ["game", True, "Game", 0.0, "%s"] - , ["hand", False, "Hand", 0.0, "%s"] # true not allowed for this line - , ["plposition", False, "Posn", 1.0, "%s"] # true not allowed for this line (set in code) - , ["pname", False, "Name", 0.0, "%s"] # true not allowed for this line (set in code) - , ["n", True, "Hds", 1.0, "%d"] - , ["avgseats", False, "Seats", 1.0, "%3.1f"] - , ["vpip", True, "VPIP", 1.0, "%3.1f"] - , ["pfr", True, "PFR", 1.0, "%3.1f"] - , ["pf3", True, "PF3", 1.0, "%3.1f"] - , ["steals", True, "Steals", 1.0, "%3.1f"] - , ["saw_f", True, "Saw_F", 1.0, "%3.1f"] - , ["sawsd", True, "SawSD", 1.0, "%3.1f"] - , ["wtsdwsf", True, "WtSDwsF", 1.0, "%3.1f"] - , ["wmsd", True, "W$SD", 1.0, "%3.1f"] - , ["flafq", True, "FlAFq", 1.0, "%3.1f"] - , ["tuafq", True, "TuAFq", 1.0, "%3.1f"] - , ["rvafq", True, "RvAFq", 1.0, "%3.1f"] - , ["pofafq", False, "PoFAFq", 1.0, "%3.1f"] - , ["net", True, "Net($)", 1.0, "%6.2f"] - , ["bbper100", True, "bb/100", 1.0, "%4.2f"] - , ["rake", True, "Rake($)", 1.0, "%6.2f"] - , ["bb100xr", True, "bbxr/100", 1.0, "%4.2f"] - , ["variance", True, "Variance", 1.0, "%5.2f"] + # is column displayed, column heading, xalignment, formatting, celltype + self.columns = [ ["game", True, "Game", 0.0, "%s", "str"] + , ["hand", False, "Hand", 0.0, "%s", "str"] # true not allowed for this line + , ["plposition", False, "Posn", 1.0, "%s", "str"] # true not allowed for this line (set in code) + , ["pname", False, "Name", 0.0, "%s", "str"] # true not allowed for this line (set in code) + , ["n", True, "Hds", 1.0, "%d", "str"] + , ["avgseats", False, "Seats", 1.0, "%3.1f", "str"] + , ["vpip", True, "VPIP", 1.0, "%3.1f", "str"] + , ["pfr", True, "PFR", 1.0, "%3.1f", "str"] + , ["pf3", True, "PF3", 1.0, "%3.1f", "str"] + , ["steals", True, "Steals", 1.0, "%3.1f", "str"] + , ["saw_f", True, "Saw_F", 1.0, "%3.1f", "str"] + , ["sawsd", True, "SawSD", 1.0, "%3.1f", "str"] + , ["wtsdwsf", True, "WtSDwsF", 1.0, "%3.1f", "str"] + , ["wmsd", True, "W$SD", 1.0, "%3.1f", "str"] + , ["flafq", True, "FlAFq", 1.0, "%3.1f", "str"] + , ["tuafq", True, "TuAFq", 1.0, "%3.1f", "str"] + , ["rvafq", True, "RvAFq", 1.0, "%3.1f", "str"] + , ["pofafq", False, "PoFAFq", 1.0, "%3.1f", "str"] + , ["net", True, "Net($)", 1.0, "%6.2f", "cash"] + , ["bbper100", True, "bb/100", 1.0, "%4.2f", "str"] + , ["rake", True, "Rake($)", 1.0, "%6.2f", "cash"] + , ["bb100xr", True, "bbxr/100", 1.0, "%4.2f", "str"] + , ["variance", True, "Variance", 1.0, "%5.2f", "str"] ] # Detail filters: This holds the data used in the popup window, extra values are @@ -235,10 +237,37 @@ class GuiPlayerStats (threading.Thread): print "Stats page displayed in %4.2f seconds" % (time() - starttime) #end def fillStatsFrame(self, vbox): + def reset_style_render_func(self, treeviewcolumn, cell, model, iter): + cell.set_property('foreground', 'black') + + def ledger_style_render_func(self, tvcol, cell, model, iter): + str = cell.get_property('text') + if '-' in str: + str = str.replace("-", "") + str = "(%s)" %(str) + cell.set_property('text', str) + cell.set_property('foreground', 'red') + else: + cell.set_property('foreground', 'green') + + return + + def sortcols(self, col, n): + #This doesn't actually work yet + if n == 0: + # Card values can stay the same for the moment. + return + if col.get_sort_order() == gtk.SORT_ASCENDING: + col.set_sort_order(gtk.SORT_DESCENDING) + else: + col.set_sort_order(gtk.SORT_ASCENDING) + self.liststore.set_sort_column_id(n, col.get_sort_order()) + def addTable(self, vbox, query, flags, playerids, sitenos, limits, type, seats, groups, dates): + counter = 0 row = 0 sqlrow = 0 - colalias,colshow,colheading,colxalign,colformat = 0,1,2,3,4 + colalias,colshow,colheading,colxalign,colformat,coltype = 0,1,2,3,4,5 if not flags: holecards = False else: holecards = flags[0] @@ -252,8 +281,8 @@ class GuiPlayerStats (threading.Thread): cols_to_show = [x for x in self.columns if x[colshow]] hgametypeid_idx = colnames.index('hgametypeid') - liststore = gtk.ListStore(*([str] * len(cols_to_show))) - view = gtk.TreeView(model=liststore) + self.liststore = gtk.ListStore(*([str] * len(cols_to_show))) + view = gtk.TreeView(model=self.liststore) view.set_grid_lines(gtk.TREE_VIEW_GRID_LINES_BOTH) #vbox.pack_start(view, expand=False, padding=3) vbox.add(view) @@ -263,6 +292,7 @@ class GuiPlayerStats (threading.Thread): numcell = gtk.CellRendererText() numcell.set_property('xalign', 1.0) listcols = [] + idx = 0 # Create header row eg column: ("game", True, "Game", 0.0, "%s") for col, column in enumerate(cols_to_show): @@ -272,6 +302,9 @@ class GuiPlayerStats (threading.Thread): s = column[colheading] listcols.append(gtk.TreeViewColumn(s)) view.append_column(listcols[col]) + #listcols[col].set_clickable(True) + #listcols[col].set_sort_indicator(True) + #listcols[col].connect("clicked", self.sortcols, idx) if column[colformat] == '%s': if column[colxalign] == 0.0: listcols[col].pack_start(textcell, expand=True) @@ -285,6 +318,11 @@ class GuiPlayerStats (threading.Thread): listcols[col].add_attribute(numcell, 'text', col) listcols[col].set_expand(True) #listcols[col].set_alignment(column[colxalign]) # no effect? + if column[coltype] == 'cash': + listcols[col].set_cell_data_func(numcell, self.ledger_style_render_func) + else: + listcols[col].set_cell_data_func(numcell, self.reset_style_render_func) + idx = idx+1 rows = len(result) # +1 for title row @@ -325,7 +363,7 @@ class GuiPlayerStats (threading.Thread): treerow.append(column[colformat] % value) else: treerow.append(' ') - iter = liststore.append(treerow) + iter = self.liststore.append(treerow) sqlrow += 1 row += 1 vbox.show_all() diff --git a/pyfpdb/GuiSessionViewer.py b/pyfpdb/GuiSessionViewer.py old mode 100644 new mode 100755 index 0587e5e0..76ad682b --- a/pyfpdb/GuiSessionViewer.py +++ b/pyfpdb/GuiSessionViewer.py @@ -15,6 +15,7 @@ #In the "official" distribution you can find the license in #agpl-3.0.txt in the docs folder of the package. +import sys import threading import pygtk pygtk.require('2.0') @@ -22,7 +23,11 @@ import gtk import os from time import time, strftime, localtime try: - from numpy import diff, nonzero + from numpy import diff, nonzero, sum, cumsum, max, mina + import matplotlib.finance +# from matplotlib.dates import DateFormatter, WeekdayLocator, HourLocator, \ +# DayLocator, MONDAY, timezone + except: print """Failed to load numpy in Session Viewer""" print """This is of no consequence as the module currently doesn't do anything.""" @@ -34,10 +39,13 @@ import Filters import FpdbSQLQueries class GuiSessionViewer (threading.Thread): - def __init__(self, config, querylist, debug=True): + def __init__(self, config, querylist, mainwin, debug=True): self.debug = debug self.conf = config self.sql = querylist + + self.liststore = None + self.MYSQL_INNODB = 2 self.PGSQL = 3 self.SQLITE = 4 @@ -56,55 +64,63 @@ class GuiSessionViewer (threading.Thread): self.filterText = {'handhead':'Hand Breakdown for all levels listed above' } - filters_display = { "Heroes" : True, - "Sites" : True, - "Games" : False, - "Limits" : True, - "LimitSep" : True, - "Seats" : True, - "SeatSep" : True, - "Dates" : False, - "Groups" : True, - "Button1" : True, - "Button2" : True + filters_display = { "Heroes" : True, + "Sites" : True, + "Games" : False, + "Limits" : True, + "LimitSep" : True, + "LimitType" : True, + "Type" : True, + "Seats" : True, + "SeatSep" : True, + "Dates" : True, + "Groups" : True, + "GroupsAll" : True, + "Button1" : True, + "Button2" : True } self.filters = Filters.Filters(self.db, self.conf, self.sql, display = filters_display) - self.filters.registerButton2Name("_Refresh") - self.filters.registerButton2Callback(self.refreshStats) + self.filters.registerButton1Name("_Refresh") + self.filters.registerButton1Callback(self.refreshStats) # ToDo: store in config # ToDo: create popup to adjust column config # columns to display, keys match column name returned by sql, values in tuple are: # is column displayed, column heading, xalignment, formatting - self.columns = [ ("game", True, "Game", 0.0, "%s") + self.columns = [ ("sid", True, "SID", 0.0, "%s") , ("hand", False, "Hand", 0.0, "%s") # true not allowed for this line , ("n", True, "Hds", 1.0, "%d") - , ("avgseats", True, "Seats", 1.0, "%3.1f") - , ("vpip", True, "VPIP", 1.0, "%3.1f") - , ("pfr", True, "PFR", 1.0, "%3.1f") - , ("pf3", True, "PF3", 1.0, "%3.1f") - , ("steals", True, "Steals", 1.0, "%3.1f") - , ("saw_f", True, "Saw_F", 1.0, "%3.1f") - , ("sawsd", True, "SawSD", 1.0, "%3.1f") - , ("wtsdwsf", True, "WtSDwsF", 1.0, "%3.1f") - , ("wmsd", True, "W$SD", 1.0, "%3.1f") - , ("flafq", True, "FlAFq", 1.0, "%3.1f") - , ("tuafq", True, "TuAFq", 1.0, "%3.1f") - , ("rvafq", True, "RvAFq", 1.0, "%3.1f") - , ("pofafq", False, "PoFAFq", 1.0, "%3.1f") - , ("net", True, "Net($)", 1.0, "%6.2f") - , ("bbper100", True, "BB/100", 1.0, "%4.2f") - , ("rake", True, "Rake($)", 1.0, "%6.2f") - , ("variance", True, "Variance", 1.0, "%5.2f") + , ("start", True, "Start", 1.0, "%d") + , ("end", True, "End", 1.0, "%d") + , ("hph", True, "Hands/h", 1.0, "%d") + , ("profit", True, "Profit", 1.0, "%s") + #, ("avgseats", True, "Seats", 1.0, "%3.1f") + #, ("vpip", True, "VPIP", 1.0, "%3.1f") + #, ("pfr", True, "PFR", 1.0, "%3.1f") + #, ("pf3", True, "PF3", 1.0, "%3.1f") + #, ("steals", True, "Steals", 1.0, "%3.1f") + #, ("saw_f", True, "Saw_F", 1.0, "%3.1f") + #, ("sawsd", True, "SawSD", 1.0, "%3.1f") + #, ("wtsdwsf", True, "WtSDwsF", 1.0, "%3.1f") + #, ("wmsd", True, "W$SD", 1.0, "%3.1f") + #, ("flafq", True, "FlAFq", 1.0, "%3.1f") + #, ("tuafq", True, "TuAFq", 1.0, "%3.1f") + #, ("rvafq", True, "RvAFq", 1.0, "%3.1f") + #, ("pofafq", False, "PoFAFq", 1.0, "%3.1f") + #, ("net", True, "Net($)", 1.0, "%6.2f") + #, ("bbper100", True, "BB/100", 1.0, "%4.2f") + #, ("rake", True, "Rake($)", 1.0, "%6.2f") + #, ("variance", True, "Variance", 1.0, "%5.2f") ] self.stats_frame = None self.stats_vbox = None self.detailFilters = [] # the data used to enhance the sql select - - self.main_hbox = gtk.HBox(False, 0) - self.main_hbox.show() + + #self.main_hbox = gtk.HBox(False, 0) + #self.main_hbox.show() + self.main_hbox = gtk.HPaned() self.stats_frame = gtk.Frame() self.stats_frame.show() @@ -112,21 +128,23 @@ class GuiSessionViewer (threading.Thread): self.stats_vbox = gtk.VBox(False, 0) self.stats_vbox.show() self.stats_frame.add(self.stats_vbox) - self.fillStatsFrame(self.stats_vbox) - - self.main_hbox.pack_start(self.filters.get_vbox()) - self.main_hbox.pack_start(self.stats_frame, expand=True, fill=True) - -################################ + # self.fillStatsFrame(self.stats_vbox) + #self.main_hbox.pack_start(self.filters.get_vbox()) + #self.main_hbox.pack_start(self.stats_frame, expand=True, fill=True) + self.main_hbox.pack1(self.filters.get_vbox()) + self.main_hbox.pack2(self.stats_frame) + self.main_hbox.show() # make sure Hand column is not displayed - [x for x in self.columns if x[0] == 'hand'][0][1] == False + #[x for x in self.columns if x[0] == 'hand'][0][1] = False def get_vbox(self): """returns the vbox of this thread""" return self.main_hbox + + def refreshStats(self, widget, data): try: self.stats_vbox.destroy() except AttributeError: pass @@ -202,6 +220,31 @@ class GuiSessionViewer (threading.Thread): print "Stats page displayed in %4.2f seconds" % (time() - starttime) #end def fillStatsFrame(self, vbox): + def generateGraph(self, vbox, data): + fig = figure() + fig.subplots_adjust(bottom=0.2) + ax = fig.add_subplot(111) + ax.xaxis.set_major_locator(mondays) + ax.xaxis.set_minor_locator(alldays) + ax.xaxis.set_major_formatter(weekFormatter) + #ax.xaxis.set_minor_formatter(dayFormatter) + #plot_day_summary(ax, quotes, ticksize=3) +# candlestick(ax, quotes, width=0.6) +# candlestick2(ax, opens, closes, highs, lows, width=4, colorup='k', colordown='r', alpha=0.75) +# Represent the open, close as a bar line and high low range as a vertical line. +# ax : an Axes instance to plot to +# width : the bar width in points +# colorup : the color of the lines where close >= open +# colordown : the color of the lines where close < open +# alpha : bar transparency +# return value is lineCollection, barCollection + ax.xaxis_date() + ax.autoscale_view() + setp( gca().get_xticklabels(), rotation=45, horizontalalignment='right') + + show() + + def addTable(self, vbox, query, flags, playerids, sitenos, limits, seats): row = 0 sqlrow = 0 @@ -209,105 +252,114 @@ class GuiSessionViewer (threading.Thread): if not flags: holecards = False else: holecards = flags[0] + # pre-fetch some constant values: + cols_to_show = [x for x in self.columns if x[colshow]] - self.stats_table = gtk.Table(1, 1, False) - self.stats_table.set_col_spacings(4) - self.stats_table.show() - - self.db.cursor.execute("""select UNIX_TIMESTAMP(handStart) as time, id from Hands ORDER BY time""") + self.liststore = gtk.ListStore(*([str] * len(cols_to_show))) + + view = gtk.TreeView(model=self.liststore) + view.set_grid_lines(gtk.TREE_VIEW_GRID_LINES_BOTH) + vbox.add(view) + textcell = gtk.CellRendererText() + textcell50 = gtk.CellRendererText() + textcell50.set_property('xalign', 0.5) + numcell = gtk.CellRendererText() + numcell.set_property('xalign', 1.0) + listcols = [] + + # Create header row eg column: ("game", True, "Game", 0.0, "%s") + for col, column in enumerate(cols_to_show): + s = column[colheading] + listcols.append(gtk.TreeViewColumn(s)) + view.append_column(listcols[col]) + if column[colformat] == '%s': + if column[colxalign] == 0.0: + listcols[col].pack_start(textcell, expand=True) + listcols[col].add_attribute(textcell, 'text', col) + else: + listcols[col].pack_start(textcell50, expand=True) + listcols[col].add_attribute(textcell50, 'text', col) + listcols[col].set_expand(True) + else: + listcols[col].pack_start(numcell, expand=True) + listcols[col].add_attribute(numcell, 'text', col) + listcols[col].set_expand(True) + + # Get a list of all handids and their timestampts + # FIXME: Will probably want to be able to filter this list eventually + # FIXME: Join on handsplayers for Hero to get other useful stuff like total profit? + q = """ +select UNIX_TIMESTAMP(h.handStart) as time, hp.handId, hp.startCash, hp.winnings, hp.totalProfit +from HandsPlayers hp + inner join Hands h on (h.id = hp.handId) + inner join Gametypes gt on (gt.Id = h.gameTypeId) + inner join Sites s on (s.Id = gt.siteId) + inner join Players p on (p.Id = hp.playerId) +where hp.playerId in (2) +order by time +""" + self.db.cursor.execute(q) THRESHOLD = 1800 hands = self.db.cursor.fetchall() + # Take that list and create an array of the time between hands times = map(lambda x:long(x[0]), hands) handids = map(lambda x:int(x[1]), hands) + winnings = map(lambda x:float(x[4]), hands) print "DEBUG: len(times) %s" %(len(times)) - diffs = diff(times) - print "DEBUG: len(diffs) %s" %(len(diffs)) - index = nonzero(diff(times) > THRESHOLD) - print "DEBUG: len(index[0]) %s" %(len(index[0])) - print "DEBUG: index %s" %(index) - print "DEBUG: index[0][0] %s" %(index[0][0]) + diffs = diff(times) # This array is the difference in starttime between consecutive hands + index = nonzero(diff(times) > THRESHOLD) # This array represents the indexes into 'times' for start/end times of sessions + # ie. times[index[0][0]] is the end of the first session + #print "DEBUG: len(index[0]) %s" %(len(index[0])) + #print "DEBUG: index %s" %(index) + #print "DEBUG: index[0][0] %s" %(index[0][0]) total = 0 - last_idx = 0 + lowidx = 0 + uppidx = 0 + opens = [] + closes = [] + highs = [] + lows = [] + results = [] + cum_sum = cumsum(winnings) + cum_sum = cum_sum/100 + # Take all results and format them into a list for feeding into gui model. for i in range(len(index[0])): - print "Hands in session %4s: %4s Start: %s End: %s Total: %s" %(i, index[0][i] - last_idx, strftime("%d/%m/%Y %H:%M", localtime(times[last_idx])), strftime("%d/%m/%Y %H:%M", localtime(times[index[0][i]])), times[index[0][i]] - times[last_idx]) + sid = i # Session id + hds = index[0][i] - last_idx # Number of hands in session + stime = strftime("%d/%m/%Y %H:%M", localtime(times[last_idx])) # Formatted start time + etime = strftime("%d/%m/%Y %H:%M", localtime(times[index[0][i]])) # Formatted end time + hph = (times[index[0][i]] - times[last_idx])/60 # Hands per hour + won = sum(winnings[last_idx:index[0][i]])/100.0 + hwm = max(cum_sum[last_idx:index[0][i]]) + lwm = min(cum_sum[last_idx:index[0][i]]) + print "DEBUG: range: (%s, %s) - (min, max): (%s, %s)" %(last_idx, index[0][i], hwm, lwm) + + results.append([sid, hds, stime, etime, hph, won]) + opens.append((sum(winnings[:last_idx]))/100) + closes.append((sum(winnings[:index[0][i]]))/100) + highs.append(hwm) + lows.append(lwm) + print "Hands in session %4s: %4s Start: %s End: %s HPH: %s Profit: %s" %(sid, hds, stime, etime, hph, won) total = total + (index[0][i] - last_idx) last_idx = index[0][i] + 1 - print "Total: ", total -# -# colnames = [desc[0].lower() for desc in self.cursor.description] -# -# # pre-fetch some constant values: -# cols_to_show = [x for x in self.columns if x[colshow]] -# hgametypeid_idx = colnames.index('hgametypeid') -# -# liststore = gtk.ListStore(*([str] * len(cols_to_show))) -# view = gtk.TreeView(model=liststore) -# view.set_grid_lines(gtk.TREE_VIEW_GRID_LINES_BOTH) -# vbox.pack_start(view, expand=False, padding=3) -# textcell = gtk.CellRendererText() -# numcell = gtk.CellRendererText() -# numcell.set_property('xalign', 1.0) -# listcols = [] -# -# # Create header row eg column: ("game", True, "Game", 0.0, "%s") -# for col, column in enumerate(cols_to_show): -# if column[colalias] == 'game' and holecards: -# s = [x for x in self.columns if x[colalias] == 'hand'][0][colheading] -# else: -# s = column[colheading] -# listcols.append(gtk.TreeViewColumn(s)) -# view.append_column(listcols[col]) -# if column[colformat] == '%s': -# if col == 1 and holecards: -# listcols[col].pack_start(textcell, expand=True) -# else: -# listcols[col].pack_start(textcell, expand=False) -# listcols[col].add_attribute(textcell, 'text', col) -# else: -# listcols[col].pack_start(numcell, expand=False) -# listcols[col].add_attribute(numcell, 'text', col) -# -# rows = len(result) # +1 for title row -# -# while sqlrow < rows: -# treerow = [] -# if(row%2 == 0): -# bgcolor = "white" -# else: -# bgcolor = "lightgrey" -# for col,column in enumerate(cols_to_show): -# if column[colalias] in colnames: -# value = result[sqlrow][colnames.index(column[colalias])] -# else: -# if column[colalias] == 'game': -# if holecards: -# value = Card.twoStartCardString( result[sqlrow][hgametypeid_idx] ) -# else: -# minbb = result[sqlrow][colnames.index('minbigblind')] -# maxbb = result[sqlrow][colnames.index('maxbigblind')] -# value = result[sqlrow][colnames.index('limittype')] + ' ' \ -# + result[sqlrow][colnames.index('category')].title() + ' ' \ -# + result[sqlrow][colnames.index('name')] + ' $' -# if 100 * int(minbb/100.0) != minbb: -# value += '%.2f' % (minbb/100.0) -# else: -# value += '%.0f' % (minbb/100.0) -# if minbb != maxbb: -# if 100 * int(maxbb/100.0) != maxbb: -# value += ' - $' + '%.2f' % (maxbb/100.0) -# else: -# value += ' - $' + '%.0f' % (maxbb/100.0) -# else: -# continue -# if value and value != -999: -# treerow.append(column[colformat] % value) -# else: -# treerow.append(' ') -# iter = liststore.append(treerow) -# sqlrow += 1 -# row += 1 + for row in results: + iter = self.liststore.append(row) + + print "DEBUG: highs = %s" % highs + print "DEBUG: lows = %s" % lows + print "DEBUG: opens = %s" % opens + print "DEBUG: closes = %s" % closes + vbox.show_all() + +def main(argv=None): + config = Configuration.Config() + i = GuiBulkImport(settings, config) + +if __name__ == '__main__': + sys.exit(main()) + diff --git a/pyfpdb/HandHistoryConverter.py b/pyfpdb/HandHistoryConverter.py index e40694ea..0642d845 100644 --- a/pyfpdb/HandHistoryConverter.py +++ b/pyfpdb/HandHistoryConverter.py @@ -37,7 +37,13 @@ import gettext gettext.install('fpdb') import logging, logging.config -logging.config.fileConfig(os.path.join(sys.path[0],"logging.conf")) +import ConfigParser + +try: + logging.config.fileConfig(os.path.join(sys.path[0],"logging.conf")) +except ConfigParser.NoSectionError: # debian package path + logging.config.fileConfig('/usr/share/python-fpdb/logging.conf') + log = logging.getLogger("parser") import pygtk diff --git a/pyfpdb/fpdb.py b/pyfpdb/fpdb.py index 18bc65d9..4f3210f4 100755 --- a/pyfpdb/fpdb.py +++ b/pyfpdb/fpdb.py @@ -155,12 +155,6 @@ class fpdb: def dia_database_stats(self, widget, data=None): self.warning_box("Unimplemented: Database Stats") - def dia_database_sessions(self, widget, data=None): - new_sessions_thread = GuiSessionViewer.GuiSessionViewer(self.config, self.sql) - self.threads.append(new_sessions_thread) - sessions_tab=new_sessions_thread.get_vbox() - self.add_and_display_tab(sessions_tab, "Sessions") - def dia_delete_db_parts(self, widget, data=None): self.warning_box("Unimplemented: Delete Database Parts") self.obtain_global_lock() @@ -368,6 +362,7 @@ class fpdb: + @@ -377,7 +372,6 @@ class fpdb: - @@ -409,6 +403,7 @@ class fpdb: ('playerdetails', None, 'Player _Details (todo)', None, 'Player Details (todo)', self.not_implemented), ('playerstats', None, '_Player Stats (tabulated view)', 'P', 'Player Stats (tabulated view)', self.tab_player_stats), ('posnstats', None, 'P_ositional Stats (tabulated view)', 'O', 'Positional Stats (tabulated view)', self.tab_positional_stats), + ('sessionstats', None, 'Session Stats', None, 'Session Stats', self.tab_session_stats), ('sessionreplay', None, '_Session Replayer (todo)', None, 'Session Replayer (todo)', self.not_implemented), ('tableviewer', None, 'Poker_table Viewer (mostly obselete)', None, 'Poker_table Viewer (mostly obselete)', self.tab_table_viewer), ('database', None, '_Database'), @@ -417,7 +412,6 @@ class fpdb: ('createtabs', None, 'Create or Recreate _Tables', None, 'Create or Recreate Tables ', self.dia_recreate_tables), ('rebuildhudcache', None, 'Rebuild HUD Cache', None, 'Rebuild HUD Cache', self.dia_recreate_hudcache), ('stats', None, '_Statistics (todo)', None, 'View Database Statistics', self.dia_database_stats), - ('sessions', None, 'Sessions', None, 'View Sessions', self.dia_database_sessions), ('help', None, '_Help'), ('Abbrev', None, '_Abbrevations (todo)', None, 'List of Abbrevations', self.tab_abbreviations), ('About', None, 'A_bout', None, 'About the program', self.dia_about), @@ -554,6 +548,12 @@ class fpdb: ps_tab=new_ps_thread.get_vbox() self.add_and_display_tab(ps_tab, "Positional Stats") + def tab_session_stats(self, widget, data=None): + new_ps_thread = GuiSessionViewer.GuiSessionViewer(self.config, self.sql, self.window) + self.threads.append(new_ps_thread) + ps_tab=new_ps_thread.get_vbox() + self.add_and_display_tab(ps_tab, "Session Stats") + def tab_main_help(self, widget, data=None): """Displays a tab with the main fpdb help screen""" mh_tab=gtk.Label("""Welcome to Fpdb! diff --git a/pyfpdb/fpdb_import.py b/pyfpdb/fpdb_import.py index 878b64b2..4d384372 100644 --- a/pyfpdb/fpdb_import.py +++ b/pyfpdb/fpdb_import.py @@ -43,7 +43,13 @@ import Configuration import Exceptions import logging, logging.config -logging.config.fileConfig(os.path.join(sys.path[0],"logging.conf")) +import ConfigParser + +try: + logging.config.fileConfig(os.path.join(sys.path[0],"logging.conf")) +except ConfigParser.NoSectionError: # debian package path + logging.config.fileConfig('/usr/share/python-fpdb/logging.conf') + log = logging.getLogger('importer') # database interface modules diff --git a/setup.py b/setup.py index 668693cf..737ad18e 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ from distutils.core import setup setup(name = 'fpdb', description = 'Free Poker Database', - version = '0.10.999', + version = '0.11.3', author = 'FPDB team', author_email = 'fpdb-main@lists.sourceforge.net', packages = ['fpdb'], @@ -13,5 +13,12 @@ setup(name = 'fpdb', data_files = [ ('/usr/share/doc/python-fpdb', ['docs/readme.txt', 'docs/release-notes.txt', - 'docs/tabledesign.html', 'THANKS.txt'])] + 'docs/tabledesign.html', 'THANKS.txt']), + ('/usr/share/pixmaps', + ['gfx/fpdb-icon.png']), + ('/usr/share/applications', + ['files/fpdb.desktop']), + ('/usr/share/python-fpdb', + ['pyfpdb/logging.conf']) + ] )