learnopolis's picture
Create main.py
607d7eb verified
Raw
History Blame Contribute Delete
2.16 kB
from fastapi import FastAPI, BackgroundTasks
from fastapi.responses import FileResponse
from pydantic import BaseModel
import os
from datetime import datetime
# This imports the functions from your massive script (which we will upload next)
from report_generator import (
calculate_metrics, get_ai_analysis, chart_daily_completion,
chart_goal_proximity_gauge, chart_dow_performance,
chart_score_breakdown, build_pdf
)
app = FastAPI(title="FocusDesk AI Analytics Server")
# This tells the server what JSON structure to expect from Flutter
class ReportContext(BaseModel):
user_profile: dict
strategy: dict
today_plan: dict
history: list
# Deletes the PDF from the server after it is sent to the user to save space
def cleanup_file(filepath: str):
if os.path.exists(filepath):
os.remove(filepath)
@app.post("/generate_report")
async def generate_report(data: ReportContext, background_tasks: BackgroundTasks):
context_data = data.model_dump()
try:
metrics = calculate_metrics(context_data)
ai_sections = get_ai_analysis(context_data, metrics)
chart_daily = chart_daily_completion(metrics["daily_rates"])
chart_gauge = chart_goal_proximity_gauge(metrics["goal_proximity"])
chart_dow = chart_dow_performance(metrics["dow_avg"])
chart_radar = chart_score_breakdown(metrics)
name = context_data["user_profile"]["name"].replace(" ", "_")
timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
output_path = f"temp_report_{name}_{timestamp}.pdf"
# Build the PDF using your awesome layout
build_pdf(
context_data, metrics, ai_sections,
chart_daily, chart_gauge, chart_dow, chart_radar,
output_path
)
# Schedule the cleanup, then send the file!
background_tasks.add_task(cleanup_file, output_path)
return FileResponse(
path=output_path,
media_type="application/pdf",
filename=f"FocusDesk_{name}.pdf"
)
except Exception as e:
return {"error": str(e)}