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 dataclasses import asdict
|
||||
import dataclasses
|
||||
@ -152,7 +153,7 @@ class ConnectionManager:
|
||||
|
||||
async def broadcast_to_other(
|
||||
self,
|
||||
message: str,
|
||||
data: dict,
|
||||
user_id: int,
|
||||
con_key: ConnectionKeyEnum,
|
||||
**kwargs,
|
||||
@ -162,6 +163,10 @@ class ConnectionManager:
|
||||
if key not in self.connections[con_key]:
|
||||
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]:
|
||||
if con_info.user_id != user_id:
|
||||
try:
|
||||
@ -171,20 +176,41 @@ class ConnectionManager:
|
||||
|
||||
async def broadcast_to_all(
|
||||
self,
|
||||
message: str,
|
||||
data: dict,
|
||||
con_key: ConnectionKeyEnum,
|
||||
user_id: int | None = None,
|
||||
**kwargs,
|
||||
):
|
||||
key = frozenset(kwargs.items())
|
||||
if key not in self.connections[con_key]:
|
||||
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]:
|
||||
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:
|
||||
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)
|
||||
|
||||
async def get_data(self, websocket: WebSocket) -> dict:
|
||||
@ -665,16 +691,16 @@ async def process_websocket(
|
||||
):
|
||||
data["error"] = "Ячейка уже редактируется другим пользователем"
|
||||
await manager.send_back(
|
||||
dumps(data, default=_convert_error, ensure_ascii=False),
|
||||
data,
|
||||
websocket,
|
||||
)
|
||||
continue
|
||||
await manager.send_back(
|
||||
dumps(data, default=_convert_error, ensure_ascii=False),
|
||||
data,
|
||||
websocket,
|
||||
)
|
||||
await manager.broadcast_to_other(
|
||||
message=dumps(data, default=_convert_error, ensure_ascii=False),
|
||||
data=data,
|
||||
user_id=user_id,
|
||||
con_key=con_key,
|
||||
**kwargs_process,
|
||||
@ -688,11 +714,11 @@ async def process_websocket(
|
||||
form_key=kwargs_process,
|
||||
)
|
||||
await manager.send_back(
|
||||
dumps(data, default=_convert_error, ensure_ascii=False),
|
||||
data,
|
||||
websocket,
|
||||
)
|
||||
await manager.broadcast_to_other(
|
||||
message=dumps(data, default=_convert_error, ensure_ascii=False),
|
||||
data=data,
|
||||
user_id=user_id,
|
||||
con_key=con_key,
|
||||
**kwargs_process,
|
||||
@ -707,7 +733,7 @@ async def process_websocket(
|
||||
):
|
||||
data["error"] = "Ячейка уже редактируется другим пользователем"
|
||||
await manager.send_back(
|
||||
dumps(data, default=_convert_error, ensure_ascii=False),
|
||||
data,
|
||||
websocket,
|
||||
)
|
||||
continue
|
||||
@ -719,7 +745,7 @@ async def process_websocket(
|
||||
):
|
||||
data["error"] = "Ячейка уже редактируется другим пользователем"
|
||||
await manager.send_back(
|
||||
dumps(data, default=_convert_error, ensure_ascii=False),
|
||||
data,
|
||||
websocket,
|
||||
)
|
||||
continue
|
||||
@ -733,7 +759,7 @@ async def process_websocket(
|
||||
"Нельзя удалить строку: в этой строке есть редактируемые ячейки"
|
||||
)
|
||||
await manager.send_back(
|
||||
dumps(data, default=_convert_error, ensure_ascii=False),
|
||||
data,
|
||||
websocket,
|
||||
)
|
||||
continue
|
||||
@ -762,12 +788,13 @@ async def process_websocket(
|
||||
"row_deleted",
|
||||
]:
|
||||
await manager.broadcast_to_all(
|
||||
message=dumps(data, default=_convert_error),
|
||||
data=data,
|
||||
user_id=user_id,
|
||||
**kwargs
|
||||
)
|
||||
else:
|
||||
await manager.broadcast_to_other(
|
||||
message=dumps(data, default=_convert_error),
|
||||
data=data,
|
||||
user_id=user_id,
|
||||
**kwargs,
|
||||
)
|
||||
@ -775,13 +802,13 @@ async def process_websocket(
|
||||
except BasicAppException as e:
|
||||
data["error"] = e.description or "Неизвестная ошибка"
|
||||
await manager.send_back(
|
||||
message=dumps(data, default=_convert_error),
|
||||
data=data,
|
||||
websocket=websocket,
|
||||
)
|
||||
except IntegrityError as e:
|
||||
data["error"] = str(e)
|
||||
await manager.send_back(
|
||||
message=dumps(data, default=_convert_error),
|
||||
data=data,
|
||||
websocket=websocket,
|
||||
)
|
||||
|
||||
@ -791,7 +818,7 @@ async def process_websocket(
|
||||
if tp in handlers:
|
||||
data["error"] = loads((await handlers[tp](request=None, exc=e)).body)
|
||||
await manager.send_back(
|
||||
message=dumps(data, default=_convert_error),
|
||||
data=data,
|
||||
websocket=websocket,
|
||||
)
|
||||
else:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user