from flask import Blueprint, render_template, jsonify, request, flash, redirect, url_for from flask_login import login_required, current_user from models import User, Chat, AnalysisReport from extensions import db from datetime import datetime, timedelta from sqlalchemy import func admin_bp = Blueprint('admin_bp', __name__, template_folder='templates') @admin_bp.before_request @login_required def restrict_admin_panel(): if not current_user.is_admin: flash('Доступ запрещен', 'danger') return redirect(url_for('index')) @admin_bp.route('/') def dashboard(): # Статистика за последние 30 дней end_date = datetime.now() start_date = end_date - timedelta(days=30) # Основная статистика users_count = User.query.count() new_users = User.query.filter(User.created_at >= start_date).count() reports_count = AnalysisReport.query.count() active_users = db.session.query(Chat.user_id).distinct().count() # Статистика по эмоциям emotion_stats = db.session.query( AnalysisReport.emotion, func.count(AnalysisReport.id).label('count') ).group_by(AnalysisReport.emotion).all() # Активность пользователей user_activity = db.session.query( User.username, func.count(AnalysisReport.id).label('report_count') ).join( AnalysisReport, User.id == AnalysisReport.user_id ).group_by( User.username ).order_by( func.count(AnalysisReport.id).desc() ).limit(10).all() return render_template('admin/dashboard.html', users_count=users_count, new_users=new_users, reports_count=reports_count, active_users=active_users, emotion_stats=emotion_stats, user_activity=user_activity) @admin_bp.route('/users') def manage_users(): search_query = request.args.get('search', '') page = request.args.get('page', 1, type=int) query = User.query.order_by(User.created_at.desc()) if search_query: query = query.filter(User.username.ilike(f'%{search_query}%') | User.email.ilike(f'%{search_query}%')) users = query.paginate(page=page, per_page=20, error_out=False) return render_template('admin/users.html', users=users, search_query=search_query) @admin_bp.route('/reports') def view_reports(): emotion_filter = request.args.get('emotion') page = request.args.get('page', 1, type=int) query = AnalysisReport.query.order_by(AnalysisReport.created_at.desc()) if emotion_filter: query = query.filter(AnalysisReport.emotion == emotion_filter) reports = query.paginate(page=page, per_page=20, error_out=False) # Получаем список всех эмоций для фильтра emotions = db.session.query( AnalysisReport.emotion.distinct().label('emotion') ).all() return render_template('admin/reports.html', reports=reports, emotions=emotions, current_emotion=emotion_filter) @admin_bp.route('/toggle_admin/', methods=['POST']) def toggle_admin(user_id): user = User.query.get_or_404(user_id) user.is_admin = not user.is_admin db.session.commit() return jsonify({'status': 'success', 'is_admin': user.is_admin}) @admin_bp.route('/delete_user/', methods=['POST']) def delete_user(user_id): if current_user.id == user_id: return jsonify({'status': 'error', 'message': 'Нельзя удалить себя'}), 400 user = User.query.get_or_404(user_id) # Удаляем все связанные данные пользователя AnalysisReport.query.filter_by(user_id=user_id).delete() Chat.query.filter_by(user_id=user_id).delete() db.session.delete(user) db.session.commit() return jsonify({'status': 'success'})