Skip to content

Commit

Permalink
mark sender as read (#13)
Browse files Browse the repository at this point in the history
* mark sender as read

* add user_who_viewed on initial send
  • Loading branch information
ckcollab authored Oct 14, 2022
1 parent 2a42b88 commit 1240d51
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 3 deletions.
7 changes: 6 additions & 1 deletion chit_chat/consumer_serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,9 @@ def validate(self, attrs):
return attrs

def create(self, validated_data):
return Message.objects.create(**validated_data)
message = Message.objects.create(**validated_data)

# Add sender as viewer
message.users_who_viewed.add(message.user)

return message
3 changes: 3 additions & 0 deletions chit_chat/consumers.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ async def receive(self, text_data=None, bytes_data=None):
'text': message.text,
'time': message.created_when.isoformat(),
'id': message.id,
# Attach the user who sent it as someone who has already viewed it
'users_who_viewed': [user.pk],
}
)

Expand Down Expand Up @@ -107,6 +109,7 @@ async def chat(self, event):
'room': event.get('room'),
'time': event.get('time'),
'id': event.get('id'),
'users_who_viewed': event.get('users_who_viewed'),
})
)

Expand Down
3 changes: 3 additions & 0 deletions chit_chat/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,6 @@ class Message(models.Model):
user = models.ForeignKey(User, related_name='chat_room_messages', on_delete=models.CASCADE)
created_when = models.DateTimeField(default=timezone.now)
users_who_viewed = models.ManyToManyField(User, related_name='chat_room_messages_viewed')

def __str__(self):
return f"Sent by User.id = {self.user_id} @ {self.created_when:%I:%M%p}"
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ name = django-chit-chat
author = Bailey Trefts
author_email = [email protected]
description = chat for projects we help maintain @ ckc
version = 0.0.9
version = 0.0.10
url = https://github.com/ckc-org/django-chit-chat
keywords =
django
Expand Down
28 changes: 27 additions & 1 deletion tests/integration/test_chat_async.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import asyncio

import pytest
from django.contrib.sessions.models import Session
from django.contrib.auth import HASH_SESSION_KEY, SESSION_KEY, BACKEND_SESSION_KEY, get_user_model
Expand All @@ -10,12 +12,16 @@

from chit_chat.consumers import ChatRoomConsumer
from chit_chat.serializers import RoomSerializer
from chit_chat.models import Message
from testproject.testapp.factories import RoomFactory, UserFactory
from testproject.testapp.serializers import ChatTestSerializer

User = get_user_model()


# ----------------------------------------------------------------------------
# Database helper functions
# ----------------------------------------------------------------------------
@pytest.mark.django_db
@database_sync_to_async
def create_user(auth_backend=None):
Expand Down Expand Up @@ -55,6 +61,14 @@ def get_messages_from_room(room):
return list(room.messages.all().order_by('created_when').select_related('user'))


@database_sync_to_async
def _get_message_object(**kwargs):
return Message.objects.get(**kwargs)


# ----------------------------------------------------------------------------
# Websocket helper functions
# ----------------------------------------------------------------------------
async def create_websocket_communicator(session_id):
communicator = WebsocketCommunicator(
get_default_application(),
Expand All @@ -66,6 +80,9 @@ async def create_websocket_communicator(session_id):
return communicator


# ----------------------------------------------------------------------------
# Tests
# ----------------------------------------------------------------------------
@pytest.mark.asyncio
@pytest.mark.django_db
async def test_connection_to_chat_room_requires_session_cookie():
Expand Down Expand Up @@ -155,7 +172,8 @@ async def test_serializer_hook():
'text': 'hello',
'type': 'chat',
'user': user.pk,
'id': (await get_messages_from_room(room))[-1].id
'id': (await get_messages_from_room(room))[-1].id,
'users_who_viewed': [user.pk],
}

ckc_chat_settings = {
Expand Down Expand Up @@ -295,15 +313,23 @@ async def test_chat_message_proliferates_to_users_who_connected_before_room_was_
# User sends message
await communicator.send_json_to({'message_type': 'chat', 'room': room.pk, 'text': 'hello'})

# Wait for message object to be created...
await asyncio.sleep(0.1)

# Message is marked as read by the sender
await _get_message_object(user=user, users_who_viewed__in=[user])

# Other user receives message
response = await other_communicator.receive_json_from()
assert response['user'] == user.pk
assert response['room'] == room.pk
assert response['users_who_viewed'] == [user.pk]

# User also receives message
response = await communicator.receive_json_from()
assert response['user'] == user.pk
assert response['room'] == room.pk
assert response['users_who_viewed'] == [user.pk]

# This user should not receive a message
try:
Expand Down

0 comments on commit 1240d51

Please sign in to comment.