From 9d0998fb2bc57286b0dc6cdfad02b25a54390bc1 Mon Sep 17 00:00:00 2001 From: SDE Date: Tue, 15 Aug 2023 16:05:41 +0300 Subject: [PATCH] 0.3.20 support chat v3 --- ChatServiceApp/funcs.py | 22 +- ChatServiceApp/js_urls.py | 2 +- ChatServiceApp/js_views.py | 216 +++++++++--------- ChatServiceApp/websocket_views.py | 74 ++++++ TWB/asgi.py | 2 +- TWB/settings.py | 2 +- .../widgets/w_chat_right_panel_tickets.html | 8 +- 7 files changed, 211 insertions(+), 115 deletions(-) diff --git a/ChatServiceApp/funcs.py b/ChatServiceApp/funcs.py index a3dab12..18d0c81 100644 --- a/ChatServiceApp/funcs.py +++ b/ChatServiceApp/funcs.py @@ -1,5 +1,5 @@ from .models import * -from django.db.models import Q +from django.db.models import Q, Value as V, Count, OuterRef, Subquery from django.http import HttpResponse, Http404, JsonResponse from django.template import loader, RequestContext from django.contrib.auth.decorators import login_required @@ -305,12 +305,28 @@ def get_ticketsDict_for_staff(user): def get_tickets_wo_manager(): - tickets = MsgGroup.objects.filter(enable=True, manager=None).order_by('-modifiedDT') + tickets = MsgGroup.objects.filter( + enable=True, manager=None + ).annotate( + unread_msgs_count=V(1) + ).order_by('-modifiedDT') + return tickets def get_tickets_for_manager(user): - tickets = MsgGroup.objects.filter(enable=True, manager=user).order_by('-modifiedDT') + msgs = Message.objects.filter(group=OuterRef('pk'), status='sended', receiver=user).values('id')[:1] + + tickets = MsgGroup.objects.filter( + enable=True, manager=user + ).annotate( + unread_msgs_count = Count(Subquery(msgs)) + # unread_msgs_count=Count( + # 'rel_messages_for_group', + # filter=Q(rel_messages_for_group__status='sended', rel_messages_for_group__receiver=user) + # ) + ).order_by('-modifiedDT') + return tickets \ No newline at end of file diff --git a/ChatServiceApp/js_urls.py b/ChatServiceApp/js_urls.py index 9b5c21d..41e9561 100644 --- a/ChatServiceApp/js_urls.py +++ b/ChatServiceApp/js_urls.py @@ -10,7 +10,7 @@ urlpatterns = [ path('support_create_ticket_form/', support_create_ticket_form_ajax, name='support_create_ticket_form_ajax'), path('create_ticket/', create_ticket_ajax, name='create_ticket_ajax'), path('support_show_chat_by_ticket/', support_show_chat_by_ticket_ajax, name='support_show_chat_by_ticket_ajax'), - path('send_msg/', send_msg_ajax, name='send_msg_ajax'), + # path('send_msg/', send_msg_ajax, name='send_msg_ajax'), # path('update_chat/', update_chat_ajax2, name='update_chat_ajax'), path('show_chat_w_user/', show_chat_w_user_ajax, name='show_chat_w_user_ajax'), ] \ No newline at end of file diff --git a/ChatServiceApp/js_views.py b/ChatServiceApp/js_views.py index a2650b9..acae6a3 100644 --- a/ChatServiceApp/js_views.py +++ b/ChatServiceApp/js_views.py @@ -231,112 +231,114 @@ def update_chat_ajax(request): return JsonResponse({'error': msg}, status=400) -@login_required(login_url='/profile/login/') -def send_msg_ajax(request): - from AuthApp.models import User - - if request.method != 'POST': - raise Http404 - - res_Dict = {} - msg = None - - try: - - data = json.loads(request.body) - ticket = None - - tpl_name = 'blocks/profile/b_messages_container.html' - - if data['text']: - - - if 'ticket_id' in data: - ticket = MsgGroup.objects.get(id=data['ticket_id']) - - sender = User.objects.get(id=data['sender']) - receiver = User.objects.get(id=data['receiver']) - - msg_create_kwargs = {} - - # если только что манагер присоединился к тикету - if ticket: - if not ticket.manager: - if sender.is_staff: - ticket.manager = sender - else: - ticket.manager = receiver - - ticket.save() - - kwargs = { - 'sender': ticket.owner, - 'receiver': ticket.manager, - 'text': ticket.text, - } - - kwargs.update({'group': ticket}) - - msg = Message.objects.create(**kwargs) - Message.objects.filter(id=msg.id).update(modifiedDT=ticket.createDT, createDT=ticket.createDT) - - res_Dict.update({ - 'ticket': ticket, - # 'cur_receiver': receiver, - # 'messages': get_messages_for_ticket(ticket), - # 'text': data['text'], - # 'modifiedDT': msg.modifiedDT - }) - - msg_create_kwargs.update({ - 'group': ticket, - }) - - res_Dict.update(get_ticketsDict_for_staff(request.user)) - - - # if not msg: - msg_create_kwargs.update({ - 'sender': sender, - 'receiver': receiver, - 'text': data['text'] - }) - - session_data = { - 'for_save_to_session':{ - 'user_alerts':{ - 'new_message': True - } - } - } - - receiver.user_profile.add_node_to_json_data(session_data, save=True) - - msg = Message.objects.create(**msg_create_kwargs) - - if ticket: - msgs = get_messages_for_ticket(ticket) - else: - msgs = get_msgs_for_chat_w_users(sender, receiver) - - receivers, unread_msgs_count = get_chat_receivers_for_user(request.user) - - - res_Dict.update({ - 'messages': msgs, - 'cur_receiver': receiver, - 'receivers': receivers, - 'text': data['text'], - 'modifiedDT': msgs[0].modifiedDT - }) - - - html = render_to_string(tpl_name, res_Dict, request=request) - return JsonResponse({'html': html}, status=200) - - except Exception as e: - msg = f'send_msg_ajax Error = {str(e)}' - return JsonResponse({'error': msg}, status=400) +# @login_required(login_url='/profile/login/') +# def send_msg_ajax(request): +# from AuthApp.models import User +# +# if request.method != 'POST': +# raise Http404 +# +# res_Dict = {} +# msg = None +# +# try: +# +# data = json.loads(request.body) +# ticket = None +# +# tpl_name = 'blocks/profile/b_messages_container.html' +# +# if data['text']: +# +# +# if 'ticket_id' in data: +# ticket = MsgGroup.objects.get(id=data['ticket_id']) +# +# sender = User.objects.get(id=data['sender']) +# receiver = User.objects.get(id=data['receiver']) +# +# msg_create_kwargs = {} +# +# # если только что манагер присоединился к тикету +# if ticket: +# if not ticket.manager: +# if sender.is_staff: +# ticket.manager = sender +# else: +# ticket.manager = receiver +# +# ticket.save() +# +# kwargs = { +# 'sender': ticket.owner, +# 'receiver': ticket.manager, +# 'text': ticket.text, +# } +# +# kwargs.update({'group': ticket}) +# +# msg = Message.objects.create(**kwargs) +# Message.objects.filter(id=msg.id).update(modifiedDT=ticket.createDT, createDT=ticket.createDT) +# +# # if +# +# res_Dict.update({ +# 'ticket': ticket, +# # 'cur_receiver': receiver, +# # 'messages': get_messages_for_ticket(ticket), +# # 'text': data['text'], +# # 'modifiedDT': msg.modifiedDT +# }) +# +# msg_create_kwargs.update({ +# 'group': ticket, +# }) +# +# res_Dict.update(get_ticketsDict_for_staff(request.user)) +# +# +# # if not msg: +# msg_create_kwargs.update({ +# 'sender': sender, +# 'receiver': receiver, +# 'text': data['text'] +# }) +# +# session_data = { +# 'for_save_to_session':{ +# 'user_alerts':{ +# 'new_message': True +# } +# } +# } +# +# receiver.user_profile.add_node_to_json_data(session_data, save=True) +# +# msg = Message.objects.create(**msg_create_kwargs) +# +# if ticket: +# msgs = get_messages_for_ticket(ticket) +# else: +# msgs = get_msgs_for_chat_w_users(sender, receiver) +# +# receivers, unread_msgs_count = get_chat_receivers_for_user(request.user) +# +# +# res_Dict.update({ +# 'messages': msgs, +# 'cur_receiver': receiver, +# 'receivers': receivers, +# 'text': data['text'], +# 'modifiedDT': msgs[0].modifiedDT +# }) +# +# +# html = render_to_string(tpl_name, res_Dict, request=request) +# return JsonResponse({'html': html}, status=200) +# +# except Exception as e: +# msg = f'send_msg_ajax Error = {str(e)}' +# return JsonResponse({'error': msg}, status=400) @@ -366,6 +368,8 @@ def support_show_chat_by_ticket_ajax(request): # if len(msgs) > 1: new_msg_allow = True + # msgs.filter(receiver=cur_receiver).update(status='seen') + Dict = { 'ticket': ticket, 'messages': msgs, diff --git a/ChatServiceApp/websocket_views.py b/ChatServiceApp/websocket_views.py index 28fcfd9..632010f 100644 --- a/ChatServiceApp/websocket_views.py +++ b/ChatServiceApp/websocket_views.py @@ -3,6 +3,39 @@ from channels.generic.websocket import WebsocketConsumer, AsyncWebsocketConsumer from asgiref.sync import async_to_sync, sync_to_async # from channels.auth import channel_session_user, channel_session_user_from_http from channels.layers import get_channel_layer +from django.template.loader import render_to_string + +def get_tickets_wo_manager_html(ticket, user_id, data): + from .funcs import get_tickets_wo_manager + + # если не менеджер - возвращаем None + if ticket.manager.id != user_id: + return None + + Dict = { + 'ticket': ticket, + 'tickets_wo_manager': get_tickets_wo_manager() + } + tickets_wo_manager_html = render_to_string('widgets/w_tickets_wo_manager.html', Dict) + + return tickets_wo_manager_html + + +def get_tickets_w_manager_html(ticket, user_id, data): + from .funcs import get_tickets_w_manager + + # если не менеджер - возвращаем None + if ticket.manager.id != user_id: + return None + + Dict = { + 'ticket': ticket, + 'tickets_w_manager': get_tickets_w_manager() + } + tickets_w_manager_html = render_to_string('widgets/w_tickets_wo_manager.html', Dict) + + return tickets_w_manager_html + class ChatConsumer(WebsocketConsumer): @@ -35,19 +68,39 @@ class ChatConsumer(WebsocketConsumer): def receive(self, text_data): print(f'ws receive text_data = {text_data}') + from AuthApp.models import User + from .models import Message, MsgGroup + + data = json.loads(text_data) sender = data['sender'] receiver = data['receiver'] + + + from .funcs import send_msg, get_update_chat_Dict data.update({ 'cur_user': sender, 'required_beep': False, }) send_msg(data) + + ticket = None + + if 'ticket_id' in data and data['ticket_id']: + ticket = MsgGroup.objects.get(id=data['ticket_id']) + # receiver_obj = User.objects.get(id=receiver) + msgs = Message.objects.filter( + receiver__id=sender, group__id=data['ticket_id'] + ) + msgs.update(status='seen') + Dict = get_update_chat_Dict(data) + + group_name = f'user_{sender}' resDict = { 'type': 'update_chat', @@ -56,6 +109,16 @@ class ChatConsumer(WebsocketConsumer): 'group_name': group_name, } + + tickets_wo_manager_html = get_tickets_wo_manager_html(ticket, sender, data) + if tickets_wo_manager_html: + resDict.update({'tickets_wo_manager_html': tickets_wo_manager_html}) + + tickets_w_manager_html = get_tickets_w_manager_html(ticket, sender, data) + if tickets_w_manager_html: + resDict.update({'tickets_w_manager_html': tickets_w_manager_html}) + + resDict.update(Dict) async_to_sync(self.channel_layer.group_send)( group_name, @@ -81,12 +144,23 @@ class ChatConsumer(WebsocketConsumer): 'receiver': sender, 'group_name': group_name, } + + tickets_wo_manager_html = get_tickets_wo_manager_html(ticket, receiver, data) + if tickets_wo_manager_html: + resDict.update({'tickets_wo_manager_html': tickets_wo_manager_html}) + + tickets_w_manager_html = get_tickets_w_manager_html(ticket, sender, data) + if tickets_w_manager_html: + resDict.update({'tickets_w_manager_html': tickets_w_manager_html}) + resDict.update(Dict) async_to_sync(self.channel_layer.group_send)( group_name, resDict ) + + def echo(self, data): print('ws echo') diff --git a/TWB/asgi.py b/TWB/asgi.py index ad656f2..436f4f6 100644 --- a/TWB/asgi.py +++ b/TWB/asgi.py @@ -11,7 +11,7 @@ import os from django.core.asgi import get_asgi_application from channels.routing import ProtocolTypeRouter, URLRouter -from channels.auth import AuthMiddlewareStack +# from channels.auth import AuthMiddlewareStack from ChatServiceApp.websocket_urls import websocket_urlpatterns from channels.security.websocket import AllowedHostsOriginValidator from channels.sessions import SessionMiddlewareStack diff --git a/TWB/settings.py b/TWB/settings.py index 94b2053..d32532e 100644 --- a/TWB/settings.py +++ b/TWB/settings.py @@ -88,7 +88,7 @@ TEMPLATES = [ }, ] -WSGI_APPLICATION = 'TWB.wsgi.application' +# WSGI_APPLICATION = 'TWB.wsgi.application' ASGI_APPLICATION = 'TWB.asgi.application' CHANNEL_LAYERS = { diff --git a/templates/widgets/w_chat_right_panel_tickets.html b/templates/widgets/w_chat_right_panel_tickets.html index b7150f5..77af64d 100644 --- a/templates/widgets/w_chat_right_panel_tickets.html +++ b/templates/widgets/w_chat_right_panel_tickets.html @@ -9,7 +9,9 @@ {{ item.owner.last_name }} {{ item.owner.first_name }} {{ item.name }} -
-
1
-
+ {% if item.unread_msgs_count %} +
+
{{ item.unread_msgs_count }}
+
+ {% endif %} \ No newline at end of file