feat: add persistent badges and admin badge page
This commit is contained in:
@@ -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"])
|
||||
|
||||
Reference in New Issue
Block a user