from __future__ import annotations from quart import ( request, render_template, make_response, Blueprint, g ) from suma_browser.app.authz import require_admin from suma_browser.app.redis_cacher import clear_cache def register(): bp = Blueprint("admin", __name__, url_prefix='/admin') # ---------- Pages ---------- @bp.get("/") @require_admin async def admin(slug: str, calendar_slug: str): from suma_browser.app.utils.htmx import is_htmx_request # Determine which template to use based on request type if not is_htmx_request(): # Normal browser request: full page with layout html = await render_template("_types/calendar/admin/index.html") else: # HTMX request: main panel + OOB elements html = await render_template("_types/calendar/admin/_oob_elements.html") return await make_response(html) @bp.get("/description/") @require_admin async def calendar_description_edit(slug: str, calendar_slug: str): # g.post and g.calendar should already be set by the parent calendar bp html = await render_template( "_types/calendar/admin/_description_edit.html", post=g.post_data['post'], calendar=g.calendar, ) return await make_response(html) @bp.post("/description/") @require_admin @clear_cache(tag="calendars", tag_scope="all") async def calendar_description_save(slug: str, calendar_slug: str): form = await request.form description = (form.get("description") or "").strip() or None # simple inline update, or call a service if you prefer g.calendar.description = description await g.s.flush() html = await render_template( "_types/calendar/admin/_description.html", post=g.post_data['post'], calendar=g.calendar, oob=True ) return await make_response(html) @bp.get("/description/view/") @require_admin async def calendar_description_view(slug: str, calendar_slug: str): # just render the display version without touching the DB (used by Cancel) html = await render_template( "_types/calendar/admin/_description.html", post=g.post_data['post'], calendar=g.calendar, ) return await make_response(html) return bp