dissistant / modules /report_generator.py
Stephen Zweibel
Update app for Hugging Face
5d74609
import logging
from typing import Dict, Any
from fpdf import FPDF
import xml.etree.ElementTree as ET
logger = logging.getLogger(__name__)
def generate_report(analysis_results: Dict[str, Any]) -> Dict[str, Any]:
"""
Generate a review report from the LLM's analysis results.
"""
report = {
"summary": {},
"issues": [],
"recommendations": [],
"pdf_content": b""
}
# Parse the XML output
raw_xml = analysis_results.get("raw_xml", "").strip()
if not raw_xml:
logger.error("Received empty or missing XML for report generation.")
return report
try:
root = ET.fromstring(raw_xml)
# Extract summary
summary_node = root.find("summary")
if summary_node is not None:
report["summary"] = {
"overall_assessment": summary_node.findtext("overall_assessment", "N/A"),
"total_issues": summary_node.findtext("total_issues", "N/A"),
"critical_issues": summary_node.findtext("critical_issues", "N/A"),
"warning_issues": summary_node.findtext("warning_issues", "N/A"),
}
# Extract issues
for issue_node in root.findall(".//issue"):
issue = {
"severity": issue_node.get("severity"),
"message": issue_node.findtext("message"),
"location": issue_node.findtext("location"),
"suggestion": issue_node.findtext("suggestion")
}
report["issues"].append(issue)
# Extract recommendations
for rec_node in root.findall(".//recommendation"):
report["recommendations"].append(rec_node.text)
except ET.ParseError as e:
logger.error(f"Failed to parse XML for report generation: {e}", exc_info=True)
# Handle XML parsing errors
pass
# Generate PDF report
pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", size=12)
pdf.cell(200, 10, txt="Dissertation Review Report", ln=True, align="C")
# TODO: Add more details to the PDF report
report["pdf_content"] = pdf.output(dest='S').encode('latin-1')
return report
if __name__ == "__main__":
# This module is intended to be imported, not run directly.
pass