Merge pull request 'websocket-self-flag: добавил флаг is_self в сообщениях вебсокетов' (#63) from websocket-self-flag into test
Reviewed-on: #63 Reviewed-by: Raykov-MS <RaykovMS@avt.rshb.ru>
This commit is contained in:
commit
d9e1cc4263
@ -1,3 +1,4 @@
|
|||||||
|
import asyncio
|
||||||
from contextlib import asynccontextmanager
|
from contextlib import asynccontextmanager
|
||||||
from dataclasses import asdict
|
from dataclasses import asdict
|
||||||
import dataclasses
|
import dataclasses
|
||||||
@ -152,7 +153,7 @@ class ConnectionManager:
|
|||||||
|
|
||||||
async def broadcast_to_other(
|
async def broadcast_to_other(
|
||||||
self,
|
self,
|
||||||
message: str,
|
data: dict,
|
||||||
user_id: int,
|
user_id: int,
|
||||||
con_key: ConnectionKeyEnum,
|
con_key: ConnectionKeyEnum,
|
||||||
**kwargs,
|
**kwargs,
|
||||||
@ -162,6 +163,10 @@ class ConnectionManager:
|
|||||||
if key not in self.connections[con_key]:
|
if key not in self.connections[con_key]:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
data = data.copy()
|
||||||
|
data["is_self"] = False
|
||||||
|
message = dumps(data, default=_convert_error, ensure_ascii=False)
|
||||||
|
|
||||||
for con_info in self.connections[con_key][key]:
|
for con_info in self.connections[con_key][key]:
|
||||||
if con_info.user_id != user_id:
|
if con_info.user_id != user_id:
|
||||||
try:
|
try:
|
||||||
@ -171,20 +176,41 @@ class ConnectionManager:
|
|||||||
|
|
||||||
async def broadcast_to_all(
|
async def broadcast_to_all(
|
||||||
self,
|
self,
|
||||||
message: str,
|
data: dict,
|
||||||
con_key: ConnectionKeyEnum,
|
con_key: ConnectionKeyEnum,
|
||||||
|
user_id: int | None = None,
|
||||||
**kwargs,
|
**kwargs,
|
||||||
):
|
):
|
||||||
key = frozenset(kwargs.items())
|
key = frozenset(kwargs.items())
|
||||||
if key not in self.connections[con_key]:
|
if key not in self.connections[con_key]:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
data = data.copy()
|
||||||
|
if user_id is None:
|
||||||
|
data["is_self"] = None
|
||||||
|
default_message = dumps(data, default=_convert_error, ensure_ascii=False)
|
||||||
|
self_message = None
|
||||||
|
else:
|
||||||
|
data["is_self"] = False
|
||||||
|
default_message = dumps(data, default=_convert_error, ensure_ascii=False)
|
||||||
|
data["is_self"] = True
|
||||||
|
self_message = dumps(data, default=_convert_error, ensure_ascii=False)
|
||||||
|
|
||||||
for con_info in self.connections[con_key][key]:
|
for con_info in self.connections[con_key][key]:
|
||||||
try:
|
try:
|
||||||
await con_info.ws.send_text(message)
|
if user_id is not None and con_info.user_id == user_id:
|
||||||
|
await con_info.ws.send_text(self_message)
|
||||||
|
else:
|
||||||
|
await con_info.ws.send_text(default_message)
|
||||||
|
|
||||||
|
|
||||||
except:
|
except:
|
||||||
pass # Игнорируем недоступные соединения
|
pass # Игнорируем недоступные соединения
|
||||||
|
|
||||||
async def send_back(self, message: str, websocket: WebSocket):
|
async def send_back(self, data: dict, websocket: WebSocket):
|
||||||
|
data = data.copy()
|
||||||
|
data["is_self"] = True
|
||||||
|
message = dumps(data, default=_convert_error, ensure_ascii=False)
|
||||||
await websocket.send_text(message)
|
await websocket.send_text(message)
|
||||||
|
|
||||||
async def get_data(self, websocket: WebSocket) -> dict:
|
async def get_data(self, websocket: WebSocket) -> dict:
|
||||||
@ -665,16 +691,16 @@ async def process_websocket(
|
|||||||
):
|
):
|
||||||
data["error"] = "Ячейка уже редактируется другим пользователем"
|
data["error"] = "Ячейка уже редактируется другим пользователем"
|
||||||
await manager.send_back(
|
await manager.send_back(
|
||||||
dumps(data, default=_convert_error, ensure_ascii=False),
|
data,
|
||||||
websocket,
|
websocket,
|
||||||
)
|
)
|
||||||
continue
|
continue
|
||||||
await manager.send_back(
|
await manager.send_back(
|
||||||
dumps(data, default=_convert_error, ensure_ascii=False),
|
data,
|
||||||
websocket,
|
websocket,
|
||||||
)
|
)
|
||||||
await manager.broadcast_to_other(
|
await manager.broadcast_to_other(
|
||||||
message=dumps(data, default=_convert_error, ensure_ascii=False),
|
data=data,
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
con_key=con_key,
|
con_key=con_key,
|
||||||
**kwargs_process,
|
**kwargs_process,
|
||||||
@ -688,11 +714,11 @@ async def process_websocket(
|
|||||||
form_key=kwargs_process,
|
form_key=kwargs_process,
|
||||||
)
|
)
|
||||||
await manager.send_back(
|
await manager.send_back(
|
||||||
dumps(data, default=_convert_error, ensure_ascii=False),
|
data,
|
||||||
websocket,
|
websocket,
|
||||||
)
|
)
|
||||||
await manager.broadcast_to_other(
|
await manager.broadcast_to_other(
|
||||||
message=dumps(data, default=_convert_error, ensure_ascii=False),
|
data=data,
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
con_key=con_key,
|
con_key=con_key,
|
||||||
**kwargs_process,
|
**kwargs_process,
|
||||||
@ -707,7 +733,7 @@ async def process_websocket(
|
|||||||
):
|
):
|
||||||
data["error"] = "Ячейка уже редактируется другим пользователем"
|
data["error"] = "Ячейка уже редактируется другим пользователем"
|
||||||
await manager.send_back(
|
await manager.send_back(
|
||||||
dumps(data, default=_convert_error, ensure_ascii=False),
|
data,
|
||||||
websocket,
|
websocket,
|
||||||
)
|
)
|
||||||
continue
|
continue
|
||||||
@ -719,7 +745,7 @@ async def process_websocket(
|
|||||||
):
|
):
|
||||||
data["error"] = "Ячейка уже редактируется другим пользователем"
|
data["error"] = "Ячейка уже редактируется другим пользователем"
|
||||||
await manager.send_back(
|
await manager.send_back(
|
||||||
dumps(data, default=_convert_error, ensure_ascii=False),
|
data,
|
||||||
websocket,
|
websocket,
|
||||||
)
|
)
|
||||||
continue
|
continue
|
||||||
@ -733,7 +759,7 @@ async def process_websocket(
|
|||||||
"Нельзя удалить строку: в этой строке есть редактируемые ячейки"
|
"Нельзя удалить строку: в этой строке есть редактируемые ячейки"
|
||||||
)
|
)
|
||||||
await manager.send_back(
|
await manager.send_back(
|
||||||
dumps(data, default=_convert_error, ensure_ascii=False),
|
data,
|
||||||
websocket,
|
websocket,
|
||||||
)
|
)
|
||||||
continue
|
continue
|
||||||
@ -762,12 +788,13 @@ async def process_websocket(
|
|||||||
"row_deleted",
|
"row_deleted",
|
||||||
]:
|
]:
|
||||||
await manager.broadcast_to_all(
|
await manager.broadcast_to_all(
|
||||||
message=dumps(data, default=_convert_error),
|
data=data,
|
||||||
|
user_id=user_id,
|
||||||
**kwargs
|
**kwargs
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
await manager.broadcast_to_other(
|
await manager.broadcast_to_other(
|
||||||
message=dumps(data, default=_convert_error),
|
data=data,
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
**kwargs,
|
**kwargs,
|
||||||
)
|
)
|
||||||
@ -775,13 +802,13 @@ async def process_websocket(
|
|||||||
except BasicAppException as e:
|
except BasicAppException as e:
|
||||||
data["error"] = e.description or "Неизвестная ошибка"
|
data["error"] = e.description or "Неизвестная ошибка"
|
||||||
await manager.send_back(
|
await manager.send_back(
|
||||||
message=dumps(data, default=_convert_error),
|
data=data,
|
||||||
websocket=websocket,
|
websocket=websocket,
|
||||||
)
|
)
|
||||||
except IntegrityError as e:
|
except IntegrityError as e:
|
||||||
data["error"] = str(e)
|
data["error"] = str(e)
|
||||||
await manager.send_back(
|
await manager.send_back(
|
||||||
message=dumps(data, default=_convert_error),
|
data=data,
|
||||||
websocket=websocket,
|
websocket=websocket,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -791,7 +818,7 @@ async def process_websocket(
|
|||||||
if tp in handlers:
|
if tp in handlers:
|
||||||
data["error"] = loads((await handlers[tp](request=None, exc=e)).body)
|
data["error"] = loads((await handlers[tp](request=None, exc=e)).body)
|
||||||
await manager.send_back(
|
await manager.send_back(
|
||||||
message=dumps(data, default=_convert_error),
|
data=data,
|
||||||
websocket=websocket,
|
websocket=websocket,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user