67 lines
2.4 KiB
Python
67 lines
2.4 KiB
Python
import json
|
|
import os
|
|
import aiohttp
|
|
from typing import Literal
|
|
import uuid
|
|
from fastapi import HTTPException
|
|
from pathvalidate import sanitize_filename
|
|
|
|
from models.pptx_models import PptxPresentationModel
|
|
from models.presentation_and_path import PresentationAndPath
|
|
from services.pptx_presentation_creator import PptxPresentationCreator
|
|
from services.temp_file_service import TEMP_FILE_SERVICE
|
|
from utils.asset_directory_utils import get_exports_directory
|
|
import uuid
|
|
|
|
|
|
async def export_presentation(
|
|
presentation_id: uuid.UUID, title: str, export_as: Literal["pptx", "pdf"]
|
|
) -> PresentationAndPath:
|
|
if export_as == "pptx":
|
|
|
|
# Get the converted PPTX model from the Next.js service
|
|
async with aiohttp.ClientSession() as session:
|
|
async with session.get(
|
|
f"http://localhost/api/presentation_to_pptx_model?id={presentation_id}"
|
|
) as response:
|
|
if response.status != 200:
|
|
error_text = await response.text()
|
|
print(f"Failed to get PPTX model: {error_text}")
|
|
raise HTTPException(
|
|
status_code=500,
|
|
detail="Failed to convert presentation to PPTX model",
|
|
)
|
|
pptx_model_data = await response.json()
|
|
|
|
# Create PPTX file using the converted model
|
|
pptx_model = PptxPresentationModel(**pptx_model_data)
|
|
temp_dir = TEMP_FILE_SERVICE.create_temp_dir()
|
|
pptx_creator = PptxPresentationCreator(pptx_model, temp_dir)
|
|
await pptx_creator.create_ppt()
|
|
|
|
export_directory = get_exports_directory()
|
|
pptx_path = os.path.join(
|
|
export_directory,
|
|
f"{sanitize_filename(title or str(uuid.uuid4()))}.pptx",
|
|
)
|
|
pptx_creator.save(pptx_path)
|
|
|
|
return PresentationAndPath(
|
|
presentation_id=presentation_id,
|
|
path=pptx_path,
|
|
)
|
|
else:
|
|
async with aiohttp.ClientSession() as session:
|
|
async with session.post(
|
|
"http://localhost/api/export-as-pdf",
|
|
json={
|
|
"id": str(presentation_id),
|
|
"title": sanitize_filename(title or str(uuid.uuid4())),
|
|
},
|
|
) as response:
|
|
response_json = await response.json()
|
|
|
|
return PresentationAndPath(
|
|
presentation_id=presentation_id,
|
|
path=response_json["path"],
|
|
)
|