[Pykafe-commits] SF.net SVN: pykafe: [79] trunk/pykafe/server
Status: Pre-Alpha
Brought to you by:
jnmbk
From: <jn...@us...> - 2007-06-03 10:02:26
|
Revision: 79 http://pykafe.svn.sourceforge.net/pykafe/?rev=79&view=rev Author: jnmbk Date: 2007-06-03 03:02:27 -0700 (Sun, 03 Jun 2007) Log Message: ----------- fixes in options window send options to all clients when accepted logger takes cashier from database Modified Paths: -------------- trunk/pykafe/server/logger.py trunk/pykafe/server/server.py trunk/pykafe/server/settings.py trunk/pykafe/server/settingswindow.py trunk/pykafe/server/settingswindow.ui Modified: trunk/pykafe/server/logger.py =================================================================== --- trunk/pykafe/server/logger.py 2007-06-03 09:58:49 UTC (rev 78) +++ trunk/pykafe/server/logger.py 2007-06-03 10:02:27 UTC (rev 79) @@ -13,7 +13,8 @@ from database import Database from PyQt4 import QtCore -def add(log_type, log_value, cashier, computer = "", member = "", income = ""): +def add(log_type, log_value, computer = "", member = "", income = ""): + cashier = Database().runOnce("select setting_value from general_settings where setting_id = 'last_cashier'")[0][0] date = QtCore.QDateTime.currentDateTime().toTime_t() Database().runOnce("insert into logs (date, log_type, log_value, cashier, computer, member, income) values (?,?,?,?,?,?,?)", (date, log_type, log_value, cashier, computer, member, income)) class logTypes: Modified: trunk/pykafe/server/server.py =================================================================== --- trunk/pykafe/server/server.py 2007-06-03 09:58:49 UTC (rev 78) +++ trunk/pykafe/server/server.py 2007-06-03 10:02:27 UTC (rev 79) @@ -18,13 +18,13 @@ from session import ClientSession from database import Database from settingswindow import Ui_SettingsWindow +from currencyformat import currency import logger import base64, sha, time, os import locale, gettext locale.setlocale(locale.LC_MESSAGES, "C") -#maybe using LC_MONETARY would be better for printing money in listwidgets -locale.setlocale(locale.LC_NUMERIC, "") +locale.setlocale(locale.LC_MONETARY, "") _ = gettext.translation("pyKafe_server", fallback=True).ugettext class MessageSender(QtCore.QThread): @@ -65,10 +65,9 @@ client = self.clients[self.clientNumber] data = base64.decodestring(self.tcpSocket.readAll()) print "data:", data - if data[:3] == "011": + #TODO: Move these into setState if client.session.state in (ClientSession.notConnected, ClientSession.notReady): - logger.add(logger.logTypes.information, "client connected", self.config.last_cashier, client.name) if self.config.filter_enable: message = "007" filterFile = open(self.config.filter_file) @@ -76,9 +75,9 @@ filterFile.close() for i in filters: message += i - client.sendMessage(message) + client.sendMessage(message.strip()) message = "016" - message += "%s|%s|%s|%s".strip() % (self.config.price_fixedprice, + message += "%s|%s|%s|%s" % (self.config.price_fixedprice, self.config.price_fixedpriceminutes, self.config.price_onehourprice, self.config.price_rounding) @@ -92,7 +91,7 @@ #client.sendSession() elif data[:3] == "004": if client.session.state == ClientSession.notReady: - client.setState(ClientSession.ready) + self.emit(QtCore.SIGNAL("stateChange"), self.clientNumber, ClientSession.ready) elif data[:3] == "000": #User wants to open if client.session.state == ClientSession.ready: @@ -107,13 +106,13 @@ db.cur.execute("select count() from members where username = ? and password = ?", (username, password)) if db.cur.fetchall()[0][0]: client.sendMessage("0031") - logger.add(logger.logTypes.information, _("member login"), self.config.last_cashier, client.name, username) - client.setState(ClientSession.loggedIn, user = username) + logger.add(logger.logTypes.information, _("Member logged in"), computer = client.name, member = username) + self.emit(QtCore.SIGNAL("stateChange"), self.clientNumber, ClientSession.waitingMoney, user = username) else: - logger.add(logger.logTypes.warning, _("Someone entered wrong password or username"), self.config.last_cashier, client.name, username) + logger.add(logger.logTypes.warning, _("Someone entered wrong password or username"), computer = client.name, member = username) client.sendMessage("0030") elif data[:3] == "008": - client.setState(ClientSession.waitingMoney) + self.emit(QtCore.SIGNAL("stateChange"), self.clientNumber, ClientSession.waitingMoney) self.tcpSocket.disconnectFromHost() class ClientThread(QtCore.QThread): @@ -131,7 +130,7 @@ else: #TODO: round the price using price_rounding price = float(self.config.price_onehourprice)/3600 * utime - self.emit(QtCore.SIGNAL("changetext"),3,str(price)) + self.emit(QtCore.SIGNAL("changetext"),3,currency(price)) usedTime = QtCore.QDateTime() usedTime.setTime_t(utime) self.emit(QtCore.SIGNAL("changetext"),4,usedTime.toUTC().time().toString("hh.mm")) @@ -140,8 +139,8 @@ class Client(QtGui.QTreeWidgetItem): def __init__(self, parent, clientInformation, config): QtGui.QTreeWidgetItem.__init__(self, parent) + self.config = config self.fillList(clientInformation) - self.config = config watcherThread = ClientThread(self, config) QtCore.QObject.connect(watcherThread, QtCore.SIGNAL("changetext"), self.setText) watcherThread.start() @@ -170,7 +169,7 @@ elif state == ClientSession.loggedIn: self.session.user = user self.setText(2, user) - self.setText(3, self.config.currency_prefix + "0" + self.config.currency_suffix) + self.setText(3, currency(0.0)) self.session.startTime = QtCore.QDateTime.currentDateTime() self.setText(4, self.session.startTime.time().toString("00.00")) if endTime: @@ -182,20 +181,26 @@ self.changeColor("red") self.session.state = state self.setText(1, self.session.toString()) + logger.add(logger.logTypes.information, _("State changed to %s") % self.session.toString(), member = self.name) def sendSession(self): - #send latest session to the client - message = "012" + "sends latest session to the client, this is for eliminating client side problems like rebooting" + message = "012"+\ + str(self.session.state)+'|'+\ + self.session.user+'|'+\ + str(self.session.startTime.toTime_t())+'|'+\ + str(self.session.endTime.toTime_t()) self.sendMessage(message) class Product(QtGui.QTreeWidgetItem): def __init__(self, parent, productInformation): QtGui.QTreeWidgetItem.__init__(self, parent) self.updateValues(productInformation) + def updateValues(self, productInformation): self.name, self.price, self.quantity = productInformation self.setText(0,self.name) - self.setText(1,locale.format("%.2f", self.price, grouping=True)) + self.setText(1,currency(float(self.price))) self.setText(2,str(self.quantity)) class Member(QtGui.QTreeWidgetItem): @@ -218,25 +223,27 @@ self.ui = ui if self.config.startup_askpassword: self.config.set("last_cashier", cashier) - logger.add(logger.logTypes.information, _("cashier login to server"), self.config.last_cashier) + logger.add(logger.logTypes.information, _("cashier login to server")) if not self.listen(QtNetwork.QHostAddress(QtNetwork.QHostAddress.Any), int(self.config.network_port)): - logger.add(logger.logTypes.error, _("Unable to start server: %s") % self.errorString(), self.config.last_cashier) + logger.add(logger.logTypes.error, _("Unable to start server: %s") % self.errorString()) QtGui.QMessageBox.critical(self.parent(), _("Connection Error"), _("Unable to start server: %s") % self.errorString()) self.parent().close() self.clients = [] for clientInformation in self.config.clientList: self.clients.append(Client(ui.main_treeWidget, clientInformation, self.config)) ui.main_treeWidget.sortItems(0, QtCore.Qt.AscendingOrder) - self.initMembers() + self.initMembers(first = True) self.initProducts() self.localize() self.threads = [] - def initMembers(self): - self.members = [] - memberList = Database().run("select * from members where is_cashier='0'") - for memberInformation in memberList: - self.members.append(Member(self.ui.members_treeWidget, memberInformation[:7])) + def initMembers(self, first = False): + #TODO: Call this function after adding and deleting + if first: + self.members = [] + memberList = Database().run("select * from members where is_cashier='0'") + for memberInformation in memberList: + self.members.append(Member(self.ui.members_treeWidget, memberInformation[:7])) self.ui.members_dateEdit.setDate(QtCore.QDate.currentDate()) self.ui.members_dateEdit_2.setDate(QtCore.QDate.currentDate().addMonths(1)) self.ui.members_username.clear() @@ -372,6 +379,7 @@ self.members.append(Member(self.ui.members_treeWidget, memberInformation[:7])) self.filterMembers(self.ui.members_filter.text()) self.ui.statusbar.showMessage(_("Added member")) + logger.add(logger.logTypes.information, _("Added member"), member = memberInformation[0]) except sqlite.IntegrityError: QtGui.QMessageBox.critical(self.parent(), _("Error"), _("Username must be unique")) @@ -458,10 +466,16 @@ member.setHidden(True) def localize(self): - self.ui.members_debt.setPrefix(self.config.currency_prefix) - self.ui.members_debt.setSuffix(self.config.currency_suffix) - self.ui.orders_spinBox_2.setPrefix(self.config.currency_prefix) - self.ui.orders_spinBox_2.setSuffix(self.config.currency_suffix) + conv = locale.localeconv() + symbol = conv['currency_symbol'] + if conv['p_cs_precedes']: + symbol += ' ' + self.ui.members_debt.setPrefix(symbol) + self.ui.orders_spinBox_2.setPrefix(symbol) + else: + symbol = ' ' + symbol + self.ui.members_debt.setSuffix(symbol) + self.ui.orders_spinBox_2.setSuffix(symbol) def addProduct(self): productName = unicode(self.ui.orders_itemLineEdit.text()) @@ -519,7 +533,29 @@ QtGui.QMessageBox.aboutQt(self.parent()) def settings(self): - settingsDialog = QtGui.QDialog(self.parent()) + self.settingsDialog = QtGui.QDialog(self.parent()) + QtCore.QObject.connect(self.settingsDialog, QtCore.SIGNAL("accepted()"), self.sendOptions) settingsUi = Ui_SettingsWindow() - settingsUi.setupUi(settingsDialog, self.config) - settingsDialog.show() + settingsUi.setupUi(self.settingsDialog, self.config) + self.settingsDialog.show() + + def sendOptions(self): + "Sends internet filtering and pricing settings to all clients" + if self.config.filter_enable: + filterMessage = "007" + filterFile = open(self.config.filter_file) + filters = filterFile.readlines() + filterFile.close() + for i in filters: + filterMessage += i + filterMessage = filterMessage.strip() + priceMessage = "016" + priceMessage += "%s|%s|%s|%s" % (self.config.price_fixedprice, + self.config.price_fixedpriceminutes, + self.config.price_onehourprice, + self.config.price_rounding) + for client in self.clients: + if client.session.state != ClientSession.notConnected: + client.sendMessage(priceMessage) + if self.config.filter_enable: + client.sendMessage(filterMessage) Modified: trunk/pykafe/server/settings.py =================================================================== --- trunk/pykafe/server/settings.py 2007-06-03 09:58:49 UTC (rev 78) +++ trunk/pykafe/server/settings.py 2007-06-03 10:02:27 UTC (rev 79) @@ -17,6 +17,7 @@ import locale, gettext locale.setlocale(locale.LC_ALL, "C") +locale.setlocale(locale.LC_MONETARY, "") _ = gettext.translation("pyKafe_server", fallback=True).ugettext def getSiteIP(site): @@ -46,6 +47,7 @@ self.filterRead() self.cashiers = [] self.fillCashiers() + self.localize() def fillCashiers(self): cashierList = Database().run("select username,password,name from members where is_cashier='1'") @@ -56,17 +58,17 @@ if not text: text = self.ui.filter_address.text() #TODO: a QtGui.QProgressDialog() is needed here because getSiteIP takes some time to complete its job - if not getSiteIP(text): - if errorDialog: - QtGui.QMessageBox.critical(self.parent(), _("Error"), _("You didn't enter a valid address")) - return + if errorDialog: + if not getSiteIP(text): + QtGui.QMessageBox.critical(self.parent, _("Error"), _("You didn't enter a valid address")) + return self.filterItems.append(QtGui.QTreeWidgetItem(self.ui.filter_treeWidget)) self.filterItems[-1].setText(0, text) def filterDelete(self): currentFilter = self.ui.filter_treeWidget.currentItem() if not currentFilter: - QtGui.QMessageBox.critical(self.parent(), _("Error"), _("You must select a filter first")) + QtGui.QMessageBox.critical(self.parent, _("Error"), _("You must select a filter first")) return self.ui.filter_treeWidget.takeTopLevelItem(self.ui.filter_treeWidget.indexOfTopLevelItem(currentFilter)) del(self.filterItems[self.filterItems.index(currentFilter)]) @@ -74,7 +76,7 @@ def filterUpdate(self): currentFilter = self.ui.filter_treeWidget.currentItem() if not currentFilter: - QtGui.QMessageBox.critical(self.parent(), _("Error"), _("You must select a filter first")) + QtGui.QMessageBox.critical(self.parent, _("Error"), _("You must select a filter first")) return currentFilter.setText(0, self.ui.filter_address.text()) @@ -83,6 +85,7 @@ if not currentFilter: currentFilter = previous self.ui.filter_address.setText(currentFilter.text(0)) + def filterEnable(self): if self.ui.filter_enable.checkState() == QtCore.Qt.Checked: self.ui.filter_address.setEnabled(True) @@ -102,7 +105,7 @@ self.ui.filter_browse.setEnabled(False) def filterBrowse(self): - fileName = QtGui.QFileDialog.getOpenFileName(self.parent(), _("Select Filter File"), self.config.filter_file[:self.config.filter_file.rfind('/')], "Text files (*.txt)") + fileName = QtGui.QFileDialog.getOpenFileName(self.parent, _("Select Filter File"), self.config.filter_file[:self.config.filter_file.rfind('/')], "Text files (*.txt)") if not fileName: return self.ui.filter_file.setText(fileName) @@ -120,8 +123,12 @@ filter_file.writelines(filters) filter_file.close() self.config.set("filter_file", unicode(self.ui.filter_file.text())) + self.config.set("price_fixedpriceminutes", str(self.ui.pricing_minutes.value())) + self.config.set("price_fixedprice", str(self.ui.pricing_fixed.value())) + self.config.set("price_onehourprice", str(self.ui.pricing_onehour.value())) + self.config.set("price_rounding", str(self.ui.pricing_rounding.value())) #TODO: cashier changes should be applied here, not directly to db! - self.parent.close() + self.parent.accept() def readFromConfig(self): if self.config.filter_enable: @@ -129,7 +136,25 @@ self.ui.filter_file.setText(self.config.filter_file) if self.config.startup_askpassword: self.ui.checkBox_2.setCheckState(QtCore.Qt.Checked) + self.ui.pricing_minutes.setValue(int(self.config.price_fixedpriceminutes)) + self.ui.pricing_fixed.setValue(float(self.config.price_fixedprice)) + self.ui.pricing_onehour.setValue(float(self.config.price_onehourprice)) + self.ui.pricing_rounding.setValue(float(self.config.price_rounding)) + def localize(self): + conv = locale.localeconv() + symbol = conv['currency_symbol'] + if conv['p_cs_precedes']: + symbol += ' ' + self.ui.pricing_fixed.setPrefix(symbol) + self.ui.pricing_onehour.setPrefix(symbol) + self.ui.pricing_rounding.setPrefix(symbol) + else: + symbol = ' ' + symbol + self.ui.pricing_fixed.setSuffix(symbol) + self.ui.pricing_onehour.setSuffix(symbol) + self.ui.pricing_rounding.setSuffix(symbol) + def filterRead(self): file = open(unicode(self.ui.filter_file.text())) filters = file.readlines() Modified: trunk/pykafe/server/settingswindow.py =================================================================== --- trunk/pykafe/server/settingswindow.py 2007-06-03 09:58:49 UTC (rev 78) +++ trunk/pykafe/server/settingswindow.py 2007-06-03 10:02:27 UTC (rev 79) @@ -67,10 +67,10 @@ self.label_2.setObjectName("label_2") self.hboxlayout.addWidget(self.label_2) - self.doubleSpinBox = QtGui.QDoubleSpinBox(self.tab_3) - self.doubleSpinBox.setMaximum(1000000000.0) - self.doubleSpinBox.setObjectName("doubleSpinBox") - self.hboxlayout.addWidget(self.doubleSpinBox) + self.pricing_rounding = QtGui.QDoubleSpinBox(self.tab_3) + self.pricing_rounding.setMaximum(1000000000.0) + self.pricing_rounding.setObjectName("pricing_rounding") + self.hboxlayout.addWidget(self.pricing_rounding) self.gridlayout2.addLayout(self.hboxlayout,2,0,1,1) spacerItem2 = QtGui.QSpacerItem(20,40,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding) @@ -85,20 +85,20 @@ self.label_5.setObjectName("label_5") self.hboxlayout1.addWidget(self.label_5) - self.spinBox = QtGui.QSpinBox(self.tab_3) - self.spinBox.setMaximum(3600) - self.spinBox.setSingleStep(15) - self.spinBox.setObjectName("spinBox") - self.hboxlayout1.addWidget(self.spinBox) + self.pricing_minutes = QtGui.QSpinBox(self.tab_3) + self.pricing_minutes.setMaximum(3600) + self.pricing_minutes.setSingleStep(15) + self.pricing_minutes.setObjectName("pricing_minutes") + self.hboxlayout1.addWidget(self.pricing_minutes) self.label = QtGui.QLabel(self.tab_3) self.label.setObjectName("label") self.hboxlayout1.addWidget(self.label) - self.pricing_30minutes = QtGui.QDoubleSpinBox(self.tab_3) - self.pricing_30minutes.setMaximum(1000000000.0) - self.pricing_30minutes.setObjectName("pricing_30minutes") - self.hboxlayout1.addWidget(self.pricing_30minutes) + self.pricing_fixed = QtGui.QDoubleSpinBox(self.tab_3) + self.pricing_fixed.setMaximum(1000000000.0) + self.pricing_fixed.setObjectName("pricing_fixed") + self.hboxlayout1.addWidget(self.pricing_fixed) self.gridlayout2.addLayout(self.hboxlayout1,0,0,1,1) self.hboxlayout2 = QtGui.QHBoxLayout() @@ -323,7 +323,7 @@ self.tabWidget.setCurrentIndex(0) self.manager = SettingsManager(self, SettingsWindow, config) QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL("accepted()"),self.manager.accept) - QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL("rejected()"),SettingsWindow.close) + QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL("rejected()"),SettingsWindow.reject) QtCore.QObject.connect(self.filter_add,QtCore.SIGNAL("clicked()"),self.manager.filterAdd) QtCore.QObject.connect(self.filter_delete,QtCore.SIGNAL("clicked()"),self.manager.filterDelete) QtCore.QObject.connect(self.filter_update,QtCore.SIGNAL("clicked()"),self.manager.filterUpdate) @@ -337,11 +337,11 @@ QtCore.QObject.connect(self.cashiers_reportsButton,QtCore.SIGNAL("clicked()"),self.manager.cashierReports) QtCore.QMetaObject.connectSlotsByName(SettingsWindow) SettingsWindow.setTabOrder(self.tabWidget,self.checkBox_2) - SettingsWindow.setTabOrder(self.checkBox_2,self.spinBox) - SettingsWindow.setTabOrder(self.spinBox,self.pricing_30minutes) - SettingsWindow.setTabOrder(self.pricing_30minutes,self.pricing_onehour) - SettingsWindow.setTabOrder(self.pricing_onehour,self.doubleSpinBox) - SettingsWindow.setTabOrder(self.doubleSpinBox,self.filter_enable) + SettingsWindow.setTabOrder(self.checkBox_2,self.pricing_minutes) + SettingsWindow.setTabOrder(self.pricing_minutes,self.pricing_fixed) + SettingsWindow.setTabOrder(self.pricing_fixed,self.pricing_onehour) + SettingsWindow.setTabOrder(self.pricing_onehour,self.pricing_rounding) + SettingsWindow.setTabOrder(self.pricing_rounding,self.filter_enable) SettingsWindow.setTabOrder(self.filter_enable,self.filter_file) SettingsWindow.setTabOrder(self.filter_file,self.filter_browse) SettingsWindow.setTabOrder(self.filter_browse,self.filter_address) Modified: trunk/pykafe/server/settingswindow.ui =================================================================== --- trunk/pykafe/server/settingswindow.ui 2007-06-03 09:58:49 UTC (rev 78) +++ trunk/pykafe/server/settingswindow.ui 2007-06-03 10:02:27 UTC (rev 79) @@ -103,7 +103,7 @@ </widget> </item> <item> - <widget class="QDoubleSpinBox" name="doubleSpinBox" > + <widget class="QDoubleSpinBox" name="pricing_rounding" > <property name="maximum" > <double>1000000000.000000000000000</double> </property> @@ -140,7 +140,7 @@ </widget> </item> <item> - <widget class="QSpinBox" name="spinBox" > + <widget class="QSpinBox" name="pricing_minutes" > <property name="maximum" > <number>3600</number> </property> @@ -157,7 +157,7 @@ </widget> </item> <item> - <widget class="QDoubleSpinBox" name="pricing_30minutes" > + <widget class="QDoubleSpinBox" name="pricing_fixed" > <property name="maximum" > <double>1000000000.000000000000000</double> </property> @@ -568,10 +568,10 @@ <tabstops> <tabstop>tabWidget</tabstop> <tabstop>checkBox_2</tabstop> - <tabstop>spinBox</tabstop> - <tabstop>pricing_30minutes</tabstop> + <tabstop>pricing_minutes</tabstop> + <tabstop>pricing_fixed</tabstop> <tabstop>pricing_onehour</tabstop> - <tabstop>doubleSpinBox</tabstop> + <tabstop>pricing_rounding</tabstop> <tabstop>filter_enable</tabstop> <tabstop>filter_file</tabstop> <tabstop>filter_browse</tabstop> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |