diff --git a/app/database.py b/app/database.py index 716f7e2..b44f3c3 100644 --- a/app/database.py +++ b/app/database.py @@ -170,6 +170,7 @@ def get_consumed(user=None, startdate=None, enddate=None): consumed.append(c) return consumed + def add_consume(username, productid): consumerid = query_db("SELECT ID FROM USERS WHERE NAME = ?", [username], one=True) @@ -184,6 +185,19 @@ def add_consume(username, productid): return + +def get_debt(name=None): + consumptions = get_consumed(name) + debt = 0 + for consumption in consumptions: + debt += consumption.price + + deposits = get_deposits(get_user_by_name(name).id) + for deposit in deposits: + debt -= deposit.amount + return debt + + def get_deposits(userid = None): #ID|USERID|AMOUNT|TIME if userid == None: diff --git a/app/gui.py b/app/gui.py index 74aac25..fdfd0bd 100644 --- a/app/gui.py +++ b/app/gui.py @@ -1,26 +1,33 @@ # -*- coding: utf-8 -*- import wx +import wx.lib.buttons +import wx.lib.platebtn from plot import * from database import * +from settings import * import flask as fla + class MainWindow(wx.Frame): def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) - self.init_ui() - - def init_ui(self): - self.SetSize((480, 320)) - self.SetTitle('Baroness Control') - self.panelStart = PanelStart(self) self.panelDrinks = PanelDrinks(self) self.panelUsers = PanelUsers(self) self.panelThanks = PanelThanks(self) self.panelSorry = PanelSorry(self) + self.settings = Settings() self.user = User() + self.drinkl = str() + self.active = 0 + + self.init_ui() + + def init_ui(self): + self.SetSize((480, 320)) + self.SetTitle('Baroness Control') self.active = 0 self.switchPanels() @@ -38,6 +45,9 @@ class MainWindow(wx.Frame): return self.user.id # return self.user + def getDrink(self): + return self.drink + def onExit(self, e=None): self.active = 0 self.switchPanels() @@ -56,8 +66,8 @@ class MainWindow(wx.Frame): def onProduct(self, e): self.active = 3 print self.user.longname + ' consumes' - buttonl = e.GetEventObject().GetLabelText() - drink = get_product_by_name(buttonl.split('\n')[0]).id + self.drinkl = e.GetEventObject().GetLabelText() + drink = get_product_by_name(self.drinkl.split('\n')[0]).id with app.app_context(): for i in range(0, int(self.panelDrinks.GetAmount())): add_consume(self.user.name, drink) @@ -73,12 +83,19 @@ class MainWindow(wx.Frame): if self.active == 0: self.panelStart.Show() elif self.active == 1: + if not settings.onlyOneDrink: + self.panelDrinks.l_amount.SetLabel("%02d" % 1) self.panelDrinks.l_user.SetLabel(self.user.longname) self.panelDrinks.Show() elif self.active == 2: self.panelUsers.Show() elif self.active == 3: - self.panelThanks.label_1.SetLabel(self.user.longname) + self.panelThanks.label_1.SetLabel(self.user.longname + "\n" + "%02d x " % int(self.panelDrinks.GetAmount()) + self.drinkl.split('\n')[0]) + self.panelThanks.label_1.Wrap(340) + try: + self.panelThanks.bitmap_2.SetBitmap(wx.Bitmap("./app/static/product_%s.png" % self.drinkl.split('\n')[0], wx.BITMAP_TYPE_ANY)) + except: + print "no picture for drink:", self.drinkl.split('\n') self.panelThanks.Show() self.delayExit() elif self.active == 4: @@ -89,11 +106,12 @@ class MainWindow(wx.Frame): class PanelStart (wx.Panel): def __init__(self, parent): - wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos = wx.DefaultPosition, size=(480, 320)) + wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=(0, 0), size=(480, 320)) #panel = wx.Panel(self, -1) - self.bitmap_1 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap("./gui/start.png", wx.BITMAP_TYPE_ANY)) - self.Bind(wx.EVT_LEFT_DOWN, parent.onStart) - self.bitmap_1.Bind(wx.EVT_LEFT_DOWN, parent.onStart) + self.bitmap_1 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap("./gui/start.png", wx.BITMAP_TYPE_ANY), pos=(0, 0)) + if not settings.hideGuiList: + self.Bind(wx.EVT_LEFT_DOWN, parent.onStart) + self.bitmap_1.Bind(wx.EVT_LEFT_DOWN, parent.onStart) def on_quit(self, e): print "close" @@ -103,12 +121,18 @@ class PanelStart (wx.Panel): class PanelThanks (wx.Panel): def __init__(self, parent): - wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos = wx.DefaultPosition, size=(480, 320)) + wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=(0, 0), size=(480, 320)) #panel = wx.Panel(self, -1) - self.bitmap_1 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap("./gui/thanks.png", wx.BITMAP_TYPE_ANY)) - self.bitmap_1.Bind(wx.EVT_LEFT_DOWN, parent.onExit) - self.label_1 = wx.StaticText(self, wx.ID_ANY, 'bla blub', pos=(100,100)) - self.label_1.SetFont(wx.Font(30, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Humor Sans")) + self.bitmap_1 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap("./gui/thanks.png", wx.BITMAP_TYPE_ANY), pos=(0, 0)) + self.bitmap_2 = wx.StaticBitmap(self, wx.ID_ANY, wx.NullBitmap, pos=(10, 10)) + + self.label_1 = wx.StaticText(self, wx.ID_ANY, 'bla blub', pos=(120, 50), size=(340, 100)) + self.label_1.SetFont(wx.Font(25, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Humor Sans")) + self.label_1.SetForegroundColour("white") + + #self.l_product = wx.StaticText(self, wx.ID_ANY, 'bla blub', pos=(120, 100), size=(340, 100)) + #self.l_product.SetFont(wx.Font(30, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Humor Sans")) + #self.l_product.SetForegroundColour("white") def on_quit(self, e): print "close" @@ -118,9 +142,9 @@ class PanelThanks (wx.Panel): class PanelSorry (wx.Panel): def __init__(self, parent): - wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos = wx.DefaultPosition, size=(480, 320)) + wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=(0, 0), size=(480, 320)) #panel = wx.Panel(self, -1) - self.bitmap_1 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap("./gui/sorry.png", wx.BITMAP_TYPE_ANY)) + self.bitmap_1 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap("./gui/sorry.png", wx.BITMAP_TYPE_ANY), pos=(0, 0)) self.bitmap_1.Bind(wx.EVT_LEFT_DOWN, parent.onExit) self.label_1 = wx.StaticText(self, wx.ID_ANY, 'bla blub', pos=(100,100)) self.label_1.SetFont(wx.Font(30, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Humor Sans")) @@ -133,9 +157,9 @@ class PanelSorry (wx.Panel): class PanelRfid (wx.Panel): def __init__(self, parent): - wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos = wx.DefaultPosition, size=(480, 320)) + wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=(0, 0), size=(480, 320)) #panel = wx.Panel(self, -1) - self.bitmap_1 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap("./gui/rfid.png", wx.BITMAP_TYPE_ANY)) + self.bitmap_1 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap("./gui/rfid.png", wx.BITMAP_TYPE_ANY), pos=(0, 0)) self.bitmap_1.Bind(wx.EVT_LEFT_DOWN, parent.onExit) self.label_1 = wx.StaticText(self, wx.ID_ANY, 'bla blub', pos=(100,100)) self.label_1.SetFont(wx.Font(30, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Humor Sans")) @@ -148,9 +172,9 @@ class PanelRfid (wx.Panel): class PanelDrinks (wx.Panel): def __init__(self, parent): - wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos = wx.DefaultPosition, size=(480, 320)) + wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=(0, 0), size=(480, 320)) - self.bitmap_1 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap("./gui/products.png", wx.BITMAP_TYPE_ANY)) + self.bitmap_1 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap("./gui/products.png", wx.BITMAP_TYPE_ANY), pos=(0, 0)) products = get_products() buttonids = [] @@ -158,22 +182,24 @@ class PanelDrinks (wx.Panel): for product in products: if product.isshown: #480x320 - self.but = wx.Button(self, id=wx.ID_ANY, label=product.name + u"\n" + "%0.2f" % product.price, pos=(0+i*120, 0), size=(120, 120)) + self.but = wx.Button(self, id=wx.ID_ANY, label=product.name + u"\n" + u"%0.2f" % product.price, pos=(0+i*120, 0), size=(120, 120)) + self.but.SetBackgroundColour((255-(i*20 % 40), (160+(i*50 % 100)), 0)) + #self.but.SetForegroundColour("#006699") self.but.SetFont(wx.Font(23, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Humor Sans")) - print "Button %s created" % product.name self.but.Bind(wx.EVT_LEFT_DOWN, parent.onProduct, id=self.but.Id) - i = i+1 + i += 1 - self.b_less = wx.Button(self, id = wx.ID_ANY, label=u"-", pos=(0,240), size=(120, 80)) - self.b_less.SetFont(wx.Font(60, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Humor Sans")) - self.b_less.Bind(wx.EVT_LEFT_DOWN, self.onLess, id=self.b_less.Id) + if not settings.onlyOneDrink: + self.b_less = wx.Button(self, id = wx.ID_ANY, label=u"-", pos=(0,240), size=(120, 80)) + self.b_less.SetFont(wx.Font(60, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Humor Sans")) + self.b_less.Bind(wx.EVT_LEFT_DOWN, self.onLess, id=self.b_less.Id) - self.l_amount = wx.StaticText(self, wx.ID_ANY, "1", pos=(145,245), style=wx.ALIGN_CENTER) - self.l_amount.SetFont(wx.Font(50, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Sans")) + self.l_amount = wx.StaticText(self, wx.ID_ANY, "%2d" % 0, pos=(137, 245), style=wx.ALIGN_CENTER) + self.l_amount.SetFont(wx.Font(50, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Sans")) - self.b_more = wx.Button(self, id = wx.ID_ANY, label=u"+", pos=(240,240), size=(120, 80)) - self.b_more.SetFont(wx.Font(60, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Humor Sans")) - self.b_more.Bind(wx.EVT_LEFT_DOWN, self.onMore, id=self.b_more.Id) + self.b_more = wx.Button(self, id = wx.ID_ANY, label=u"+", pos=(240,240), size=(120, 80)) + self.b_more.SetFont(wx.Font(60, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Humor Sans")) + self.b_more.Bind(wx.EVT_LEFT_DOWN, self.onMore, id=self.b_more.Id) self.b_exit = wx.Button(self, id = wx.ID_ANY, label=u"x", pos=(360,240), size=(120, 80)) self.b_exit.SetFont(wx.Font(30, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Humor Sans")) @@ -187,13 +213,14 @@ class PanelDrinks (wx.Panel): def onMore(self,e, id=-1): self.amount = int(self.l_amount.GetLabelText()) + 1 - self.l_amount.SetLabel(str(self.amount)) - self.Layout() + if self.amount <= settings.drinkLimit: + self.l_amount.SetLabel("%02d" % self.amount) + self.Layout() def onLess(self,e, id=-1): self.amount = int(self.l_amount.GetLabelText()) - 1 if self.amount > 0: - self.l_amount.SetLabel(str(self.amount)) + self.l_amount.SetLabel( "%02d" % self.amount) self.Layout() def GetAmount(self): @@ -207,9 +234,9 @@ class PanelDrinks (wx.Panel): class PanelUsers (wx.Panel): def __init__(self, parent): - wx.Panel.__init__(self, parent, id=wx.ID_ANY, size=(480, 320)) + wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=(0, 0), size=(480, 320)) - self.bitmap_1 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap("./gui/users.png", wx.BITMAP_TYPE_ANY)) + self.bitmap_1 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap("./gui/users.png", wx.BITMAP_TYPE_ANY), pos=(0, 0)) users = get_users() names = list() @@ -217,26 +244,32 @@ class PanelUsers (wx.Panel): if user.isshown: names.append(user.longname) - self.but_names = list() i = 0 for name in names: #480x320 - self.but = wx.Button(self, id=wx.ID_ANY, label=name, pos=(0,0+i*80), size=(400, 80)) - self.but.SetFont(wx.Font(20, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Humor Sans")) + #self.but = wx.Button (self, id=wx.ID_ANY, label=name, pos=(0,0+i*80), size=(400, 80)) + self.but = wx.lib.platebtn.PlateButton(self, label=name, pos=(3, 3+i*80), + style=wx.BU_EXACTFIT | wx.lib.platebtn.PB_STYLE_SQUARE) + self.but.SetSize((392, 74)) + + self.but.SetBackgroundColour((255-(i*20 % 40), (160+(i*50 % 100)), 0)) + #self.but.SetForegroundColour("#006699") + self.but.SetPressColor(wx.Color(255,255,255,0)) + self.but.SetFont(wx.Font(25, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Humor Sans")) self.but.Bind(wx.EVT_LEFT_DOWN, parent.onUser, id=self.but.Id) self.but_names.append(self.but) i += 1 - self.b_up = wx.Button(self, id=wx.ID_ANY, label=u"\u25B2", pos=(400,0), size=(80, 80)) + self.b_up = wx.Button(self, id=wx.ID_ANY, label=u"\u25B2", pos=(400, 0), size=(80, 80)) self.b_up.SetFont(wx.Font(20, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Humor Sans")) self.b_up.Bind(wx.EVT_LEFT_DOWN, self.on_up, id=self.b_up.Id) - self.b_down = wx.Button(self, id=wx.ID_ANY, label=u"\u25BC", pos=(400,240), size=(80, 80)) + self.b_down = wx.Button(self, id=wx.ID_ANY, label=u"\u25BC", pos=(400, 240), size=(80, 80)) self.b_down.SetFont(wx.Font(20, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Humor Sans")) self.b_down.Bind(wx.EVT_LEFT_DOWN, self.on_down, id=self.b_down.Id) - self.b_exit = wx.Button(self, id=wx.ID_ANY, label="X", pos=(400,120), size=(80, 80)) + self.b_exit = wx.Button(self, id=wx.ID_ANY, label="X", pos=(400, 120), size=(80, 80)) self.b_exit.SetFont(wx.Font(20, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "Humor Sans")) self.b_exit.Bind(wx.EVT_LEFT_DOWN, parent.onExit, id=self.b_exit.Id) self.Bind(wx.EVT_CLOSE, self.on_quit) @@ -247,14 +280,14 @@ class PanelUsers (wx.Panel): if self.but_names[len(self.but_names)-1].GetPosition()[1] < 320: return for button in self.but_names: - button.SetPosition((button.GetPosition()[0],button.GetPosition()[1]-320)) + button.SetPosition((button.GetPosition()[0], button.GetPosition()[1]-320)) self.Layout() def on_up(self,e , id=-1): - if self.but_names[0].GetPosition()[1] == 0: + if self.but_names[0].GetPosition()[1] >= 0: return for button in self.but_names: - button.SetPosition((button.GetPosition()[0],button.GetPosition()[1]+320)) + button.SetPosition((button.GetPosition()[0], button.GetPosition()[1]+320)) self.Layout() def on_button_press(self,e, id=-1): @@ -262,6 +295,10 @@ class PanelUsers (wx.Panel): print id #if id == self.b_down.Id: + def trap(self, e): + e.Skip() + return + def on_quit(self, e): print "close" self.Destroy() \ No newline at end of file diff --git a/app/settings.py b/app/settings.py new file mode 100644 index 0000000..0f1b92a --- /dev/null +++ b/app/settings.py @@ -0,0 +1,46 @@ +################################################################ +# Settings # +################################################################ +# +# This is the settings file! +# Edit settings to your preference and restart the device +# +# The default for everything is False, +# default numbers are given in comments +# +# Web interface colours and styles +# can be changed in app/static/style.css +# +# Gui Backgrounds can be replaced in gui/ folder (.png files) +# +################################################################ + + +class Settings: + + def __init__(self): + ##User Interaction + #Gui + self.hideGuiList = False #Show the consumers in the gui + self.disableRFID = False #Disable RFID Reading + self.allowHiding = False #Allow a user to hide from the gui consumer list + self.onlyOneDrink = False #Hide selection for amount in the gui + self.drinkLimit = 20 #Max amount of consumptions in the gui (default 20) + #Web Interface + self.disableWebIF = False #Disable Web Interface + self.disableStats = False #Disable All Statistics + + ##Payment Incentives + #Money Limit + self.autoBlock = False #Automatically block user if money owed > limit + self.autoUnblock = False #Automatically unblock user if money owed < limit + self.blockLimit = 150 #Money limit for automatic blocking (default 150) + #Mail Spam + self.autoAnnoy = False #Automatically send payment eMails + self.annoyDays = 20 #Automatically send mails every x days (default 20) + self.annoyLimit = 100 #Money limit for autoAnnoy (default 100) + + ##Developer Settings + self.debug = False #Show debug output in console + +settings = Settings() \ No newline at end of file diff --git a/app/templates/billing.html b/app/templates/billing.html index 27ae5cf..aee2cb3 100644 --- a/app/templates/billing.html +++ b/app/templates/billing.html @@ -23,7 +23,7 @@ {{user.longname}} {% if user.isblack %} ☑ {% else %} ☐ {% endif %} - {{dept}} € + {{debt[user.id-1]}} € € Einzelne Rechnung versenden diff --git a/app/templates/personal.html b/app/templates/personal.html index ccbaaf5..6121214 100644 --- a/app/templates/personal.html +++ b/app/templates/personal.html @@ -18,7 +18,7 @@

