/
azathd
/
mutiagent
Обзор
Документация
Войти
/
azathd
/
mutiagent
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/reports/render.py
71 строка
2 KB
Your Name
init
15 май 2026, 17:47
15 май 2026, 17:47
359c81e
Код
Авторство
О чём код?
"""Report rendering: HTML -> PDF, MinIO upload.""" from __future__ import annotations import json import tempfile import uuid from datetime import UTC, datetime from pathlib import Path from jinja2 import Environment, FileSystemLoader from minio import Minio from weasyprint import HTML from src.common.db import async_session_fact, init_engine from src.common.orm import ReportIndex from src.common.settings import settings from src.reports.charts import line_png, poster_png from src.reports.kpi import summarize from src.reports.narrative import executive_summary from redis.asyncio import Redis async def generate_report(period: str, formats: list[str], job_id: str) -> dict: kpi = {"events": 1000, "incidents": 3, "period": period} redis = await Redis.from_url(settings.redis_url, decode_responses=True) summary = "" if settings.openai_api_key: summary = await executive_summary(redis, kpi) env = Environment(loader=FileSystemLoader("/app/src/reports/templates")) html = env.get_template("report.html").render(kpi=kpi, summary=summary, period=period) tmp = Path(tempfile.mkdtemp()) pdf_path = tmp / f"{job_id}.pdf" png_path = tmp / f"{job_id}.png" HTML(string=html).write_pdf(str(pdf_path)) line_png(["Mon", "Tue", "Wed"], [10, 20, 15], png_path) poster_png(kpi, tmp / f"{job_id}_poster.png") client = Minio( settings.minio_endpoint.replace("http://", "").replace("https://", ""), access_key=settings.minio_access_key, secret_key=settings.minio_secret_key, secure=settings.minio_endpoint.startswith("https"), ) bucket = "xray-reports" if not client.bucket_exists(bucket): client.make_bucket(bucket) keys = [] if "pdf" in formats: key = f"reports/{period}/{job_id}.pdf" client.fput_object(bucket, key, str(pdf_path)) keys.append(key) if "png" in formats: key = f"reports/{period}/{job_id}.png" client.fput_object(bucket, key, str(png_path)) keys.append(key) session = async_session_fact(init_engine()) async with session() as db: row = ReportIndex( id=uuid.uuid4(), period=period, object_key=keys[0] if keys else "", formats=formats, ) db.add(row) await db.commit() return {"job_id": job_id, "keys": keys, "summary": summary[:200]}