Merge remote-tracking branch 'origin/main'

This commit is contained in:
2023-08-15 17:36:55 +03:00
10 changed files with 238 additions and 118 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,35 @@ 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')
unread_msgs = Message.objects.filter(
group=OuterRef('pk'), status='sended', receiver=user
).values('id')[:1]
msgs = Message.objects.filter(
group=OuterRef('pk')
).order_by('-modifiedDT').values('modifiedDT')[:1]
tickets = MsgGroup.objects.filter(
enable=True, manager=user
).annotate(
unread_msgs_count = Count(Subquery(unread_msgs)),
last_msg_modifiedDT = 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('-unread_msgs_count', '-last_msg_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, data):
from .funcs import get_tickets_wo_manager
# если не менеджер - возвращаем None
if not ticket or 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, data):
from .funcs import get_tickets_for_manager
# если не менеджер - возвращаем None
if not ticket or ticket.manager.id != user.id:
return None
Dict = {
'ticket': ticket,
'tickets_w_manager': get_tickets_for_manager(user)
}
tickets_w_manager_html = render_to_string('widgets/w_tickets_w_manager.html', Dict)
return tickets_w_manager_html
class ChatConsumer(WebsocketConsumer):
@@ -35,10 +68,18 @@ 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']
sender_obj = User.objects.get(id=sender)
receiver_obj = User.objects.get(id=receiver)
from .funcs import send_msg, get_update_chat_Dict
data.update({
@@ -46,8 +87,21 @@ class ChatConsumer(WebsocketConsumer):
'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 +110,17 @@ class ChatConsumer(WebsocketConsumer):
'group_name': group_name,
}
if ticket:
tickets_wo_manager_html = get_tickets_wo_manager_html(ticket, sender_obj, 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_obj, 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 +146,24 @@ class ChatConsumer(WebsocketConsumer):
'receiver': sender,
'group_name': group_name,
}
if ticket:
tickets_wo_manager_html = get_tickets_wo_manager_html(ticket, receiver_obj, 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, receiver_obj, 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

@@ -92,10 +92,21 @@ chatSocket.onmessage = function (e) {
if (data.tickets_wo_manager_html) {
if (document.querySelector(".list_linked_tickets") !== null || document.querySelector(".list_unlinked_tickets") !== null) {
document.querySelector(".list_unlinked_tickets").innerHTML = data.tickets_wo_manager_html
if (el_tab !== null) {
document.querySelector(".tab_user_messanger.select").classList.remove("select")
document.querySelector(`[data-cur-receiver-item="${old_item_tab_user}"]`).classList.add("select")
document.querySelector(`[data-cur-receiver-item="${old_item_tab_user}"]`).scrollIntoView({behavior: "smooth"});
}
}
}
if (data.tickets_w_manager_html) {
if (document.querySelector(".list_linked_tickets") !== null || document.querySelector(".list_unlinked_tickets") !== null) {
document.querySelector(".list_linked_tickets").innerHTML = data.tickets_w_manager_html
if (el_tab !== null){
document.querySelector(".tab_user_messanger.select").classList.remove("select")
document.querySelector(`[data-cur-receiver-item="${old_item_tab_user}"]` ).classList.add("select")
document.querySelector(`[data-cur-receiver-item="${old_item_tab_user}"]` ).scrollIntoView(false)
document.querySelector(`[data-cur-receiver-item="${old_item_tab_user}"]` ).scrollIntoView({behavior: "smooth"});
}
}
@@ -111,6 +122,8 @@ chatSocket.onmessage = function (e) {
}
}
} else if (data.type === "update_support_chat"){
if (msg_cont !== null){
if (msg_cont.dataset['curReceiver'] === ""){

View File

@@ -187,7 +187,8 @@ function selectedUserMessenger (ticket_id=null,user_id=null){
document.querySelector(".info_profile").innerHTML = data.html;
document.querySelector(".enter-message-inp").focus()
document.querySelector(".tab_user_messanger.select").scrollIntoView()
document.querySelector(".tab_user_messanger.select").scrollIntoView({behavior: "smooth"});
},
error: function (data){

View File

@@ -19,7 +19,7 @@
<div class="container-header-chat">
<div class="header-chat-left-part">
<img class="chat-avatar" src="{% static "delete_later/Avatar.png" %}">
<span class="chat-username">{{ ticket.manager.last_name }} {{ ticket.manager.first_name }}</span>
<span class="chat-username">{{ cur_receiver.last_name }} {{ cur_receiver.first_name }}</span>
</div>
<div class="header-chat-right-part">
<img class="header-icons-right-part-padding" src="{% static "img/svg/phone.svg" %}">

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>