Added Role Owner and new UI for Owner

This commit is contained in:
2026-01-15 19:00:09 +06:00
parent 9a1e2df04d
commit 551d733dc4
15 changed files with 3999 additions and 22 deletions

242
backend/migrate_users.py Normal file
View File

@@ -0,0 +1,242 @@
#!/usr/bin/env python3
"""
Скрипт миграции пользователей для MC Panel v1.1.0
Добавляет роль владельца и систему прав
"""
import json
from pathlib import Path
from datetime import datetime
def migrate_users():
"""Миграция пользователей на новую систему прав"""
users_file = Path("users.json")
# Проверка существования файла
if not users_file.exists():
print("❌ Файл users.json не найден")
print(" Создайте файл users.json или запустите панель для автоматического создания")
return False
# Создание backup
backup_file = Path(f"users_backup_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json")
try:
with open(users_file, "r", encoding="utf-8") as f:
backup_data = f.read()
with open(backup_file, "w", encoding="utf-8") as f:
f.write(backup_data)
print(f"✅ Backup создан: {backup_file}")
except Exception as e:
print(f"❌ Ошибка создания backup: {e}")
return False
# Загрузка пользователей
try:
with open(users_file, "r", encoding="utf-8") as f:
users_data = json.load(f)
except json.JSONDecodeError:
print("❌ Ошибка чтения users.json - неверный формат JSON")
return False
except Exception as e:
print(f"❌ Ошибка чтения файла: {e}")
return False
# Проверка формата (объект или список)
if isinstance(users_data, dict):
# Формат: {"username": {...}}
users_list = list(users_data.values())
is_dict_format = True
print(" Обнаружен формат: объект (словарь)")
elif isinstance(users_data, list):
# Формат: [{...}, {...}]
users_list = users_data
is_dict_format = False
print(" Обнаружен формат: список")
else:
print("❌ Неизвестный формат users.json")
return False
if not users_list:
print(" Нет пользователей для миграции")
return True
print(f"\n📊 Найдено пользователей: {len(users_list)}")
print("=" * 50)
# Миграция первого пользователя (владелец)
if users_list:
first_user = users_list[0]
print(f"\n👑 Назначение владельца: {first_user.get('username', 'Unknown')}")
first_user["role"] = "owner"
first_user["permissions"] = {
"manage_users": True,
"manage_roles": True,
"manage_servers": True,
"manage_tickets": True,
"manage_files": True,
"delete_users": True,
"view_all_resources": True
}
if "resource_access" not in first_user:
first_user["resource_access"] = {
"servers": first_user.get("servers", []),
"tickets": [],
"files": []
}
# Миграция остальных пользователей
for i, user in enumerate(users_list[1:], start=2):
username = user.get("username", f"User{i}")
current_role = user.get("role", "user")
print(f"\n👤 Пользователь {i}: {username}")
print(f" Текущая роль: {current_role}")
# Установка роли по умолчанию
if "role" not in user or user["role"] not in ["admin", "support", "user", "banned"]:
user["role"] = "user"
print(f" ➜ Установлена роль: user")
# Добавление прав
if "permissions" not in user:
if user["role"] == "admin":
user["permissions"] = {
"manage_users": True,
"manage_roles": False,
"manage_servers": True,
"manage_tickets": True,
"manage_files": True,
"delete_users": False,
"view_all_resources": True
}
print(" ➜ Добавлены права администратора")
elif user["role"] == "support":
user["permissions"] = {
"manage_users": False,
"manage_roles": False,
"manage_servers": False,
"manage_tickets": True,
"manage_files": False,
"delete_users": False,
"view_all_resources": False
}
print(" ➜ Добавлены права поддержки")
elif user["role"] == "banned":
user["permissions"] = {
"manage_users": False,
"manage_roles": False,
"manage_servers": False,
"manage_tickets": False,
"manage_files": False,
"delete_users": False,
"view_all_resources": False
}
print(" ➜ Пользователь заблокирован")
else: # user
user["permissions"] = {
"manage_users": False,
"manage_roles": False,
"manage_servers": True,
"manage_tickets": True,
"manage_files": True,
"delete_users": False,
"view_all_resources": False
}
print(" ➜ Добавлены права пользователя")
# Добавление доступа к ресурсам
if "resource_access" not in user:
user["resource_access"] = {
"servers": user.get("servers", []),
"tickets": [],
"files": []
}
print(" ➜ Добавлен доступ к ресурсам")
# Сохранение в правильном формате
try:
if is_dict_format:
# Сохраняем обратно как объект
users_dict = {user["username"]: user for user in users_list}
with open(users_file, "w", encoding="utf-8") as f:
json.dump(users_dict, f, indent=2, ensure_ascii=False)
else:
# Сохраняем как список
with open(users_file, "w", encoding="utf-8") as f:
json.dump(users_list, f, indent=2, ensure_ascii=False)
print("\n" + "=" * 50)
print("✅ Миграция успешно завершена!")
print(f"✅ Обновлено пользователей: {len(users_list)}")
print(f"👑 Владелец: {users_list[0]['username']}")
print(f"📁 Backup: {backup_file}")
return True
except Exception as e:
print(f"\n❌ Ошибка сохранения: {e}")
print(f" Восстановите из backup: {backup_file}")
return False
def show_users():
"""Показать список пользователей после миграции"""
users_file = Path("users.json")
if not users_file.exists():
print("❌ Файл users.json не найден")
return
try:
with open(users_file, "r", encoding="utf-8") as f:
users_data = json.load(f)
except Exception as e:
print(f"❌ Ошибка чтения файла: {e}")
return
# Преобразуем в список если это объект
if isinstance(users_data, dict):
users_list = list(users_data.values())
else:
users_list = users_data
print("\n" + "=" * 50)
print("📋 СПИСОК ПОЛЬЗОВАТЕЛЕЙ")
print("=" * 50)
for i, user in enumerate(users_list, start=1):
print(f"\n{i}. {user.get('username', 'Unknown')}")
print(f" Роль: {user.get('role', 'unknown')}")
print(f" Права:")
for perm, value in user.get('permissions', {}).items():
status = "" if value else ""
print(f" {status} {perm}")
# Показать доступ к ресурсам
resource_access = user.get('resource_access', {})
if resource_access:
servers = resource_access.get('servers', [])
if servers:
print(f" Серверы: {', '.join(servers)}")
if __name__ == "__main__":
print("=" * 50)
print("MC Panel - Миграция пользователей v1.1.0")
print("=" * 50)
# Запуск миграции
success = migrate_users()
if success:
# Показать результат
show_users()
print("\n" + "=" * 50)
print("📝 СЛЕДУЮЩИЕ ШАГИ:")
print("=" * 50)
print("1. Перезапустите панель")
print("2. Войдите как владелец")
print("3. Проверьте права пользователей")
print("4. Настройте доступ к ресурсам")
print("\n✨ Готово!")
else:
print("\n❌ Миграция не выполнена")
print(" Проверьте ошибки выше и попробуйте снова")