| 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) |
|
|
| |
| if not os.path.exists(app.config['UPLOAD_FOLDER']): |
| os.makedirs(app.config['UPLOAD_FOLDER']) |
|
|
| |
| 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) |