Seed demo content only on database creation via @kanta.bootstrap

Previously startup appended any missing seed pages into existing
databases, resurrecting deleted content on running sites.
This commit is contained in:
2026-08-19 00:57:35 +00:00
parent 58e5d3ef2b
commit 3b074c02ed
2 changed files with 23 additions and 19 deletions
+7 -5
View File
@@ -125,8 +125,8 @@ not for the public pages. See `docs/design-principles.md` for the design.
and their nav links point at their first child page. Dynamic regions have stable ids
(`#page-banner`, `#nav`, `#sidebar`, `#main`) for fetch-navigation swaps
(`#sidebar` may be absent on either side of a swap).
- `seed.py` — demo content written on startup for paths missing from the
database (never overwrites existing pages).
- `seed.py` — demo content written only when the database is first
created, via a `@kanta.bootstrap` handler in `app.py`.
- `frontend/src/` — the Vue editor and public-page entries.
- `main.js` — Vue editor app entry, mounts the tabbed EditorShell.
- `pagerite.js` — public page entry; runs fetch-navigation, scroll-reveal,
@@ -141,9 +141,11 @@ not for the public pages. See `docs/design-principles.md` for the design.
learn the current session's admin status. The same reverse proxy that
gates `/_api` returns 401 for anonymous users, 403 for users without
the admin permission, and 200 for admins. When Paskia is detected, a
🔑 login button (anonymous) or 🔐 profile button (logged in) is shown in
the banner corner; both open Paskia's iframe dialog via `showAuthIframe`
instead of navigating away. Admins also get the 🖊️ page/banner edit pens
🔑 login link (anonymous) or 🔐 profile link (logged in) is shown in
the banner corner; both are plain `<a href="/auth/">` links (Paskia
does not support being iframed, so we navigate normally), and a
`pageshow` handler re-probes auth when history navigation restores a
cached page. Admins also get the 🖊️ page/banner edit pens
and a ⚙️ site-settings pen (asset URLs from the
`pagerite:editor-src`/`-css` meta tags). If no Paskia SSO is
detected (dev/no proxy), editing is left open. Pages themselves render
+11 -9
View File
@@ -121,15 +121,10 @@ def _migrate_legacy() -> None:
data.version += 1
@asynccontextmanager
async def lifespan(_app: FastAPI) -> AsyncIterator[None]:
"""Open the database, migrate/seed content, load assets."""
await kanta.open()
_migrate_legacy()
missing = [p for p in seed.PAGES if resolve(data.menu, p) is None]
if missing:
with kanta.transaction("seed missing pages"):
for path in missing:
@kanta.bootstrap
def _seed(data: Data) -> None:
"""Write the demo pages on database creation (never on existing dbs)."""
for path in seed.PAGES:
title, markdown, files, banner, order, design = seed.PAGES[path]
for orig, body in files.items():
markdown, banner = _store_seed_file(markdown, banner, orig, body)
@@ -139,6 +134,13 @@ async def lifespan(_app: FastAPI) -> AsyncIterator[None]:
node.banner = banner
node.banner_design = design
node.order = order
@asynccontextmanager
async def lifespan(_app: FastAPI) -> AsyncIterator[None]:
"""Open the database, migrate legacy content, load assets."""
await kanta.open()
_migrate_legacy()
await frontend.load()
yield
await kanta.close()