add load from server role
This commit is contained in:
		
							parent
							
								
									49757604ba
								
							
						
					
					
						commit
						988cb0176a
					
				@ -103,3 +103,15 @@ def set_last_login(login: str):
 | 
			
		||||
    cursor.execute("INSERT OR REPLACE INTO app_state (key, value) VALUES ('last_login', ?)", (login,))
 | 
			
		||||
    conn.commit()
 | 
			
		||||
    conn.close()
 | 
			
		||||
 | 
			
		||||
def get_current_access_token():
 | 
			
		||||
    """
 | 
			
		||||
    Получает access_token для последней активной сессии.
 | 
			
		||||
    :return: access_token или None, если сессия не найдена.
 | 
			
		||||
    """
 | 
			
		||||
    last_login = get_last_login()
 | 
			
		||||
    if not last_login:
 | 
			
		||||
        return None
 | 
			
		||||
    
 | 
			
		||||
    session = get_session(last_login)
 | 
			
		||||
    return session['access_token'] if session else None
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										23
									
								
								app/core/models/user_models.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								app/core/models/user_models.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
from uuid import UUID
 | 
			
		||||
from datetime import datetime
 | 
			
		||||
from pydantic import BaseModel, Field
 | 
			
		||||
from typing import List, Optional
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UserPrivilege(BaseModel):
 | 
			
		||||
    id: int
 | 
			
		||||
    code: str
 | 
			
		||||
    name: str
 | 
			
		||||
    description: str
 | 
			
		||||
    is_active: bool
 | 
			
		||||
    created_at: datetime
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UserRoleData(BaseModel):
 | 
			
		||||
    user_id: UUID = Field(..., description="ID пользователя")
 | 
			
		||||
    user_privilege: Optional[UserPrivilege] = Field(None, description="Привилегия пользователя")
 | 
			
		||||
    user_permissions: List[str] = Field(default_factory=list, description="Список кодов прав")
 | 
			
		||||
 | 
			
		||||
class UserRoleResponse(BaseModel):
 | 
			
		||||
    status: str
 | 
			
		||||
    data: UserRoleData
 | 
			
		||||
@ -91,6 +91,43 @@ async def register(login, password, invite=None):
 | 
			
		||||
        return False, f"{localizer.translate('Произошла ошибка')}: {e}"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def get_user_role(access_token: str):
 | 
			
		||||
    """
 | 
			
		||||
    Получает роль и права пользователя по токену доступа.
 | 
			
		||||
 | 
			
		||||
    :param access_token: Токен доступа пользователя
 | 
			
		||||
    :return: Кортеж (успех: bool, данные: UserRoleData | str)
 | 
			
		||||
    """
 | 
			
		||||
    url = f"{config.BASE_URL}/v1/user/role"
 | 
			
		||||
    headers = {"Authorization": f"Bearer {access_token}"}
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        async with httpx.AsyncClient(http2=True) as client:
 | 
			
		||||
            response = await client.get(url, headers=headers)
 | 
			
		||||
 | 
			
		||||
            if response.status_code == 200:
 | 
			
		||||
                data = response.json()
 | 
			
		||||
                if data.get("status") == "fine":
 | 
			
		||||
                    # Здесь можно добавить валидацию через Pydantic, если необходимо
 | 
			
		||||
                    # from app.core.models.user_models import UserRoleData
 | 
			
		||||
                    # user_role_data = UserRoleData(**data['data'])
 | 
			
		||||
                    return True, data['data']
 | 
			
		||||
                else:
 | 
			
		||||
                    return False, data.get("detail", localizer.translate("Неизвестная ошибка ответа"))
 | 
			
		||||
 | 
			
		||||
            elif response.status_code == 401:
 | 
			
		||||
                return False, localizer.translate("Токен недействителен или истек")
 | 
			
		||||
            elif response.status_code == 404:
 | 
			
		||||
                return False, localizer.translate("Пользователь не найден")
 | 
			
		||||
            else:
 | 
			
		||||
                return False, f"{localizer.translate('Ошибка сервера')}: {response.status_code}"
 | 
			
		||||
 | 
			
		||||
    except httpx.RequestError as e:
 | 
			
		||||
        return False, f"{localizer.translate('Ошибка сети')}: {e}"
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
        return False, f"{localizer.translate('Произошла ошибка')}: {e}"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Пример использования (для тестирования)
 | 
			
		||||
