design final
This commit is contained in:
parent
da5e765d49
commit
a0d2188f6f
1400 changed files with 1748 additions and 207 deletions
85
main.py
85
main.py
|
|
@ -1,7 +1,7 @@
|
|||
import os
|
||||
import shutil
|
||||
from fastapi import FastAPI, UploadFile, File, Request, Form
|
||||
from fastapi.responses import HTMLResponse, RedirectResponse
|
||||
from fastapi.responses import HTMLResponse
|
||||
from fastapi.templating import Jinja2Templates
|
||||
from fastapi.staticfiles import StaticFiles
|
||||
|
||||
|
|
@ -11,24 +11,71 @@ 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")
|
||||
|
||||
import asyncio
|
||||
|
||||
presence_state = {"present": False}
|
||||
|
||||
async def update_presence_periodically():
|
||||
while True:
|
||||
try:
|
||||
# Here you can implement logic to update presence automatically
|
||||
# For example, check some condition, a file, or even keep it False
|
||||
print("Updating presence state…")
|
||||
# Example: flip presence every 5 mins (just for demo)
|
||||
# presence_state["present"] = not presence_state["present"]
|
||||
|
||||
except Exception as e:
|
||||
print("Error updating presence:", e)
|
||||
|
||||
await asyncio.sleep(300) # 5 minutes
|
||||
|
||||
@app.on_event("startup")
|
||||
async def startup_event():
|
||||
asyncio.create_task(update_presence_periodically())
|
||||
|
||||
|
||||
# ---- Presence State ----
|
||||
presence_state = {"present": False}
|
||||
|
||||
@app.get("/presence")
|
||||
def get_presence():
|
||||
"""Return current presence state"""
|
||||
return presence_state
|
||||
|
||||
@app.post("/presence")
|
||||
def set_presence(present: bool = Form(...)):
|
||||
"""Set presence state explicitly"""
|
||||
presence_state["present"] = present
|
||||
return {"status": "ok", "present": presence_state["present"]}
|
||||
|
||||
@app.post("/presence/toggle")
|
||||
def toggle_presence():
|
||||
"""Toggle presence state"""
|
||||
presence_state["present"] = not presence_state["present"]
|
||||
return {"status": "ok", "present": presence_state["present"]}
|
||||
|
||||
# ---- Existing Endpoints ----
|
||||
@app.get("/", response_class=HTMLResponse)
|
||||
async def welcome(request: Request):
|
||||
return templates.TemplateResponse("landing.html", {"request": request})
|
||||
|
||||
return templates.TemplateResponse(
|
||||
"landing.html",
|
||||
{
|
||||
"request": request,
|
||||
"studio_open": presence_state["present"],
|
||||
"opening_hours": "Di-Do 11:00–16:00", # or read from config
|
||||
},
|
||||
)
|
||||
|
||||
@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(
|
||||
|
|
@ -40,7 +87,6 @@ async def cost_dashboard(request: Request):
|
|||
},
|
||||
)
|
||||
|
||||
|
||||
@app.post("/upload")
|
||||
async def upload_file(request: Request, file: UploadFile = File(...)):
|
||||
if not allowed_file(file.filename):
|
||||
|
|
@ -65,28 +111,31 @@ async def upload_file(request: Request, file: UploadFile = File(...)):
|
|||
},
|
||||
)
|
||||
|
||||
|
||||
@app.post("/send-order")
|
||||
def send_order_endpoint(
|
||||
request: Request,
|
||||
filename: str = Form(...),
|
||||
name: 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."},
|
||||
{"request": request, "error": "Datei nicht gefunden. Bitte erneut hochladen."},
|
||||
)
|
||||
|
||||
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
|
||||
send_order_sync(
|
||||
pdf_path=path,
|
||||
analysis=analysis,
|
||||
room_id="!eFWbWEnYsgeIKqyfjw:einszwovier.local",
|
||||
name=name,
|
||||
comment=comment,
|
||||
)
|
||||
|
||||
return templates.TemplateResponse(
|
||||
"result.html",
|
||||
{
|
||||
|
|
@ -94,7 +143,9 @@ def send_order_endpoint(
|
|||
"result": analysis,
|
||||
"rate_black": get_rate_black(),
|
||||
"rate_color": get_rate_color(),
|
||||
"success": "✅ Your order has been sent!"
|
||||
"success": "✅ Dein Auftrag wurde erfolgreich gesendet!",
|
||||
"name": name,
|
||||
"comment": comment,
|
||||
},
|
||||
)
|
||||
except Exception as e:
|
||||
|
|
@ -105,6 +156,8 @@ def send_order_endpoint(
|
|||
"result": analysis,
|
||||
"rate_black": get_rate_black(),
|
||||
"rate_color": get_rate_color(),
|
||||
"error": f"Failed to send order: {e}",
|
||||
"error": f"Fehler beim Senden des Auftrags: {e}",
|
||||
"name": name,
|
||||
"comment": comment,
|
||||
},
|
||||
)
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue