Files
unit-selector/Build/main.py

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