summaryrefslogtreecommitdiffstats
path: root/restaurant_orders/dashboard/consumers.py
blob: 17a5d34c59060dca34901abc6b5d8dedb972e3a3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from channels.generic.websocket import AsyncWebsocketConsumer
from channels.exceptions import StopConsumer
import channels.layers

from asgiref.sync import sync_to_async, async_to_sync

from core.models import Restaurant, Order

from django.db.models import signals
from django.dispatch import receiver
from django.core import serializers


class OrderConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        restaurant_pk = self.scope['url_route']['kwargs']['restaurant_pk']
        self.restaurant = sync_to_async(Restaurant.get_user_restaurant_or_404)(restaurant_pk, self.scope['user'])
        if not self.restaurant:
            return

        self.room_name = str(restaurant_pk)
        self.room_group_name = f'restaurant_{self.room_name}'

        # Join room group
        await self.channel_layer.group_add(
            self.room_group_name,
            self.channel_name
        )

        await self.accept()

    async def disconnect(self, close_code):
        raise StopConsumer 

    async def new_order(self, event):
        await self.send(event['data'])

    @staticmethod
    @receiver(signals.post_save, sender=Order)
    def order_observer(sender, instance, **kwargs):
        if not instance.can_display:
            return

        layer = channels.layers.get_channel_layer()

        async_to_sync(layer.group_send)(f'restaurant_{instance.restaurant.pk}', {
            'type': 'new.order',
            'data': serializers.serialize('json', (instance, ))
        })