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,))
 | 
					    cursor.execute("INSERT OR REPLACE INTO app_state (key, value) VALUES ('last_login', ?)", (login,))
 | 
				
			||||||
    conn.commit()
 | 
					    conn.commit()
 | 
				
			||||||
    conn.close()
 | 
					    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}"
 | 
					        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():
 | 
					async def main():
 | 
				
			||||||
    # Замените на реальные данные для теста
 | 
					    # Замените на реальные данные для теста
 | 
				
			||||||
 | 
				
			|||||||
@ -40,6 +40,7 @@ class YobbleHomeView(QWidget):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        # 3. Нижняя панель навигации
 | 
					        # 3. Нижняя панель навигации
 | 
				
			||||||
        self.bottom_bar = self.create_bottom_bar()
 | 
					        self.bottom_bar = self.create_bottom_bar()
 | 
				
			||||||
 | 
					        self.content_stack.setCurrentIndex(2)
 | 
				
			||||||
        content_layout.addWidget(self.bottom_bar)
 | 
					        content_layout.addWidget(self.bottom_bar)
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        main_layout.addWidget(self.content_widget)
 | 
					        main_layout.addWidget(self.content_widget)
 | 
				
			||||||
@ -168,18 +169,18 @@ class YobbleHomeView(QWidget):
 | 
				
			|||||||
        bottom_bar_layout.setSpacing(10)
 | 
					        bottom_bar_layout.setSpacing(10)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        btn_feed = self.create_tab_button("☰", "Лента", 0)
 | 
					        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_create = self.create_create_button()
 | 
				
			||||||
        btn_chats = self.create_tab_button("💬", "Чаты", 2)
 | 
					        btn_chats = self.create_tab_button("💬", "Чаты", 2)
 | 
				
			||||||
        btn_profile = self.create_tab_button("👤", "Лицо", 3)
 | 
					        btn_profile = self.create_tab_button("👤", "Лицо", 3)
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        bottom_bar_layout.addWidget(btn_feed)
 | 
					        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_create)
 | 
				
			||||||
        bottom_bar_layout.addWidget(btn_chats)
 | 
					        bottom_bar_layout.addWidget(btn_chats)
 | 
				
			||||||
        bottom_bar_layout.addWidget(btn_profile)
 | 
					        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.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
 | 
				
			||||||
            btn.setFocusPolicy(Qt.NoFocus)
 | 
					            btn.setFocusPolicy(Qt.NoFocus)
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
@ -230,7 +231,7 @@ class YobbleHomeView(QWidget):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def setup_content_pages(self):
 | 
					    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("Контент Чатов"))
 | 
					        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.content_stack.setCurrentIndex(index)
 | 
				
			||||||
        self.update_tab_selection(index)
 | 
					        self.update_tab_selection(index)
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        titles = ["Лента", "Поиск", "Чаты", "Лицо"]
 | 
					        titles = ["Лента", "Музыка", "Чаты", "Лицо"]
 | 
				
			||||||
        self.title_label.setText(titles[index])
 | 
					        self.title_label.setText(titles[index])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def update_tab_selection(self, selected_index):
 | 
					    def update_tab_selection(self, selected_index):
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user