Wizard-Hoehe fix, Logout in Konto, Server-Reset, responsive Tabs, Set-Zeilen, Brand-Date
Image bauen und in die Registry schieben / build (push) Successful in 7s
Image bauen und in die Registry schieben / build (push) Successful in 7s
- Wizard: feste Hoehe (600px, intern scrollbar), Schritt-Inhalt zentriert
(.wizard-body) -> Schritte gleich gross, auch beim User anlegen
- Benutzer-Anlage: Bestaetigung 'Benutzer x angelegt.' (ohne 'Weiter mit'),
Solo-Option nach User-Anlage deaktiviert (kein irrefuehrendes Umschalten)
- User-Chip + Abmelden aus der Topbar entfernt, 'Abmelden' in Konto-Sektion
- Topbar-Datum: 'Fr 02.10.2026' + aktive Session ('Push aktiv') statt
redundantem 'Today'
- Tabs: flex-wrap statt Scrollen, auf Mobil volle Breite + kompakter
- Server-Reset (Owner): Passwort + 'RESET'-Eingabe, loescht alle Daten
- Benutzerliste: Querbalken vor dem Anlegen-Formular
- Tests: 163 Checks gruen (39+18+49+32+25)
This commit is contained in:
1 parent
0ebaa8b132
commit
655316278a
6 files changed
+183
-52
No files matched your search
@@ -770,6 +770,16 @@ def set_user_password(uid, new):
|
||||
return True
|
||||
|
||||
|
||||
def reset_server():
|
||||
"""Kompletter Reset: alle Sessions, Settings, Tokens und Benutzer loeschen."""
|
||||
con = db()
|
||||
for t in ("entries", "sessions", "settings", "tokens", "users"):
|
||||
con.execute(f"DELETE FROM {t}")
|
||||
con.execute("DELETE FROM sqlite_sequence")
|
||||
con.commit()
|
||||
con.close()
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Auto-Reset: letztes Workout einer Kategorie laden
|
||||
# ---------------------------------------------------------------------------
|
||||
@@ -1415,6 +1425,8 @@ class Handler(BaseHTTPRequestHandler):
|
||||
self._send(400, json.dumps(
|
||||
{"error": "Aktuelles Passwort ist falsch"}),
|
||||
"application/json; charset=utf-8")
|
||||
elif path in ("/api/reset", "/api/reset/"):
|
||||
self.do_reset()
|
||||
else:
|
||||
uid = self._require_user()
|
||||
if uid is None:
|
||||
@@ -1450,6 +1462,33 @@ class Handler(BaseHTTPRequestHandler):
|
||||
self._send(500, json.dumps({"error": str(exc)}),
|
||||
"application/json; charset=utf-8")
|
||||
|
||||
def do_reset(self):
|
||||
uid = self._require_user()
|
||||
if uid is None:
|
||||
return
|
||||
if uid != 1:
|
||||
self._send(403, json.dumps({"error": "nur der erste Benutzer"}),
|
||||
"application/json; charset=utf-8")
|
||||
return
|
||||
data = self._read_json()
|
||||
con = db()
|
||||
row = con.execute("SELECT * FROM users WHERE id=?",
|
||||
(uid,)).fetchone()
|
||||
con.close()
|
||||
if not row or not _verify_pw(data.get("password", ""),
|
||||
row["salt"], row["password_hash"]):
|
||||
self._send(400, json.dumps(
|
||||
{"error": "Aktuelles Passwort ist falsch"}),
|
||||
"application/json; charset=utf-8")
|
||||
return
|
||||
if _clean_str(data.get("confirm")) != "RESET":
|
||||
self._send(400, json.dumps(
|
||||
{"error": "Bestätigungstext ist falsch"}),
|
||||
"application/json; charset=utf-8")
|
||||
return
|
||||
reset_server()
|
||||
self._send_json(200, {"ok": True})
|
||||
|
||||
def do_register(self):
|
||||
if user_count() > 0:
|
||||
self._send(403, json.dumps(
|
||||
|
||||
Reference in new issue
Block a user