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'})