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/') 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/', 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'])