diff --git a/app.py b/app.py index d892cfb..0a83092 100644 --- a/app.py +++ b/app.py @@ -264,6 +264,49 @@ def init_admin_user(): 'error': 'Failed to create admin user' }), 500 +@app.route('/api/debug-users') +def debug_users(): + """Debug endpoint to check all users in database""" + try: + # Check if database tables exist + from sqlalchemy import inspect + inspector = inspect(db.engine) + tables = inspector.get_table_names() + + # Get all users + all_users = User.query.all() + + # Also try a raw SQL query to double-check + raw_result = db.session.execute('SELECT COUNT(*) FROM users').scalar() + + # Get some raw user data + raw_users = db.session.execute('SELECT id, username, email, role FROM users LIMIT 10').fetchall() + + return jsonify({ + 'database_tables': tables, + 'total_users': len(all_users), + 'raw_count': raw_result, + 'raw_users_sample': [{'id': str(row[0]), 'username': row[1], 'email': row[2], 'role': row[3]} for row in raw_users], + 'users': [ + { + 'id': str(user.id), + 'username': user.username, + 'email': user.email, + 'role': user.role, + 'is_active': user.is_active, + 'is_suspended': user.is_suspended, + 'created_at': user.created_at.isoformat() + } + for user in all_users + ] + }) + except Exception as e: + import traceback + return jsonify({ + 'error': str(e), + 'traceback': traceback.format_exc() + }), 500 + # Initialize memory management memory_manager = MemoryManager(app, { 'memory_threshold_mb': app.config.get('MEMORY_THRESHOLD_MB', 4096), diff --git a/auth_routes.py b/auth_routes.py index 8d57ba0..1a8045b 100644 --- a/auth_routes.py +++ b/auth_routes.py @@ -1,5 +1,6 @@ """Authentication and user management routes""" import os +import logging from datetime import datetime, timedelta from flask import Blueprint, request, jsonify, g from flask_jwt_extended import jwt_required, get_jwt_identity, get_jwt @@ -17,6 +18,8 @@ from rate_limiter import rate_limit from validators import Validators from error_logger import log_exception +logger = logging.getLogger(__name__) + auth_bp = Blueprint('auth', __name__) @@ -404,6 +407,9 @@ def admin_list_users(): # Build query query = User.query + # Debug logging + logger.info(f"Admin user list query parameters: page={page}, per_page={per_page}, search={search}, role={role}, status={status}, sort_by={sort_by}, sort_order={sort_order}") + # Search filter if search: search_term = f'%{search}%' @@ -412,18 +418,23 @@ def admin_list_users(): User.username.ilike(search_term), User.full_name.ilike(search_term) )) + logger.info(f"Applied search filter: {search_term}") # Role filter if role: query = query.filter(User.role == role) + logger.info(f"Applied role filter: {role}") # Status filter if status == 'active': query = query.filter(User.is_active == True, User.is_suspended == False) + logger.info(f"Applied status filter: active") elif status == 'suspended': query = query.filter(User.is_suspended == True) + logger.info(f"Applied status filter: suspended") elif status == 'inactive': query = query.filter(User.is_active == False) + logger.info(f"Applied status filter: inactive") # Sorting order_column = getattr(User, sort_by, User.created_at) @@ -431,10 +442,30 @@ def admin_list_users(): query = query.order_by(order_column.desc()) else: query = query.order_by(order_column.asc()) + logger.info(f"Applied sorting: {sort_by} {sort_order}") + + # Log the SQL query being generated + try: + sql = str(query.statement.compile(compile_kwargs={"literal_binds": True})) + logger.info(f"Generated SQL query: {sql}") + except Exception as e: + logger.warning(f"Could not log SQL query: {e}") + + # Count total results before pagination + total_count = query.count() + logger.info(f"Total users matching query (before pagination): {total_count}") + + # Get all users without pagination for debugging + all_matching_users = query.all() + logger.info(f"All matching users: {[u.username for u in all_matching_users[:10]]}") # Log first 10 usernames # Paginate pagination = query.paginate(page=page, per_page=per_page, error_out=False) + # Debug logging for results + logger.info(f"Query returned {pagination.total} total users, showing {len(pagination.items)} on page {pagination.page}") + logger.info(f"Pagination items: {[u.username for u in pagination.items]}") + return jsonify({ 'success': True, 'users': [u.to_dict(include_sensitive=True) for u in pagination.items], diff --git a/templates/admin_users.html b/templates/admin_users.html index c00d4c8..085db9f 100644 --- a/templates/admin_users.html +++ b/templates/admin_users.html @@ -314,20 +314,39 @@ sort_order: 'desc' }; + console.log('Loading users with params:', params); const response = await axios.get('/api/auth/admin/users', { params }); const data = response.data; + console.log('Received data:', data); + + // Also try the debug endpoint to see all users + try { + const debugResponse = await axios.get('/api/debug-users'); + console.log('Debug endpoint shows:', debugResponse.data); + } catch (debugError) { + console.error('Debug endpoint error:', debugError); + } displayUsers(data.users); displayPagination(data.pagination); } catch (error) { console.error('Failed to load users:', error); - showAlert('Failed to load users', 'danger'); + console.error('Response:', error.response); + showAlert('Failed to load users: ' + (error.response?.data?.error || error.message), 'danger'); } } function displayUsers(users) { const tbody = document.getElementById('usersTableBody'); tbody.innerHTML = ''; + + console.log('displayUsers called with:', users); + console.log('Number of users to display:', users ? users.length : 0); + + if (!users || users.length === 0) { + tbody.innerHTML = 'No users found'; + return; + } users.forEach(user => { const tr = document.createElement('tr');