181 lines
6.2 KiB
Python
181 lines
6.2 KiB
Python
import os
|
|
import uuid
|
|
import json
|
|
import uvicorn
|
|
from flask import Flask, render_template_string, request, redirect, url_for, session, flash
|
|
# --- CONFIGURATION ---
|
|
app = Flask(__name__)
|
|
app.secret_key = 'azad_university_secret_key'
|
|
USERS_FILE = 'users/users.json'
|
|
|
|
TEMPLATE = open('ui/main.html', 'r').read()
|
|
|
|
# --- DATA PERSISTENCE HELPER FUNCTIONS ---
|
|
|
|
def load_users():
|
|
"""Loads users from the JSON file. Returns an empty list if file doesn't exist."""
|
|
if not os.path.exists(USERS_FILE):
|
|
return []
|
|
try:
|
|
with open(USERS_FILE, 'r', encoding='utf-8') as f:
|
|
return json.load(f)
|
|
except (json.JSONDecodeError, IOError):
|
|
return []
|
|
|
|
def save_users(users_list):
|
|
"""Saves the current list of users to the JSON file."""
|
|
try:
|
|
with open(USERS_FILE, 'w', encoding='utf-8') as f:
|
|
json.dump(users_list, f, ensure_ascii=False, indent=4)
|
|
except IOError as e:
|
|
print(f"Error saving data: {e}")
|
|
|
|
def get_user_courses(username):
|
|
"""Loads courses for a specific user from their JSON file."""
|
|
user_file = f'users_courses/{username}.json'
|
|
if not os.path.exists(user_file):
|
|
return []
|
|
try:
|
|
with open(user_file, 'r', encoding='utf-8') as f:
|
|
return json.load(f)
|
|
except (json.JSONDecodeError, IOError):
|
|
return []
|
|
|
|
def save_user_courses(username, courses_list):
|
|
"""Saves courses for a specific user to their JSON file."""
|
|
# Ensure directory exists
|
|
os.makedirs('users_courses', exist_ok=True)
|
|
user_file = f'users_courses/{username}.json'
|
|
try:
|
|
with open(user_file, 'w', encoding='utf-8') as f:
|
|
json.dump(courses_list, f, ensure_ascii=False, indent=4)
|
|
except IOError as e:
|
|
print(f"Error saving data: {e}")
|
|
|
|
# --- AUTHENTICATION ROUTES ---
|
|
|
|
@app.route('/register', methods=['GET', 'POST'])
|
|
def register():
|
|
if request.method == 'POST':
|
|
username = request.form.get('username')
|
|
password = request.form.get('password')
|
|
|
|
users = load_users()
|
|
|
|
# Check if username already exists
|
|
for user in users:
|
|
if user['username'] == username:
|
|
flash('نام کاربری قبلاً ثبت شده است', 'error')
|
|
return redirect(url_for('register'))
|
|
|
|
# Create new user
|
|
new_user = {
|
|
'id': str(uuid.uuid4()),
|
|
'username': username,
|
|
'password': password # In production, use password hashing!
|
|
}
|
|
users.append(new_user)
|
|
save_users(users)
|
|
|
|
flash('ثبت نام موفقیتآمیز بود! حالا وارد شوید', 'success')
|
|
return redirect(url_for('login'))
|
|
|
|
return render_template_string(TEMPLATE, page='register')
|
|
|
|
@app.route('/login', methods=['GET', 'POST'])
|
|
def login():
|
|
if request.method == 'POST':
|
|
username = request.form.get('username')
|
|
password = request.form.get('password')
|
|
|
|
users = load_users()
|
|
|
|
# Check credentials
|
|
for user in users:
|
|
if user['username'] == username and user['password'] == password:
|
|
session['user_id'] = user['id']
|
|
session['username'] = user['username']
|
|
flash(f'خوش آمدید، {username}!', 'success')
|
|
return redirect(url_for('index'))
|
|
|
|
flash('نام کاربری یا رمز عبور اشتباه است', 'error')
|
|
return redirect(url_for('login'))
|
|
|
|
return render_template_string(TEMPLATE, page='login')
|
|
|
|
@app.route('/logout')
|
|
def logout():
|
|
session.pop('user_id', None)
|
|
session.pop('username', None)
|
|
flash('با موفقیت خارج شدید', 'success')
|
|
return redirect(url_for('login'))
|
|
|
|
# --- MAIN ROUTES ---
|
|
|
|
@app.route('/')
|
|
def index():
|
|
if 'user_id' not in session:
|
|
return redirect(url_for('login'))
|
|
|
|
courses = get_user_courses(session['username'])
|
|
# Sort courses: High priority first
|
|
priority_order = {"high": 0, "normal": 1, "low": 2}
|
|
sorted_courses = sorted(courses, key=lambda x: priority_order.get(x["priority"], 1))
|
|
return render_template_string(TEMPLATE, courses=sorted_courses, username=session['username'])
|
|
|
|
@app.route('/add', methods=['POST'])
|
|
def add_course():
|
|
if 'user_id' not in session:
|
|
return redirect(url_for('login'))
|
|
|
|
courses = get_user_courses(session['username'])
|
|
new_course = {
|
|
"id": str(uuid.uuid4()),
|
|
"name": request.form.get('name'),
|
|
"code": request.form.get('code'),
|
|
"group": request.form.get('group'),
|
|
"day": request.form.get('day'),
|
|
"prof": request.form.get('prof'),
|
|
"priority": request.form.get('priority')
|
|
}
|
|
courses.append(new_course)
|
|
save_user_courses(session['username'], courses)
|
|
return redirect(url_for('index'))
|
|
|
|
@app.route('/delete/<course_id>')
|
|
def delete_course(course_id):
|
|
if 'user_id' not in session:
|
|
return redirect(url_for('login'))
|
|
|
|
courses = get_user_courses(session['username'])
|
|
# Filter out the course with the matching ID
|
|
updated_courses = [c for c in courses if c['id'] != course_id]
|
|
save_user_courses(session['username'], updated_courses)
|
|
return redirect(url_for('index'))
|
|
|
|
@app.route('/edit/<course_id>', methods=['GET', 'POST'])
|
|
def edit_course(course_id):
|
|
if 'user_id' not in session:
|
|
return redirect(url_for('login'))
|
|
|
|
courses = get_user_courses(session['username'])
|
|
course = next((c for c in courses if c['id'] == course_id), None)
|
|
|
|
if not course:
|
|
flash('درس مورد نظر یافت نشد', 'error')
|
|
return redirect(url_for('index'))
|
|
|
|
if request.method == 'POST':
|
|
course['name'] = request.form.get('name')
|
|
course['code'] = request.form.get('code')
|
|
course['group'] = request.form.get('group')
|
|
course['day'] = request.form.get('day')
|
|
course['prof'] = request.form.get('prof')
|
|
course['priority'] = request.form.get('priority')
|
|
save_user_courses(session['username'], courses)
|
|
flash('درس با موفقیت ویرایش شد', 'success')
|
|
return redirect(url_for('index'))
|
|
|
|
return render_template_string(TEMPLATE, page='edit_course', course=course, username=session['username'])
|
|
|