5c26bb028d
Everleaf converts hands Moved process hand logic into the hand subclass that knows what it wants, it calls back to the hhc (which knows about the format) to populate itself Conflicts: pyfpdb/EverleafToFpdb.py pyfpdb/Hand.py pyfpdb/HandHistoryConverter.py
253 lines
10 KiB
Python
Executable File
253 lines
10 KiB
Python
Executable File
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# Copyright 2008 Steffen Jobbagy-Felso
|
|
# 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.
|
|
|
|
# Standard Library modules
|
|
import os
|
|
import sys
|
|
from time import time
|
|
from optparse import OptionParser
|
|
|
|
# pyGTK modules
|
|
import pygtk
|
|
pygtk.require('2.0')
|
|
import gtk
|
|
|
|
# fpdb/FreePokerTools modules
|
|
import fpdb_simple
|
|
import fpdb_import
|
|
import fpdb_db
|
|
import Configuration
|
|
|
|
class GuiBulkImport():
|
|
|
|
def import_dir(self):
|
|
"""imports a directory, non-recursive. todo: move this to fpdb_import so CLI can use it"""
|
|
|
|
self.path = self.inputFile
|
|
self.importer.addImportDirectory(self.path)
|
|
self.importer.setCallHud(False)
|
|
starttime = time()
|
|
if not self.importer.settings['threads'] > 1:
|
|
(stored, dups, partial, errs, ttime) = self.importer.runImport()
|
|
print 'GuiBulkImport.import_dir done: Stored: %d Duplicates: %d Partial: %d Errors: %d in %s seconds - %d/sec'\
|
|
% (stored, dups, partial, errs, ttime, stored / ttime)
|
|
else:
|
|
self.importer.RunImportThreaded()
|
|
|
|
def load_clicked(self, widget, data=None):
|
|
# get the dir to import from the chooser
|
|
self.inputFile = self.chooser.get_filename()
|
|
|
|
# get the import settings from the gui and save in the importer
|
|
self.importer.setHandCount(int(self.spin_hands.get_text()))
|
|
self.importer.setMinPrint(int(self.spin_hands.get_text()))
|
|
self.importer.setQuiet(self.chk_st_st.get_active())
|
|
self.importer.setFailOnError(self.chk_fail.get_active())
|
|
self.importer.setThreads(int(self.spin_threads.get_text()))
|
|
self.importer.setHandsInDB(self.n_hands_in_db)
|
|
cb_model = self.cb.get_model()
|
|
cb_index = self.cb.get_active()
|
|
if cb_index:
|
|
self.importer.setDropIndexes(cb_model[cb_index][0])
|
|
else:
|
|
self.importer.setDropIndexes("auto")
|
|
hhc=self.cbfilter.get_model()[self.cbfilter.get_active()][0]
|
|
self.lab_info.set_text("Importing")
|
|
|
|
self.importer.addBulkImportImportFileOrDir(self.inputFile,filter=hhc)
|
|
self.importer.setCallHud(False)
|
|
starttime = time()
|
|
(stored, dups, partial, errs, ttime) = self.importer.runImport()
|
|
print 'GuiBulkImport.import_dir done: Stored: %d \tDuplicates: %d \tPartial: %d \tErrors: %d in %s seconds - %d/sec'\
|
|
% (stored, dups, partial, errs, ttime, stored / ttime)
|
|
self.importer.clearFileList()
|
|
|
|
self.lab_info.set_text("Import finished")
|
|
|
|
def get_vbox(self):
|
|
"""returns the vbox of this thread"""
|
|
return self.vbox
|
|
|
|
def __init__(self, db, settings, config):
|
|
self.db = db # this is an instance of fpdb_db
|
|
self.settings = settings
|
|
self.config = config
|
|
self.importer = fpdb_import.Importer(self, self.settings,
|
|
config)
|
|
|
|
self.vbox = gtk.VBox(False, 0)
|
|
self.vbox.show()
|
|
|
|
self.chooser = gtk.FileChooserWidget()
|
|
self.chooser.set_filename(self.settings['bulkImport-defaultPath'])
|
|
self.vbox.add(self.chooser)
|
|
self.chooser.show()
|
|
|
|
# Table widget to hold the settings
|
|
self.table = gtk.Table(rows = 3, columns = 5, homogeneous = False)
|
|
self.vbox.add(self.table)
|
|
self.table.show()
|
|
|
|
# checkbox - print start/stop?
|
|
self.chk_st_st = gtk.CheckButton('Print Start/Stop Info')
|
|
self.table.attach(self.chk_st_st, 0, 1, 0, 1, xpadding = 10, ypadding = 0, yoptions=gtk.SHRINK)
|
|
self.chk_st_st.show()
|
|
self.chk_st_st.set_active(True)
|
|
|
|
# label - status
|
|
self.lab_status = gtk.Label("Hands/status print:")
|
|
self.table.attach(self.lab_status, 1, 2, 0, 1, xpadding = 0, ypadding = 0, yoptions=gtk.SHRINK)
|
|
self.lab_status.show()
|
|
self.lab_status.set_justify(gtk.JUSTIFY_RIGHT)
|
|
|
|
# spin button - status
|
|
status_adj = gtk.Adjustment(value=100, lower=0, upper=300, step_incr=10, page_incr=1, page_size=0) #not sure what upper value should be!
|
|
self.spin_status = gtk.SpinButton(adjustment=status_adj, climb_rate=0.0, digits=0)
|
|
self.table.attach(self.spin_status, 2, 3, 0, 1, xpadding = 10, ypadding = 0, yoptions=gtk.SHRINK)
|
|
self.spin_status.show()
|
|
|
|
# label - threads
|
|
self.lab_threads = gtk.Label("Number of threads:")
|
|
self.table.attach(self.lab_threads, 3, 4, 0, 1, xpadding = 0, ypadding = 0, yoptions=gtk.SHRINK)
|
|
self.lab_threads.show()
|
|
self.lab_threads.set_sensitive(False)
|
|
self.lab_threads.set_justify(gtk.JUSTIFY_RIGHT)
|
|
|
|
# spin button - threads
|
|
threads_adj = gtk.Adjustment(value=0, lower=0, upper=10, step_incr=1, page_incr=1, page_size=0) #not sure what upper value should be!
|
|
self.spin_threads = gtk.SpinButton(adjustment=threads_adj, climb_rate=0.0, digits=0)
|
|
self.table.attach(self.spin_threads, 4, 5, 0, 1, xpadding = 0, ypadding = 0, yoptions=gtk.SHRINK)
|
|
self.spin_threads.show()
|
|
self.spin_threads.set_sensitive(False)
|
|
|
|
# checkbox - fail on error?
|
|
self.chk_fail = gtk.CheckButton('Fail on error')
|
|
self.table.attach(self.chk_fail, 0, 1, 1, 2, xpadding = 10, ypadding = 0, yoptions=gtk.SHRINK)
|
|
self.chk_fail.show()
|
|
|
|
# label - hands
|
|
self.lab_hands = gtk.Label("Hands/file:")
|
|
self.table.attach(self.lab_hands, 1, 2, 1, 2, xpadding = 0, ypadding = 0, yoptions=gtk.SHRINK)
|
|
self.lab_hands.show()
|
|
self.lab_hands.set_justify(gtk.JUSTIFY_RIGHT)
|
|
|
|
# spin button - hands to import
|
|
hands_adj = gtk.Adjustment(value=0, lower=0, upper=10, step_incr=1, page_incr=1, page_size=0) #not sure what upper value should be!
|
|
self.spin_hands = gtk.SpinButton(adjustment=hands_adj, climb_rate=0.0, digits=0)
|
|
self.table.attach(self.spin_hands, 2, 3, 1, 2, xpadding = 10, ypadding = 0, yoptions=gtk.SHRINK)
|
|
self.spin_hands.show()
|
|
|
|
# label - drop indexes
|
|
self.lab_drop = gtk.Label("Drop indexes:")
|
|
self.table.attach(self.lab_drop, 3, 4, 1, 2, xpadding = 0, ypadding = 0, yoptions=gtk.SHRINK)
|
|
self.lab_drop.show()
|
|
self.lab_drop.set_justify(gtk.JUSTIFY_RIGHT)
|
|
|
|
# ComboBox - drop indexes
|
|
self.cb = gtk.combo_box_new_text()
|
|
self.cb.append_text('auto')
|
|
self.cb.append_text("don't drop")
|
|
self.cb.append_text('drop')
|
|
self.cb.set_active(0)
|
|
self.table.attach(self.cb, 4, 5, 1, 2, xpadding = 10, ypadding = 0, yoptions=gtk.SHRINK)
|
|
self.cb.show()
|
|
|
|
# label - filter
|
|
self.lab_filter = gtk.Label("Site filter:")
|
|
self.table.attach(self.lab_filter, 2, 3, 2, 3, xpadding = 0, ypadding = 0, yoptions=gtk.SHRINK)
|
|
self.lab_filter.show()
|
|
self.lab_filter.set_justify(gtk.JUSTIFY_RIGHT)
|
|
|
|
# ComboBox - filter
|
|
self.cbfilter = gtk.combo_box_new_text()
|
|
self.cbfilter.append_text("passthrough")
|
|
self.cbfilter.append_text("Everleaf")
|
|
self.cbfilter.set_active(0)
|
|
self.table.attach(self.cbfilter, 3, 4, 2, 3, xpadding = 10, ypadding = 0, yoptions=gtk.SHRINK)
|
|
self.cbfilter.show()
|
|
|
|
# label - info
|
|
self.lab_info = gtk.Label()
|
|
self.table.attach(self.lab_info, 0, 4, 2, 3, xpadding = 0, ypadding = 0, yoptions=gtk.SHRINK)
|
|
self.lab_info.show()
|
|
|
|
# button - Import
|
|
self.load_button = gtk.Button('Import') # todo: rename variables to import too
|
|
self.load_button.connect('clicked', self.load_clicked,
|
|
'Import clicked')
|
|
self.table.attach(self.load_button, 4, 5, 2, 3, xpadding = 0, ypadding = 0, yoptions=gtk.SHRINK)
|
|
self.load_button.show()
|
|
|
|
# see how many hands are in the db and adjust accordingly
|
|
db_parms = config.get_db_parameters('fpdb')
|
|
db.connect(db_parms['db-backend'],
|
|
db_parms['db-host'],
|
|
db_parms['db-databaseName'],
|
|
db_parms['db-user'],
|
|
db_parms['db-password'])
|
|
cursor = db.db.cursor()
|
|
cursor.execute("Select max(id) from Hands;")
|
|
row = cursor.fetchone()
|
|
db.disconnect() # that's all we need this for
|
|
self.n_hands_in_db = row[0]
|
|
if self.n_hands_in_db == 0:
|
|
self.cb.set_active(2)
|
|
self.cb.set_sensitive(False)
|
|
self.lab_drop.set_sensitive(False)
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
|
def destroy(*args): # call back for terminating the main eventloop
|
|
gtk.main_quit()
|
|
|
|
parser = OptionParser()
|
|
parser.add_option("-f", "--file", dest="filename", help="Input file in quiet mode", metavar="FILE")
|
|
parser.add_option("-q", "--quiet", action="store_false", dest="gui", default=True, help="don't start gui")
|
|
|
|
(options, sys.argv) = parser.parse_args()
|
|
|
|
config = Configuration.Config()
|
|
db = fpdb_db.fpdb_db()
|
|
|
|
settings = {}
|
|
if os.name == 'nt': settings['os'] = 'windows'
|
|
else: settings['os'] = 'linuxmac'
|
|
|
|
settings.update(config.get_db_parameters('fpdb'))
|
|
settings.update(config.get_tv_parameters())
|
|
settings.update(config.get_import_parameters())
|
|
settings.update(config.get_default_paths())
|
|
|
|
if(options.gui == True):
|
|
i = GuiBulkImport(db, settings, config)
|
|
main_window = gtk.Window()
|
|
main_window.connect('destroy', destroy)
|
|
main_window.add(i.vbox)
|
|
main_window.show()
|
|
gtk.main()
|
|
else:
|
|
#Do something useful
|
|
importer = fpdb_import.Importer(False,settings, config)
|
|
importer.setDropIndexes("auto")
|
|
importer.setFailOnError(True)
|
|
importer.addImportFile(options.filename)
|
|
importer.setCallHud(False)
|
|
importer.runImport()
|
|
importer.clearFileList()
|