emile 7 months ago
parent 1028b6c1e1
commit 1ec60fd83f

Binary file not shown.

@ -3,6 +3,7 @@ from .models import *
# Register your models here. # Register your models here.
admin.site.register(Visitor) admin.site.register(Visitor)
admin.site.register(VisitorLog) admin.site.register(VisitorLog)
admin.site.register(ChatConnection)
admin.site.register(ChatRoom) admin.site.register(ChatRoom)
admin.site.register(ChatRoomGuest) admin.site.register(ChatRoomGuest)
admin.site.register(ChatMember) admin.site.register(ChatMember)

@ -109,7 +109,7 @@ def get_staffs(request):
"first_name": staff.user.first_name, "first_name": staff.user.first_name,
"last_name": staff.user.last_name, "last_name": staff.user.last_name,
"image": staff.image.url, "image": staff.image.url,
"last_seen": staff.get_last_seen "last_seen": get_chat_last_seen(staff.user)
} }
staffs_data.append(staff_data) staffs_data.append(staff_data)

@ -8,6 +8,7 @@ from django.forms.models import model_to_dict
from django.core.serializers.json import DjangoJSONEncoder from django.core.serializers.json import DjangoJSONEncoder
from django.db.models import Case, When, F, Max, DateTimeField from django.db.models import Case, When, F, Max, DateTimeField
from django.db import transaction from django.db import transaction
import threading
@ -55,21 +56,39 @@ class OsitcomVisitor(WebsocketConsumer):
class Osichat(WebsocketConsumer): class Osichat(WebsocketConsumer):
def connect(self): def connect(self):
self.user = self.scope["user"] self.user = self.scope["user"]
existing_connection = ChatConnection.objects.filter(user=self.user).last()
if existing_connection:
self.connection = existing_connection
self.connection.online = True
self.connection.disconnected = False
self.connection.save()
else:
self.connection = ChatConnection.objects.create(user=self.user, online=True)
async_to_sync(self.channel_layer.group_add)( async_to_sync(self.channel_layer.group_add)(
'osichat', self.channel_name 'osichat', self.channel_name
) )
self.accept() self.accept()
def disconnect(self, close_code): def disconnect(self, close_code):
self.last_seen = datetime.now()
self.connection.disconnected = True
self.connection.save()
timer_thread = threading.Timer(3, self.check_disconnect_status)
timer_thread.start()
async_to_sync(self.channel_layer.group_discard)( async_to_sync(self.channel_layer.group_discard)(
'osichat', self.channel_name 'osichat', self.channel_name
) )
def check_disconnect_status(self):
connection = ChatConnection.objects.filter(user=self.user).last()
if connection.disconnected:
self.connection.last_seen = self.last_seen
self.connection.online = False
self.connection.save()
def receive(self, text_data): def receive(self, text_data):
data = json.loads(text_data) data = json.loads(text_data)
event_type = data.get('event_type') event_type = data.get('event_type')
@ -471,6 +490,16 @@ class OsitcomChatRoom(WebsocketConsumer):
self.group, event self.group, event
) )
if event_type == 'recording':
event = {
'type': 'recording_handler',
'user_id': text_data_json.get('user_id'),
'recording_status': text_data_json.get('recording_status')
}
async_to_sync(self.channel_layer.group_send)(
self.group, event
)
if event_type == 'send_message': if event_type == 'send_message':
if text_data_json.get('user_id'): if text_data_json.get('user_id'):
member = get_object_or_404(User, id=text_data_json.get('user_id')) member = get_object_or_404(User, id=text_data_json.get('user_id'))
@ -764,6 +793,34 @@ class OsitcomChatRoom(WebsocketConsumer):
})) }))
def recording_handler(self, event):
if event.get('recording_status') == 'recording':
if event.get('user_id'):
member = get_object_or_404(User, id=event.get('user_id'))
else:
member = None
context = {
'member': member,
'chat_room': self.chat_room,
'domain': self.domain
}
if self.client_type == 'mobile_admin':
member_data = None
if member:
member_data = model_to_dict(member)
member_data['image'] = member.staffprofile.image.url if member.staffprofile and member.staffprofile.image else None
self.send(text_data=json.dumps({
'event_type': 'recording',
'member_data': member_data,
}, cls=DjangoJSONEncoder))
else:
self.send(text_data=json.dumps({
'event_type': 'stopped_recording',
}))
def send_message_handler(self, event): def send_message_handler(self, event):
chat_message = get_object_or_404(ChatMessage, id=event['chat_message_id']) chat_message = get_object_or_404(ChatMessage, id=event['chat_message_id'])
context = { context = {

@ -0,0 +1,27 @@
# Generated by Django 4.2.5 on 2024-10-03 12:27
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('osichat', '0032_remove_chatnotification_users_chatnotification_user'),
]
operations = [
migrations.CreateModel(
name='ChatConnection',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('date', models.DateTimeField(null=True)),
('online', models.BooleanField(default=True)),
('last_seen', models.DateTimeField(blank=True, null=True)),
('disconnected', models.BooleanField(default=False)),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]

@ -64,7 +64,6 @@ def send_notification(notification):
# Create your models here. # Create your models here.
class ChatNotification(models.Model): class ChatNotification(models.Model):
TYPES = ( TYPES = (
@ -211,6 +210,36 @@ class VisitorLog(models.Model):
) )
class ChatConnection(models.Model):
date = models.DateTimeField(null=True)
user = models.OneToOneField(User, on_delete=models.CASCADE)
online = models.BooleanField(default=True)
last_seen = models.DateTimeField(null=True, blank=True)
disconnected = models.BooleanField(default=False)
def get_chat_last_seen(user):
connection = ChatConnection.objects.filter(user=user).last()
if not connection:
return "Not seen yet"
if connection.online:
return "Online"
last_seen_time = connection.last_seen
now = timezone.now()
time_diff = now - last_seen_time
if time_diff < timedelta(days=1):
if last_seen_time.date() == now.date():
return f"last seen today at {last_seen_time.strftime('%I:%M %p')}"
else:
return f"last seen yesterday at {last_seen_time.strftime('%I:%M %p')}"
else:
return f"last seen on {last_seen_time.strftime('%b %d at %I:%M %p')}"
class ChatRoom(models.Model): class ChatRoom(models.Model):
name = models.CharField(max_length=300) name = models.CharField(max_length=300)
created_by = models.ForeignKey(User, null=True, on_delete=models.SET_NULL, blank=True) created_by = models.ForeignKey(User, null=True, on_delete=models.SET_NULL, blank=True)

@ -13,6 +13,7 @@ from channels.layers import get_channel_layer
from datetime import timedelta from datetime import timedelta
# Create your models here. # Create your models here.
@ -60,6 +61,7 @@ class CustomerProfile(models.Model):
new_id = str(int(max_id[-4:]) + 1).zfill(4) if max_id else '0001' # If no existing records, start with '0001' new_id = str(int(max_id[-4:]) + 1).zfill(4) if max_id else '0001' # If no existing records, start with '0001'
self.customer_id = current_year + new_id # Add 'p' prefix self.customer_id = current_year + new_id # Add 'p' prefix
super(CustomerProfile, self).save(*args, **kwargs) super(CustomerProfile, self).save(*args, **kwargs)
@property @property
def get_last_seen(self): def get_last_seen(self):
connection = Connection.objects.filter(user=self.user).last() connection = Connection.objects.filter(user=self.user).last()
@ -78,7 +80,6 @@ class CustomerProfile(models.Model):
return f"last seen yesterday at {last_seen_time.strftime('%I:%M %p')}" return f"last seen yesterday at {last_seen_time.strftime('%I:%M %p')}"
else: else:
return f"last seen on {last_seen_time.strftime('%b %d at %I:%M %p')}" return f"last seen on {last_seen_time.strftime('%b %d at %I:%M %p')}"
@ -149,6 +150,7 @@ class StaffProfile(models.Model):
new_id = str(int(max_id[-4:]) + 1).zfill(4) if max_id else '0001' # If no existing records, start with '0001' new_id = str(int(max_id[-4:]) + 1).zfill(4) if max_id else '0001' # If no existing records, start with '0001'
self.staff_id = 'O' + current_year + new_id # Add 'p' prefix self.staff_id = 'O' + current_year + new_id # Add 'p' prefix
super(StaffProfile, self).save(*args, **kwargs) super(StaffProfile, self).save(*args, **kwargs)
@property @property
def get_last_seen(self): def get_last_seen(self):
connection = Connection.objects.filter(user=self.user).last() connection = Connection.objects.filter(user=self.user).last()
@ -167,10 +169,14 @@ class StaffProfile(models.Model):
return f"last seen yesterday at {last_seen_time.strftime('%I:%M %p')}" return f"last seen yesterday at {last_seen_time.strftime('%I:%M %p')}"
else: else:
return f"last seen on {last_seen_time.strftime('%b %d at %I:%M %p')}" return f"last seen on {last_seen_time.strftime('%b %d at %I:%M %p')}"
@property @property
def active(self): def active(self):
return self.staffposition_set.filter(end_date__isnull=True).exists() return self.staffposition_set.filter(end_date__isnull=True).exists()
class StaffPosition(models.Model): class StaffPosition(models.Model):

Loading…
Cancel
Save