Merge branch 'master' of git://git.assembla.com/fpdb-sql
This commit is contained in:
commit
c3c36e1e53
|
@ -474,8 +474,9 @@ class Database:
|
||||||
else:
|
else:
|
||||||
h_seats_min, h_seats_max = 0, 10
|
h_seats_min, h_seats_max = 0, 10
|
||||||
print "bad h_seats_style value:", h_seats_style
|
print "bad h_seats_style value:", h_seats_style
|
||||||
print "opp seats style", seats_style, "hero seats style", h_seats_style
|
log.info("opp seats style %s %d %d hero seats style %s %d %d"
|
||||||
print "opp seats:", seats_min, seats_max, " hero seats:", h_seats_min, h_seats_max
|
% (seats_style, seats_min, seats_max
|
||||||
|
,h_seats_style, h_seats_min, h_seats_max) )
|
||||||
|
|
||||||
if hud_style == 'S' or h_hud_style == 'S':
|
if hud_style == 'S' or h_hud_style == 'S':
|
||||||
self.get_stats_from_hand_session(hand, stat_dict, hero_id
|
self.get_stats_from_hand_session(hand, stat_dict, hero_id
|
||||||
|
|
175
pyfpdb/GuiLogView.py
Executable file
175
pyfpdb/GuiLogView.py
Executable file
|
@ -0,0 +1,175 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
#Copyright 2008 Carl Gherardi
|
||||||
|
#This program is free software: you can redistribute it and/or modify
|
||||||
|
#it under the terms of the GNU Affero General Public License as published by
|
||||||
|
#the Free Software Foundation, version 3 of the License.
|
||||||
|
#
|
||||||
|
#This program is distributed in the hope that it will be useful,
|
||||||
|
#but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
#GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
#You should have received a copy of the GNU Affero General Public License
|
||||||
|
#along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#In the "official" distribution you can find the license in
|
||||||
|
#agpl-3.0.txt in the docs folder of the package.
|
||||||
|
|
||||||
|
|
||||||
|
import mmap
|
||||||
|
|
||||||
|
import pygtk
|
||||||
|
pygtk.require('2.0')
|
||||||
|
import gtk
|
||||||
|
import gobject
|
||||||
|
import pango
|
||||||
|
|
||||||
|
import Configuration
|
||||||
|
|
||||||
|
log = Configuration.get_logger("logging.conf", "logview")
|
||||||
|
|
||||||
|
MAX_LINES = 100000
|
||||||
|
|
||||||
|
class GuiLogView:
|
||||||
|
|
||||||
|
def __init__(self, config, mainwin, vbox):
|
||||||
|
self.config = config
|
||||||
|
self.main_window = mainwin
|
||||||
|
self.vbox = vbox
|
||||||
|
gtk.Widget.set_size_request(self.vbox, 700, 400);
|
||||||
|
|
||||||
|
self.liststore = gtk.ListStore(str, str, str, str, gobject.TYPE_BOOLEAN) # date, module, level, text
|
||||||
|
|
||||||
|
# this is how to add a filter:
|
||||||
|
#
|
||||||
|
# # Creation of the filter, from the model
|
||||||
|
# filter = self.liststore.filter_new()
|
||||||
|
# filter.set_visible_column(1)
|
||||||
|
#
|
||||||
|
# # The TreeView gets the filter as model
|
||||||
|
# self.listview = gtk.TreeView(filter)
|
||||||
|
|
||||||
|
self.listview = gtk.TreeView(model=self.liststore)
|
||||||
|
self.listview.set_grid_lines(gtk.TREE_VIEW_GRID_LINES_NONE)
|
||||||
|
self.listcols = []
|
||||||
|
|
||||||
|
scrolledwindow = gtk.ScrolledWindow()
|
||||||
|
scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
|
||||||
|
scrolledwindow.add(self.listview)
|
||||||
|
self.vbox.pack_start(scrolledwindow, expand=True, fill=True, padding=0)
|
||||||
|
|
||||||
|
refreshbutton = gtk.Button("Refresh")
|
||||||
|
refreshbutton.connect("clicked", self.refresh, None)
|
||||||
|
self.vbox.pack_start(refreshbutton, False, False, 3)
|
||||||
|
refreshbutton.show()
|
||||||
|
|
||||||
|
self.listview.show()
|
||||||
|
scrolledwindow.show()
|
||||||
|
self.vbox.show()
|
||||||
|
|
||||||
|
col = self.addColumn("Date/Time", 0)
|
||||||
|
col = self.addColumn("Module", 1)
|
||||||
|
col = self.addColumn("Level", 2)
|
||||||
|
col = self.addColumn("Text", 3)
|
||||||
|
|
||||||
|
self.loadLog()
|
||||||
|
self.vbox.show_all()
|
||||||
|
|
||||||
|
def addColumn(self, title, n):
|
||||||
|
col = gtk.TreeViewColumn(title)
|
||||||
|
self.listview.append_column(col)
|
||||||
|
cRender = gtk.CellRendererText()
|
||||||
|
cRender.set_property("wrap-mode", pango.WRAP_WORD_CHAR)
|
||||||
|
col.pack_start(cRender, True)
|
||||||
|
col.add_attribute(cRender, 'text', n)
|
||||||
|
col.set_max_width(1000)
|
||||||
|
col.set_spacing(0) # no effect
|
||||||
|
self.listcols.append(col)
|
||||||
|
col.set_clickable(True)
|
||||||
|
col.connect("clicked", self.sortCols, n)
|
||||||
|
return(col)
|
||||||
|
|
||||||
|
def loadLog(self):
|
||||||
|
|
||||||
|
#self.configStore = gtk.TreeStore(gobject.TYPE_PYOBJECT, gobject.TYPE_STRING, gobject.TYPE_STRING)
|
||||||
|
#self.configView = gtk.TreeView(self.configStore)
|
||||||
|
#self.configView.set_enable_tree_lines(True)
|
||||||
|
self.liststore.clear()
|
||||||
|
self.listcols = []
|
||||||
|
|
||||||
|
# count number of lines in file
|
||||||
|
f = open('logging.out', "r+")
|
||||||
|
buf = mmap.mmap(f.fileno(), 0)
|
||||||
|
readline = buf.readline
|
||||||
|
lines = 0
|
||||||
|
while readline():
|
||||||
|
lines += 1
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
startline = 0
|
||||||
|
if lines > MAX_LINES:
|
||||||
|
# only display from startline if log file is large
|
||||||
|
startline = lines - MAX_LINES
|
||||||
|
|
||||||
|
f = open('logging.out', "r+")
|
||||||
|
buf = mmap.mmap(f.fileno(), 0)
|
||||||
|
readline = buf.readline
|
||||||
|
l = 0
|
||||||
|
line = readline()
|
||||||
|
while line:
|
||||||
|
# eg line:
|
||||||
|
# 2009-12-02 15:23:21,716 - config DEBUG config logger initialised
|
||||||
|
l = l + 1
|
||||||
|
if l > startline and len(line) > 49:
|
||||||
|
iter = self.liststore.append( (line[0:23], line[26:32], line[39:46], line[48:].strip(), True) )
|
||||||
|
line = readline()
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
def sortCols(self, col, n):
|
||||||
|
try:
|
||||||
|
if not col.get_sort_indicator() or 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())
|
||||||
|
#self.liststore.set_sort_func(n, self.sortnums, (n,grid))
|
||||||
|
for i in xrange(len(self.listcols)):
|
||||||
|
self.listcols[i].set_sort_indicator(False)
|
||||||
|
self.listcols[n].set_sort_indicator(True)
|
||||||
|
# use this listcols[col].set_sort_indicator(True)
|
||||||
|
# to turn indicator off for other cols
|
||||||
|
except:
|
||||||
|
err = traceback.extract_tb(sys.exc_info()[2])
|
||||||
|
print "***sortCols error: " + str(sys.exc_info()[1])
|
||||||
|
print "\n".join( [e[0]+':'+str(e[1])+" "+e[2] for e in err] )
|
||||||
|
|
||||||
|
def refresh(self, widget, data):
|
||||||
|
self.loadLog()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__=="__main__":
|
||||||
|
|
||||||
|
config = Configuration.Config()
|
||||||
|
|
||||||
|
win = gtk.Window(gtk.WINDOW_TOPLEVEL)
|
||||||
|
win.set_title("Test Log Viewer")
|
||||||
|
win.set_border_width(1)
|
||||||
|
win.set_default_size(600, 500)
|
||||||
|
win.set_resizable(True)
|
||||||
|
|
||||||
|
dia = gtk.Dialog("Log Viewer",
|
||||||
|
win,
|
||||||
|
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
|
||||||
|
(gtk.STOCK_CLOSE, gtk.RESPONSE_OK))
|
||||||
|
dia.set_default_size(500, 500)
|
||||||
|
log = GuiLogView(config, win, dia.vbox)
|
||||||
|
response = dia.run()
|
||||||
|
if response == gtk.RESPONSE_ACCEPT:
|
||||||
|
pass
|
||||||
|
dia.destroy()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1317,6 +1317,7 @@ class Sql:
|
||||||
1.25 would be a config value so user could change it)
|
1.25 would be a config value so user could change it)
|
||||||
*/
|
*/
|
||||||
GROUP BY hc.PlayerId, hp.seatNo, p.name
|
GROUP BY hc.PlayerId, hp.seatNo, p.name
|
||||||
|
ORDER BY hc.PlayerId, hp.seatNo, p.name
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# same as above except stats are aggregated for all blind/limit levels
|
# same as above except stats are aggregated for all blind/limit levels
|
||||||
|
@ -1418,6 +1419,7 @@ class Sql:
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
GROUP BY hc.PlayerId, p.name
|
GROUP BY hc.PlayerId, p.name
|
||||||
|
ORDER BY hc.PlayerId, p.name
|
||||||
"""
|
"""
|
||||||
# NOTES on above cursor:
|
# NOTES on above cursor:
|
||||||
# - Do NOT include %s inside query in a comment - the db api thinks
|
# - Do NOT include %s inside query in a comment - the db api thinks
|
||||||
|
|
|
@ -66,7 +66,8 @@ if not options.errorsToConsole:
|
||||||
errorFile = open('fpdb-error-log.txt', 'w', 0)
|
errorFile = open('fpdb-error-log.txt', 'w', 0)
|
||||||
sys.stderr = errorFile
|
sys.stderr = errorFile
|
||||||
|
|
||||||
import logging
|
#import logging
|
||||||
|
import logging, logging.config
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import pygtk
|
import pygtk
|
||||||
|
@ -81,6 +82,7 @@ import interlocks
|
||||||
|
|
||||||
|
|
||||||
import GuiPrefs
|
import GuiPrefs
|
||||||
|
import GuiLogView
|
||||||
import GuiBulkImport
|
import GuiBulkImport
|
||||||
import GuiPlayerStats
|
import GuiPlayerStats
|
||||||
import GuiPositionalStats
|
import GuiPositionalStats
|
||||||
|
@ -96,6 +98,8 @@ import Exceptions
|
||||||
|
|
||||||
VERSION = "0.12"
|
VERSION = "0.12"
|
||||||
|
|
||||||
|
log = Configuration.get_logger("logging.conf", "fpdb")
|
||||||
|
|
||||||
class fpdb:
|
class fpdb:
|
||||||
def tab_clicked(self, widget, tab_name):
|
def tab_clicked(self, widget, tab_name):
|
||||||
"""called when a tab button is clicked to activate that tab"""
|
"""called when a tab button is clicked to activate that tab"""
|
||||||
|
@ -424,6 +428,29 @@ class fpdb:
|
||||||
|
|
||||||
self.release_global_lock()
|
self.release_global_lock()
|
||||||
|
|
||||||
|
def dia_logs(self, widget, data=None):
|
||||||
|
lock_set = False
|
||||||
|
if self.obtain_global_lock():
|
||||||
|
lock_set = True
|
||||||
|
|
||||||
|
dia = gtk.Dialog(title="Log Messages"
|
||||||
|
,parent=None
|
||||||
|
,flags=0
|
||||||
|
,buttons=(gtk.STOCK_CLOSE,gtk.RESPONSE_OK))
|
||||||
|
logviewer = GuiLogView.GuiLogView(self.config, self.window, dia.vbox)
|
||||||
|
response = dia.run()
|
||||||
|
if response == gtk.RESPONSE_ACCEPT:
|
||||||
|
pass
|
||||||
|
dia.destroy()
|
||||||
|
|
||||||
|
if lock_set:
|
||||||
|
self.release_global_lock()
|
||||||
|
|
||||||
|
def addLogText(self, text):
|
||||||
|
end_iter = self.logbuffer.get_end_iter()
|
||||||
|
self.logbuffer.insert(end_iter, text)
|
||||||
|
self.logview.scroll_to_mark(self.logbuffer.get_insert(), 0)
|
||||||
|
|
||||||
def __calendar_dialog(self, widget, entry):
|
def __calendar_dialog(self, widget, entry):
|
||||||
self.dia_confirm.set_modal(False)
|
self.dia_confirm.set_modal(False)
|
||||||
d = gtk.Window(gtk.WINDOW_TOPLEVEL)
|
d = gtk.Window(gtk.WINDOW_TOPLEVEL)
|
||||||
|
@ -526,6 +553,7 @@ class fpdb:
|
||||||
</menu>
|
</menu>
|
||||||
<menu action="help">
|
<menu action="help">
|
||||||
<menuitem action="Abbrev"/>
|
<menuitem action="Abbrev"/>
|
||||||
|
<menuitem action="Logs"/>
|
||||||
<separator/>
|
<separator/>
|
||||||
<menuitem action="About"/>
|
<menuitem action="About"/>
|
||||||
<menuitem action="License"/>
|
<menuitem action="License"/>
|
||||||
|
@ -567,6 +595,7 @@ class fpdb:
|
||||||
('stats', None, '_Statistics (todo)', None, 'View Database Statistics', self.dia_database_stats),
|
('stats', None, '_Statistics (todo)', None, 'View Database Statistics', self.dia_database_stats),
|
||||||
('help', None, '_Help'),
|
('help', None, '_Help'),
|
||||||
('Abbrev', None, '_Abbrevations (todo)', None, 'List of Abbrevations', self.tab_abbreviations),
|
('Abbrev', None, '_Abbrevations (todo)', None, 'List of Abbrevations', self.tab_abbreviations),
|
||||||
|
('Logs', None, '_Log Messages', None, 'Log and Debug Messages', self.dia_logs),
|
||||||
('About', None, 'A_bout', None, 'About the program', self.dia_about),
|
('About', None, 'A_bout', None, 'About the program', self.dia_about),
|
||||||
('License', None, '_License and Copying (todo)', None, 'License and Copying', self.dia_licensing),
|
('License', None, '_License and Copying (todo)', None, 'License and Copying', self.dia_licensing),
|
||||||
])
|
])
|
||||||
|
|
|
@ -11,6 +11,18 @@ keys=fileFormatter,stderrFormatter
|
||||||
level=INFO
|
level=INFO
|
||||||
handlers=consoleHandler,fileHandler
|
handlers=consoleHandler,fileHandler
|
||||||
|
|
||||||
|
[logger_fpdb]
|
||||||
|
level=INFO
|
||||||
|
handlers=consoleHandler,fileHandler
|
||||||
|
qualname=fpdb
|
||||||
|
propagate=0
|
||||||
|
|
||||||
|
[logger_logview]
|
||||||
|
level=INFO
|
||||||
|
handlers=consoleHandler,fileHandler
|
||||||
|
qualname=logview
|
||||||
|
propagate=0
|
||||||
|
|
||||||
[logger_parser]
|
[logger_parser]
|
||||||
level=INFO
|
level=INFO
|
||||||
handlers=consoleHandler,fileHandler
|
handlers=consoleHandler,fileHandler
|
||||||
|
@ -24,7 +36,7 @@ qualname=importer
|
||||||
propagate=0
|
propagate=0
|
||||||
|
|
||||||
[logger_config]
|
[logger_config]
|
||||||
level=DEBUG
|
level=INFO
|
||||||
handlers=consoleHandler,fileHandler
|
handlers=consoleHandler,fileHandler
|
||||||
qualname=config
|
qualname=config
|
||||||
propagate=0
|
propagate=0
|
||||||
|
|
Loading…
Reference in New Issue
Block a user