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):
|
||||
|
||||
Reference in New Issue
Block a user