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()
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user