emile 7 months ago
parent 1ec60fd83f
commit 84aad16714

Binary file not shown.

@ -3,8 +3,6 @@ from . import views
urlpatterns = [ urlpatterns = [
path('chat-rooms/', views.get_chat_rooms),
path('dms/', views.get_dms),
path('visitors/', views.get_visitors), path('visitors/', views.get_visitors),
path('staffs/', views.get_staffs), path('staffs/', views.get_staffs),
path('start-conversation/', views.start_conversation), path('start-conversation/', views.start_conversation),

@ -8,54 +8,6 @@ from django.utils.dateparse import parse_date
from django.db.models import Count from django.db.models import Count
from django.forms.models import model_to_dict from django.forms.models import model_to_dict
@api_view(['GET'])
def get_chat_rooms(request):
chat_rooms = ChatRoom.objects.annotate(last_update=Max('chatmessage__date_sent')).filter(chatroomguest__isnull=False).order_by('-last_update', '-date_created')
chat_rooms_serializer = ChatRoomSerializer(chat_rooms, many=True)
return successRes(chat_rooms_serializer.data)
@api_view(['GET'])
def get_dms(request):
try:
token_data = verify(request.headers.get("Authorization"))
user_id = token_data['userid']
user = User.objects.get(id=user_id)
chat_rooms = ChatRoom.objects.annotate(last_update=Max('chatmessage__date_sent')).filter(chatmember__member=user, chatroomguest__isnull=True).order_by('-last_update', '-date_created')
chat_rooms_data = []
for chat_room in chat_rooms:
chat_room_data = {
'id': chat_room.id,
'name': chat_room.name,
'last_update': chat_room.last_updated,
'date_created': chat_room.date_created,
'unread_messages': chat_room.unread_messages(user),
'last_message': model_to_dict(ChatMessage.objects.filter(room=chat_room).last())
}
members = chat_room.chatmember_set.all()
member_data = []
for member in members:
member_data.append({
'id': member.member.id,
'first_name': member.member.first_name,
'last_name': member.member.last_name,
'image': member.member.staffprofile.image.url if hasattr(member.member, 'staffprofile') and member.member.staffprofile.image else None,
})
chat_room_data['members'] = member_data
chat_rooms_data.append(chat_room_data)
return successRes(chat_rooms_data)
except TokenError as terr:
return errorRes(msg=str(terr), status=450)
except Exception as e:
return errorRes(str(e))
@api_view(['GET']) @api_view(['GET'])
def get_visitors(request): def get_visitors(request):
start_date = request.query_params.get("start_date") start_date = request.query_params.get("start_date")
@ -151,6 +103,7 @@ def start_conversation(request):
name=chat_title, name=chat_title,
created_by=user, created_by=user,
date_created=timezone.now(), date_created=timezone.now(),
type = 'DM'
) )
ChatMember.objects.create( ChatMember.objects.create(

@ -186,6 +186,19 @@ class Osichat(WebsocketConsumer):
chat_room_data = model_to_dict(chat_room) chat_room_data = model_to_dict(chat_room)
if hasattr(chat_room, 'chatroomguest') and chat_room.chatroomguest.visitor: if hasattr(chat_room, 'chatroomguest') and chat_room.chatroomguest.visitor:
chat_room_data['visitor'] = model_to_dict(chat_room.chatroomguest.visitor) chat_room_data['visitor'] = model_to_dict(chat_room.chatroomguest.visitor)
if chat_room.chatmember_set.all():
members = chat_room
member_data = []
for member in members:
member_data.append({
'id': member.member.id,
'first_name': member.member.first_name,
'last_name': member.member.last_name,
'online': get_chat_last_seen(member.member),
'image': member.member.staffprofile.image.url if member.member.staffprofile and member.member.staffprofile.image else None
})
chat_room_data['members'] = member_data
if last_message: if last_message:
chat_room_data['last_message'] = model_to_dict(last_message) chat_room_data['last_message'] = model_to_dict(last_message)
else: else:
@ -232,6 +245,7 @@ class Osichat(WebsocketConsumer):
'id': member.member.id, 'id': member.member.id,
'first_name': member.member.first_name, 'first_name': member.member.first_name,
'last_name': member.member.last_name, 'last_name': member.member.last_name,
'online': get_chat_last_seen(member.member),
'image': member.member.staffprofile.image.url if member.member.staffprofile and member.member.staffprofile.image else None 'image': member.member.staffprofile.image.url if member.member.staffprofile and member.member.staffprofile.image else None
}) })
@ -244,6 +258,24 @@ class Osichat(WebsocketConsumer):
}, cls=DjangoJSONEncoder)) }, cls=DjangoJSONEncoder))
def new_online_activity_handler(self, event):
connection = get_object_or_404(ChatConnection, id=event['connection_id'])
context = {
'connection': connection,
}
if self.client_type == 'mobile_admin':
connection_data =[]
connection_data.append({
'user_id': connection.user.id,
'online': connection.online,
'last_seen': connection.last_seen
})
self.send(text_data=json.dumps({
'event_type': 'new_online_activity',
'connection_data': connection_data,
}, cls=DjangoJSONEncoder))
def get_visitors_handler(self, event): def get_visitors_handler(self, event):
today = timezone.now().date() today = timezone.now().date()
visitors = Visitor.objects.filter(visitorlog__visit_date__date=today).annotate(latest_visit=Max('visitorlog__visit_date')).order_by('-latest_visit') visitors = Visitor.objects.filter(visitorlog__visit_date__date=today).annotate(latest_visit=Max('visitorlog__visit_date')).order_by('-latest_visit')
@ -449,7 +481,8 @@ class OsitcomChatRoom(WebsocketConsumer):
with transaction.atomic(): with transaction.atomic():
chat_room = ChatRoom.objects.create( chat_room = ChatRoom.objects.create(
name=f"Support: {self.session_id}", name=f"Support: {self.session_id}",
date_created = datetime.now() date_created = datetime.now(),
type = 'Visitor Room'
) )
if text_data_json.get('guest_name'): if text_data_json.get('guest_name'):
self.visitor.name = text_data_json.get('guest_name') self.visitor.name = text_data_json.get('guest_name')
@ -671,7 +704,9 @@ class OsitcomChatRoom(WebsocketConsumer):
'id': member.member.id, 'id': member.member.id,
'first_name': member.member.first_name, 'first_name': member.member.first_name,
'last_name': member.member.last_name, 'last_name': member.member.last_name,
'image': member.member.staffprofile.image.url, 'online': get_chat_last_seen(member.member),
'image': member.member.staffprofile.image.url if member.member.staffprofile and member.member.staffprofile.image else None
} }
for member in chat_members for member in chat_members
] ]

