""" Authentication helper functions and decorators """ from functools import wraps from flask import session, redirect, url_for, flash from models import User def login_required(f): """Decorator to require login for a route""" @wraps(f) def decorated_function(*args, **kwargs): if 'user_id' not in session: return redirect(url_for('login_page')) user = User.query.get(session['user_id']) if not user: session.clear() flash('Session expired. Please login again.', 'error') return redirect(url_for('login_page')) return f(*args, **kwargs) return decorated_function def role_required(role): """Decorator to require specific role for a route""" def decorator(f): @wraps(f) def decorated_function(*args, **kwargs): if 'user_id' not in session: flash('Please login to access this page', 'error') return redirect(url_for('login_page')) user = User.query.get(session['user_id']) if not user: session.clear() return redirect(url_for('login_page')) if user.role != role: flash(f'Access denied. This page is for {role}s only.', 'error') return redirect(url_for('index')) return f(*args, **kwargs) return decorated_function return decorator def get_current_user(): """Get currently logged in user""" if 'user_id' in session: return User.query.get(session['user_id']) return None