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