Release Nouri 1.3.0 with improved food states and quick entry flow

This commit is contained in:
2026-04-15 11:29:19 +02:00
parent 06be1371d3
commit 5e9beb1d98
22 changed files with 423 additions and 38 deletions
+27 -5
View File
@@ -2,6 +2,7 @@ from __future__ import annotations
import functools
import secrets
from urllib.parse import parse_qsl, urlencode, urlsplit, urlunsplit
from flask import (
Blueprint,
@@ -25,23 +26,23 @@ auth_bp = Blueprint("auth", __name__, url_prefix="/auth")
def login_required(view):
@functools.wraps(view)
def wrapped_view(**kwargs):
def wrapped_view(*args, **kwargs):
if g.user is None:
return redirect(url_for("auth.login"))
return view(**kwargs)
return view(*args, **kwargs)
return wrapped_view
def admin_required(view):
@functools.wraps(view)
def wrapped_view(**kwargs):
def wrapped_view(*args, **kwargs):
if g.user is None:
return redirect(url_for("auth.login"))
if g.user["role"] != "admin":
flash("Dieser Bereich ist für Admins gedacht.", "error")
return redirect(url_for("main.dashboard"))
return view(**kwargs)
return view(*args, **kwargs)
return wrapped_view
@@ -53,6 +54,25 @@ def ensure_csrf_token() -> str:
return token
def wants_to_stay_on_form() -> bool:
return request.form.get("save_mode", "").strip() == "stay"
def url_with_scroll_position(url: str) -> str:
raw_scroll = request.form.get("_scroll", "").strip()
if not raw_scroll:
return url
try:
scroll_value = max(0, int(float(raw_scroll)))
except ValueError:
return url
parts = urlsplit(url)
query = dict(parse_qsl(parts.query, keep_blank_values=True))
query["_scroll"] = str(scroll_value)
return urlunsplit((parts.scheme, parts.netloc, parts.path, urlencode(query), parts.fragment))
def normalize_login_value(raw: str) -> str:
return raw.strip().lower()
@@ -231,7 +251,9 @@ def profile():
)
database.commit()
flash("Dein Profil wurde aktualisiert.", "success")
return redirect(url_for("auth.profile"))
if wants_to_stay_on_form():
return redirect(url_with_scroll_position(url_for("auth.profile")))
return redirect(url_for("main.dashboard"))
flash(error, "error")