diff --git a/routes/dashboard.py b/routes/dashboard.py index 6730df7..027393f 100644 --- a/routes/dashboard.py +++ b/routes/dashboard.py @@ -3,7 +3,7 @@ # Dashboard Routes (Admin) -from quart import Blueprint, request, render_template, redirect, url_for, jsonify +from quart import Blueprint, request, render_template, redirect, url_for, jsonify, session from models.user import User from models.project import Project from models.category import Category @@ -13,27 +13,115 @@ from utils.validators import validate_project_data dashboard_bp = Blueprint('dashboard', __name__, url_prefix='/dashboard') +# Debug route to check authentication status +@dashboard_bp.route('/debug/auth') +async def debug_auth(): + """Debug route to check authentication status""" + current_user = await get_current_user() + session_data = dict(session) + + debug_info = { + 'session_exists': 'user_id' in session, + 'user_id_in_session': session.get('user_id'), + 'username_in_session': session.get('username'), + 'is_admin_in_session': session.get('is_admin'), + 'current_user_found': current_user is not None, + 'current_user_is_admin': current_user.is_admin if current_user else None, + 'current_user_details': { + 'id': current_user.id, + 'username': current_user.username, + 'email': current_user.email, + 'role': current_user.role, + 'is_admin': current_user.is_admin + } if current_user else None, + 'session_data': session_data + } + + return jsonify(debug_info) + +# Public route to check dashboard access without admin_required decorator +@dashboard_bp.route('/debug/access') +async def debug_access(): + """Debug route to check dashboard access requirements""" + try: + current_user = await get_current_user() + + if not current_user: + return jsonify({ + 'status': 'error', + 'message': 'Nessun utente loggato', + 'redirect': url_for('auth.login') + }), 401 + + if not current_user.is_admin: + return jsonify({ + 'status': 'error', + 'message': f'Utente {current_user.username} non ha privilegi di amministratore', + 'user_role': current_user.role, + 'is_admin': current_user.is_admin, + 'redirect': url_for('home.index') + }), 403 + + return jsonify({ + 'status': 'success', + 'message': f'Accesso consentito per {current_user.username}', + 'user': { + 'id': current_user.id, + 'username': current_user.username, + 'role': current_user.role, + 'is_admin': current_user.is_admin + }, + 'dashboard_url': url_for('dashboard.index') + }) + + except Exception as e: + return jsonify({ + 'status': 'error', + 'message': f'Errore durante il controllo accesso: {str(e)}' + }), 500 + @dashboard_bp.route('/') @admin_required async def index(): """Dashboard home""" - current_user = await get_current_user() - - # Get statistics - stats = { - 'total_users': await User.count(), - 'total_projects': await Project.count(published_only=False), - 'published_projects': await Project.count(published_only=True), - 'featured_projects': len(await Project.get_featured()) - } - - # Get recent projects - recent_projects = await Project.get_all(published_only=False, limit=5) - - return await render_template('dashboard/index.html', - user=current_user, - stats=stats, - recent_projects=recent_projects) + try: + current_user = await get_current_user() + + # Get statistics with error handling + stats = { + 'total_users': 0, + 'total_projects': 0, + 'published_projects': 0, + 'featured_projects': 0 + } + + try: + stats['total_users'] = await User.count() + except Exception as e: + print(f"Error getting user count: {e}") + + try: + stats['total_projects'] = await Project.count(published_only=False) + stats['published_projects'] = await Project.count(published_only=True) + featured_projects = await Project.get_featured() + stats['featured_projects'] = len(featured_projects) if featured_projects else 0 + except Exception as e: + print(f"Error getting project stats: {e}") + + # Get recent projects with error handling + recent_projects = [] + try: + recent_projects = await Project.get_all(published_only=False, limit=5) + except Exception as e: + print(f"Error getting recent projects: {e}") + + return await render_template('dashboard/index.html', + user=current_user, + stats=stats, + recent_projects=recent_projects) + except Exception as e: + flash_message(f'Errore nel caricamento della dashboard: {str(e)}', 'error') + return redirect(url_for('home.index')) @dashboard_bp.route('/projects') @admin_required @@ -42,26 +130,34 @@ async def projects(): page = int(request.args.get('page', 1)) per_page = 10 - # Get projects with pagination - projects = await Project.get_all(published_only=False, limit=per_page, offset=(page-1)*per_page) - total_projects = await Project.count(published_only=False) - - pagination = calculate_pagination(total_projects, page, per_page) - - return await render_template('dashboard/projects.html', - projects=projects, - pagination=pagination) + try: + # Get projects with pagination + projects = await Project.get_all(published_only=False, limit=per_page, offset=(page-1)*per_page) + total_projects = await Project.count(published_only=False) + + pagination = calculate_pagination(total_projects, page, per_page) + + return await render_template('dashboard/projects.html', + projects=projects, + pagination=pagination) + except Exception as e: + flash_message(f'Errore nel caricamento dei progetti: {str(e)}', 'error') + return redirect(url_for('dashboard.index')) @dashboard_bp.route('/projects/new', methods=['GET', 'POST']) @admin_required async def new_project(): """Create new project""" if request.method == 'GET': - categories = await Category.get_all() - return await render_template('dashboard/project_form.html', - project=None, - categories=categories, - action='create') + try: + categories = await Category.get_all() + return await render_template('dashboard/project_form.html', + project=None, + categories=categories, + action='create') + except Exception as e: + flash_message(f'Errore nel caricamento delle categorie: {str(e)}', 'error') + return redirect(url_for('dashboard.projects')) form_data = await request.form data = { @@ -208,11 +304,15 @@ async def users(): page = int(request.args.get('page', 1)) per_page = 10 - users = await User.get_all(limit=per_page, offset=(page-1)*per_page) - total_users = await User.count() - - pagination = calculate_pagination(total_users, page, per_page) - - return await render_template('dashboard/users.html', - users=users, - pagination=pagination) + try: + users = await User.get_all(limit=per_page, offset=(page-1)*per_page) + total_users = await User.count() + + pagination = calculate_pagination(total_users, page, per_page) + + return await render_template('dashboard/users.html', + users=users, + pagination=pagination) + except Exception as e: + flash_message(f'Errore nel caricamento degli utenti: {str(e)}', 'error') + return redirect(url_for('dashboard.index')) \ No newline at end of file