# utils.py import json from datetime import datetime import streamlit as st import plotly.graph_objects as go import plotly.express as px import re import pdfkit from jinja2 import Template class ReportManager: def __init__(self): if 'reports' not in st.session_state: st.session_state.reports = {} def save_report(self, topic: str, report_data: dict): """Save a new report with timestamp""" timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") report_id = f"{topic}_{timestamp}" st.session_state.reports[report_id] = { 'topic': topic, 'timestamp': timestamp, 'exec_summary': report_data.get('exec_summary', ''), 'detailed_report': report_data.get('detailed_report', ''), 'sources': report_data.get('sources', []), 'charts': report_data.get('charts', []) } return report_id def get_report(self, report_id: str): """Retrieve a specific report""" return st.session_state.reports.get(report_id) def get_all_reports(self): """Get all saved reports""" return st.session_state.reports def generate_visualizations(self, report_text: str): """Generate relevant visualizations based on report content""" charts = [] # Extract numerical data using regex patterns market_size_pattern = r"\$\s*(\d+(?:\.\d+)?)\s*(?:billion|million|trillion)" growth_rate_pattern = r"(\d+(?:\.\d+)?)\s*%" # Market size data market_sizes = re.findall(market_size_pattern, report_text) if market_sizes: fig = go.Figure(data=[ go.Bar( x=['Current Market Size', 'Projected Size'], y=[float(market_sizes[0]), float(market_sizes[-1])], text=[f'${x}B' for x in market_sizes], textposition='auto', ) ]) fig.update_layout(title='Market Size Projection') charts.append(fig) # Growth rate data growth_rates = re.findall(growth_rate_pattern, report_text) if growth_rates: fig = go.Figure(data=[ go.Line( x=list(range(len(growth_rates))), y=[float(x) for x in growth_rates], mode='lines+markers' ) ]) fig.update_layout(title='Growth Rate Trends') charts.append(fig) return charts def generate_pdf(self, report_id: str): """Generate PDF version of the report""" report = self.get_report(report_id) if not report: return None # HTML template for PDF template_str = """
Generated on: {{ report.timestamp }}