import json from flask import Blueprint, Response, current_app, render_template from sqlalchemy import select from l4d2web.auth import current_user, require_admin, require_login from l4d2web.db import session_scope from l4d2web.models import Blueprint as BlueprintModel from l4d2web.models import BlueprintOverlay, Overlay, Server bp = Blueprint("pages", __name__) @bp.get("/dashboard") @require_login def dashboard() -> str: user = current_user() assert user is not None with session_scope() as db: servers = db.scalars(select(Server).where(Server.user_id == user.id).order_by(Server.name)).all() return render_template( "dashboard.html", servers=servers, refresh_seconds=current_app.config["STATUS_REFRESH_SECONDS"], ) @bp.get("/blueprints/") @require_login def blueprint_page(blueprint_id: int): user = current_user() assert user is not None with session_scope() as db: blueprint = db.scalar(select(BlueprintModel).where(BlueprintModel.id == blueprint_id)) if blueprint is None: return Response(status=404) if blueprint.user_id != user.id: return Response(status=403) overlay_rows = db.execute( select(Overlay.name) .join(BlueprintOverlay, BlueprintOverlay.overlay_id == Overlay.id) .where(BlueprintOverlay.blueprint_id == blueprint.id) .order_by(BlueprintOverlay.position) ).all() return render_template( "blueprints.html", blueprint=blueprint, overlay_names=[row[0] for row in overlay_rows], arguments=json.loads(blueprint.arguments), config_lines=json.loads(blueprint.config), ) @bp.get("/servers/") @require_login def server_detail(server_id: int): user = current_user() assert user is not None with session_scope() as db: server = db.scalar(select(Server).where(Server.id == server_id, Server.user_id == user.id)) if server is None: return Response(status=404) return render_template("server_detail.html", server=server) @bp.get("/admin/overlays") @require_admin def admin_overlays() -> str: with session_scope() as db: overlays = db.scalars(select(Overlay).order_by(Overlay.name)).all() return render_template("admin_overlays.html", overlays=overlays)