import gradio as gr
import pandas as pd
import os
import logging
from weasyprint import HTML
from pdf2image import convert_from_path
logging.basicConfig(level=logging.INFO)
# Name of the default CSV file. Ensure this file exists in your repository.
DEFAULT_CSV = "default.csv"
def load_csv(file):
"""
Load a CSV file from the given file path.
If the file is missing, empty, or is a directory, load the default CSV.
"""
cwd = os.getcwd()
logging.info(f"load_csv received: {file}")
# If file is empty, None, or a directory, use the default CSV.
if not file or file.strip() == "" or os.path.isdir(file) or os.path.abspath(file) == cwd:
logging.info("No valid file provided; using default CSV.")
if os.path.isfile(DEFAULT_CSV):
return pd.read_csv(DEFAULT_CSV)
else:
raise FileNotFoundError("Default CSV not found.")
# If the file exists and is not a directory, load it.
if os.path.isfile(file):
logging.info(f"Loading uploaded CSV: {file}")
return pd.read_csv(file)
logging.warning(f"Provided file path '{file}' is not valid. Using default CSV.")
return pd.read_csv(DEFAULT_CSV)
def build_tree(df):
employees = {}
children = {}
all_emps = set()
all_managers = set()
for _, row in df.iterrows():
name = row["Name"].strip()
role = row["Role"].strip()
label = f"{name}
({role})"
employees[name] = label
all_emps.add(name)
children.setdefault(name, [])
for _, row in df.iterrows():
subordinate = row["Name"].strip()
manager = str(row["Reporting To"]).strip()
if manager and manager.lower() != "nan":
children.setdefault(manager, []).append(subordinate)
all_managers.add(manager)
roots = [emp for emp in all_emps if emp not in all_managers]
if not roots:
roots = [df.iloc[0]["Name"].strip()]
return employees, children, roots
def generate_node_html(node, employees, children, visited=None):
if visited is None:
visited = set()
if node in visited:
return f"