feat(root):add create export

This commit is contained in:
shahzeydyfah
2026-02-05 23:02:08 +03:30
parent b63ca268b9
commit eae9248dc5
6 changed files with 132 additions and 16 deletions
+2 -1
View File
@@ -18,4 +18,5 @@ from .financial_status import *
from .financial_adjust import *
from .delivery import *
from .report import *
from .excel import *
from .excel import *
from .download import *
+48
View File
@@ -0,0 +1,48 @@
"""
دانلود فایل اکسل تولیدشده از خروجی جدول (Table Engine).
فایل‌ها در پوشه temp پروژه ذخیره می‌شوند و از طریق این endpoint قابل دانلود هستند.
"""
import os
import re
from fastapi import APIRouter, HTTPException
from starlette.responses import FileResponse
from config import conf
from core.app import app
from core.utils.router import generate_router
router = generate_router("download", auth_dependencies=False, version="v2")
_tag_base = ["download"]
_pre = conf.server.prefix_url.replace("v1", "v2")
def _excel_temp_dir():
return os.path.join(os.getcwd(), "temp")
def _safe_excel_filename(name: str) -> bool:
"""فقط نام فایل اکسلی با فرمت uuid.xlsx (۳۲ کاراکتر hex + .xlsx) مجاز است."""
return bool(re.match(r"^[a-f0-9]{32}\.xlsx$", name))
@router.get("/excel/{filename}", tags=_tag_base)
async def download_excel(filename: str):
"""
دانلود فایل اکسل با نام بازگردانده‌شده از API لیست (فیلد path).
مثال: بعد از درخواست خروجی اکسل، در پاسخ path مثلاً «abc123...xlsx» می‌آید؛
برای دانلود: GET /v2/download/excel/abc123....xlsx
"""
if not _safe_excel_filename(filename):
raise HTTPException(status_code=400, detail="نام فایل نامعتبر است.")
file_path = os.path.join(_excel_temp_dir(), filename)
if not os.path.isfile(file_path):
raise HTTPException(status_code=404, detail="فایل یافت نشد یا منقضی شده است.")
return FileResponse(
file_path,
media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
filename=filename,
)
app.include_router(router)