File size: 6,103 Bytes
ab79ca3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | from flask import Flask, render_template, request, redirect, url_for, session, flash, send_from_directory
from werkzeug.utils import secure_filename
from werkzeug.security import generate_password_hash, check_password_hash
import os
from datetime import datetime
from models import db, User, Resource
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key_here'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///resource_management.db'
app.config['UPLOAD_FOLDER'] = 'uploads'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
# Ensure uploads folder exists
if not os.path.exists(app.config['UPLOAD_FOLDER']):
os.makedirs(app.config['UPLOAD_FOLDER'])
# Create database tables automatically
with app.app_context():
db.create_all()
@app.route('/')
def index():
if 'username' not in session:
return redirect(url_for('login'))
username = session['username']
user_type = session['user_type']
resource_count = Resource.query.count()
last_login = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
return render_template('index.html', username=username, user_type=user_type, resource_count=resource_count, last_login=last_login)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
user_type = request.form['user_type']
user = User.query.filter_by(username=username, user_type=user_type).first()
if user and check_password_hash(user.password, password):
session['username'] = user.username
session['user_type'] = user.user_type
return redirect(url_for('index'))
else:
flash('Invalid username, password, or user type.', 'error')
return render_template('login.html')
@app.route('/signup', methods=['GET', 'POST'])
def signup():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
confirm_password = request.form['confirm_password']
user_type = request.form['user_type']
if password != confirm_password:
flash('Passwords do not match!', 'error')
return redirect(url_for('signup'))
existing_user = User.query.filter_by(username=username).first()
if existing_user:
flash('Username already exists.', 'error')
return redirect(url_for('signup'))
hashed_password = generate_password_hash(password)
new_user = User(username=username, password=hashed_password, user_type=user_type)
db.session.add(new_user)
db.session.commit()
flash('Account created successfully. Please log in.', 'success')
return redirect(url_for('login'))
return render_template('signup.html')
@app.route('/logout')
def logout():
session.clear()
return redirect(url_for('login'))
@app.route('/view_resources', methods=['GET', 'POST'])
def view_resources():
if 'username' not in session:
return redirect(url_for('login'))
user_type = session['user_type']
institutions = db.session.query(Resource.institution).distinct()
resource_types = db.session.query(Resource.type).distinct()
filters = {}
if request.method == 'POST':
if 'delete_resource' in request.form and user_type == 'admin':
resource_id = request.form['delete_resource']
resource = Resource.query.get(resource_id)
if resource:
try:
os.remove(os.path.join(app.config['UPLOAD_FOLDER'], resource.resource_file))
except FileNotFoundError:
pass
db.session.delete(resource)
db.session.commit()
flash('Resource deleted successfully.', 'success')
else:
flash('Resource not found.', 'error')
return redirect(url_for('view_resources'))
filters['institution'] = request.form.get('institution')
filters['department'] = request.form.get('department')
filters['resource_type'] = request.form.get('resource_type')
query = Resource.query
if filters.get('institution'):
query = query.filter_by(institution=filters['institution'])
if filters.get('department'):
query = query.filter_by(department=filters['department'])
if filters.get('resource_type'):
query = query.filter_by(type=filters['resource_type'])
resources = query.all()
departments = []
if filters.get('institution'):
departments = db.session.query(Resource.department).filter_by(institution=filters['institution']).distinct()
return render_template('view_resources.html', resources=resources, institutions=institutions, departments=departments, resource_types=resource_types, user_type=user_type, filters=filters)
@app.route('/add_resource', methods=['GET', 'POST'])
def add_resource():
if 'username' not in session or session['user_type'] != 'admin':
return redirect(url_for('login'))
if request.method == 'POST':
name = request.form['name']
type = request.form['type']
institution = request.form['institution']
department = request.form['department']
resource_file = request.files['resource_file']
if resource_file:
filename = secure_filename(resource_file.filename)
resource_file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
new_resource = Resource(name=name, type=type, institution=institution, department=department, resource_file=filename)
db.session.add(new_resource)
db.session.commit()
flash('Resource added successfully!', 'success')
return redirect(url_for('view_resources'))
return render_template('add_resource.html')
@app.route('/uploads/<filename>')
def uploaded_file(filename):
return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=7860, debug=True) |