Total: {{ "%0.2f" % (deposited - owed)}} €

-

Einzahlungen (TODO)

+

Einzahlungen

diff --git a/app/views.py b/app/views.py index d9d435e..79e6441 100644 --- a/app/views.py +++ b/app/views.py @@ -273,7 +273,10 @@ def billing(): return render_template('billing.html', users=users, success="Writing to database is not implemented", dept=0, user=get_user_by_name(session.get('name'))) if request.method == 'GET': - return render_template('billing.html', users=users, dept=0, user=get_user_by_name(session.get('name'))) + debt = [0 for user in users] + for user in users: + debt[user.id-1] = get_debt(user.name) + return render_template('billing.html', users=users, debt=debt, user=get_user_by_name(session.get('name'))) @app.route('/billing/send_personal_bill/', methods=['GET', 'POST']) diff --git a/gui/products.png b/gui/products.png index 9f00217..cfa756f 100644 Binary files a/gui/products.png and b/gui/products.png differ diff --git a/gui/products.xcf b/gui/products.xcf index 21111c6..f5e29b0 100644 Binary files a/gui/products.xcf and b/gui/products.xcf differ diff --git a/gui/start.png b/gui/start.png index 1d0668e..4e336bf 100644 Binary files a/gui/start.png and b/gui/start.png differ diff --git a/gui/thanks.png b/gui/thanks.png index 268a3f7..488ffe7 100644 Binary files a/gui/thanks.png and b/gui/thanks.png differ diff --git a/gui/users.png b/gui/users.png index 89a4220..407809d 100644 Binary files a/gui/users.png and b/gui/users.png differ
Datum