78 lines
2.3 KiB
Python
78 lines
2.3 KiB
Python
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/<int:blueprint_id>")
|
|
@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/<int:server_id>")
|
|
@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)
|