feat: add persistent badges and admin badge page

This commit is contained in:
2026-04-13 10:19:38 +02:00
parent 3c99c3683e
commit c36abe82a8
27 changed files with 576 additions and 100 deletions

View File

@@ -10,6 +10,7 @@ from werkzeug.utils import secure_filename
from ..extensions import csrf, db
from ..forms import AdminUserForm, SettingsProfileForm
from ..models import BadgeDefinition, MonthlyScoreSnapshot, NotificationLog, PushSubscription, TaskInstance, TaskTemplate, User
from ..services.badges import earned_badges_for_user
from ..services.notifications import push_enabled
@@ -23,6 +24,13 @@ def _require_admin():
return True
def _settings_tabs():
tabs = [("settings.index", "Profil & Team", "gear")]
if current_user.is_admin:
tabs.append(("settings.badges", "Badges", "award"))
return tabs
def _save_avatar(file_storage) -> str:
filename = secure_filename(file_storage.filename or "")
ext = Path(filename).suffix.lower() or ".png"
@@ -51,17 +59,32 @@ def index():
flash("Deine Einstellungen wurden gespeichert.", "success")
return redirect(url_for("settings.index"))
badges = BadgeDefinition.query.order_by(BadgeDefinition.name.asc()).all()
subscriptions = PushSubscription.query.filter_by(user_id=current_user.id).all()
return render_template(
"settings/index.html",
form=form,
admin_form=admin_form,
badges=badges,
users=User.query.order_by(User.is_admin.desc(), User.name.asc()).all(),
earned_badges=earned_badges_for_user(current_user.id),
push_ready=push_enabled(),
vapid_public_key=current_app.config["VAPID_PUBLIC_KEY"],
has_subscription=bool(subscriptions),
settings_tabs=_settings_tabs(),
active_settings_tab="settings.index",
)
@bp.route("/badges")
@login_required
def badges():
if not _require_admin():
return redirect(url_for("settings.index"))
badges = BadgeDefinition.query.order_by(BadgeDefinition.name.asc()).all()
return render_template(
"settings/badges.html",
badges=badges,
settings_tabs=_settings_tabs(),
active_settings_tab="settings.badges",
)
@@ -76,7 +99,7 @@ def update_badge(badge_id: int):
badge.active = request.form.get("active") == "on"
db.session.commit()
flash(f"Badge „{badge.name}“ wurde aktualisiert.", "success")
return redirect(url_for("settings.index"))
return redirect(url_for("settings.badges"))
@bp.route("/users", methods=["POST"])