# retoor import logging from fastapi.responses import JSONResponse, RedirectResponse logger = logging.getLogger(__name__) def wants_json(request): content_type = request.headers.get("content-type", "") if content_type.startswith("application/json"): return True accept = request.headers.get("accept", "") return "application/json" in accept and "text/html" not in accept def json_error(status_code, message, **extra): body = {"status": status_code, "message": message} body.update(extra) return JSONResponse({"error": body}, status_code=status_code) def respond(request, template, ctx, *, model, status_code=200): if wants_json(request): try: payload = model.model_validate(ctx).model_dump(mode="json") except Exception: logger.exception("schema validation failed for %s", model.__name__) return json_error(500, "Response serialization failed") return JSONResponse(payload, status_code=status_code) from molodetz.templating import templates context = dict(ctx) return templates.TemplateResponse(request, template, context, status_code=status_code) def action_result(request, redirect_url, *, data=None, status_code=302): if wants_json(request): return JSONResponse({"ok": True, "redirect": redirect_url, "data": data}) return RedirectResponse(redirect_url, status_code=status_code)