from __future__ import annotations from quart import ( request, render_template, make_response, Blueprint, g ) from shared.browser.app.authz import require_admin from shared.browser.app.redis_cacher import clear_cache from shared.sx.helpers import sx_response def register(): bp = Blueprint("admin", __name__, url_prefix='/admin') # ---------- Pages ---------- @bp.get("/") @require_admin async def admin(calendar_slug: str, **kwargs): from shared.browser.app.utils.htmx import is_htmx_request from shared.sx.page import get_template_context from sx.sx_components import render_calendar_admin_page, render_calendar_admin_oob tctx = await get_template_context() if not is_htmx_request(): html = await render_calendar_admin_page(tctx) return await make_response(html) else: sx_src = await render_calendar_admin_oob(tctx) return sx_response(sx_src) @bp.get("/description/") @require_admin async def calendar_description_edit(calendar_slug: str, **kwargs): from sx.sx_components import render_calendar_description_edit html = render_calendar_description_edit(g.calendar) return sx_response(html) @bp.post("/description/") @require_admin @clear_cache(tag="calendars", tag_scope="all") async def calendar_description_save(calendar_slug: str, **kwargs): 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() from sx.sx_components import render_calendar_description html = render_calendar_description(g.calendar, oob=True) return sx_response(html) @bp.get("/description/view/") @require_admin async def calendar_description_view(calendar_slug: str, **kwargs): from sx.sx_components import render_calendar_description html = render_calendar_description(g.calendar) return sx_response(html) return bp