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