diff --git a/blog/sexp/sexp_components.py b/blog/sexp/sexp_components.py index 7c22ccf..03ec763 100644 --- a/blog/sexp/sexp_components.py +++ b/blog/sexp/sexp_components.py @@ -148,7 +148,7 @@ def _post_admin_nav_html(ctx: dict) -> str: market_url_fn = ctx.get("market_url") if callable(events_url_fn): for url_fn, path, label in [ - (events_url_fn, f"/{slug}/calendars/calendars/", "calendars"), + (events_url_fn, f"/{slug}/admin/", "calendars"), (market_url_fn, f"/{slug}/", "markets"), (events_url_fn, f"/{slug}/payments/", "payments"), ]: diff --git a/events/app.py b/events/app.py index cb5c082..09478a8 100644 --- a/events/app.py +++ b/events/app.py @@ -90,8 +90,8 @@ def create_app() -> "Quart": url_prefix="/", ) - # Calendars nested under post slug: ///... - # Listing stays at //calendars/, individual at /// + # Calendar admin under post slug: //admin/ + # Individual calendars at /// app.register_blueprint( register_calendars(), url_prefix="/", diff --git a/events/bp/calendars/routes.py b/events/bp/calendars/routes.py index e4e26ab..53625b1 100644 --- a/events/bp/calendars/routes.py +++ b/events/bp/calendars/routes.py @@ -21,7 +21,7 @@ from shared.browser.app.utils.htmx import is_htmx_request def register(): - bp = Blueprint("calendars", __name__, url_prefix='/calendars') + bp = Blueprint("calendars", __name__, url_prefix='/admin') bp.register_blueprint( register_calendar(), ) @@ -32,7 +32,7 @@ def register(): # ---------- Pages ---------- - @bp.get("/calendars/") + @bp.get("/") @cache_page(tag="calendars") async def home(**kwargs): from shared.sexp.page import get_template_context @@ -46,7 +46,7 @@ def register(): return await make_response(html) - @bp.post("/calendars/new/") + @bp.post("/new/") @require_admin @clear_cache(tag="calendars", tag_scope="all") async def create_calendar(**kwargs): diff --git a/events/bp/calendars/services/calendars.py b/events/bp/calendars/services/calendars.py index 3fb12d0..24d139c 100644 --- a/events/bp/calendars/services/calendars.py +++ b/events/bp/calendars/services/calendars.py @@ -86,7 +86,9 @@ async def create_calendar(sess: AsyncSession, post_id: int, name: str) -> Calend name = (name or "").strip() if not name: raise CalendarError("Calendar name must not be empty.") - slug=slugify(name) + slug = slugify(name) + if slug in ("admin", "markets", "payments", "entries"): + raise CalendarError(f'"{slug}" is a reserved name and cannot be used as a calendar name.') # Ensure post exists (avoid silent FK errors in some DBs) raw = await fetch_data("blog", "post-by-id", params={"id": post_id}, required=False)