async def main():
 | 
			
		||||
    # Замените на реальные данные для теста
 | 
			
		||||
 | 
			
		||||
@ -40,6 +40,7 @@ class YobbleHomeView(QWidget):
 | 
			
		||||
 | 
			
		||||
        # 3. Нижняя панель навигации
 | 
			
		||||
        self.bottom_bar = self.create_bottom_bar()
 | 
			
		||||
        self.content_stack.setCurrentIndex(2)
 | 
			
		||||
        content_layout.addWidget(self.bottom_bar)
 | 
			
		||||
        
 | 
			
		||||
        main_layout.addWidget(self.content_widget)
 | 
			
		||||
@ -168,18 +169,18 @@ class YobbleHomeView(QWidget):
 | 
			
		||||
        bottom_bar_layout.setSpacing(10)
 | 
			
		||||
 | 
			
		||||
        btn_feed = self.create_tab_button("☰", "Лента", 0)
 | 
			
		||||
        btn_search = self.create_tab_button("🔍", "Поиск", 1)
 | 
			
		||||
        btn_music = self.create_tab_button("🎵", "Музыка", 1)
 | 
			
		||||
        btn_create = self.create_create_button()
 | 
			
		||||
        btn_chats = self.create_tab_button("💬", "Чаты", 2)
 | 
			
		||||
        btn_profile = self.create_tab_button("👤", "Лицо", 3)
 | 
			
		||||
        
 | 
			
		||||
        bottom_bar_layout.addWidget(btn_feed)
 | 
			
		||||
        bottom_bar_layout.addWidget(btn_search)
 | 
			
		||||
        bottom_bar_layout.addWidget(btn_music)
 | 
			
		||||
        bottom_bar_layout.addWidget(btn_create)
 | 
			
		||||
        bottom_bar_layout.addWidget(btn_chats)
 | 
			
		||||
        bottom_bar_layout.addWidget(btn_profile)
 | 
			
		||||
 | 
			
		||||
        for btn in [btn_feed, btn_search, btn_chats, btn_profile]:
 | 
			
		||||
        for btn in [btn_feed, btn_music, btn_chats, btn_profile]:
 | 
			
		||||
            btn.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
 | 
			
		||||
            btn.setFocusPolicy(Qt.NoFocus)
 | 
			
		||||
        
 | 
			
		||||
@ -230,7 +231,7 @@ class YobbleHomeView(QWidget):
 | 
			
		||||
 | 
			
		||||
    def setup_content_pages(self):
 | 
			
		||||
        self.content_stack.addWidget(QLabel("Контент Ленты"))
 | 
			
		||||
        self.content_stack.addWidget(QLabel("Контент Поиска"))
 | 
			
		||||
        self.content_stack.addWidget(QLabel("Контент Музыки"))
 | 
			
		||||
        self.content_stack.addWidget(QLabel("Контент Чатов"))
 | 
			
		||||
        self.content_stack.addWidget(QLabel("Контент Профиля"))
 | 
			
		||||
 | 
			
		||||
@ -238,7 +239,7 @@ class YobbleHomeView(QWidget):
 | 
			
		||||
        self.content_stack.setCurrentIndex(index)
 | 
			
		||||
        self.update_tab_selection(index)
 | 
			
		||||
        
 | 
			
		||||
        titles = ["Лента", "Поиск", "Чаты", "Лицо"]
 | 
			
		||||
        titles = ["Лента", "Музыка", "Чаты", "Лицо"]
 | 
			
		||||
        self.title_label.setText(titles[index])
 | 
			
		||||
 | 
			
		||||
    def update_tab_selection(self, selected_index):
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user