110 lines
No EOL
3.3 KiB
Python
110 lines
No EOL
3.3 KiB
Python
import os
|
|
import shutil
|
|
from fastapi import FastAPI, UploadFile, File, Request, Form
|
|
from fastapi.responses import HTMLResponse, RedirectResponse
|
|
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
|
|
from mailer import send_order_sync
|
|
|
|
from dotenv import load_dotenv
|
|
load_dotenv()
|
|
|
|
|
|
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(),
|
|
"rate_color": get_rate_color(),
|
|
},
|
|
)
|
|
|
|
|
|
@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(),
|
|
"rate_color": get_rate_color(),
|
|
},
|
|
)
|
|
|
|
|
|
@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}",
|
|
},
|
|
) |