support chat v3
This commit is contained in:
SDE
2023-08-15 16:05:41 +03:00
parent e9d4d71c9d
commit 9d0998fb2b
7 changed files with 211 additions and 115 deletions

View File

@@ -1,5 +1,5 @@
from .models import * 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.http import HttpResponse, Http404, JsonResponse
from django.template import loader, RequestContext from django.template import loader, RequestContext
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
@@ -305,12 +305,28 @@ def get_ticketsDict_for_staff(user):
def get_tickets_wo_manager(): 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 return tickets
def get_tickets_for_manager(user): 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 return tickets

View File

@@ -10,7 +10,7 @@ urlpatterns = [
path('support_create_ticket_form/', support_create_ticket_form_ajax, name='support_create_ticket_form_ajax'), 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('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('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('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'), path('show_chat_w_user/', show_chat_w_user_ajax, name='show_chat_w_user_ajax'),
] ]

View File

@@ -231,112 +231,114 @@ def update_chat_ajax(request):
return JsonResponse({'error': msg}, status=400) return JsonResponse({'error': msg}, status=400)
@login_required(login_url='/profile/login/') # @login_required(login_url='/profile/login/')
def send_msg_ajax(request): # def send_msg_ajax(request):
from AuthApp.models import User # from AuthApp.models import User
#
if request.method != 'POST': # if request.method != 'POST':
raise Http404 # raise Http404
#
res_Dict = {} # res_Dict = {}
msg = None # msg = None
#
try: # try:
#
data = json.loads(request.body) # data = json.loads(request.body)
ticket = None # ticket = None
#
tpl_name = 'blocks/profile/b_messages_container.html' # tpl_name = 'blocks/profile/b_messages_container.html'
#
if data['text']: # if data['text']:
#
#
if 'ticket_id' in data: # if 'ticket_id' in data:
ticket = MsgGroup.objects.get(id=data['ticket_id']) # ticket = MsgGroup.objects.get(id=data['ticket_id'])
#
sender = User.objects.get(id=data['sender']) # sender = User.objects.get(id=data['sender'])
receiver = User.objects.get(id=data['receiver']) # receiver = User.objects.get(id=data['receiver'])
#
msg_create_kwargs = {} # msg_create_kwargs = {}
#
# если только что манагер присоединился к тикету # # если только что манагер присоединился к тикету
if ticket: # if ticket:
if not ticket.manager: # if not ticket.manager:
if sender.is_staff: # if sender.is_staff:
ticket.manager = sender # ticket.manager = sender
else: # else:
ticket.manager = receiver # ticket.manager = receiver
#
ticket.save() # ticket.save()
#
kwargs = { # kwargs = {
'sender': ticket.owner, # 'sender': ticket.owner,
'receiver': ticket.manager, # 'receiver': ticket.manager,
'text': ticket.text, # 'text': ticket.text,
} # }
#
kwargs.update({'group': ticket}) # kwargs.update({'group': ticket})
#
msg = Message.objects.create(**kwargs) # msg = Message.objects.create(**kwargs)
Message.objects.filter(id=msg.id).update(modifiedDT=ticket.createDT, createDT=ticket.createDT) # Message.objects.filter(id=msg.id).update(modifiedDT=ticket.createDT, createDT=ticket.createDT)
#
res_Dict.update({ # # if
'ticket': ticket, #
# 'cur_receiver': receiver, # res_Dict.update({
# 'messages': get_messages_for_ticket(ticket), # 'ticket': ticket,
# 'text': data['text'], # # 'cur_receiver': receiver,
# 'modifiedDT': msg.modifiedDT # # 'messages': get_messages_for_ticket(ticket),
}) # # 'text': data['text'],
# # 'modifiedDT': msg.modifiedDT
msg_create_kwargs.update({ # })
'group': ticket, #
}) # msg_create_kwargs.update({
# 'group': ticket,
res_Dict.update(get_ticketsDict_for_staff(request.user)) # })
#
# res_Dict.update(get_ticketsDict_for_staff(request.user))
# if not msg: #
msg_create_kwargs.update({ #
'sender': sender, # # if not msg:
'receiver': receiver, # msg_create_kwargs.update({
'text': data['text'] # 'sender': sender,
}) # 'receiver': receiver,
# 'text': data['text']
session_data = { # })
'for_save_to_session':{ #
'user_alerts':{ # session_data = {
'new_message': True # '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) # receiver.user_profile.add_node_to_json_data(session_data, save=True)
#
if ticket: # msg = Message.objects.create(**msg_create_kwargs)
msgs = get_messages_for_ticket(ticket) #
else: # if ticket:
msgs = get_msgs_for_chat_w_users(sender, receiver) # msgs = get_messages_for_ticket(ticket)
# else:
receivers, unread_msgs_count = get_chat_receivers_for_user(request.user) # 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, # res_Dict.update({
'receivers': receivers, # 'messages': msgs,
'text': data['text'], # 'cur_receiver': receiver,
'modifiedDT': msgs[0].modifiedDT # '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) #
# html = render_to_string(tpl_name, res_Dict, request=request)
except Exception as e: # return JsonResponse({'html': html}, status=200)
msg = f'send_msg_ajax Error = {str(e)}' #
return JsonResponse({'error': msg}, status=400) # 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: # if len(msgs) > 1:
new_msg_allow = True new_msg_allow = True
# msgs.filter(receiver=cur_receiver).update(status='seen')
Dict = { Dict = {
'ticket': ticket, 'ticket': ticket,
'messages': msgs, 'messages': msgs,

View File

@@ -3,6 +3,39 @@ from channels.generic.websocket import WebsocketConsumer, AsyncWebsocketConsumer
from asgiref.sync import async_to_sync, sync_to_async from asgiref.sync import async_to_sync, sync_to_async
# from channels.auth import channel_session_user, channel_session_user_from_http # from channels.auth import channel_session_user, channel_session_user_from_http
from channels.layers import get_channel_layer 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): class ChatConsumer(WebsocketConsumer):
@@ -35,19 +68,39 @@ class ChatConsumer(WebsocketConsumer):
def receive(self, text_data): def receive(self, text_data):
print(f'ws receive text_data = {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) data = json.loads(text_data)
sender = data['sender'] sender = data['sender']
receiver = data['receiver'] receiver = data['receiver']
from .funcs import send_msg, get_update_chat_Dict from .funcs import send_msg, get_update_chat_Dict
data.update({ data.update({
'cur_user': sender, 'cur_user': sender,
'required_beep': False, 'required_beep': False,
}) })
send_msg(data) 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) Dict = get_update_chat_Dict(data)
group_name = f'user_{sender}' group_name = f'user_{sender}'
resDict = { resDict = {
'type': 'update_chat', 'type': 'update_chat',
@@ -56,6 +109,16 @@ class ChatConsumer(WebsocketConsumer):
'group_name': group_name, '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) resDict.update(Dict)
async_to_sync(self.channel_layer.group_send)( async_to_sync(self.channel_layer.group_send)(
group_name, group_name,
@@ -81,12 +144,23 @@ class ChatConsumer(WebsocketConsumer):
'receiver': sender, 'receiver': sender,
'group_name': group_name, '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) resDict.update(Dict)
async_to_sync(self.channel_layer.group_send)( async_to_sync(self.channel_layer.group_send)(
group_name, group_name,
resDict resDict
) )
def echo(self, data): def echo(self, data):
print('ws echo') print('ws echo')

View File

@@ -11,7 +11,7 @@ import os
from django.core.asgi import get_asgi_application from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack # from channels.auth import AuthMiddlewareStack
from ChatServiceApp.websocket_urls import websocket_urlpatterns from ChatServiceApp.websocket_urls import websocket_urlpatterns
from channels.security.websocket import AllowedHostsOriginValidator from channels.security.websocket import AllowedHostsOriginValidator
from channels.sessions import SessionMiddlewareStack from channels.sessions import SessionMiddlewareStack

View File

@@ -88,7 +88,7 @@ TEMPLATES = [
}, },
] ]
WSGI_APPLICATION = 'TWB.wsgi.application' # WSGI_APPLICATION = 'TWB.wsgi.application'
ASGI_APPLICATION = 'TWB.asgi.application' ASGI_APPLICATION = 'TWB.asgi.application'
CHANNEL_LAYERS = { CHANNEL_LAYERS = {

View File

@@ -9,7 +9,9 @@
<span class="user_name_messenger">{{ item.owner.last_name }} {{ item.owner.first_name }}</span> <span class="user_name_messenger">{{ item.owner.last_name }} {{ item.owner.first_name }}</span>
<span class="last-message-messenger-user-tab">{{ item.name }}</span> <span class="last-message-messenger-user-tab">{{ item.name }}</span>
</div> </div>
<div class="right-part-tab-user"> {% if item.unread_msgs_count %}
<div class="cost-messages-in-user-tab-messenger"><span>1</span></div> <div class="right-part-tab-user">
</div> <div class="cost-messages-in-user-tab-messenger"><span>{{ item.unread_msgs_count }}</span></div>
</div>
{% endif %}
</div> </div>