Spaces:
Sleeping
Sleeping
File size: 6,843 Bytes
430763b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
import streamlit as st
import pandas as pd
from datetime import datetime, timedelta
# Load schedule data from CSV
@st.cache_data
def load_schedule():
try:
schedule_data = pd.read_csv('schedule.csv')
except FileNotFoundError:
schedule_data = pd.DataFrame(columns=['Class', 'Day', 'Start Time', 'Username', 'System'])
return schedule_data
# Save schedule data to CSV
def save_schedule(schedule_data):
schedule_data.to_csv('schedule.csv', index=False)
# Load user details from CSV
@st.cache_data
def load_user_details():
try:
user_details = pd.read_csv('details.csv')
except FileNotFoundError:
user_details = pd.DataFrame(columns=['username', 'password'])
return user_details
# Check for system availability
def has_system_availability(schedule_data, class_selected, day_selected, start_time_selected, system_selected):
bookings = schedule_data[
(schedule_data['Class'] == class_selected) &
(schedule_data['Day'] == day_selected) &
(schedule_data['Start Time'] == start_time_selected)
]
if len(bookings) >= 6:
return False
elif system_selected in bookings['System'].values:
return False
else:
return True
# Convert string day and time to datetime
def get_class_datetime(day_selected, start_time_selected):
days_of_week = ["Sunday", "Monday", "Tuesday", "Wednesday"]
today = datetime.now()
current_day_index = today.weekday()
# Find the date of the next occurrence of the given day
target_day_index = days_of_week.index(day_selected)
delta_days = (target_day_index - current_day_index) % 7
# If the class day is today but time has passed, move to the next week
if delta_days == 0 and datetime.strptime(start_time_selected, "%I:%M %p").time() < today.time():
delta_days = 7
class_date = today + timedelta(days=delta_days)
class_time = datetime.strptime(start_time_selected, "%I:%M %p").time()
class_datetime = datetime.combine(class_date.date(), class_time)
return class_datetime
# Initialize session state variables
if 'username' not in st.session_state:
st.session_state.username = ""
if 'password' not in st.session_state:
st.session_state.password = ""
if 'schedule_data' not in st.session_state:
st.session_state.schedule_data = load_schedule()
if 'authenticated' not in st.session_state:
st.session_state.authenticated = False
if 'is_admin' not in st.session_state:
st.session_state.is_admin = False
# Login Page
def login_page():
st.title("Login")
st.session_state.username = st.text_input("Username")
st.session_state.password = st.text_input("Password", type='password')
user_details = load_user_details()
if st.button("Login"):
if (
(st.session_state.username in user_details['username'].values) and
(st.session_state.password in user_details[user_details['username'] == st.session_state.username]['password'].values)
) or (st.session_state.username == "armin" and st.session_state.password == "12345679"):
st.session_state.authenticated = True
st.session_state.is_admin = (st.session_state.username == "armin")
st.experimental_rerun()
else:
st.error("Invalid username or password. Please try again.")
# Class Schedule Page
def schedule_page():
st.title("Class Schedule")
classes = ["mobile", "Math", "Chemistry", "Programming"]
days = ["Sunday", "Monday", "Tuesday", "Wednesday"]
start_times = ["8:00 AM", "10:00 AM", "12:00 PM", "2:00 PM"]
systems = ["System 1", "System 2", "System 3", "System 4", "System 5", "System 6"]
st.header("Manage Classes")
col1, col2 = st.columns(2)
with col1:
st.subheader("Add a Class")
class_selected = st.selectbox("Class", classes, key='add_class_select')
day_selected = st.selectbox("Day", days, key='add_day_select')
start_time_selected = st.selectbox("Start Time", start_times, key='add_time_select')
system_selected = st.selectbox("System", systems, key='add_system_select')
if st.button("Add Class"):
class_datetime = get_class_datetime(day_selected, start_time_selected)
if class_datetime - datetime.now() < timedelta(hours=30):
st.error("Classes can only be booked at least 30 hours in advance.")
elif not has_system_availability(st.session_state.schedule_data, class_selected, day_selected, start_time_selected, system_selected):
st.error(f"System '{system_selected}' is not available for '{class_selected}' at {start_time_selected} on {day_selected}.")
else:
new_row = pd.DataFrame([[class_selected, day_selected, start_time_selected, st.session_state.username, system_selected]], columns=['Class', 'Day', 'Start Time', 'Username', 'System'])
st.session_state.schedule_data = pd.concat([st.session_state.schedule_data, new_row], ignore_index=True)
save_schedule(st.session_state.schedule_data)
st.success(f"Class {class_selected} added successfully with {system_selected}.")
with col2:
st.subheader("Remove a Class")
class_to_remove = st.selectbox("Class", st.session_state.schedule_data['Class'].unique(), key='remove_class_select')
user_booking = st.session_state.schedule_data[
(st.session_state.schedule_data['Class'] == class_to_remove) &
(st.session_state.schedule_data['Username'] == st.session_state.username)
]
if st.button("Remove Class"):
if st.session_state.is_admin or not user_booking.empty:
st.session_state.schedule_data = st.session_state.schedule_data[~(
(st.session_state.schedule_data['Class'] == class_to_remove) &
((st.session_state.is_admin) or (st.session_state.schedule_data['Username'] == st.session_state.username))
)]
save_schedule(st.session_state.schedule_data)
st.success(f"Class {class_to_remove} removed successfully.")
else:
st.error("You can only remove your own classes.")
st.header("Your Schedule")
st.table(st.session_state.schedule_data)
if st.button("Log Out"):
st.session_state['authenticated'] = False
st.session_state['username'] = ""
st.session_state['password'] = ""
st.session_state['is_admin'] = False
st.experimental_rerun()
# Authentication check
if not st.session_state['authenticated']:
login_page()
else:
schedule_page()
|