Spaces:
Sleeping
Sleeping
File size: 7,932 Bytes
9705159 66419b7 9705159 010dc77 9705159 010dc77 9705159 010dc77 9705159 010dc77 9705159 010dc77 9705159 66419b7 9705159 66419b7 9705159 66419b7 9705159 66419b7 9705159 66419b7 9705159 66419b7 9705159 66419b7 9705159 66419b7 9705159 66419b7 9705159 66419b7 9705159 66419b7 9705159 66419b7 9705159 66419b7 9705159 66419b7 9705159 66419b7 9705159 66419b7 9705159 66419b7 9705159 66419b7 9705159 66419b7 9705159 66419b7 9705159 |
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 159 160 161 162 163 164 165 166 167 |
import streamlit as st
import pandas as pd
from datetime import datetime, timedelta
from persiantools.jdatetime import JalaliDate
# Load schedule data from CSV
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
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 = ["شنبه", "یکشنبه", "دوشنبه", "سهشنبه", "چهارشنبه", "پنجشنبه", "جمعه"]
today = JalaliDate.today().to_gregorian()
current_day_index = today.weekday() # This returns the current day of the week as an integer (0=Monday, 6=Sunday)
# Adjusting days of the week to start from Saturday to match the Persian calendar
target_day_index = days_of_week.index(day_selected)
adjusted_day_index = (target_day_index + 1) % 7 # Mapping Saturday to 0, ..., Friday to 6
delta_days = (adjusted_day_index - current_day_index) % 7
# If the class day is today but time has passed, move to the next week
class_time = datetime.strptime(start_time_selected, "%H:%M").time()
if delta_days == 0 and class_time < datetime.now().time():
delta_days = 7
class_date = today + timedelta(days=delta_days)
class_datetime = datetime.combine(class_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("ورود")
st.session_state.username = st.text_input("نام کاربری")
st.session_state.password = st.text_input("رمز عبور", type='password')
user_details = load_user_details()
if st.button("ورود"):
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")
# Load schedule data again after login
st.session_state.schedule_data = load_schedule()
st.experimental_rerun()
else:
st.error("نام کاربری یا رمز عبور اشتباه است. لطفا دوباره تلاش کنید.")
# Class Schedule Page
def schedule_page():
st.title("برنامه کلاسی")
classes = ["فیزیک", "ریاضی", "شیمی", "برنامهنویسی"]
days = ["شنبه", "یکشنبه", "دوشنبه", "سهشنبه", "چهارشنبه", "پنجشنبه", "جمعه"]
start_times = ["08:00", "10:00", "12:00", "14:00"]
systems = ["سیستم ۱", "سیستم ۲", "سیستم ۳", "سیستم ۴", "سیستم ۵", "سیستم ۶"]
st.header("مدیریت کلاسها")
col1, col2 = st.columns(2)
with col1:
st.subheader("اضافه کردن کلاس")
class_selected = st.selectbox("کلاس", classes, key='add_class_select')
day_selected = st.selectbox("روز", days, key='add_day_select')
start_time_selected = st.selectbox("زمان شروع", start_times, key='add_time_select')
system_selected = st.selectbox("سیستم", systems, key='add_system_select')
if st.button("اضافه کردن کلاس"):
class_datetime = get_class_datetime(day_selected, start_time_selected)
if class_datetime - datetime.now() < timedelta(hours=30):
st.error("کلاسها باید حداقل ۳۰ ساعت قبل رزرو شوند.")
elif not has_system_availability(st.session_state.schedule_data, class_selected, day_selected, start_time_selected, system_selected):
st.error(f"سیستم '{system_selected}' در زمان '{start_time_selected}' در روز '{day_selected}' برای '{class_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_selected} با موفقیت اضافه شد به {system_selected}.")
with col2:
st.subheader("حذف کلاس")
if not st.session_state.schedule_data.empty and 'Username' in st.session_state.schedule_data.columns:
user_classes = st.session_state.schedule_data[
(st.session_state.schedule_data['Username'] == st.session_state.username) |
st.session_state.is_admin
]
if not user_classes.empty:
class_to_remove = st.selectbox("کلاس", user_classes['Class'].unique(), key='remove_class_select')
if st.button("حذف کلاس"):
if st.session_state.is_admin or not user_classes.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_to_remove} با موفقیت حذف شد.")
else:
st.error("شما فقط میتوانید کلاسهای خودتان را حذف کنید.")
else:
st.error("شما هیچ کلاسی برای حذف ندارید.")
else:
st.error("هیچ کلاسی برای حذف وجود ندارد یا ستون 'Username' موجود نیست.")
st.header("برنامه شما")
st.table(st.session_state.schedule_data)
if st.button("خروج"):
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()
|