profile patch
This commit is contained in:
parent
e54cec4c49
commit
f3a2812ccc
@ -76,3 +76,16 @@ class PrivateMessageSendData(BaseModel):
|
|||||||
class PrivateMessageSendResponse(BaseModel):
|
class PrivateMessageSendResponse(BaseModel):
|
||||||
status: str
|
status: str
|
||||||
data: PrivateMessageSendData
|
data: PrivateMessageSendData
|
||||||
|
|
||||||
|
|
||||||
|
# create private chat
|
||||||
|
class PrivateChatCreateData(BaseModel):
|
||||||
|
chat_id: UUID = Field(..., description="ID созданного или существующего приватного чата")
|
||||||
|
chat_type: Literal["private", "self"]
|
||||||
|
status: str
|
||||||
|
message: str
|
||||||
|
|
||||||
|
|
||||||
|
class PrivateChatCreateResponse(BaseModel):
|
||||||
|
status: str
|
||||||
|
data: PrivateChatCreateData
|
||||||
|
|||||||
@ -4,7 +4,8 @@ from app.core.localizer import localizer
|
|||||||
from app.core.models.chat_models import (
|
from app.core.models.chat_models import (
|
||||||
PrivateChatListResponse, PrivateChatListData,
|
PrivateChatListResponse, PrivateChatListData,
|
||||||
PrivateChatHistoryResponse, PrivateChatHistoryData,
|
PrivateChatHistoryResponse, PrivateChatHistoryData,
|
||||||
PrivateMessageSendRequest, PrivateMessageSendResponse
|
PrivateMessageSendRequest, PrivateMessageSendResponse,
|
||||||
|
PrivateChatCreateResponse, PrivateChatCreateData
|
||||||
)
|
)
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
from app.core.http_client import get_client, authorized_get, authorized_post
|
from app.core.http_client import get_client, authorized_get, authorized_post
|
||||||
@ -116,3 +117,40 @@ async def send_private_message(login: str, token: str, payload: "PrivateMessageS
|
|||||||
return False, f"{localizer.translate('Сетевая ошибка')}: {e}"
|
return False, f"{localizer.translate('Сетевая ошибка')}: {e}"
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return False, f"{localizer.translate('Произошла ошибка')}: {e}"
|
return False, f"{localizer.translate('Произошла ошибка')}: {e}"
|
||||||
|
|
||||||
|
async def create_private_chat(login: str, token: str, target_user_id: str):
|
||||||
|
"""
|
||||||
|
??????? (??? ???????? ????????????) ????????? ??? ? ?????????????.
|
||||||
|
:return: tuple (ok: bool, data: PrivateChatCreateData | str)
|
||||||
|
"""
|
||||||
|
url = f"{config.BASE_URL}/v1/chat/private/create"
|
||||||
|
headers = {"Authorization": f"Bearer {token}"}
|
||||||
|
params = {"target_user_id": target_user_id}
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = await authorized_post(url, login=login, access_token=token, headers=headers, params=params)
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
data = response.json()
|
||||||
|
if data.get("status") == "fine":
|
||||||
|
model = PrivateChatCreateResponse(**data)
|
||||||
|
return True, model.data
|
||||||
|
return False, data.get("detail", localizer.translate("????????? ??????"))
|
||||||
|
|
||||||
|
if response.status_code in [401, 403, 404]:
|
||||||
|
error_data = response.json()
|
||||||
|
return False, error_data.get("detail", localizer.translate("???????????? ???? ??? ?????? ?? ??????"))
|
||||||
|
|
||||||
|
if response.status_code == 422:
|
||||||
|
error_data = response.json()
|
||||||
|
detail = error_data.get("detail")
|
||||||
|
if isinstance(detail, list):
|
||||||
|
return False, ", ".join([e.get("msg", localizer.translate("???????????? ?????????")) for e in detail])
|
||||||
|
return False, detail or localizer.translate("???????????? ?????????")
|
||||||
|
|
||||||
|
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}"
|
||||||
|
|||||||
@ -19,10 +19,11 @@ from app.core.services.auth_service import get_user_role
|
|||||||
from app.core.database import get_current_access_token
|
from app.core.database import get_current_access_token
|
||||||
from app.core.localizer import localizer
|
from app.core.localizer import localizer
|
||||||
from app.ui.views.chat_view import ChatView
|
from app.ui.views.chat_view import ChatView
|
||||||
from app.core.services.chat_service import get_chat_history, send_private_message
|
from app.core.services.chat_service import get_chat_history, send_private_message, create_private_chat
|
||||||
from app.core.models.chat_models import PrivateMessageSendRequest, MessageItem
|
from app.core.models.chat_models import PrivateMessageSendRequest, MessageItem
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
from app.core.services.search_service import search_by_query
|
from app.core.services.search_service import search_by_query
|
||||||
|
import app.core.config as config
|
||||||
|
|
||||||
class YobbleHomeView(QWidget):
|
class YobbleHomeView(QWidget):
|
||||||
REQUIRED_PERMISSIONS = {
|
REQUIRED_PERMISSIONS = {
|
||||||
@ -741,8 +742,8 @@ class YobbleHomeView(QWidget):
|
|||||||
def open_profile_view(self, user: dict):
|
def open_profile_view(self, user: dict):
|
||||||
try:
|
try:
|
||||||
self.profile_view = ProfileView(user)
|
self.profile_view = ProfileView(user)
|
||||||
# stub handlers for actions
|
# create private chat on click
|
||||||
self.profile_view.start_chat_clicked.connect(lambda u: self.show_notification("Скоро: написать сообщение"))
|
self.profile_view.start_chat_clicked.connect(lambda u: asyncio.ensure_future(self._start_private_chat(u)))
|
||||||
self.profile_view.follow_clicked.connect(lambda u: self.show_notification("Скоро: подписка"))
|
self.profile_view.follow_clicked.connect(lambda u: self.show_notification("Скоро: подписка"))
|
||||||
self.bottom_bar.hide()
|
self.bottom_bar.hide()
|
||||||
self.burger_menu_button.hide()
|
self.burger_menu_button.hide()
|
||||||
@ -752,6 +753,27 @@ class YobbleHomeView(QWidget):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.show_notification(str(e), is_error=True)
|
self.show_notification(str(e), is_error=True)
|
||||||
|
|
||||||
|
async def _start_private_chat(self, user: dict):
|
||||||
|
try:
|
||||||
|
target_user_id = str(user.get("user_id") or (user.get("profile") or {}).get("user_id") or "")
|
||||||
|
if not target_user_id:
|
||||||
|
self.show_notification("Не удалось определить пользователя", is_error=True)
|
||||||
|
return
|
||||||
|
token = await get_current_access_token()
|
||||||
|
if not token:
|
||||||
|
self.show_notification("Нет токена авторизации", is_error=True)
|
||||||
|
return
|
||||||
|
ok, data = await create_private_chat(self.username, token, target_user_id)
|
||||||
|
if not ok:
|
||||||
|
self.show_notification(str(data), is_error=True)
|
||||||
|
return
|
||||||
|
# открыть чат
|
||||||
|
from uuid import UUID as _UUID
|
||||||
|
chat_uuid = _UUID(str(data.chat_id)) if hasattr(data, 'chat_id') else _UUID(str(data.get('chat_id')))
|
||||||
|
self.open_chat_view(chat_uuid)
|
||||||
|
except Exception as e:
|
||||||
|
self.show_notification(str(e), is_error=True)
|
||||||
|
|
||||||
def close_profile_view(self):
|
def close_profile_view(self):
|
||||||
self.content_stack.setCurrentWidget(self.search_results_view)
|
self.content_stack.setCurrentWidget(self.search_results_view)
|
||||||
self.bottom_bar.show()
|
self.bottom_bar.show()
|
||||||
@ -973,3 +995,15 @@ class YobbleHomeView(QWidget):
|
|||||||
}}
|
}}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# def _update_window_title(self, title):
|
||||||
|
# def set_title():
|
||||||
|
# window = self.window()
|
||||||
|
# if not window:
|
||||||
|
# return
|
||||||
|
|
||||||
|
# title = f"{title} | {config.APP_HEADER}"
|
||||||
|
|
||||||
|
# window.setWindowTitle(title)
|
||||||
|
|
||||||
|
# # Откладываем выполнение, чтобы `self.window()` уже был готов
|
||||||
|
# QTimer.singleShot(0, set_title)
|
||||||
|
|||||||
Reference in New Issue
Block a user