Compare commits
25 Commits
db3f8bd13f
...
main
Author | SHA1 | Date | |
---|---|---|---|
1a12dcd1d0 | |||
|
9f7bc8086c | ||
|
833287222d | ||
|
e2cdaf059a | ||
|
b2e8192a2d | ||
|
3a15183094 | ||
|
08d668c984 | ||
|
24e9d83a52 | ||
|
4d7e352220 | ||
|
abc4403373 | ||
|
57930c374a | ||
|
9318f0b25c | ||
|
02a9df95b5 | ||
|
9ad4038d6b | ||
|
c68fcc56f9 | ||
|
90eccad3f7 | ||
|
2440963afc | ||
|
08705ae44e | ||
|
a57c5fa837 | ||
|
7a0be8aa61 | ||
|
e2383aefb5 | ||
|
6601cd3e88 | ||
|
4a1b237482 | ||
|
629ca0ea88 | ||
|
6ff60dfb09 |
21
README.md
21
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*.
|
||||
|
||||
@@ -31,12 +31,16 @@ Die Web-App *erdbeerhannah* wurde für einfachste Bedienbarkeit auf allen Gerät
|
||||
|
||||
Die Anpassung von Artikeln und Preisen ist derzeit lediglich im Quellcode der App möglich. Die App ist auf maximal sechs Artikel beschränkt.
|
||||
|
||||
Individuelle Anpassungen (Birnen? Kirschen? Spargel?) oder ein passendes Branding können auf Wunsch vom Autor gegen ein angemessenes Entgeld oder eine Spende an eine Organisation der Wahl des Autors vorgenommen werden. Ein Hosting unter der eigenen Domain (z.B. https://kasse.mein-erdbeerhof.de) ist ebenfalls möglich. Bei Interesse schreiben Sie bitte eine Mail an [m.busche@mailbox.org](mailto:m.busche@mailbox.org?subject=Erdbeerhannah).
|
||||
Individuelle Anpassungen (Birnen? Kirschen? Spargel?) oder ein passendes Branding können auf Wunsch vom Autor gegen ein angemessenes Entgeld oder eine Spende an eine [Organisation der Wahl des Autors](https://www.tagesschau.de/spendenkonten/spendenkonten-133.html) vorgenommen werden. Ein Hosting unter der eigenen Domain (z.B. https://kasse.mein-erdbeerhof.de) ist ebenfalls möglich. Bei Interesse schreiben Sie bitte eine Mail an [m.busche@mailbox.org](mailto:m.busche@mailbox.org?subject=Erdbeerhannah).
|
||||
|
||||
## Deployment
|
||||
|
||||
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, Hermany
|
||||
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.
|
||||
```
|
||||
```
|
||||
|
||||
|
46
app.py
46
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.3')
|
||||
|
||||
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,5 +147,4 @@ def favicon():
|
||||
# 'about.html')
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.logger.info('Starting erdbeerhannah v1.0.3')
|
||||
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 kowledge in Kiel Strawberry City.<br>
|
||||
Version: 1.0.3/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