You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

163 lines
6.0 KiB
Python

from channels.generic.websocket import WebsocketConsumer
from django.shortcuts import get_object_or_404
from .models import *
import json
from django.template.loader import render_to_string
from asgiref.sync import async_to_sync
from channels.generic.websocket import WebsocketConsumer
from django.shortcuts import get_object_or_404
from customercore.models import *
import json
from django.template.loader import render_to_string
from asgiref.sync import async_to_sync
class TicketRoomConsumer(WebsocketConsumer):
def connect(self):
self.user = self.scope['user']
self.ticket_id = self.scope['url_route']['kwargs']['ticket_id']
self.ticket = get_object_or_404(Ticket, id=self.ticket_id)
self.ticket_number = self.ticket.ticket_number
existing_connection = TicketConnection.objects.filter(ticket=self.ticket, user=self.user, terminated_at__isnull=True).delete()
TicketConnection.objects.create(
ticket=self.ticket,
user=self.user,
date=datetime.now()
)
staff_profile = StaffProfile.objects.filter(user=self.user).first()
if staff_profile:
if not TicketStaff.objects.filter(staff=staff_profile, ticket=self.ticket).exists():
TicketStaff.objects.create(
staff=staff_profile,
ticket=self.ticket,
date_added=datetime.now()
)
async_to_sync(self.channel_layer.group_add)(
self.ticket_number, self.channel_name
)
self.accept()
self.modify_online_user()
def disconnect(self, close_code):
TicketConnection.objects.filter(
ticket=self.ticket,
user=self.user,
).update(terminated_at=datetime.now())
async_to_sync(self.channel_layer.group_discard)(
self.ticket_number, self.channel_name
)
self.modify_online_user()
def modify_online_user(self):
connections = TicketConnection.objects.filter(ticket=self.ticket, terminated_at__isnull=True)
event = {
'type': 'user_connection_handler',
'user': self.user,
'connections': list(connections.values()),
}
async_to_sync(self.channel_layer.group_send)(
self.ticket_number, event
)
def user_connection_handler(self, event):
context = {
'connections': event['connections'],
'user': event['user']
}
html = render_to_string("details_templates/partials/ticket-online-users.html", context=context)
self.send(text_data=json.dumps({
'event_type': 'user_status',
'html': html
}))
class NewTicketConsumer(WebsocketConsumer):
def connect(self):
self.user = self.scope['user']
async_to_sync(self.channel_layer.group_add)(
"new_ticket_group",
self.channel_name
)
self.accept()
def disconnect(self, close_code):
async_to_sync(self.channel_layer.group_discard)(
"new_ticket_group",
self.channel_name
)
def new_ticket_event(self, event):
ticket_id = event['ticket_id']
ticket = Ticket.objects.get(id=ticket_id)
is_ticketstaff_member = (
hasattr(self.user, 'staffprofile') and
(self.user.staffprofile in ticket.get_all_ticket_staff() or self.user.is_superuser)
)
is_ticket_customer = (
hasattr(self.user, 'customerprofile') and
(self.user.customerprofile == ticket.customer))
if is_ticketstaff_member or is_ticket_customer:
context = {'ticket': ticket, 'new': True}
if is_ticketstaff_member:
html = render_to_string("details_templates/partials/staff-ticket-display.html", context)
else:
html = render_to_string("details_templates/partials/customer-ticket-display.html", context)
self.send(text_data=json.dumps({
'event_type': 'new_ticket',
'html': html,
'ticket_id': ticket_id
}))
class NewTicketUpdateConsumer(WebsocketConsumer):
def connect(self):
self.user = self.scope['user']
async_to_sync(self.channel_layer.group_add)(
"new_ticket_update_group",
self.channel_name
)
self.accept()
def disconnect(self, close_code):
async_to_sync(self.channel_layer.group_discard)(
"new_ticket_update_group",
self.channel_name
)
def new_ticket_update_event(self, event):
ticket_update_id = event['ticket_update_id']
ticket_update = TicketUpdate.objects.get(id=ticket_update_id)
ticket = ticket_update.ticket
ticket_id = ticket.id
unread_updates_count = 0
for ticket_update in ticket.ticketupdate_set.exclude(added_by=self.user):
if not TicketRead.objects.filter(ticket_update=ticket_update, user=self.user, read=True).exists():
unread_updates_count += 1
ticket.unread_updates_count = unread_updates_count
is_ticketstaff_member = (
hasattr(self.user, 'staffprofile') and
(self.user.staffprofile in ticket.get_all_ticket_staff() or self.user.is_superuser)
)
is_ticket_customer = (
hasattr(self.user, 'customerprofile') and
(self.user.customerprofile == ticket.customer))
if is_ticketstaff_member or is_ticket_customer:
context = {'ticket': ticket, 'new': True}
if is_ticketstaff_member:
html = render_to_string("details_templates/partials/staff-ticket-display.html", context)
else:
html = render_to_string("details_templates/partials/customer-ticket-display.html", context)
self.send(text_data=json.dumps({
'event_type': 'new_ticket_update_group',
'html': html,
'ticket_id': ticket_id
}))