Spaces:
Runtime error
Runtime error
| from flask import Flask, render_template, request, redirect, url_for, session, flash, send_from_directory | |
| from flask_sqlalchemy import SQLAlchemy | |
| from werkzeug.utils import secure_filename | |
| import os | |
| os.system("python dummy_user.py") | |
| app = Flask(__name__) | |
| app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db' | |
| app.config['SECRET_KEY'] = 'your_secret_key' | |
| app.config['UPLOAD_FOLDER'] = 'uploads' | |
| if not os.path.exists(app.config['UPLOAD_FOLDER']): | |
| os.makedirs(app.config['UPLOAD_FOLDER']) | |
| db = SQLAlchemy(app) | |
| # User model | |
| class User(db.Model): | |
| id = db.Column(db.Integer, primary_key=True) | |
| role = db.Column(db.String(10)) # student, staff, admin | |
| username = db.Column(db.String(50), unique=True, nullable=False) | |
| dob = db.Column(db.String(10)) | |
| # File model | |
| class File(db.Model): | |
| id = db.Column(db.Integer, primary_key=True) | |
| file_name = db.Column(db.String(200)) | |
| subject_name = db.Column(db.String(100)) | |
| category = db.Column(db.String(50)) | |
| subject_code = db.Column(db.String(20)) | |
| year = db.Column(db.String(10)) | |
| author_name = db.Column(db.String(100)) | |
| uploaded_by = db.Column(db.Integer, db.ForeignKey('user.id')) | |
| # Bookmark model | |
| class Bookmark(db.Model): | |
| id = db.Column(db.Integer, primary_key=True) | |
| user_id = db.Column(db.Integer, db.ForeignKey('user.id')) | |
| file_id = db.Column(db.Integer, db.ForeignKey('file.id')) | |
| def index(): | |
| files = File.query.all() | |
| return render_template('index.html', files=files) | |
| def login(): | |
| if request.method == 'POST': | |
| username = request.form['username'] | |
| dob = request.form['dob'] | |
| user = User.query.filter_by(username=username, dob=dob).first() | |
| if user: | |
| session['user_id'] = user.id | |
| session['role'] = user.role | |
| if user.role == 'admin': | |
| return redirect(url_for('admin_dashboard')) | |
| elif user.role == 'student': | |
| return redirect(url_for('student_dashboard')) | |
| elif user.role == 'staff': | |
| return redirect(url_for('staff_dashboard')) | |
| else: | |
| flash("Invalid credentials!") | |
| return render_template('login.html') | |
| def student_dashboard(): | |
| if 'user_id' in session and session['role'] == 'student': | |
| user_id = session['user_id'] | |
| all_files = File.query.all() | |
| user_uploaded_files = File.query.filter_by(uploaded_by=user_id).all() | |
| bookmarked_files = File.query.join(Bookmark).filter(Bookmark.user_id == user_id).all() | |
| return render_template( | |
| 'student_dashboard.html', | |
| all_files=all_files, | |
| user_uploaded_files=user_uploaded_files, | |
| bookmarked_files=bookmarked_files | |
| ) | |
| return redirect(url_for('login')) | |
| def staff_dashboard(): | |
| if 'user_id' in session and session['role'] == 'staff': | |
| user_id = session['user_id'] | |
| all_files = File.query.all() | |
| user_uploaded_files = File.query.filter_by(uploaded_by=user_id).all() | |
| bookmarked_files = File.query.join(Bookmark).filter(Bookmark.user_id == user_id).all() | |
| return render_template( | |
| 'staff_dashboard.html', | |
| all_files=all_files, | |
| user_uploaded_files=user_uploaded_files, | |
| bookmarked_files=bookmarked_files | |
| ) | |
| return redirect(url_for('login')) | |
| def admin_dashboard(): | |
| if 'user_id' in session and session['role'] == 'admin': | |
| users = User.query.all() | |
| files = File.query.all() | |
| return render_template('admin_dashboard.html', users=users, files=files) | |
| return redirect(url_for('login')) | |
| def upload(): | |
| if 'user_id' in session and session['role'] in ['student', 'staff']: | |
| if request.method == 'POST': | |
| file = request.files['file'] | |
| subject_name = request.form['subject_name'] | |
| category = request.form['category'] | |
| subject_code = request.form['subject_code'] | |
| year = request.form['year'] | |
| author_name = request.form['author_name'] | |
| if file and subject_name and category and subject_code and year and author_name: | |
| filename = secure_filename(file.filename) | |
| file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) | |
| new_file = File( | |
| file_name=filename, | |
| subject_name=subject_name, | |
| category=category, | |
| subject_code=subject_code, | |
| year=year, | |
| author_name=author_name, | |
| uploaded_by=session['user_id'] | |
| ) | |
| db.session.add(new_file) | |
| db.session.commit() | |
| flash("File uploaded successfully!") | |
| return redirect(url_for('student_dashboard' if session['role'] == 'student' else 'staff_dashboard')) | |
| else: | |
| flash("All fields are required!") | |
| return render_template('upload.html') | |
| return redirect(url_for('login')) | |
| def delete_file(file_id): | |
| if 'user_id' in session: | |
| file = File.query.get(file_id) | |
| if not file: | |
| flash("File not found!") | |
| elif file.uploaded_by == session['user_id'] or session['role'] == 'admin': | |
| try: | |
| # Remove associated bookmarks | |
| Bookmark.query.filter_by(file_id=file_id).delete() | |
| # Delete the file from the file system | |
| file_path = os.path.join(app.config['UPLOAD_FOLDER'], file.file_name) | |
| if os.path.exists(file_path): | |
| os.remove(file_path) | |
| # Delete the file record from the database | |
| db.session.delete(file) | |
| db.session.commit() | |
| flash("File deleted successfully!") | |
| except Exception as e: | |
| flash(f"An error occurred while deleting the file: {str(e)}") | |
| else: | |
| flash("You do not have permission to delete this file!") | |
| return redirect(url_for('student_dashboard' if session['role'] == 'student' else 'staff_dashboard')) | |
| return redirect(url_for('login')) | |
| def delete_user(user_id): | |
| if 'user_id' in session and session['role'] == 'admin': | |
| user = User.query.get(user_id) | |
| if not user: | |
| flash("User not found!") | |
| elif user.role == 'admin': | |
| flash("You cannot delete another admin!") | |
| else: | |
| try: | |
| # Check if the user has uploaded any files | |
| files = File.query.filter_by(uploaded_by=user_id).all() | |
| for file in files: | |
| # Remove associated bookmarks | |
| Bookmark.query.filter_by(file_id=file.id).delete() | |
| # Delete file from the file system | |
| file_path = os.path.join(app.config['UPLOAD_FOLDER'], file.file_name) | |
| if os.path.exists(file_path): | |
| os.remove(file_path) | |
| # Delete the file record | |
| db.session.delete(file) | |
| # Delete the user record | |
| db.session.delete(user) | |
| db.session.commit() | |
| flash("User and their uploaded files deleted successfully!") | |
| except Exception as e: | |
| flash(f"An error occurred while deleting the user: {str(e)}") | |
| return redirect(url_for('admin_dashboard')) | |
| flash("You do not have permission to perform this action!") | |
| return redirect(url_for('login')) | |
| def bookmark(file_id): | |
| if 'user_id' in session: | |
| user_id = session['user_id'] | |
| bookmark = Bookmark.query.filter_by(user_id=user_id, file_id=file_id).first() | |
| if bookmark: | |
| db.session.delete(bookmark) | |
| db.session.commit() | |
| flash("Bookmark removed!") | |
| else: | |
| new_bookmark = Bookmark(user_id=user_id, file_id=file_id) | |
| db.session.add(new_bookmark) | |
| db.session.commit() | |
| flash("Bookmark added!") | |
| return redirect(url_for('student_dashboard' if session['role'] == 'student' else 'staff_dashboard')) | |
| return redirect(url_for('login')) | |
| def uploaded_file(filename): | |
| return send_from_directory(app.config['UPLOAD_FOLDER'], filename) | |
| def logout(): | |
| session.clear() | |
| return redirect(url_for('login')) | |
| if __name__ == '__main__': | |
| with app.app_context(): | |
| db.create_all() | |
| app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860))) | |