Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import os | |
| import tempfile | |
| from pathlib import Path | |
| import time | |
| import logging | |
| import asyncio | |
| # Import modules | |
| from modules.llm_interface import analyze_with_llm | |
| from modules.report_generator import generate_report | |
| # Import configuration | |
| from config import settings | |
| # Get logger | |
| logger = logging.getLogger(__name__) | |
| # --- Password Authentication Function --- | |
| def check_authentication(): | |
| """Returns `True` if the user is authenticated.""" | |
| expected_password = st.secrets.get("APP_PASSWORD") | |
| if not expected_password: | |
| st.session_state.authenticated = True | |
| return True | |
| if "authenticated" not in st.session_state: | |
| st.session_state.authenticated = False | |
| if st.session_state.authenticated: | |
| return True | |
| with st.form(key="password_form"): | |
| st.subheader("Enter Password to Access") | |
| password_attempt = st.text_input("Password", type="password", key="password_input_field") | |
| login_button = st.form_submit_button("Login") | |
| if login_button: | |
| if password_attempt == expected_password: | |
| st.session_state.authenticated = True | |
| st.rerun() | |
| else: | |
| st.error("Incorrect password. Please try again.") | |
| return False | |
| return False | |
| # Set page configuration | |
| st.set_page_config( | |
| page_title="Graduate Center Dissertation Review Tool", | |
| page_icon="📚", | |
| layout="wide", | |
| initial_sidebar_state="expanded" | |
| ) | |
| # Custom CSS | |
| st.markdown(""" | |
| <style> | |
| .main .block-container { | |
| padding-top: 2rem; | |
| padding-bottom: 2rem; | |
| } | |
| h1, h2, h3 { | |
| margin-bottom: 1rem; | |
| } | |
| .stProgress > div > div > div { | |
| background-color: #4CAF50; | |
| } | |
| </style> | |
| """, unsafe_allow_html=True) | |
| # Initialize session state | |
| if "analysis_results" not in st.session_state: | |
| st.session_state.analysis_results = None | |
| if "report_generated" not in st.session_state: | |
| st.session_state.report_generated = False | |
| # Title and description | |
| st.title("Graduate Center Dissertation Review Tool") | |
| st.markdown(""" | |
| This tool automatically checks dissertations and theses for formatting and citation rules. | |
| Upload your document to receive a detailed report. | |
| """) | |
| # Sidebar for configuration | |
| with st.sidebar: | |
| st.header("Configuration") | |
| # Reset button | |
| if st.button("Start Over"): | |
| for key in st.session_state.keys(): | |
| del st.session_state[key] | |
| st.rerun() | |
| if check_authentication(): | |
| # Main content area | |
| tab1, tab2 = st.tabs(["Document Upload", "Review Report"]) | |
| with tab1: | |
| st.header("Upload Your Document") | |
| uploaded_file = st.file_uploader("Choose a PDF or Word document", type=["pdf", "docx"]) | |
| if uploaded_file is not None: | |
| # Display file info | |
| file_details = { | |
| "Filename": uploaded_file.name, | |
| "File size": f"{uploaded_file.size / 1024:.2f} KB", | |
| "File type": uploaded_file.type | |
| } | |
| st.write("File Details:") | |
| for key, value in file_details.items(): | |
| st.write(f"- {key}: {value}") | |
| # Process button | |
| if st.button("Process Document"): | |
| logger.info(f"Processing document: {uploaded_file.name}") | |
| try: | |
| with st.spinner("Processing document..."): | |
| # Process document | |
| progress_bar = st.progress(0) | |
| # Step 1: Read file bytes | |
| pdf_bytes = uploaded_file.getvalue() | |
| progress_bar.progress(25) | |
| time.sleep(0.5) # Simulate processing time | |
| # Step 2: Metadata extraction | |
| logger.info("Extracting metadata...") | |
| st.write("Extracting metadata...") | |
| metadata = {"title": uploaded_file.name} # Dummy metadata | |
| progress_bar.progress(50) | |
| time.sleep(0.5) # Simulate processing time | |
| # Step 3: LLM analysis | |
| logger.info("Performing analysis with LLM...") | |
| st.write("Performing analysis with LLM...") | |
| analysis_results = analyze_with_llm( | |
| pdf_file=pdf_bytes, | |
| metadata=metadata | |
| ) | |
| st.session_state.analysis_results = analysis_results | |
| progress_bar.progress(100) | |
| # Generate report | |
| logger.info("Generating report...") | |
| st.session_state.report = generate_report(analysis_results) | |
| st.session_state.report_generated = True | |
| # Switch to report tab | |
| st.success("Document processed successfully! View the compliance report in the next tab.") | |
| except Exception as e: | |
| logger.error(f"An error occurred during processing: {str(e)}", exc_info=True) | |
| st.error(f"An error occurred during processing: {str(e)}") | |
| with tab2: | |
| st.header("Review Report") | |
| if not st.session_state.report_generated: | |
| st.info("Upload and process a document to generate a review report.") | |
| else: | |
| # Display summary | |
| st.subheader("Summary") | |
| summary = st.session_state.analysis_results.get("summary", {}) | |
| st.write(f"**Overall Assessment**: {summary.get('overall_assessment', 'N/A')}") | |
| st.write(f"**Total Issues**: {summary.get('total_issues', 'N/A')}") | |
| st.write(f"**Critical Issues**: {summary.get('critical_issues', 'N/A')}") | |
| st.write(f"**Warning Issues**: {summary.get('warning_issues', 'N/A')}") | |
| # Display recommendations | |
| st.subheader("Recommendations") | |
| recommendations = st.session_state.analysis_results.get("recommendations", []) | |
| if recommendations: | |
| for rec in recommendations: | |
| st.write(f"- {rec}") | |
| else: | |
| st.write("No recommendations.") | |
| # Display detailed report | |
| st.subheader("Detailed Report") | |
| issues = st.session_state.analysis_results.get("issues", []) | |
| if issues: | |
| for issue in issues: | |
| severity = issue.get('severity', 'N/A').lower() | |
| message = f"**{issue.get('severity', 'N/A').upper()}**: {issue.get('message', 'N/A')}" | |
| if severity == 'critical': | |
| st.error(message) | |
| elif severity == 'warning': | |
| st.warning(message) | |
| elif severity == 'info': | |
| st.info(message) | |
| else: | |
| st.success(message) | |
| st.write(f"**Location**: {issue.get('location', 'N/A')}") | |
| st.write(f"**Suggestion**: {issue.get('suggestion', 'N/A')}") | |
| st.divider() | |
| else: | |
| st.success("No issues found.") | |
| # Footer | |
| st.markdown("---") | |
| st.markdown("© Graduate Center, CUNY. Developed to assist with dissertation and thesis review.") | |