|
import streamlit as st |
|
from datetime import datetime |
|
|
|
from config.settings import settings |
|
from models import ChatMessage, ChatSession, User |
|
from models.db import get_session_context |
|
from services.pdf_report import generate_pdf_report |
|
from services.logger import app_logger |
|
from services.metrics import log_report_generated |
|
|
|
st.set_page_config(page_title=f"Reports - {settings.APP_TITLE}", layout="wide") |
|
|
|
if not st.session_state.get("authenticated_user"): |
|
st.warning("Please log in to access reports.") |
|
st.switch_page("app.py") |
|
|
|
current_user: User = st.session_state.authenticated_user |
|
|
|
st.title("Consultation Reports") |
|
st.markdown("View and download your past consultation sessions.") |
|
|
|
|
|
@st.cache_data(ttl=300) |
|
def get_user_sessions(user_id: int): |
|
with get_session_context() as db: |
|
sessions = db.query(ChatSession).filter(ChatSession.user_id == user_id).order_by(ChatSession.start_time.desc()).all() |
|
return sessions |
|
|
|
chat_sessions = get_user_sessions(current_user.id) |
|
|
|
if not chat_sessions: |
|
st.info("You have no past consultation sessions.") |
|
st.stop() |
|
|
|
|
|
selected_session_id_str = st.selectbox( |
|
"Select a Consultation Session:", |
|
options=[(f"Session ID: {s.id} - Started: {s.start_time.strftime('%Y-%m-%d %H:%M')} - Title: {s.title or 'Untitled'}", str(s.id)) for s in chat_sessions], |
|
format_func=lambda x: x[0] |
|
) |
|
|
|
if selected_session_id_str: |
|
selected_session_id = int(selected_session_id_str[1]) |
|
|
|
|
|
selected_session = next((s for s in chat_sessions if s.id == selected_session_id), None) |
|
|
|
if selected_session: |
|
st.subheader(f"Details for Session ID: {selected_session.id}") |
|
st.write(f"Started: {selected_session.start_time.strftime('%Y-%m-%d %H:%M:%S UTC')}") |
|
st.write(f"Title: {selected_session.title or 'Untitled'}") |
|
|
|
with get_session_context() as db: |
|
messages = db.query(ChatMessage).filter(ChatMessage.session_id == selected_session.id).order_by(ChatMessage.timestamp).all() |
|
|
|
if messages: |
|
with st.expander("View Chat Transcript", expanded=False): |
|
for msg in messages: |
|
icon = "π§ββοΈ" if msg.role == "assistant" else "π€" |
|
if msg.role == "tool": icon = "π οΈ" |
|
st.markdown(f"**{icon} {msg.role.capitalize()} ({msg.timestamp.strftime('%H:%M:%S')}):**") |
|
st.markdown(f"> {msg.content}\n---") |
|
|
|
|
|
try: |
|
pdf_bytes = generate_pdf_report(messages, patient_name=current_user.username) |
|
|
|
st.download_button( |
|
label="Download Report as PDF", |
|
data=pdf_bytes, |
|
file_name=f"consultation_report_{selected_session.id}_{datetime.now().strftime('%Y%m%d')}.pdf", |
|
mime="application/pdf", |
|
on_click=log_report_generated |
|
) |
|
except Exception as e: |
|
app_logger.error(f"Error generating PDF for session {selected_session.id}: {e}") |
|
st.error(f"Could not generate PDF report: {e}") |
|
else: |
|
st.info("This session has no messages.") |