Spaces:
Running
Running
import streamlit as st | |
from section_extract import find_cover, find_underwriter, find_financial | |
from streamlit_pdf_viewer import pdf_viewer | |
def process_sections(): | |
if "processing" not in st.session_state or st.session_state.get("all_processed", False): | |
return | |
# Only process the current page if it's set and not processed | |
current_page = st.session_state.get("current_page") | |
current_page_needs_processing = False | |
if current_page and not st.session_state.get(current_page, None): | |
if not st.session_state["processing"].get(current_page, False): | |
current_page_needs_processing = True | |
key = current_page | |
if key == "cover_path": | |
st.session_state[key] = find_cover(st.session_state["uploaded_file"]) | |
elif key == "underwriter_path": | |
st.session_state[key] = find_underwriter(st.session_state["uploaded_file"]) | |
elif key == "income_statement_path": | |
st.session_state[key] = find_financial(st.session_state["uploaded_file"], "income_statement") | |
elif key == "balance_sheet_path": | |
st.session_state[key] = find_financial(st.session_state["uploaded_file"], "balance_sheet") | |
elif key == "cash_flow_path": | |
st.session_state[key] = find_financial(st.session_state["uploaded_file"], "cash_flow") | |
st.session_state["processing"][key] = True | |
st.rerun() | |
# Process remaining sections if not processing current page and not locked | |
if not current_page_needs_processing and not st.session_state.get("processing_lock", False): | |
sections_to_process = [ | |
("cover_path", lambda: find_cover(st.session_state["uploaded_file"])), | |
("underwriter_path", lambda: find_underwriter(st.session_state["uploaded_file"])), | |
("income_statement_path", lambda: find_financial(st.session_state["uploaded_file"], "income_statement")), | |
("balance_sheet_path", lambda: find_financial(st.session_state["uploaded_file"], "balance_sheet")), | |
("cash_flow_path", lambda: find_financial(st.session_state["uploaded_file"], "cash_flow")) | |
] | |
# Store the section being processed | |
if "processing_section" not in st.session_state: | |
st.session_state["processing_section"] = None | |
for key, process_func in sections_to_process: | |
if not st.session_state["processing"].get(key, False): | |
# Check if we've switched pages during processing | |
if (st.session_state.get("processing_section") is not None and | |
st.session_state["processing_section"] != current_page): | |
st.session_state["processing_section"] = None | |
return # Stop processing if we've switched pages | |
st.session_state["processing_section"] = key | |
st.session_state[key] = process_func() | |
st.session_state["processing"][key] = True | |
st.session_state["processing_section"] = None | |
if not st.session_state.get("all_processed", False): | |
st.rerun() # Trigger another run to process next section | |
break | |
# Check if all sections are processed | |
st.session_state["all_processed"] = all(st.session_state["processing"].values()) | |
def show_section(section_key): | |
"""Display the section if available, otherwise inform the user.""" | |
# Check if we're switching to a different page | |
if st.session_state.get("current_page") != section_key: | |
# Reset processing state when switching pages | |
st.session_state["processing_lock"] = True | |
st.session_state["processing_section"] = None | |
# Update current page | |
st.session_state["current_page"] = section_key | |
temp_path = st.session_state.get(section_key) | |
if temp_path: | |
# If we have the section, allow background processing of other sections | |
st.session_state["processing_lock"] = False | |
pdf_viewer(temp_path) | |
# Continue processing remaining sections | |
if not st.session_state.get("all_processed", False): | |
process_sections() | |
else: | |
# Lock processing and process this section first | |
st.session_state["processing_lock"] = True | |
if not st.session_state["processing"].get(section_key, False): | |
st.info(f"Processing {section_key.replace('_path', '').replace('_', ' ').title()}...") | |
process_sections() | |
else: | |
st.warning(f"Could not process {section_key.replace('_path', '').replace('_', ' ')}.") | |