privil
This commit is contained in:
parent
66334803ef
commit
730262fe3a
@ -2,7 +2,7 @@ DEBUG = True
|
|||||||
API_SCHEME = "https"
|
API_SCHEME = "https"
|
||||||
API_HOST = "api.yobble.org"
|
API_HOST = "api.yobble.org"
|
||||||
BASE_URL = f"{API_SCHEME}://{API_HOST}"
|
BASE_URL = f"{API_SCHEME}://{API_HOST}"
|
||||||
APP_VERSION = "0.1_login_screen_windows"
|
APP_VERSION = "0.2_home_screen"
|
||||||
APP_NAME = "yobble messenger"
|
APP_NAME = "yobble messenger"
|
||||||
APP_HEADER = f"{APP_NAME}"
|
APP_HEADER = f"{APP_NAME}"
|
||||||
if DEBUG: APP_HEADER=f"{APP_HEADER} ({APP_VERSION})"
|
if DEBUG: APP_HEADER=f"{APP_HEADER} ({APP_VERSION})"
|
||||||
|
|||||||
@ -25,6 +25,7 @@ class YobbleHomeView(QWidget):
|
|||||||
self.setWindowTitle(f"Yobble Home - {username}")
|
self.setWindowTitle(f"Yobble Home - {username}")
|
||||||
self.setMinimumSize(360, 640)
|
self.setMinimumSize(360, 640)
|
||||||
self.permission_cache = set()
|
self.permission_cache = set()
|
||||||
|
self.permissions_preloaded = False
|
||||||
|
|
||||||
# --- Основной макет ---
|
# --- Основной макет ---
|
||||||
# Используем QHBoxLayout, чтобы можно было разместить меню и контент рядом
|
# Используем QHBoxLayout, чтобы можно было разместить меню и контент рядом
|
||||||
@ -240,16 +241,31 @@ class YobbleHomeView(QWidget):
|
|||||||
return button
|
return button
|
||||||
|
|
||||||
def setup_content_pages(self):
|
def setup_content_pages(self):
|
||||||
self.content_stack.addWidget(QLabel("Контент Ленты"))
|
# Лента
|
||||||
self.content_stack.addWidget(QLabel("Контент Музыки"))
|
self.feed_label = QLabel("Загрузка...")
|
||||||
|
self.feed_label.setAlignment(Qt.AlignCenter)
|
||||||
|
self.content_stack.addWidget(self.feed_label)
|
||||||
|
|
||||||
|
# Музыка
|
||||||
|
self.music_label = QLabel("Загрузка...")
|
||||||
|
self.music_label.setAlignment(Qt.AlignCenter)
|
||||||
|
self.content_stack.addWidget(self.music_label)
|
||||||
|
|
||||||
|
# Чаты
|
||||||
self.content_stack.addWidget(QLabel("Контент Чатов"))
|
self.content_stack.addWidget(QLabel("Контент Чатов"))
|
||||||
|
|
||||||
|
# Профиль
|
||||||
self.content_stack.addWidget(QLabel("Контент Профиля"))
|
self.content_stack.addWidget(QLabel("Контент Профиля"))
|
||||||
|
|
||||||
def on_tab_button_clicked(self, index):
|
def on_tab_button_clicked(self, index):
|
||||||
"""Обрабатывает нажатие на кнопку вкладки, проверяя права доступа."""
|
"""Обрабатывает нажатие на кнопку вкладки, проверяя права доступа."""
|
||||||
if index in self.REQUIRED_PERMISSIONS:
|
if index in self.REQUIRED_PERMISSIONS:
|
||||||
# Запускаем асинхронную проверку в существующем цикле событий
|
# сразу переключаем на вкладку (там уже "Загрузка...")
|
||||||
asyncio.create_task(self.check_permissions_and_switch(index, self.REQUIRED_PERMISSIONS[index]))
|
self.switch_tab(index)
|
||||||
|
# запускаем асинхронную проверку
|
||||||
|
asyncio.create_task(
|
||||||
|
self.check_permissions_and_switch(index, self.REQUIRED_PERMISSIONS[index])
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
# Для вкладок без специальных прав доступа
|
# Для вкладок без специальных прав доступа
|
||||||
self.switch_tab(index)
|
self.switch_tab(index)
|
||||||
@ -267,6 +283,7 @@ class YobbleHomeView(QWidget):
|
|||||||
for permission_code in self.REQUIRED_PERMISSIONS.values():
|
for permission_code in self.REQUIRED_PERMISSIONS.values():
|
||||||
if permission_code in user_permissions:
|
if permission_code in user_permissions:
|
||||||
self.permission_cache.add(permission_code)
|
self.permission_cache.add(permission_code)
|
||||||
|
self.permissions_preloaded = True
|
||||||
print(f"[Permissions] Preloaded. Cache: {self.permission_cache}")
|
print(f"[Permissions] Preloaded. Cache: {self.permission_cache}")
|
||||||
else:
|
else:
|
||||||
print(f"[Permissions] Preload failed: {data}")
|
print(f"[Permissions] Preload failed: {data}")
|
||||||
@ -274,9 +291,17 @@ class YobbleHomeView(QWidget):
|
|||||||
async def check_permissions_and_switch(self, index, permission_code):
|
async def check_permissions_and_switch(self, index, permission_code):
|
||||||
"""Асинхронно проверяет права и переключает вкладку."""
|
"""Асинхронно проверяет права и переключает вкладку."""
|
||||||
if permission_code in self.permission_cache:
|
if permission_code in self.permission_cache:
|
||||||
|
self.show_real_content(index)
|
||||||
self.switch_tab(index)
|
self.switch_tab(index)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# Если предзагрузка завершена, но прав в кеше нет → запрет
|
||||||
|
if self.permissions_preloaded:
|
||||||
|
self.show_denied(index)
|
||||||
|
self.switch_tab(index)
|
||||||
|
return
|
||||||
|
|
||||||
|
# Иначе делаем запрос
|
||||||
access_token = get_current_access_token()
|
access_token = get_current_access_token()
|
||||||
if not access_token:
|
if not access_token:
|
||||||
self.show_error_message(localizer.translate("Сессия не найдена. Пожалуйста, войдите снова."))
|
self.show_error_message(localizer.translate("Сессия не найдена. Пожалуйста, войдите снова."))
|
||||||
@ -285,12 +310,14 @@ class YobbleHomeView(QWidget):
|
|||||||
success, data = await get_user_role(access_token)
|
success, data = await get_user_role(access_token)
|
||||||
print("data", data)
|
print("data", data)
|
||||||
|
|
||||||
|
success, data = await get_user_role(access_token)
|
||||||
if success and permission_code in data.get("user_permissions", []):
|
if success and permission_code in data.get("user_permissions", []):
|
||||||
self.permission_cache.add(permission_code)
|
self.permission_cache.add(permission_code)
|
||||||
|
self.show_real_content(index)
|
||||||
self.switch_tab(index)
|
self.switch_tab(index)
|
||||||
else:
|
else:
|
||||||
error_message = data if not success else localizer.translate("У вас нет прав для доступа к этому разделу.")
|
self.show_denied(index)
|
||||||
self.show_error_message(error_message)
|
self.switch_tab(index)
|
||||||
|
|
||||||
def switch_tab(self, index):
|
def switch_tab(self, index):
|
||||||
"""Переключает на указанную вкладку."""
|
"""Переключает на указанную вкладку."""
|
||||||
@ -319,6 +346,26 @@ class YobbleHomeView(QWidget):
|
|||||||
button.style().unpolish(button)
|
button.style().unpolish(button)
|
||||||
button.style().polish(button)
|
button.style().polish(button)
|
||||||
|
|
||||||
|
def show_real_content(self, index):
|
||||||
|
if index == 0:
|
||||||
|
self.feed_label.setText("Контент Ленты")
|
||||||
|
elif index == 1:
|
||||||
|
self.music_label.setText("Контент Музыки")
|
||||||
|
|
||||||
|
def show_denied(self, index):
|
||||||
|
denied = QLabel("Доступ запрещен")
|
||||||
|
denied.setAlignment(Qt.AlignCenter)
|
||||||
|
denied.setStyleSheet("font-size: 18px; color: #8e8e93;")
|
||||||
|
|
||||||
|
if index == 0:
|
||||||
|
self.content_stack.removeWidget(self.feed_label)
|
||||||
|
self.feed_label = denied
|
||||||
|
self.content_stack.insertWidget(0, denied)
|
||||||
|
elif index == 1:
|
||||||
|
self.content_stack.removeWidget(self.music_label)
|
||||||
|
self.music_label = denied
|
||||||
|
self.content_stack.insertWidget(1, denied)
|
||||||
|
|
||||||
def get_stylesheet(self):
|
def get_stylesheet(self):
|
||||||
"""Возвращает QSS стили для компонента в зависимости от темы."""
|
"""Возвращает QSS стили для компонента в зависимости от темы."""
|
||||||
is_dark = theme_manager.is_dark()
|
is_dark = theme_manager.is_dark()
|
||||||
|
|||||||
Reference in New Issue
Block a user