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