diff --git a/osinaweb/db.sqlite3 b/osinaweb/db.sqlite3 index 51dfbe3c..ae243706 100644 Binary files a/osinaweb/db.sqlite3 and b/osinaweb/db.sqlite3 differ diff --git a/osinaweb/osichat/__pycache__/consumers.cpython-310.pyc b/osinaweb/osichat/__pycache__/consumers.cpython-310.pyc index b8032527..b0553d59 100644 Binary files a/osinaweb/osichat/__pycache__/consumers.cpython-310.pyc and b/osinaweb/osichat/__pycache__/consumers.cpython-310.pyc differ diff --git a/osinaweb/osichat/__pycache__/models.cpython-310.pyc b/osinaweb/osichat/__pycache__/models.cpython-310.pyc index dea9d81b..d45615d9 100644 Binary files a/osinaweb/osichat/__pycache__/models.cpython-310.pyc and b/osinaweb/osichat/__pycache__/models.cpython-310.pyc differ diff --git a/osinaweb/osichat/api/__pycache__/urls.cpython-310.pyc b/osinaweb/osichat/api/__pycache__/urls.cpython-310.pyc index 744a3dfe..82a5635f 100644 Binary files a/osinaweb/osichat/api/__pycache__/urls.cpython-310.pyc and b/osinaweb/osichat/api/__pycache__/urls.cpython-310.pyc differ diff --git a/osinaweb/osichat/api/__pycache__/views.cpython-310.pyc b/osinaweb/osichat/api/__pycache__/views.cpython-310.pyc index 72b333d9..23d05d56 100644 Binary files a/osinaweb/osichat/api/__pycache__/views.cpython-310.pyc and b/osinaweb/osichat/api/__pycache__/views.cpython-310.pyc differ diff --git a/osinaweb/osichat/api/urls.py b/osinaweb/osichat/api/urls.py index 49c57d88..61659995 100644 --- a/osinaweb/osichat/api/urls.py +++ b/osinaweb/osichat/api/urls.py @@ -3,8 +3,6 @@ from . import views urlpatterns = [ - path('chat-rooms/', views.get_chat_rooms), - path('dms/', views.get_dms), path('visitors/', views.get_visitors), path('staffs/', views.get_staffs), path('start-conversation/', views.start_conversation), diff --git a/osinaweb/osichat/api/views.py b/osinaweb/osichat/api/views.py index b040b999..23fef06e 100644 --- a/osinaweb/osichat/api/views.py +++ b/osinaweb/osichat/api/views.py @@ -8,54 +8,6 @@ from django.utils.dateparse import parse_date from django.db.models import Count 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']) def get_visitors(request): start_date = request.query_params.get("start_date") @@ -151,6 +103,7 @@ def start_conversation(request): name=chat_title, created_by=user, date_created=timezone.now(), + type = 'DM' ) ChatMember.objects.create( diff --git a/osinaweb/osichat/consumers.py b/osinaweb/osichat/consumers.py index 4ebeede2..53738015 100644 --- a/osinaweb/osichat/consumers.py +++ b/osinaweb/osichat/consumers.py @@ -186,6 +186,19 @@ class Osichat(WebsocketConsumer): chat_room_data = model_to_dict(chat_room) if hasattr(chat_room, 'chatroomguest') and 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: chat_room_data['last_message'] = model_to_dict(last_message) else: @@ -232,6 +245,7 @@ class Osichat(WebsocketConsumer): '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 }) @@ -244,6 +258,24 @@ class Osichat(WebsocketConsumer): }, 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): today = timezone.now().date() 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(): chat_room = ChatRoom.objects.create( name=f"Support: {self.session_id}", - date_created = datetime.now() + date_created = datetime.now(), + type = 'Visitor Room' ) if 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, 'first_name': member.member.first_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 ] diff --git a/osinaweb/osichat/migrations/0034_chatroom_group_chatroom_visitor.py b/osinaweb/osichat/migrations/0034_chatroom_group_chatroom_visitor.py new file mode 100644 index 00000000..86678620 --- /dev/null +++ b/osinaweb/osichat/migrations/0034_chatroom_group_chatroom_visitor.py @@ -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), + ), + ] diff --git a/osinaweb/osichat/migrations/0035_remove_chatroom_group_remove_chatroom_visitor_and_more.py b/osinaweb/osichat/migrations/0035_remove_chatroom_group_remove_chatroom_visitor_and_more.py new file mode 100644 index 00000000..f0272d2b --- /dev/null +++ b/osinaweb/osichat/migrations/0035_remove_chatroom_group_remove_chatroom_visitor_and_more.py @@ -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), + ), + ] diff --git a/osinaweb/osichat/migrations/__pycache__/0034_chatroom_group_chatroom_visitor.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0034_chatroom_group_chatroom_visitor.cpython-310.pyc new file mode 100644 index 00000000..fd9ee60d Binary files /dev/null and b/osinaweb/osichat/migrations/__pycache__/0034_chatroom_group_chatroom_visitor.cpython-310.pyc differ diff --git a/osinaweb/osichat/migrations/__pycache__/0035_remove_chatroom_group_remove_chatroom_visitor_and_more.cpython-310.pyc b/osinaweb/osichat/migrations/__pycache__/0035_remove_chatroom_group_remove_chatroom_visitor_and_more.cpython-310.pyc new file mode 100644 index 00000000..1327e0f1 Binary files /dev/null and b/osinaweb/osichat/migrations/__pycache__/0035_remove_chatroom_group_remove_chatroom_visitor_and_more.cpython-310.pyc differ diff --git a/osinaweb/osichat/models.py b/osinaweb/osichat/models.py index 31b71442..3687532d 100644 --- a/osinaweb/osichat/models.py +++ b/osinaweb/osichat/models.py @@ -217,6 +217,14 @@ class ChatConnection(models.Model): online = models.BooleanField(default=True) last_seen = models.DateTimeField(null=True, blank=True) 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): + TYPE_CHOICES = ( + ('DM', 'DM'), + ('DM Group', 'DM Group'), + ('Visitor Room', 'Visitor Room'), + ) name = models.CharField(max_length=300) created_by = models.ForeignKey(User, null=True, on_delete=models.SET_NULL, blank=True) date_created = models.DateTimeField() 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) + type = models.CharField(max_length=15, choices=TYPE_CHOICES, null=True) @property def last_updated(self): last_message = ChatMessage.objects.filter(room=self).order_by('-date_sent').first() diff --git a/osinaweb/static/.DS_Store b/osinaweb/static/.DS_Store index 5980bbe5..7e32af6a 100644 Binary files a/osinaweb/static/.DS_Store and b/osinaweb/static/.DS_Store differ diff --git a/osinaweb/static/js/.DS_Store b/osinaweb/static/js/.DS_Store index 0d88dfa3..db1d3f31 100644 Binary files a/osinaweb/static/js/.DS_Store and b/osinaweb/static/js/.DS_Store differ