File size: 4,272 Bytes
6bcf797 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
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/<int:user_id>', 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/<int:user_id>', 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'}) |