from django.shortcuts import render from uuid import uuid1 from .models import * from django.contrib import auth from django.http import HttpResponse, Http404, JsonResponse from django.template import loader, RequestContext from django.contrib.auth.decorators import login_required from BaseModels.mailSender import techSendMail from django.utils.translation import gettext as _ from datetime import datetime from django.template.loader import render_to_string from django.urls import reverse from .funcs import * import json from datetime import datetime, time from channels.layers import get_channel_layer from asgiref.sync import async_to_sync @login_required(login_url='/profile/login/') def show_chat_w_user_ajax(request): if request.method != 'POST': raise Http404 try: data = json.loads(request.body) Dict = get_chat_page_content_Dict(request, data['user_id']) tpl_name = 'blocks/profile/b_chats.html' html = render_to_string(tpl_name, Dict, request=request) return JsonResponse({'html': html}, status=200) except Exception as e: msg = f'show_chat_w_user_ajax Error = {str(e)}' return JsonResponse({'error': msg}, status=400) def update_chat_ajax2(request): from AuthApp.models import User if request.method != 'POST': raise Http404 res_Dict = {} msgs = [] Dict = {} context_Dict = {} last_message_modifiedDT = None required_beep = False try: data = json.loads(request.body) 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(request.user, 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 = request.user.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: # записываем данные в профиль request.user.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, request=request) 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, request=request) res_Dict.update({'chat_html': chat_html}) required_beep = True unreaded_msgs.update(status='seen') res_Dict.update({ 'required_beep': required_beep, }) return JsonResponse(res_Dict, status=200) except Exception as e: msg = f'update_chat_ajax2 Error = {str(e)}' return JsonResponse({'error': msg}, status=400) def update_chat_ajax(request): from AuthApp.models import User if request.method != 'POST': raise Http404 res_Dict = {} msgs = [] Dict = {} context_Dict = {} last_message_modifiedDT = None required_beep = False try: data = json.loads(request.body) 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']) if 'last_message_modifiedDT' in data: last_message_modifiedDT = datetime.strptime(data['last_message_modifiedDT'], '%d.%m.%Y %H:%M:%S:%f') 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 ticket: context_Dict.update({ 'ticket': ticket, }) msgs = get_messages_for_ticket(ticket) context_Dict.update({'messages': msgs}) context_Dict = get_ticketsDict_for_staff(request.user) tickets_list_html = render_to_string( 'blocks/profile/b_list_of_tickets_support_chat.html', context_Dict, request=request) res_Dict.update({ 'tickets_list_html': tickets_list_html, 'msgs_count': len(msgs) }) else: # получаем правую панель с получателями receivers, unread_msgs_count = get_chat_receivers_for_user(request.user, 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 = request.user.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: request.user.user_profile.add_node_to_json_data( {'receivers_unread_msgs_count': receivers_unread_msgs_count}, save=True) # if unread_msgs_count: required_beep = True context_Dict.update({'receivers': receivers}) users_list_html = render_to_string( 'blocks/profile/b_list_of_users_messenger.html', context_Dict, request=request) res_Dict.update({ 'users_list_html': users_list_html, 'unread_msgs_count': unread_msgs_count }) # если есть получатель - получаем сообщения чата if 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, request=request) res_Dict.update({'chat_html': chat_html}) required_beep = True unreaded_msgs.update(status='seen') # if not msgs or (request.user != msgs[0].receiver) or (not msgs and not last_message_modifiedDT) or (msgs and last_message_modifiedDT and msgs[0].modifiedDT <= last_message_modifiedDT): # Dict.update({ # 'required_beep': False # }) # return JsonResponse(Dict, status=200) res_Dict.update({ 'required_beep': required_beep, }) return JsonResponse(res_Dict, status=200) except Exception as e: msg = f'update_chat_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) @login_required(login_url='/profile/login/') def support_show_chat_by_ticket_ajax(request): if request.method != 'POST': raise Http404 try: data = json.loads(request.body) ticket = MsgGroup.objects.get(id=data['ticket_id']) msgs = get_messages_for_ticket(ticket) new_msg_allow = False cur_receiver = None if request.user.is_staff: cur_receiver = ticket.owner new_msg_allow = True else: if ticket.manager: cur_receiver = ticket.manager # if len(msgs) > 1: new_msg_allow = True # msgs.filter(receiver=cur_receiver).update(status='seen') Dict = { 'ticket': ticket, 'messages': msgs, 'cur_receiver': cur_receiver, 'new_msg_allow': new_msg_allow } Dict.update(get_ticketsDict_for_staff(request.user)) tpl_name = 'blocks/profile/b_support_chat.html' html = render_to_string(tpl_name, Dict, request=request) return JsonResponse({'html': html}, status=200) except Exception as e: msg = f'support_show_chat_by_ticket_ajax Error = {str(e)}' return JsonResponse({'error': msg}, status=400) @login_required(login_url='/profile/login/') def support_create_ticket_form_ajax(request): from ChatServiceApp.forms import TicketForm if request.method != 'POST': raise Http404 Dict = { 'form': TicketForm() } tpl_name = 'blocks/profile/b_create_ticket.html' html = render_to_string(tpl_name, Dict, request=request) return JsonResponse({'html': html}, status=200) @login_required(login_url='/profile/login/') def create_ticket_ajax(request): from ChatServiceApp.forms import TicketForm if request.method != 'POST': raise Http404 try: data = request.POST form = TicketForm(data) if not form.is_valid(): form.initial = form.cleaned_data Dict = {'form': form} html = render_to_string('blocks/profile/b_create_ticket.html', Dict, request=request) return JsonResponse({'html': html}, status=400) ticket = form.save(commit=False) ticket.owner = request.user ticket.enable = True ticket.save() from .websocket_views import send_to_support_managers_list_tickets_wo_manager send_to_support_managers_list_tickets_wo_manager(ticket, required_beep=True) # # рассылаем всем менеджерам сообщение # # Dict = { # 'ticket': ticket, # 'tickets_wo_manager': get_tickets_wo_manager() # } # tickets_wo_manager_html = render_to_string('widgets/w_tickets_wo_manager.html', Dict, request=request) # # group_name = 'support_managers' # Dict = { # 'type': 'update_chat', # 'tickets_wo_manager_html': tickets_wo_manager_html, # 'required_beep': True, # 'group_name': group_name, # } # channel_layer = get_channel_layer() # async_to_sync(channel_layer.group_send)( # group_name, # Dict # ) # # # # --------------------- msgs_for_ticket = get_messages_for_ticket(ticket) Dict = { 'ticket': ticket, 'messages': msgs_for_ticket } html = render_to_string('blocks/profile/b_support_chat.html', Dict, request=request) res_Dict = { 'html': html } return JsonResponse(res_Dict) except Exception as e: errors_Dict = { 'errors': { 'all__': f'ошибка в запросе = {str(e)}' } } Dict = {'form': errors_Dict} html = render_to_string('blocks/profile/b_create_ticket.html', Dict, request=request) return JsonResponse({'html': html}, status=400) def sendDeployments(owner, armies): type = "renderDeployments" message = owner + " has " + str(armies) + " to deploy" channel_layer = get_channel_layer() async_to_sync(channel_layer.group_send)( 'render_updates_group', {'type': 'render', 'message': message} )