Download app.py from Sumup/scheduler: direct link, hf CLI and curl.
- Browser
- Download file 2.85 kB
-
https://huggingface.co/spaces/Sumup/scheduler/resolve/main/app.py
- Command line
-
hf download hf://spaces/Sumup/scheduler/app.py
-
curl -L -o app.py https://huggingface.co/spaces/Sumup/scheduler/resolve/main/app.py
2.85 kB
| from fastapi import FastAPI, Request | |
| from fastapi.responses import HTMLResponse, JSONResponse, FileResponse | |
| from fastapi.templating import Jinja2Templates | |
| import requests | |
| import logging | |
| import os | |
| # ------------------------------ | |
| # Setup basic logging | |
| # ------------------------------ | |
| logging.basicConfig( | |
| level=logging.INFO, | |
| format="%(asctime)s - %(levelname)s - %(message)s" | |
| ) | |
| logger = logging.getLogger(__name__) | |
| app = FastAPI() | |
| templates = Jinja2Templates(directory=".") | |
| SECURE_API_KEY = os.getenv("SECURE_API_KEY") | |
| BASE_API_URL = "https://script.google.com/macros/s/AKfycbwuRcqUlVroX4qGzBKNpC9mVa6ftGlNL2adJmVBxNW5-VFhj67WRTbFYh-QYXxobCC5ew/exec" | |
| async def get_style(): | |
| return FileResponse("style.css", media_type="text/css") | |
| async def index(request: Request, ln: str = "", le: str = "", oe: str = ""): | |
| """ | |
| Pass query parameters to the front-end to pre-fill the form. | |
| ln = lead name | |
| le = lead email | |
| oe = owner / sales rep email | |
| """ | |
| return templates.TemplateResponse( | |
| "index.html", | |
| { | |
| "request": request, | |
| "lead_name": ln, | |
| "lead_email": le, | |
| "sales_rep_email": oe | |
| } | |
| ) | |
| async def available(name: str, email: str, salesRepEmail: str): | |
| """ | |
| Return available slots for a given salesRepEmail | |
| """ | |
| try: | |
| slot_resp = requests.get(f"{BASE_API_URL}?action=getAvailableSlots&salesRepEmail={salesRepEmail}") | |
| slots = slot_resp.json() | |
| if isinstance(slots, dict) and "error" in slots: | |
| return {"error": slots["error"]} | |
| if not slots: | |
| return {"slots": [], "repEmail": salesRepEmail} | |
| return {"slots": slots, "repEmail": salesRepEmail} | |
| except Exception as e: | |
| logger.exception("Error fetching slots") | |
| return {"error": str(e)} | |
| async def book_meeting(booking: dict): | |
| name = booking.get("name") | |
| email = booking.get("email") | |
| salesRepEmail = booking.get("salesRepEmail") | |
| selectedSlot = booking.get("selectedSlot") | |
| try: | |
| response = requests.get( | |
| f"{BASE_API_URL}?action=createBooking&customerName={name}&customerEmail={email}" | |
| f"&salesRepEmail={salesRepEmail}&selectedSlot={selectedSlot}" | |
| ) | |
| response_data = response.json() if response.content else {} | |
| if "error" in response_data: | |
| return JSONResponse(status_code=400, content={"message": response_data["error"]}) | |
| return JSONResponse(status_code=200, content={"message": "Booking confirmed!", "data": response_data}) | |
| except Exception as e: | |
| logger.exception("Error while creating booking") | |
| return JSONResponse(status_code=500, content={"message": f"Failed to create booking. {str(e)}"}) | |