feat: E-Mail-Adresse bestehender Benutzer aenderbar (mit Eindeutigkeits-Pruefung + Audit-Log)

This commit is contained in:
mscadm 2026-07-13 16:04:15 +00:00
parent c2b341316b
commit 57b532cbec
1 changed files with 34 additions and 17 deletions

51
app.py
View File

@ -927,37 +927,54 @@ def admin_users_edit_route(user_id):
if not u: if not u:
abort(404) abort(404)
error = None error = None
ok_msg = None
if request.method == "POST": if request.method == "POST":
email = request.form.get("email", "").strip().lower()
vorname = request.form.get("vorname", "").strip() vorname = request.form.get("vorname", "").strip()
nachname = request.form.get("nachname", "").strip() nachname = request.form.get("nachname", "").strip()
telefon = request.form.get("telefon", "").strip() telefon = request.form.get("telefon", "").strip()
abteilung = request.form.get("abteilung", "").strip() abteilung = request.form.get("abteilung", "").strip()
adresse = request.form.get("adresse", "").strip() adresse = request.form.get("adresse", "").strip()
db.update_user_profile(tenant_id, user_id, vorname or None, nachname or None, if not email or "@" not in email:
telefon or None, abteilung or None, adresse or None) error = "Bitte eine gueltige E-Mail-Adresse angeben."
db.log_audit(tenant_id, session["user_id"], "user_profile_updated", "user", str(user_id), elif db.email_exists_excluding(email, user_id):
None, _client_ip()) error = "Diese E-Mail-Adresse wird bereits von einem anderen Benutzer verwendet."
u = dict(u) else:
u.update({"vorname": vorname, "nachname": nachname, "telefon": telefon, old_email = u["email"]
"abteilung": abteilung, "adresse": adresse}) if email != old_email:
error = "Gespeichert." db.update_user_email(tenant_id, user_id, email)
err_html = ("<p class='sz' style='color:var(--ok)'>%s</p>" % html.escape(error)) if error else "" db.log_audit(tenant_id, session["user_id"], "user_email_changed", "user", str(user_id),
{"alt": old_email, "neu": email}, _client_ip())
if user_id == session["user_id"]:
session["email"] = email
db.update_user_profile(tenant_id, user_id, vorname or None, nachname or None,
telefon or None, abteilung or None, adresse or None)
db.log_audit(tenant_id, session["user_id"], "user_profile_updated", "user", str(user_id),
None, _client_ip())
u = dict(u)
u.update({"email": email, "vorname": vorname, "nachname": nachname, "telefon": telefon,
"abteilung": abteilung, "adresse": adresse})
ok_msg = "Gespeichert."
err_html = "<p class='err'>%s</p>" % html.escape(error) if error else ""
ok_html = ("<p class='sz' style='color:var(--ok)'>%s</p>" % html.escape(ok_msg)) if ok_msg else ""
body = """<h1 class="page-title">Benutzerdetails</h1> body = """<h1 class="page-title">Benutzerdetails</h1>
<div class="sz" style="margin-bottom:14px">%s</div> <div class="panel">%s%s<form method="post">
<div class="panel">%s<form method="post"> <div class="formrow"><label>E-Mail (Login)</label><input type="email" name="email" value="%s" required></div>
<div class="hint">Wird sofort als Login-Adresse wirksam. Aenderungen werden im Audit-Log erfasst.</div>
<h2 class="section-title" style="margin-top:14px">Details (optional)</h2>
<div class="grid-2"> <div class="grid-2">
<div class="formrow"><label>Vorname</label><input name="vorname" value="%s"></div> <div class="formrow"><label>Vorname</label><input type="text" name="vorname" value="%s"></div>
<div class="formrow"><label>Nachname</label><input name="nachname" value="%s"></div> <div class="formrow"><label>Nachname</label><input type="text" name="nachname" value="%s"></div>
</div> </div>
<div class="grid-2"> <div class="grid-2">
<div class="formrow"><label>Telefon</label><input name="telefon" value="%s"></div> <div class="formrow"><label>Telefon</label><input type="text" name="telefon" value="%s"></div>
<div class="formrow"><label>Abteilung</label><input name="abteilung" value="%s"></div> <div class="formrow"><label>Abteilung</label><input type="text" name="abteilung" value="%s"></div>
</div> </div>
<div class="formrow"><label>Adresse</label><input name="adresse" value="%s"></div> <div class="formrow"><label>Adresse</label><input type="text" name="adresse" value="%s"></div>
<button class="btn" type="submit">Speichern</button> <button class="btn" type="submit">Speichern</button>
</form></div> </form></div>
<a class="btn ghost" href="/admin/users">Zurueck zur Benutzerverwaltung</a>""" % ( <a class="btn ghost" href="/admin/users">Zurueck zur Benutzerverwaltung</a>""" % (
html.escape(u["email"]), err_html, err_html, ok_html, html.escape(u["email"]),
html.escape(u["vorname"] or ""), html.escape(u["nachname"] or ""), html.escape(u["vorname"] or ""), html.escape(u["nachname"] or ""),
html.escape(u["telefon"] or ""), html.escape(u["abteilung"] or ""), html.escape(u["telefon"] or ""), html.escape(u["abteilung"] or ""),
html.escape(u["adresse"] or ""), html.escape(u["adresse"] or ""),