diff options
author | jdlugosz963 <jdlugosz963@gmail.com> | 2023-07-17 01:47:57 +0200 |
---|---|---|
committer | jdlugosz963 <jdlugosz963@gmail.com> | 2023-07-17 01:52:26 +0200 |
commit | c21f4b3dacd597a15a5ec39d525df1dfe1b70376 (patch) | |
tree | 0dfc51d2ffeb7b5022d9ad852f2fd3620c72196a /restaurant_orders/dashboard/consumers.py | |
parent | 2c6f98aeef4fa1aba5678fe17c8e762a11db7b40 (diff) | |
download | restaurant-orders-c21f4b3dacd597a15a5ec39d525df1dfe1b70376.tar.gz restaurant-orders-c21f4b3dacd597a15a5ec39d525df1dfe1b70376.zip |
Add project.main
Diffstat (limited to 'restaurant_orders/dashboard/consumers.py')
-rw-r--r-- | restaurant_orders/dashboard/consumers.py | 49 |
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 @@ | |||
1 | from channels.generic.websocket import AsyncWebsocketConsumer | ||
2 | from channels.exceptions import StopConsumer | ||
3 | import channels.layers | ||
4 | |||
5 | from asgiref.sync import sync_to_async, async_to_sync | ||
6 | |||
7 | from core.models import Restaurant, Order | ||
8 | |||
9 | from django.db.models import signals | ||
10 | from django.dispatch import receiver | ||
11 | from django.core import serializers | ||
12 | |||
13 | |||
14 | class 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 | }) | ||