flask_test / app.py
harichselvamc's picture
Update app.py
e541c80 verified
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'))
@app.route('/')
def index():
files = File.query.all()
return render_template('index.html', files=files)
@app.route('/login', methods=['GET', 'POST'])
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')
@app.route('/student_dashboard')
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'))
@app.route('/staff_dashboard')
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'))
@app.route('/admin_dashboard', methods=['GET', 'POST'])
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'))
@app.route('/upload', methods=['GET', 'POST'])
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'))
@app.route('/delete/<int:file_id>')
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'))
@app.route('/admin/delete_user/<int:user_id>', methods=['GET'])
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'))
@app.route('/bookmark/<int:file_id>')
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'))
@app.route('/uploads/<filename>')
def uploaded_file(filename):
return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
@app.route('/logout')
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)))