Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Independent notifications accomplished #22

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions donation/consumers.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,44 @@ def donation_request(self, event):
request = event['request']
# Send message to WebSocket
self.send(request)


class NotificationConsumer(WebsocketConsumer):
"""
Notification Consumer for communication
through web sockets
"""

def connect(self):
"""
Connect method for web socket
"""

user = self.scope['user']
if user.is_anonymous:
self.close()
else:
self.room_group_name = f"notification-{user.username}"
# Join room group
async_to_sync(self.channel_layer.group_add)(
self.room_group_name,
self.channel_name
)

self.accept()

def disconnect(self, close_code):
"""
Dicconnect method for web socket
"""
async_to_sync(self.channel_layer.group_discard)(
self.room_group_name,
self.channel_name
)

def notification(self, event):
"""
notification structure for sending notification over web socket
"""
request = event['request']
self.send(request)
25 changes: 25 additions & 0 deletions donation/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,31 @@ def donation_request_observer(sender, instance, created, **kwargs):
)


@receiver(signals.post_save, sender=DonationRequest)
def donation_request_status_notifier(sender, instance, created, **kwargs):
"""
Pushes Notification to user on donation acceptance or rejection
"""
layer = channels.layers.get_channel_layer()

if instance.status == Status.REJECTED:
async_to_sync(layer.group_send)(
f"notification-{instance.created_by.username}", {
'type': 'notification',
'request': json.dumps({"blood_group": instance.blood_group,
"status": instance.status})
}
)
elif instance.status == Status.APPROVED:
async_to_sync(layer.group_send)(
f"notification-{instance.created_by.username}", {
'type': 'notification',
'request': json.dumps({"blood_group": instance.blood_group,
"status": instance.status})
}
)


@receiver(signals.post_save, sender=DonationRequest)
def donation_request_approve_observer(sender, instance, created, **kwargs):
"""
Expand Down
7 changes: 5 additions & 2 deletions haemosupport/asgi.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@

import os

from django.core.asgi import get_asgi_application
import django
from channels.routing import get_default_application


os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'haemosupport.settings')
django.setup()

application = get_asgi_application()
application = get_default_application()
5 changes: 3 additions & 2 deletions haemosupport/routing.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,16 @@

from channels.routing import ProtocolTypeRouter, URLRouter
from django.conf.urls import url
from donation.consumers import DonationRequestsConsumer
from donation.consumers import DonationRequestsConsumer, NotificationConsumer

from haemosupport.channelsmiddleware import TokenAuthMiddleware

application = ProtocolTypeRouter({
'websocket': TokenAuthMiddleware(
URLRouter(
[
url("", DonationRequestsConsumer.as_asgi())
url("ws/donations/", DonationRequestsConsumer.as_asgi()),
url("ws/notification-service/", NotificationConsumer.as_asgi())
]
)
)
Expand Down