ui/app.py (53 lines of code) (raw):

from fastapi import FastAPI, File, UploadFile, Form from fastapi.responses import HTMLResponse, FileResponse from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates import subprocess import os import shutil import zipfile import uuid import json app = FastAPI() app.mount("/static", StaticFiles(directory="static"), name="static") templates = Jinja2Templates(directory="templates") @app.get("/", response_class=HTMLResponse) async def main(): return templates.TemplateResponse("index.html", {"request": {}, "download_link": None}) @app.post("/", response_class=HTMLResponse) async def process_file(source_file: UploadFile = File(...), dag_divider: str = Form(...)): download_link = None report_data = {} if source_file.filename: with open(source_file.filename, "wb") as buffer: buffer.write(await source_file.read()) source_path = source_file.filename output_path = "ui-output" # Clear the output directory if os.path.exists(output_path): shutil.rmtree(output_path) # This removes the directory and its contents os.makedirs(output_path) # Recreate an empty directory current_dir = os.getcwd() # Run the subprocess from parent directory where DAGify.py is located os.chdir('..') # source_path is at current directory, this must be specified when running the subprocess source_path = os.path.join(current_dir, source_file.filename) subprocess.run(["python3", "DAGify.py", "--source-path", source_path, "--dag-divider", dag_divider, "--output-path", output_path, "-r"]) if os.listdir(output_path): # Generate a unique ID unique_id = uuid.uuid4() source_xml_name = source_path.split("/")[-1].split(".")[0] # Create a ZIP archive with the unique ID in the filename zip_filename = f"dagify_{source_xml_name}_{unique_id}.zip" with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zipf: for root, dirs, files in os.walk(output_path): for file in files: if file.endswith(".json"): file_path = os.path.join(root, file) with open(file_path, 'r') as f: report_data = json.load(f) zipf.write(os.path.join(root, file), os.path.relpath(os.path.join(root, file), output_path)) download_link = f"/download/{zip_filename}" # Change directory to current directory after subprocess completes os.chdir(current_dir) os.remove(source_file.filename) return templates.TemplateResponse("index.html", {"request": {}, "download_link": download_link, "report_data": report_data}) @app.get("/download/{filename}") async def download_file(filename: str): # File Path is updated as output is downloaded in parent directory, # where DAGify.py is located. file_path = os.path.join(os.pardir, filename) return FileResponse(file_path, media_type='application/zip', filename=filename)