From 66334803efff7a957816ff5e45d6003b110d4500 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 26 Sep 2025 20:44:28 +0300 Subject: [PATCH] privil --- app/controllers/main_controller.py | 15 +++++++++++++- app/ui/views/login_view.py | 20 +++++++++++++------ app/ui/views/yobble_home_view.py | 32 ++++++++++++++++++++++-------- 3 files changed, 52 insertions(+), 15 deletions(-) diff --git a/app/controllers/main_controller.py b/app/controllers/main_controller.py index 0492b25..516a137 100644 --- a/app/controllers/main_controller.py +++ b/app/controllers/main_controller.py @@ -4,6 +4,7 @@ from app.ui.views.yobble_home_view import YobbleHomeView # <--- Изменено from typing import Optional from threading import Thread import time # эмуляция задержки от сервера +import asyncio from app.core.database import get_last_login, get_session, set_last_login class MainController(QStackedWidget): @@ -50,7 +51,19 @@ class MainController(QStackedWidget): Thread(target=self.update_data_from_server, args=(username,), daemon=True).start() def update_data_from_server(self, username: str): + """ + В фоновом режиме обновляет данные с сервера. + Эмулирует задержку и предзагружает права доступа. + """ # Эмуляция запроса time.sleep(2) print(f"[Sync] Обновляем данные для пользователя: {username}") - # Здесь будет логика обновления данных для YobbleHome + + if self.yobble_home_view: + print("[Sync] Запускаем предзагрузку прав доступа...") + try: + # Запускаем асинхронную функцию в текущем потоке + asyncio.run(self.yobble_home_view.preload_permissions()) + print("[Sync] Предзагрузка прав доступа завершена.") + except Exception as e: + print(f"[Sync] Ошибка во время предзагрузки прав: {e}") diff --git a/app/ui/views/login_view.py b/app/ui/views/login_view.py index e1bdf54..fe06420 100644 --- a/app/ui/views/login_view.py +++ b/app/ui/views/login_view.py @@ -137,7 +137,7 @@ class LoginView(QWidget): self.login_button = QPushButton(localizer.translate("Войти")) self.login_button.setFixedHeight(40) - self.login_button.clicked.connect(self.handle_login) + self.login_button.clicked.connect(self._handle_login_click) self.register_switch = QPushButton(localizer.translate("Нет аккаунта? Регистрация")) self.register_switch.setFlat(True) @@ -161,7 +161,7 @@ class LoginView(QWidget): self.register_button = QPushButton(localizer.translate("Зарегистрироваться")) self.register_button.setFixedHeight(40) - self.register_button.clicked.connect(self.handle_register) + self.register_button.clicked.connect(self._handle_register_click) self.login_switch = QPushButton(localizer.translate("Уже есть аккаунт? Войти")) self.login_switch.setFlat(True) @@ -245,7 +245,11 @@ class LoginView(QWidget): if child.widget(): child.widget().setParent(None) - def handle_login(self): + def _handle_login_click(self): + """Синхронный обработчик для сигнала нажатия кнопки.""" + asyncio.create_task(self.handle_login()) + + async def handle_login(self): login = self.login_input.text() password = self.password_input.text() @@ -264,7 +268,7 @@ class LoginView(QWidget): try: # Запускаем асинхронную функцию - success, message = asyncio.run(auth_service.login(login, password)) + success, message = await auth_service.login(login, password) if success: self.on_login(login) @@ -277,12 +281,16 @@ class LoginView(QWidget): self.login_button.setText(localizer.translate("Войти")) + def _handle_register_click(self): + """Синхронный обработчик для сигнала нажатия кнопки.""" + asyncio.create_task(self.handle_register()) + def validate_confirm_password(self, text): if text != self.reg_password_input.text(): return False, localizer.translate("Пароли не совпадают") return True, "" - def handle_register(self): + async def handle_register(self): # Принудительная валидация всех полей self.reg_login_input.on_text_changed(self.reg_login_input.text()) self.reg_password_input.on_text_changed(self.reg_password_input.text()) @@ -308,7 +316,7 @@ class LoginView(QWidget): self.register_button.setText(localizer.translate("Регистрация...")) try: - success, message = asyncio.run(auth_service.register(login, password, invite)) + success, message = await auth_service.register(login, password, invite) if success: QMessageBox.information(self, localizer.translate("Успех"), message) diff --git a/app/ui/views/yobble_home_view.py b/app/ui/views/yobble_home_view.py index b2ac3b5..4230d7a 100644 --- a/app/ui/views/yobble_home_view.py +++ b/app/ui/views/yobble_home_view.py @@ -14,6 +14,11 @@ from app.core.database import get_current_access_token from app.core.localizer import localizer class YobbleHomeView(QWidget): + REQUIRED_PERMISSIONS = { + 0: "post.access", # Лента + 1: "music.access" # Музыка + } + def __init__(self, username: str): super().__init__() self.username = username @@ -242,19 +247,30 @@ class YobbleHomeView(QWidget): def on_tab_button_clicked(self, index): """Обрабатывает нажатие на кнопку вкладки, проверяя права доступа.""" - - required_permissions = { - 0: "post.access", # Лента - 1: "music.access" # Музыка - } - - if index in required_permissions: + if index in self.REQUIRED_PERMISSIONS: # Запускаем асинхронную проверку в существующем цикле событий - asyncio.create_task(self.check_permissions_and_switch(index, required_permissions[index])) + asyncio.create_task(self.check_permissions_and_switch(index, self.REQUIRED_PERMISSIONS[index])) else: # Для вкладок без специальных прав доступа self.switch_tab(index) + async def preload_permissions(self): + """Асинхронно предзагружает права доступа без UI.""" + access_token = get_current_access_token() + if not access_token: + print("[Permissions] Preload failed: No access token.") + return + + success, data = await get_user_role(access_token) + if success: + user_permissions = data.get("user_permissions", []) + for permission_code in self.REQUIRED_PERMISSIONS.values(): + if permission_code in user_permissions: + self.permission_cache.add(permission_code) + print(f"[Permissions] Preloaded. Cache: {self.permission_cache}") + else: + print(f"[Permissions] Preload failed: {data}") + async def check_permissions_and_switch(self, index, permission_code): """Асинхронно проверяет права и переключает вкладку.""" if permission_code in self.permission_cache: