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