summaryrefslogtreecommitdiffstats
path: root/restaurant_orders/dashboard/consumers.py
diff options
context:
space:
mode:
Diffstat (limited to 'restaurant_orders/dashboard/consumers.py')
-rw-r--r--restaurant_orders/dashboard/consumers.py49
1 files changed, 49 insertions, 0 deletions
diff --git a/restaurant_orders/dashboard/consumers.py b/restaurant_orders/dashboard/consumers.py
new file mode 100644
index 0000000..17a5d34
--- /dev/null
+++ b/restaurant_orders/dashboard/consumers.py
@@ -0,0 +1,49 @@
1from channels.generic.websocket import AsyncWebsocketConsumer
2from channels.exceptions import StopConsumer
3import channels.layers
4
5from asgiref.sync import sync_to_async, async_to_sync
6
7from core.models import Restaurant, Order
8
9from django.db.models import signals
10from django.dispatch import receiver
11from django.core import serializers
12
13
14class OrderConsumer(AsyncWebsocketConsumer):
15 async def connect(self):
16 restaurant_pk = self.scope['url_route']['kwargs']['restaurant_pk']
17 self.restaurant = sync_to_async(Restaurant.get_user_restaurant_or_404)(restaurant_pk, self.scope['user'])
18 if not self.restaurant:
19 return
20
21 self.room_name = str(restaurant_pk)
22 self.room_group_name = f'restaurant_{self.room_name}'
23
24 # Join room group
25 await self.channel_layer.group_add(
26 self.room_group_name,
27 self.channel_name
28 )
29
30 await self.accept()
31
32 async def disconnect(self, close_code):
33 raise StopConsumer
34
35 async def new_order(self, event):
36 await self.send(event['data'])
37
38 @staticmethod
39 @receiver(signals.post_save, sender=Order)
40 def order_observer(sender, instance, **kwargs):
41 if not instance.can_display:
42 return
43
44 layer = channels.layers.get_channel_layer()
45
46 async_to_sync(layer.group_send)(f'restaurant_{instance.restaurant.pk}', {
47 'type': 'new.order',
48 'data': serializers.serialize('json', (instance, ))
49 })