From 0674849b6c6dbb874d05b94c731df46421aa1364 Mon Sep 17 00:00:00 2001 From: elpatron Date: Thu, 24 Jul 2025 15:31:55 +0200 Subject: [PATCH] Fix: Werktagsberechnung robust, Checkbox-Auswertung verbessert, Tests angepasst --- app.py | 22 ++++++++-------------- templates/index.html | 45 +++++++++++++------------------------------- test_app.py | 28 ++++++++++++++++++++++----- 3 files changed, 44 insertions(+), 51 deletions(-) diff --git a/app.py b/app.py index c823aa0..ee921c0 100644 --- a/app.py +++ b/app.py @@ -47,28 +47,22 @@ def index(): with open(log_path, 'a', encoding='utf-8') as f: from datetime import datetime as dt f.write(f"{dt.now().isoformat()} FUNC: {action}\n") - if action == 'tage': + if action == 'tage_werktage': active_idx = 0 start = request.form.get('start1') end = request.form.get('end1') + is_werktage = request.form.get('werktage') in ('on', 'true', '1', True) try: d1 = datetime.strptime(start, '%Y-%m-%d') d2 = datetime.strptime(end, '%Y-%m-%d') - tage = abs((d2 - d1).days) + if is_werktage: + if d1 > d2: + d1, d2 = d2, d1 + tage = np.busday_count(d1.date(), (d2 + timedelta(days=1)).date()) + else: + tage = abs((d2 - d1).days) except Exception: tage = 'Ungültige Eingabe' - elif action == 'werktage': - active_idx = 1 - start = request.form.get('start2') - end = request.form.get('end2') - try: - d1 = datetime.strptime(start, '%Y-%m-%d') - d2 = datetime.strptime(end, '%Y-%m-%d') - if d1 > d2: - d1, d2 = d2, d1 - werktage = np.busday_count(d1.date(), (d2 + timedelta(days=1)).date()) - except Exception: - werktage = 'Ungültige Eingabe' elif action == 'wochentag': active_idx = 2 datum = request.form.get('datum3') diff --git a/templates/index.html b/templates/index.html index ed032b8..01dd943 100644 --- a/templates/index.html +++ b/templates/index.html @@ -55,7 +55,7 @@ - Anzahl der Tage zwischen zwei Daten + Anzahl der Tage/Werktage zwischen zwei Daten
@@ -71,39 +71,20 @@ - + +
{% if tage is not none %} -
Anzahl der Tage zwischen {{ format_date(request.form.get('start1', '')) }} und {{ format_date(request.form.get('end1', '')) }}: {{ tage }}
- {% endif %} -
- -
- -
-
- - - -
- {% if werktage is not none %} -
Anzahl der Werktage zwischen {{ format_date(request.form.get('start2', '')) }} und {{ format_date(request.form.get('end2', '')) }}: {{ werktage }}
+
+ {% if request.form.get('werktage') %} + Anzahl der Werktage zwischen {{ format_date(request.form.get('start1', '')) }} und {{ format_date(request.form.get('end1', '')) }}: {{ tage }} + {% else %} + Anzahl der Tage zwischen {{ format_date(request.form.get('start1', '')) }} und {{ format_date(request.form.get('end1', '')) }}: {{ tage }} + {% endif %} +
{% endif %}
diff --git a/test_app.py b/test_app.py index 2d47c61..c7839a0 100644 --- a/test_app.py +++ b/test_app.py @@ -15,7 +15,7 @@ def test_homepage(client): def test_tage_berechnung(client): resp = client.post('/', data={ - 'action': 'tage', + 'action': 'tage_werktage', 'start1': '2024-01-01', 'end1': '2024-01-10' }) @@ -27,16 +27,34 @@ def test_xss_protection(client): # Versuche ein Skript einzuschleusen xss = '' resp = client.post('/', data={ - 'action': 'tage', + 'action': 'tage_werktage', 'start1': xss, 'end1': '2024-01-10' }) assert resp.status_code == 200 - # Das Skript darf nicht im HTML erscheinen (sollte escaped sein) + # Das Skript darf nicht im HTML erscheinen assert b'' not in resp.data - assert b'<script>alert(1)</script>' in resp.data + # Es sollte eine Fehlermeldung erscheinen + html = resp.data.decode('utf-8') + assert 'Ungültige Eingabe' in html def test_stats_login_required(client): resp = client.get('/stats') assert resp.status_code == 200 - assert b'Dashboard Login' in resp.data \ No newline at end of file + assert b'Dashboard Login' in resp.data + +def test_werktage_berechnung(client): + from numpy import busday_count + from datetime import date, timedelta + start = '2024-01-01' + end = '2024-03-01' + expected = busday_count(date.fromisoformat(start), date.fromisoformat(end) + timedelta(days=1)) + resp = client.post('/', data={ + 'action': 'tage_werktage', + 'start1': start, + 'end1': end, + 'werktage': 'on' + }) + assert resp.status_code == 200 + assert b'Anzahl der Werktage' in resp.data + assert f': {expected}'.encode() in resp.data \ No newline at end of file