add load from server role

This commit is contained in:
unknown 2025-09-26 18:57:18 +03:00
parent 49757604ba
commit 988cb0176a
4 changed files with 78 additions and 5 deletions

View File

@ -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

View 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

View File

@ -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():
# Замените на реальные данные для теста

View File

@ -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):