diff --git a/ChatServiceApp/funcs.py b/ChatServiceApp/funcs.py index 4fa6518..e57ad89 100644 --- a/ChatServiceApp/funcs.py +++ b/ChatServiceApp/funcs.py @@ -11,14 +11,99 @@ from django.urls import reverse import json from datetime import datetime, time + +def update_chat(data): + from AuthApp.models import User + + res_Dict = {} + msgs = [] + Dict = {} + context_Dict = {} + + last_message_modifiedDT = None + + required_beep = False + + try: + + if type(data) == str: + data = json.loads(data) + ticket = None + + tpl_name = 'blocks/profile/b_messages_container.html' + + + if 'ticket_id' in data and data['ticket_id'] and data['ticket_id'] != 'null': + ticket = MsgGroup.objects.get(id=data['ticket_id']) + + sender = User.objects.get(id=data['sender']) + receiver = None + if 'receiver' in data and data['receiver']: + receiver = User.objects.get(id=data['receiver']) + + context_Dict.update({'cur_receiver': receiver}) + + + if not ticket: + + # получаем правую панель с получателями + # получатели + receivers, unread_msgs_count = get_chat_receivers_for_user(sender, receiver) + # собираем для сохранения в профиле + receivers_unread_msgs_count = sorted( + [{'id': item.id, 'unread_msgs_count': item.unread_msgs_count} for item in receivers], + key=lambda d: d['id']) + # забираем данные из профиля + saved_receivers_unread_msgs_count = sender.user_profile.get_node_by_name( + 'receivers_unread_msgs_count') + # если данных нет или данные поменялись + if saved_receivers_unread_msgs_count == None or receivers_unread_msgs_count != saved_receivers_unread_msgs_count: + # записываем данные в профиль + sender.user_profile.add_node_to_json_data( + {'receivers_unread_msgs_count': receivers_unread_msgs_count}, save=True) + # разрешаем сигнал + required_beep = True + + # формируем правую панель + context_Dict.update({'receivers': receivers}) + users_list_html = render_to_string( + 'blocks/profile/b_list_of_users_messenger.html', context_Dict) + res_Dict.update({ + 'users_list_html': users_list_html, + 'unread_msgs_count': unread_msgs_count + }) + + + if sender and receiver: + msgs = get_msgs_for_chat_w_users(sender, receiver) + unreaded_msgs = msgs.filter(status='sended') + if msgs and unreaded_msgs: + context_Dict.update({'messages': msgs}) + chat_html = render_to_string(tpl_name, context_Dict) + res_Dict.update({'chat_html': chat_html}) + required_beep = True + unreaded_msgs.update(status='seen') + + + + res_Dict.update({ + 'required_beep': required_beep, + }) + return res_Dict + + except Exception as e: + msg = f'update_chat_ajax2 Error = {str(e)}' + return {'error': msg} + + def send_msg(data): from AuthApp.models import User res_Dict = {} msg = None try: - - data = json.loads(data) + if type(data) == str: + data = json.loads(data) ticket = None tpl_name = 'blocks/profile/b_messages_container.html' diff --git a/ChatServiceApp/websocket_views.py b/ChatServiceApp/websocket_views.py index 78c35c9..b251e70 100644 --- a/ChatServiceApp/websocket_views.py +++ b/ChatServiceApp/websocket_views.py @@ -22,16 +22,7 @@ class ChatConsumer(WebsocketConsumer): print(f'self.channel_name = {self.channel_name}') self.accept() - def ws_send_msg(self, msg_type, group_name, msg): - msgDict = { - 'type': msg_type, - 'message': msg, - # 'sender': resDict['sender'] - } - async_to_sync(self.channel_layer.group_send)( - group_name, - msgDict - ) + def receive(self, text_data): @@ -39,26 +30,36 @@ class ChatConsumer(WebsocketConsumer): data = json.loads(text_data) - from .funcs import send_msg - Dict = send_msg(text_data) + sender = data['sender'] + receiver = data['receiver'] + + from .funcs import send_msg, update_chat + send_msg(data) + Dict = update_chat(data) - group_name = f'user_{data["receiver"]}' resDict = { - 'type': 'echo', - 'message': f'group = {group_name}', + 'type': 'update_chat', + # 'message': Dict, # 'sender': resDict['sender'] } + resDict.update(Dict) + group_name = f'user_{sender}' async_to_sync(self.channel_layer.group_send)( group_name, resDict ) + data['sender'] = receiver + data['receiver'] = sender + Dict = update_chat(data) + + group_name = f'user_{receiver}' resDict = { - 'type': 'echo', - 'message': Dict, + 'type': 'update_chat', + # 'message': Dict, # 'sender': resDict['sender'] } - group_name = f'user_{data["sender"]}' + resDict.update(Dict) async_to_sync(self.channel_layer.group_send)( group_name, resDict @@ -69,9 +70,12 @@ class ChatConsumer(WebsocketConsumer): self.send(text_data=json.dumps(data)) + def update_chat(self, data): + print('ws update_chat') + + self.send(text_data=json.dumps(data)) + def ws_send_msg(self, data): print('ws ws_send_msg') - data['type'] = 'chat' - self.send(text_data=json.dumps(data)) \ No newline at end of file