Schedule_App / app.py
3morrrrr's picture
Update app.py
ac50c2d verified
import os
import zipfile
import pandas as pd
import gradio as gr
from helper import assign_main_accounts, generate_schedule, save_processed_files
# Global Constants
UPLOAD_FOLDER = "uploads"
PROCESSED_FOLDER = "processed"
ZIP_FILE = "processed_files.zip"
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
os.makedirs(PROCESSED_FOLDER, exist_ok=True)
# Create an empty ZIP file if it doesn't exist
if not os.path.exists(ZIP_FILE):
with zipfile.ZipFile(ZIP_FILE, "w") as zipf:
pass
USERNAME = "admin"
PASSWORD = "password123"
# Helper Functions
def login(username, password):
if username == USERNAME and password == PASSWORD:
return "Login Successful!", True
else:
return "Invalid credentials. Try again.", False
def upload_files(creators_file, overnight_file, day_file, prime_file):
try:
with open(os.path.join(UPLOAD_FOLDER, "creators_file.xlsx"), "wb") as f:
f.write(creators_file)
with open(os.path.join(UPLOAD_FOLDER, "overnight_file.xlsx"), "wb") as f:
f.write(overnight_file)
with open(os.path.join(UPLOAD_FOLDER, "day_file.xlsx"), "wb") as f:
f.write(day_file)
with open(os.path.join(UPLOAD_FOLDER, "prime_file.xlsx"), "wb") as f:
f.write(prime_file)
return "Files uploaded successfully!"
except Exception as e:
return f"Error uploading files: {e}"
def generate_main_accounts():
creators_file = os.path.join(UPLOAD_FOLDER, "creators_file.xlsx")
chatter_files = [
os.path.join(UPLOAD_FOLDER, "overnight_file.xlsx"),
os.path.join(UPLOAD_FOLDER, "day_file.xlsx"),
os.path.join(UPLOAD_FOLDER, "prime_file.xlsx"),
]
if not all(os.path.exists(path) for path in [creators_file] + chatter_files):
return "Missing required files. Please upload all necessary files.", None, None
try:
updated_chatter_files, processed_creator_file, combined_assignments = assign_main_accounts(
creators_file, chatter_files
)
# Add the `Shift` column to the combined assignments
shifts = ["Overnight", "Day", "Prime"]
for idx, chatter_df in enumerate(updated_chatter_files):
chatter_df["Shift"] = shifts[idx]
updated_chatter_files[idx] = chatter_df
combined_assignments = pd.concat(updated_chatter_files)
# Save updated files
for idx, chatter_df in enumerate(updated_chatter_files):
chatter_df.to_excel(
os.path.join(PROCESSED_FOLDER, f"Updated_{shifts[idx].lower()}_file.xlsx"),
index=False
)
processed_creator_file.to_excel(
os.path.join(PROCESSED_FOLDER, "creators_file.xlsx"), index=False
)
# Create a zip file containing all processed files
with zipfile.ZipFile(ZIP_FILE, "w") as zipf:
for root, _, files in os.walk(PROCESSED_FOLDER):
for file in files:
zipf.write(os.path.join(root, file), arcname=file)
return "Main accounts generated successfully!", combined_assignments, processed_creator_file
except Exception as e:
return f"Error during main account generation: {e}", None, None
def update_assignments(assignments_df, creators_df):
try:
print("DEBUG: Assignments DataFrame Columns:", assignments_df.columns)
shifts = ["Overnight", "Day", "Prime"]
for shift in shifts:
shift_data = assignments_df[assignments_df["Shift"] == shift]
shift_file_path = os.path.join(PROCESSED_FOLDER, f"Updated_{shift.lower()}_file.xlsx")
shift_data.to_excel(shift_file_path, index=False)
creators_file_path = os.path.join(PROCESSED_FOLDER, "creators_file.xlsx")
creators_df.to_excel(creators_file_path, index=False)
# Update the ZIP file with the latest files
with zipfile.ZipFile(ZIP_FILE, "w") as zipf:
for root, _, files in os.walk(PROCESSED_FOLDER):
for file in files:
zipf.write(os.path.join(root, file), arcname=file)
return "Assignments and Creator File updated successfully!", ZIP_FILE
except Exception as e:
return f"Error updating assignments: {e}", None
def update_and_download_schedule(overnight_df, day_df, prime_df):
try:
# Save updated schedules to the processed folder
overnight_path = os.path.join(PROCESSED_FOLDER, "Updated_Overnight_Schedule.xlsx")
day_path = os.path.join(PROCESSED_FOLDER, "Updated_Day_Schedule.xlsx")
prime_path = os.path.join(PROCESSED_FOLDER, "Updated_Prime_Schedule.xlsx")
overnight_df.to_excel(overnight_path, index=False)
day_df.to_excel(day_path, index=False)
prime_df.to_excel(prime_path, index=False)
# Zip the updated files for download
with zipfile.ZipFile(ZIP_FILE, "w") as zipf:
zipf.write(overnight_path, arcname="Updated_Overnight_Schedule.xlsx")
zipf.write(day_path, arcname="Updated_Day_Schedule.xlsx")
zipf.write(prime_path, arcname="Updated_Prime_Schedule.xlsx")
return "Schedules updated and saved successfully!", ZIP_FILE
except Exception as e:
return f"Error updating schedules: {e}", None
def generate_full_schedule(creators_file_path, overnight_file_path, day_file_path, prime_file_path):
try:
# Log file paths for debugging
print(f"DEBUG: Creators File Path: {creators_file_path}")
print(f"DEBUG: Overnight File Path: {overnight_file_path}")
print(f"DEBUG: Day File Path: {day_file_path}")
print(f"DEBUG: Prime File Path: {prime_file_path}")
# Read files
creators_data = pd.read_excel(creators_file_path)
overnight_data = pd.read_excel(overnight_file_path)
day_data = pd.read_excel(day_file_path)
prime_data = pd.read_excel(prime_file_path)
print("DEBUG: Creators File Columns:", creators_data.columns)
# Validate structure
if not {"Creator", "ActiveFans"}.issubset(creators_data.columns):
raise KeyError("The account data must contain 'Creator' and 'ActiveFans' columns.")
# Pass data to generate_schedule
chatter_files = [overnight_data, day_data, prime_data]
full_schedule = generate_schedule(chatter_files, creators_data)
# Extract individual schedules
overnight_schedule = full_schedule["Overnight"]
day_schedule = full_schedule["Day"]
prime_schedule = full_schedule["Prime"]
print("DEBUG: Overnight Schedule:", overnight_schedule.head())
print("DEBUG: Day Schedule:", day_schedule.head())
print("DEBUG: Prime Schedule:", prime_schedule.head())
return overnight_schedule, day_schedule, prime_schedule
except Exception as e:
print(f"DEBUG: Error in generate_full_schedule: {e}")
return f"Error generating schedule: {e}", None, None
# Gradio Interface
def app():
with gr.Blocks() as interface:
with gr.Tab("Login"):
username = gr.Textbox(label="Username")
password = gr.Textbox(label="Password", type="password")
login_btn = gr.Button("Login")
login_status = gr.Textbox(label="Login Status", interactive=False)
login_btn.click(
login,
inputs=[username, password],
outputs=[login_status],
)
with gr.Tab("Upload Files"):
creators_file = gr.File(label="Creators File", type="binary")
overnight_file = gr.File(label="Overnight File", type="binary")
day_file = gr.File(label="Day File", type="binary")
prime_file = gr.File(label="Prime File", type="binary")
upload_btn = gr.Button("Upload Files")
upload_status = gr.Textbox(label="Upload Status", interactive=False)
upload_btn.click(
upload_files,
inputs=[creators_file, overnight_file, day_file, prime_file],
outputs=[upload_status],
)
with gr.Tab("Generate Main Accounts"):
generate_main_status = gr.Textbox(label="Status", interactive=False)
assignments_preview = gr.Dataframe(label="Main Account Assignments Preview", interactive=True)
creators_preview = gr.Dataframe(label="Processed Creator File Preview", interactive=True)
generate_main_btn = gr.Button("Generate Main Accounts")
update_btn = gr.Button("Update and Download Files")
download_zip_btn = gr.File(label="Download Processed Files", value=ZIP_FILE)
generate_main_btn.click(
generate_main_accounts,
inputs=[],
outputs=[generate_main_status, assignments_preview, creators_preview],
)
update_btn.click(
update_assignments,
inputs=[assignments_preview, creators_preview],
outputs=[generate_main_status, download_zip_btn],
)
with gr.Tab("Generate Full Schedule"):
creators_file = gr.File(label="Creators File", type="binary")
overnight_file = gr.File(label="Overnight File", type="binary")
day_file = gr.File(label="Day File", type="binary")
prime_file = gr.File(label="Prime File", type="binary")
generate_schedule_btn = gr.Button("Generate Full Schedule")
overnight_schedule_output = gr.Dataframe(label="Overnight Schedule", interactive=True)
day_schedule_output = gr.Dataframe(label="Day Schedule", interactive=True)
prime_schedule_output = gr.Dataframe(label="Prime Schedule", interactive=True)
update_schedule_btn = gr.Button("Update and Download Schedule")
download_schedule_btn = gr.File(label="Download Updated Schedules", value=ZIP_FILE)
update_status = gr.Textbox(label="Update Status", interactive=False)
# Generate Schedule
generate_schedule_btn.click(
generate_full_schedule,
inputs=[creators_file, overnight_file, day_file, prime_file],
outputs=[overnight_schedule_output, day_schedule_output, prime_schedule_output]
)
# Update and Download Schedule
update_schedule_btn.click(
update_and_download_schedule,
inputs=[overnight_schedule_output, day_schedule_output, prime_schedule_output],
outputs=[update_status, download_schedule_btn]
)
return interface
if __name__ == "__main__":
app().launch()