diff --git a/osinaweb/db.sqlite3 b/osinaweb/db.sqlite3 index 411f050b..c6579831 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 4e2326e2..bbf77517 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/api/__pycache__/urls.cpython-310.pyc b/osinaweb/osichat/api/__pycache__/urls.cpython-310.pyc index 26ed7ea5..744a3dfe 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 8e83b663..431f7df2 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 93d9631d..49c57d88 100644 --- a/osinaweb/osichat/api/urls.py +++ b/osinaweb/osichat/api/urls.py @@ -4,6 +4,7 @@ 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 5466cb7c..8d36c3c6 100644 --- a/osinaweb/osichat/api/views.py +++ b/osinaweb/osichat/api/views.py @@ -15,6 +15,21 @@ def get_chat_rooms(request): +@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).order_by('-last_update', '-date_created') + chat_rooms_serializer = ChatRoomSerializer(chat_rooms, many=True) + return successRes(chat_rooms_serializer.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") @@ -87,43 +102,44 @@ def start_conversation(request): start_with_id = request.data.get('start_with') start_with = get_object_or_404(User, id=start_with_id) - existing_room = ChatRoom.objects.filter( - chatmember__member=user - ).annotate( - member_count=Count('chatmember') - ).filter( - member_count=2, - chatmember__member=start_with - ).first() - - if existing_room: - return successRes({'room_id': existing_room.id}) - - chat_title = ( - f"Chat created by {user.first_name} {user.last_name} " - f"with {start_with.first_name} {start_with.last_name} " - f"on {timezone.now()}" - ) - - room = ChatRoom.objects.create( - name=chat_title, - created_by=user, - date_created=timezone.now(), - ) - - ChatMember.objects.create( - member=user, - room=room, - date_joined=timezone.now() - ) - ChatMember.objects.create( - member=start_with, - room=room, - date_joined=timezone.now() + existing_chat_room = ( + ChatRoom.objects.annotate(member_count=Count('chatmember')) + .filter(member_count=2) + .filter(chatmember__member=user) + .filter(chatmember__member=start_with) + .distinct() + .first() ) + if existing_chat_room: + return successRes({'room_id': existing_chat_room.id}) + + else: + chat_title = ( + f"Chat created by {user.first_name} {user.last_name} " + f"with {start_with.first_name} {start_with.last_name} " + f"on {timezone.now()}" + ) + + room = ChatRoom.objects.create( + name=chat_title, + created_by=user, + date_created=timezone.now(), + ) + + ChatMember.objects.create( + member=user, + room=room, + date_joined=timezone.now() + ) + ChatMember.objects.create( + member=start_with, + room=room, + date_joined=timezone.now() + ) + + return successRes({'room_id': room.id}) - return successRes({'room_id': room.id}) except TokenError as terr: return errorRes(msg=str(terr), status=450) diff --git a/osinaweb/osichat/consumers.py b/osinaweb/osichat/consumers.py index d0e13e46..de1ad0f7 100644 --- a/osinaweb/osichat/consumers.py +++ b/osinaweb/osichat/consumers.py @@ -161,7 +161,8 @@ class Osichat(WebsocketConsumer): } if self.client_type == 'mobile_admin': chat_room_data = model_to_dict(chat_room) - chat_room_data['visitor'] = model_to_dict(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) if last_message: chat_room_data['last_message'] = model_to_dict(last_message) else: @@ -352,7 +353,7 @@ class OsitcomChatRoom(WebsocketConsumer): ) if self.chat_room: - self.group = f"{self.session_id}_{self.chat_room.id}" + self.group = f"chat_{self.chat_room.id}" else: self.group = self.session_id #Visitor hasn't started a chat yet, when he will we will remove him from this group and add it to the chat group @@ -580,15 +581,13 @@ class OsitcomChatRoom(WebsocketConsumer): if self.client_type == 'mobile_admin': chat_room_data = model_to_dict(chat_room) - if hasattr(chat_room, 'chatroomguest'): + if hasattr(chat_room, 'chatroomguest') and chat_room.chatroomguest.visitor: chat_room_data['visitor'] = { 'id': chat_room.chatroomguest.visitor.id, 'country_flag': chat_room.chatroomguest.visitor.flag_image_url, 'is_online': chat_room.chatroomguest.visitor.is_online, 'ip': chat_room.chatroomguest.visitor.ip_address, } - else: - chat_room_data['visitor'] = None chat_members = ChatMember.objects.filter(room=chat_room) if chat_members.exists(): @@ -597,7 +596,7 @@ class OsitcomChatRoom(WebsocketConsumer): 'id': member.member.id, 'first_name': member.member.first_name, 'last_name': member.member.last_name, - 'image': member.member.staffprofile.image, + 'image': member.member.staffprofile.image.url, } for member in chat_members ]