Spaces:
No application file
No application file
| 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') | |
| def restrict_admin_panel(): | |
| if not current_user.is_admin: | |
| flash('Доступ запрещен', 'danger') | |
| return redirect(url_for('index')) | |
| 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) | |
| 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) | |
| 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) | |
| 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}) | |
| 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'}) |