[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.
|