profile patch
This commit is contained in:
		
							parent
							
								
									e54cec4c49
								
							
						
					
					
						commit
						f3a2812ccc
					
				@ -75,4 +75,17 @@ 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)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user