@ -0,0 +1,23 @@
# Generated by Django 4.2.5 on 2024-10-07 07:23
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('osichat', '0033_chatconnection'),
]
operations = [
migrations.AddField(
model_name='chatroom',
name='group',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='chatroom',
name='visitor',
field=models.BooleanField(default=False),
),
]

@ -0,0 +1,26 @@
# Generated by Django 4.2.5 on 2024-10-07 07:26
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('osichat', '0034_chatroom_group_chatroom_visitor'),
]
operations = [
migrations.RemoveField(
model_name='chatroom',
name='group',
),
migrations.RemoveField(
model_name='chatroom',
name='visitor',
),
migrations.AddField(
model_name='chatroom',
name='type',
field=models.CharField(choices=[('DM', 'DM'), ('DM Group', 'DM Group'), ('Visitor Room', 'Visitor Room')], max_length=15, null=True),
),
]

@ -217,6 +217,14 @@ class ChatConnection(models.Model):
online = models.BooleanField(default=True) online = models.BooleanField(default=True)
last_seen = models.DateTimeField(null=True, blank=True) last_seen = models.DateTimeField(null=True, blank=True)
disconnected = models.BooleanField(default=False) disconnected = models.BooleanField(default=False)
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
channel_layer = get_channel_layer()
event = {
'type': 'new_online_activity_handler',
'connection_id': self.id,
}
async_to_sync(channel_layer.group_send)("osichat", event)
@ -241,11 +249,17 @@ def get_chat_last_seen(user):
class ChatRoom(models.Model): class ChatRoom(models.Model):
TYPE_CHOICES = (
('DM', 'DM'),
('DM Group', 'DM Group'),
('Visitor Room', 'Visitor Room'),
)
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)
date_created = models.DateTimeField() date_created = models.DateTimeField()
terminated_by = models.ForeignKey(User, null=True, on_delete=models.SET_NULL, blank=True, related_name='terminated_chatrooms') terminated_by = models.ForeignKey(User, null=True, on_delete=models.SET_NULL, blank=True, related_name='terminated_chatrooms')
date_terminated = models.DateTimeField(null=True, blank=True) date_terminated = models.DateTimeField(null=True, blank=True)
type = models.CharField(max_length=15, choices=TYPE_CHOICES, null=True)
@property @property
def last_updated(self): def last_updated(self):
last_message = ChatMessage.objects.filter(room=self).order_by('-date_sent').first() last_message = ChatMessage.objects.filter(room=self).order_by('-date_sent').first()

Binary file not shown.

Binary file not shown.
Loading…
Cancel
Save