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