diff --git a/app/api/welcome.py b/app/api/welcome.py
index dfd707d..159074f 100644
--- a/app/api/welcome.py
+++ b/app/api/welcome.py
@@ -7,6 +7,7 @@
"""
import datetime
+import logging
from typing import Optional
import duckdb
@@ -17,7 +18,9 @@ from pydantic import BaseModel, Field
from app.auth.access import require_admin
from app.auth.dependencies import _get_db, get_current_user
from src.repositories.welcome_template import WelcomeTemplateRepository
-from src.welcome_template import _load_default_template, render_welcome
+from src.welcome_template import _load_default_template, build_context, render_welcome
+
+logger = logging.getLogger(__name__)
router = APIRouter(tags=["welcome"])
@@ -75,9 +78,10 @@ async def get_welcome(
try:
rendered = render_welcome(conn, user=user, server_url=server_url)
except TemplateError as e:
+ logger.warning("Welcome render failed: %s", e, exc_info=True)
raise HTTPException(
status_code=500,
- detail=f"Welcome template render failed: {e}. An admin can reset it via /admin/welcome.",
+ detail="Welcome template render failed. An admin can fix it at /admin/welcome.",
)
return WelcomeResponse(content=rendered)
@@ -133,8 +137,6 @@ async def admin_preview_template(
"""Render arbitrary template content against the live context for the
calling admin, without persisting. Used by the /admin/welcome editor's
Preview button so admins can see their edits before saving."""
- from src.welcome_template import build_context
-
env = Environment(undefined=StrictUndefined, autoescape=False)
try:
template = env.from_string(payload.content)
diff --git a/app/web/router.py b/app/web/router.py
index 87abbd5..962f746 100644
--- a/app/web/router.py
+++ b/app/web/router.py
@@ -744,8 +744,13 @@ async def setup_page(
@router.get("/install", response_class=HTMLResponse)
async def install_redirect(request: Request):
- """Backwards-compat redirect: /install → /setup (301)."""
- return RedirectResponse(url="/setup", status_code=301)
+ """Backwards-compat redirect: /install → /setup (302).
+
+ Using 302 (temporary) rather than 301 (permanent) so browsers/proxies
+ don't cache indefinitely — if the path ever changes again, cached 301s
+ require manual cache clearing to recover.
+ """
+ return RedirectResponse(url="/setup", status_code=302)
@router.get("/admin/tables", response_class=HTMLResponse)
diff --git a/app/web/templates/admin_setup_banner.html b/app/web/templates/admin_setup_banner.html
index ace18dd..c96d351 100644
--- a/app/web/templates/admin_setup_banner.html
+++ b/app/web/templates/admin_setup_banner.html
@@ -2,10 +2,18 @@
{% block title %}Setup Banner — {{ config.INSTANCE_NAME }}{% endblock %}
{% block content %}
-
-
-
-
+
+
+
+