Compare commits
20 Commits
e2383aefb5
...
main
Author | SHA1 | Date | |
---|---|---|---|
1a12dcd1d0 | |||
|
9f7bc8086c | ||
|
833287222d | ||
|
e2cdaf059a | ||
|
b2e8192a2d | ||
|
3a15183094 | ||
|
08d668c984 | ||
|
24e9d83a52 | ||
|
4d7e352220 | ||
|
abc4403373 | ||
|
57930c374a | ||
|
9318f0b25c | ||
|
02a9df95b5 | ||
|
9ad4038d6b | ||
|
c68fcc56f9 | ||
|
90eccad3f7 | ||
|
2440963afc | ||
|
08705ae44e | ||
|
a57c5fa837 | ||
|
7a0be8aa61 |
19
README.md
19
README.md
@@ -1,6 +1,6 @@
|
||||
# erdbeerhannah
|
||||
|
||||
*Simple Rechner-App für Erdbeerstände*
|
||||
*Simple Rechner-App für Erdbeerstände (und ähnliche Verkausstellen)*
|
||||
|
||||
## Motivation
|
||||
|
||||
@@ -8,7 +8,7 @@ Viele Erdbeerstände in Deutschland haben keine elektronische Kasse. Aufgrund de
|
||||
|
||||
Für jeden Artikel gibt es einen großen Knopf. Ein Klick addiert 1x den ausgewählten Artikel zur Gesamtsumme. Optional kann per Eingabefeld das Wechselgeld berechnet werden.
|
||||
|
||||
Eine Demo-Instanz der App kann [hier](https://erdbeerhannah.elpatron.me/) zum freien Testen aufgerufen werden.
|
||||
Eine Demo-Instanz der App kann [hier](https://erdbeerhannah.elpatron.me/) zur freien Nutzung aufgerufen werden.
|
||||
|
||||
Die Demo-Instanz ist werbefrei und die Nutzung dauerhaft kostenlos. Details siehe in den Abschnitten *Anpassung* und *Privatsphäre*.
|
||||
|
||||
@@ -37,6 +37,10 @@ Individuelle Anpassungen (Birnen? Kirschen? Spargel?) oder ein passendes Brandin
|
||||
|
||||
Die Bereitstellung der App erfolgt am einfachsten mit Docker:
|
||||
|
||||
`git clone https://gitea.elpatron.me/elpatron/erdbeerhannah.git`
|
||||
|
||||
`cd erdbeerhannah`
|
||||
|
||||
`docker image build -t erdbeerhannah:latest .`
|
||||
|
||||
`docker run -p 9090:90 -t erdbeerhannah:latest`
|
||||
@@ -51,16 +55,15 @@ Die App *erdbeerhannah* protokolliert keinerlei Daten. Keine IP-Adressen, keine
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
Version 2, December 2004
|
||||
|
||||
Copyright (C) 2024 Markus Busche; Knorrstr. 16, 24106 Kiel, Germany
|
||||
Copyright (C) 2024 Markus Busche; Knorrstr. 16, 24106 Kiel, Germany
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim or modified
|
||||
copies of this license document, and changing it is allowed as long
|
||||
as the name is changed.
|
||||
Everyone is permitted to copy and distribute verbatim or modified
|
||||
copies of this license document, and changing it is allowed as long
|
||||
as the name is changed.
|
||||
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. You just DO WHAT THE FUCK YOU WANT TO.
|
||||
```
|
||||
```
|
||||
|
||||
|
45
app.py
45
app.py
@@ -1,24 +1,25 @@
|
||||
import os
|
||||
import time
|
||||
import logging
|
||||
from flask import Flask, render_template, request, session, send_from_directory
|
||||
from flask import Flask, render_template, request, session, send_from_directory, g
|
||||
from flask_bootstrap import Bootstrap
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config['SECRET_KEY'] = 'j69ol5mcHLsEtLg4Y/+myd9wWD4pp56E'
|
||||
|
||||
# set up logging
|
||||
formatter = logging.Formatter( # pylint: disable=invalid-name
|
||||
# setup logging
|
||||
formatter = logging.Formatter(
|
||||
'%(asctime)s %(levelname)s %(process)d ---- %(threadName)s '
|
||||
'%(module)s : %(funcName)s {%(pathname)s:%(lineno)d} %(message)s','%Y-%m-%dT%H:%M:%SZ')
|
||||
handler = logging.StreamHandler()
|
||||
handler.setFormatter(formatter)
|
||||
app.logger.setLevel(logging.DEBUG)
|
||||
app.logger.addHandler(handler)
|
||||
app.logger.info('Starting erdbeerhannah v1.0.4')
|
||||
|
||||
Bootstrap(app)
|
||||
|
||||
requestcounter = 0
|
||||
version = "1.0.9/2024-05-28"
|
||||
postcounter = 0
|
||||
gesamtwert = 0
|
||||
change = 0
|
||||
givenfloat = 0
|
||||
@@ -30,13 +31,32 @@ item4 = 0
|
||||
item5 = 0
|
||||
item6 = 0
|
||||
|
||||
app.logger.info('Starting erdbeerhannah ' + version)
|
||||
|
||||
# https://code-maven.com/flask-display-elapsed-time
|
||||
@app.before_request
|
||||
def before_request():
|
||||
g.request_start_time = time.time()
|
||||
g.request_time = lambda: "%.4fs" % (time.time() - g.request_start_time)
|
||||
|
||||
# prevent cached responses
|
||||
# https://stackoverflow.com/questions/47376744/how-to-prevent-cached-response-flask-server-using-chrome
|
||||
@app.after_request
|
||||
def add_header(r):
|
||||
"""
|
||||
Add headers to both force latest IE rendering engine or Chrome Frame,
|
||||
and also to cache the rendered page for 10 minutes.
|
||||
"""
|
||||
r.headers["Cache-Control"] = "no-store, max-age=0"
|
||||
return r
|
||||
|
||||
@app.route("/", methods=["GET", "POST"])
|
||||
def index():
|
||||
global gesamtwert, item1, item2, item3, item4, item5, item6, sum, givenfloat, change, given, background, requestcounter
|
||||
global gesamtwert, item1, item2, item3, item4, item5, item6, sum, givenfloat, change, given, background, postcounter, version
|
||||
background = "bg-white"
|
||||
|
||||
if request.method == "POST":
|
||||
requestcounter += 1
|
||||
postcounter += 1
|
||||
# wert = float(request.form["wert"])
|
||||
wert = request.form.get('wert', "0", type=float)
|
||||
given = request.form.get('given', "0", type=float)
|
||||
@@ -65,15 +85,15 @@ def index():
|
||||
sum = str(gesamtwert) + "0"
|
||||
|
||||
# summarize items
|
||||
if wertfloat == 5.8:
|
||||
if wertfloat == 4.9:
|
||||
item1 += 1
|
||||
if wertfloat == 4.8:
|
||||
item2 += 1
|
||||
if wertfloat == 3.3:
|
||||
item3 += 1
|
||||
if wertfloat == 8.8:
|
||||
if wertfloat == 4.5:
|
||||
item4 += 1
|
||||
if wertfloat == 5.5:
|
||||
if wertfloat == 5:
|
||||
item5 += 1
|
||||
if wertfloat == .2:
|
||||
item6 += 1
|
||||
@@ -101,7 +121,7 @@ def index():
|
||||
session['given'] = givenfloat
|
||||
|
||||
app.logger.info('*** sum %s, given %s, change %s', sum, givenfloat, change)
|
||||
app.logger.info('*** requestcounter %s', requestcounter)
|
||||
app.logger.info('*** postcounter %s', postcounter)
|
||||
|
||||
return render_template("index.html", gesamtwert=session.get('summestring', 0),
|
||||
change=session.get('change', 0),
|
||||
@@ -113,6 +133,7 @@ def index():
|
||||
item5=session.get('item5', 0),
|
||||
item6=session.get('item6', 0),
|
||||
background=background,
|
||||
version=version,
|
||||
)
|
||||
|
||||
@app.route('/favicon.ico')
|
||||
@@ -126,4 +147,4 @@ def favicon():
|
||||
# 'about.html')
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(debug=True, host='0.0.0.0')
|
||||
app.run(debug=True, host='127.0.0.1')
|
@@ -7,8 +7,8 @@
|
||||
<meta http-equiv="Pragma" content="cache" />
|
||||
<meta name="robots" content="INDEX,FOLLOW" />
|
||||
<meta http-equiv="content-Language" content="de" />
|
||||
<meta name="description" content="Viele Erdbeerstände in Deutschland haben keine elektronische Kasse. Aufgrund der geringen Zahl unterschiedlicher Artikel bietet sich diese simple Rechner-App an, die bis zu sechs verschiedene Artikel in unterschiedlicher Stückzahl summieren kann." />
|
||||
<meta name="keywords" content="rechner calculator bargeld artikel obst erdbeeren spargel kirschen verkaufsstand wechselgeld" />
|
||||
<meta name="description" content="Viele Obststände in Deutschland haben keine elektronische Kasse. Aufgrund der geringen Zahl unterschiedlicher Artikel bietet sich diese simple Rechner-App an, die bis zu sechs verschiedene Artikel in unterschiedlicher Stückzahl summieren kann." />
|
||||
<meta name="keywords" content="rechner kasse calculator bargeld artikel obst erdbeeren spargel kirschen verkaufsstand wechselgeld kostenlos opensource werbefrei" />
|
||||
<meta name="author" content="Markus Busche" />
|
||||
<meta name="publisher" content="Markus Busche" />
|
||||
<meta name="copyright" content="2024 Markus Busche" />
|
||||
@@ -73,41 +73,45 @@
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
$('[data-toggle="tooltip"]').tooltip();
|
||||
});
|
||||
</script>
|
||||
<body>
|
||||
<div class="container-fluid table-container">
|
||||
<table class="table table-bordered">
|
||||
<form method="post">
|
||||
<tbody>
|
||||
<tr class="bold-row">
|
||||
<td colspan="3">Erdbeerkasse 🍓💶</td>
|
||||
<td colspan="3">erdbeerrechner 🍓💶</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><button type="submit" name="wert" value="5.8" class="btn btn-xl btn-primary custom-btn-size">🍓 5,80€ ({{ item1 }})</button></td>
|
||||
<td><button type="submit" name="wert" value="4.8" class="btn btn-xl btn-danger custom-btn-size">🫙🫙 4,80€ ({{ item2 }})</button></td>
|
||||
<td><button type="submit" name="wert" value="3.3" class="btn btn-xl btn-danger custom-btn-size">🫙 3,30€ ({{ item3 }})</button></td>
|
||||
<td><button type="submit" name="wert" value="4.9" data-toggle="tooltip" data-placement="top" title="500g Erdbeeren" class="btn btn-xl btn-primary custom-btn-size">🍓 4,90€ ({{ item1 }})</button></td>
|
||||
<td><button type="submit" name="wert" value="4.8" data-toggle="tooltip" data-placement="top" title="Marmelade groß" class="btn btn-xl btn-danger custom-btn-size">🫙🫙 4,80€ ({{ item2 }})</button></td>
|
||||
<td><button type="submit" name="wert" value="3.3" data-toggle="tooltip" data-placement="top" title="Marmelade klein" class="btn btn-xl btn-danger custom-btn-size">🫙 3,30€ ({{ item3 }})</button></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><button type="submit" name="wert" value="8.8" class="btn btn-xl btn-warning custom-btn-size">🧃🧃 8,80€ ({{ item4 }})</button></td>
|
||||
<td><button type="submit" name="wert" value="5.5" class="btn btn-xl btn-warning custom-btn-size">🧃 5,50€ ({{ item5 }})</button></td>
|
||||
<td><button type="submit" name="wert" value="0.2" class="btn btn-xl btn-success custom-btn-size">🛍️ 0,20€ ({{ item6 }})</button></td>
|
||||
<td><button type="submit" name="wert" value="5.0" data-toggle="tooltip" data-placement="top" title="500g Kirschen" class="btn btn-xl btn-warning custom-btn-size">🍒 5,00€ ({{ item4 }})</button></td>
|
||||
<td><button type="submit" name="wert" value="4.5" data-toggle="tooltip" data-placement="top" title="500g Himbeeren" class="btn btn-xl btn-warning custom-btn-size">🫐 4,50€ ({{ item5 }})</button></td>
|
||||
<td><button type="submit" name="wert" value="0.2" data-toggle="tooltip" data-placement="top" title="Tragetasche" class="btn btn-xl btn-success custom-btn-size">🛍️ 0,20€ ({{ item6 }})</button></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bold-row">🫰 {{ gesamtwert }}€</td>
|
||||
<td data-toggle="tooltip" data-placement="top" title="Summe" class="bold-row">🫰 {{ gesamtwert }}€</td>
|
||||
<td>
|
||||
<div class="input-container">
|
||||
<input type="text" class="form-control" name="given" placeholder="{{ given }}">
|
||||
<button type="submit" name="wert" value="-2" class="btn btn-xl btn-primary custom-btn-size-med">🧾</button>
|
||||
<button type="submit" name="wert" value="-2" data-toggle="tooltip" data-placement="top" title="Wechselgeld berechnen" class="btn btn-xl btn-primary custom-btn-size-med">🧾</button>
|
||||
</div>
|
||||
</td>
|
||||
<td class="bold-row {{ background }}">🪙 {{ change }}€</td>
|
||||
<td data-toggle="tooltip" data-placement="top" title="Wechselgeld" class="bold-row {{ background }}">🪙 {{ change }}€</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3"><button type="submit" name="wert" value="0" id="reset" class="btn btn-xl btn-dark custom-btn-size">Reset 🦭</button></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3">Made with ♥️, marmalade and zero knowledge in Kiel Strawberry City.<br>
|
||||
Version: 1.0.4/2024-05-27<br>
|
||||
<a href="https://gitea.elpatron.me/elpatron/erdbeerhannah/src/branch/main/README.md" target="_blank">Weitere Infos</a></td>
|
||||
<td colspan="3">Made with ♥️, marmalade and zero knowledge in <a href="https://kiel-sailing-city.de/" target="_blank">Kiel Strawberry City.</a><br>
|
||||
Version: {{ version }} ({{ g.request_time() }}), <a href="https://gitea.elpatron.me/elpatron/erdbeerhannah/src/branch/main/README.md" target="_blank">Infos</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</form>
|
||||
|
Reference in New Issue
Block a user