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 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

View File

@@ -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'),
]

View File

@@ -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,

View File

@@ -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')

View File

@@ -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

View File

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

View File

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