124-webapp/main.py

110 lines
3.3 KiB
Python
Raw Normal View History

2025-09-11 16:01:32 +02:00
import os
import shutil
2025-09-17 16:35:11 +02:00
from fastapi import FastAPI, UploadFile, File, Request, Form
from fastapi.responses import HTMLResponse, RedirectResponse
2025-09-11 16:01:32 +02:00
from fastapi.templating import Jinja2Templates
from fastapi.staticfiles import StaticFiles
from cost_calculator import allowed_file, analyze_pdf, get_rate_black, get_rate_color, UPLOAD_FOLDER
2025-09-17 16:35:11 +02:00
from mailer import send_order_sync
from dotenv import load_dotenv
load_dotenv()
2025-09-11 16:01:32 +02:00
app = FastAPI()
templates = Jinja2Templates(directory="templates")
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
app.mount("/static", StaticFiles(directory="static"), name="static")
@app.get("/", response_class=HTMLResponse)
async def welcome(request: Request):
return templates.TemplateResponse("landing.html", {"request": request})
@app.get("/about", response_class=HTMLResponse)
async def about(request: Request):
return templates.TemplateResponse("about.html", {"request": request})
@app.get("/cost", response_class=HTMLResponse)
async def cost_dashboard(request: Request):
return templates.TemplateResponse(
"cost-calculator.html",
{
"request": request,
"rate_black": get_rate_black(),
2025-09-17 16:35:11 +02:00
"rate_color": get_rate_color(),
},
2025-09-11 16:01:32 +02:00
)
@app.post("/upload")
async def upload_file(request: Request, file: UploadFile = File(...)):
if not allowed_file(file.filename):
return templates.TemplateResponse(
"cost-calculator.html",
{"request": request, "error": "Unsupported file type. Only PDF allowed."},
)
path = os.path.join(UPLOAD_FOLDER, file.filename)
with open(path, "wb") as buffer:
shutil.copyfileobj(file.file, buffer)
result = analyze_pdf(path)
return templates.TemplateResponse(
"result.html",
{
"request": request,
"result": result,
"rate_black": get_rate_black(),
2025-09-17 16:35:11 +02:00
"rate_color": get_rate_color(),
2025-09-11 16:01:32 +02:00
},
)
2025-09-17 16:35:11 +02:00
@app.post("/send-order")
def send_order_endpoint(
request: Request,
filename: str = Form(...),
comment: str = Form(""),
):
"""
Handles the 'Send Order' button. Sends PDF + analysis + user comment via Matrix.
"""
path = os.path.join(UPLOAD_FOLDER, filename)
if not os.path.exists(path):
return templates.TemplateResponse(
"cost-calculator.html",
{"request": request, "error": "File not found. Please upload again."},
)
analysis = analyze_pdf(path)
try:
send_order_sync(path, analysis, room_id="!YokZIMTVFEmSMRmmsb:localhost", comment=comment)
# Render same result.html but include a success banner
return templates.TemplateResponse(
"result.html",
{
"request": request,
"result": analysis,
"rate_black": get_rate_black(),
"rate_color": get_rate_color(),
"success": "✅ Your order has been sent!"
},
)
except Exception as e:
return templates.TemplateResponse(
"result.html",
{
"request": request,
"result": analysis,
"rate_black": get_rate_black(),
"rate_color": get_rate_color(),
"error": f"Failed to send order: {e}",
},
)